윈도우에서 FFmpeg을 컴파일하려면 Visual Studio에서 하는 방법과 MinGW의 gcc로 컴파일하는 방법이 있다. Visual Studio를 사용하는 방법이 쉽다고 되어있는데, 막상 해보니 잘 되지 않고… 윈도우 환경에서 gcc로 컴파일 하려면 MinGW와 yasm이 필요하다. 1. MinGW 다운 및 설치 MinGW를 설치하려면 여기에서 mingw-get-setup.exe를 다운받아 실행하면 된다. 설치 화면에서 mingw32-base와 msys-base를 선택한 뒤에 Installation - Apply Changes를 클릭하면 설치가 진행된다. 설치가 되는 기본 폴더의 위치는 c:\MinGW이다. 2. pr.exe 설치 컴파일할 때 pr.exe가 필요한데, 위에서 설치한 내용에선 이 파일..
OpenELEC을 업데이트하다가 뭔가 알 수 없는 문제가 발생했다. 이왕 새로 엎어야 되는 거 OSMC로 갈아타기로 했다. 1. 설치 설치 후의 사용법이야 사실상 동일하지만, 설치과정은 OSMC가 편한 편이다. 아래 화면과 같은 설치 프로그램을 별도로 지원한다. USB 포트에 SD 카드를 꽂은 뒤 설치 프로그램을 실행하고 옵션만 잘 선택하면 간단하게 작업이 끝난다. 2. 계정의 차이 OpenELEC의 계정은 root/openelec 인데, OSMC는 osmc/osmc 이다. 3. 자막 폰트의 위치 자막 폰트는 /usr/share/kodi/media/Fonts에 위치한다. SFTP 클라이언트로 저장할 수 있는데, 해당 폴더는 쓰기가 막혀있다. 터미널에서 아래와 같이 권한을 변경한 뒤에, cd /usr/sh..
아이들 방학숙제를 도와주는데, 사진첩을 만드는 숙제가 있었다.찍어놓은 사진들은 많은데, 문제는 이 사진들을 비슷한 크기로 인쇄하는 자체가 손이 많이 간다는 것. 그래서 하나 급조해봤다.사진들을 떨어뜨리면 이를 지정된 크기로 설정해서 하안글(정확히는 HML) 파일로 만들어주는 프로그램.긴 변의 길이를 지정한 크기에 맞춰 일정 비율로 줄여서 하안글 파일에 끼워넣어준다. 삽입 가능한 이미지는 JPEG, PNG, GIF의 세 종류.리스트 컨트롤에 떨어뜨린 뒤 파일을 생성한 뒤 하안글에서 읽으면 아래와 같은 화면을 볼 수 있다. 이 프로그램은 아래 링크에서 다운받을 수 있다.
더 좋은 화질/음질의 영상/음성 포맷은 이 바닥 관련자에게는 영원한 목표일 것이다.그런데, 문득 생각한 10년쯤 된 사기질 하나가 생각났다.이름하여 NV Codec. 이제는 없어져버린 네빌소프트(www.nevilsoft.com)란 곳에서 2004년 2월 경 '곧 정식버전을 발표하겠다'며 사기 친 코덱이었다.아마도 투자자를 끌어모은 뒤 먹튀를 하겠다는 목표로 구성된 사기였던 것 같다. 네빌 쪽에서 얘기한 이 코덱의 장점(?)들은 대략 아래와 같았다. 1. Visual 무손실 압축 기법으로 압축률은 4배 이상 향상시키며 손실률은 0.5db 이내 2. 비디오/오디오 각각 별도로 적용 가능함 3. 독립 코덱으로도 동작하고 기존 코덱에 add-on도 되는 획기적인 방식 4. add-on시 심지어 메인 코덱의 점유..
내가 처음 mp3 파일을 구했을 때가 대략 1996년 초였다.윈도우 3.1에서 돌아가는 최초의 mp3 파일 플레이어인 WinPlay3을 어디선가 구했고, 이 때 mp3 파일 몇 개를 함께 구했었다. 이 무렵의 환경은 대략 이러했다. 1. 이전에는 재생 가능하면서 괜찮은 음질을 지원하는 오디오는 mp2 파일밖에 없었는데, mp3보다 파일은 크고 음질은 낮았음 2. WinPlay3이 나오기 전에는 mp3를 실시간으로 재생할 수 있는 프로그램이 없었고, wav 포맷 등으로 변환해야 들을 수 있었음 그렇게 처음 구한 mp3 플레이어는 훌륭한 음질을 들려는 줬다.하지만, 한계가 있었으니… 앞뒤로 이동하는 기능이 없어 한번 듣기 시작하면 끝까지 듣거나 중단하는 수밖에 없었다. 이 문제는 결국 전설의 Winamp가 ..
C/C++에서 memset()은 종종 최적화에 대한 얘기가 종종 나오는 테마이다.이론적으로는 내용들에 동감은 하는데, 과연 실제로 영향이 있는지 확인해봤다. 비교 대상은 memset(), 단순무식, 8바이트 정렬 고려한 최적화, 버클리 구현 소스 등. - memset() : 그냥 Visual C++에 내장된 함수- 단순무식 : 루프 돌리는, 일반상식에 기반한 코딩- 8바이트 단위 쓰기 : 루프를 8바이트 단위로 돌리면서 uint64_t 단위로 쓰기 (참조 사이트) - 8바이트 단위 정렬 최적화 : 메모리에 쓸 때 주소가 8바이트 단위면 CPU가 조금 더 최적화한다는 점을 고려한 쓰기- 버클리 구현 : 8바이트 단위 정렬 최적화의 버클리 버전 (참조 사이트) 이 코드를 디버그 모드에서 돌렸을 때의 결과는 ..
깃허브의 메모장2-mod Issue에 이상한 내용이 올라왔다.몇몇 글자가 제대로 화면에 표시되지 않는다는 것. 좀 더 정확히는 현재 지정된 폰트에 포함되지 않은 글자가 화면에 나오지 않는다.예를 들면, 메모장2를 유니코드 모드로 실행한 상태에서 다음 내용을 붙여넣으면 제대로 화면에 출력되지 않는다. ∈ ∘ ⌀∈ ○ ∘ ○ ⌀ ○∈ ⊥ ∘ ⊥ ⌀ ⊥ℕ ℤ ℚ ℝ ℂ ℍ 원작자인 Florian Balmer 님께 여쭤본 결과, 윈도우 자체가 GDI 모드에서 그런 문제가 있고, DirectDraw 모드에선 잘 동작한다는 답을 들었다.더불어 앤티에일리어싱이 좀 더 멋지게 지원된다는 얘기도… 이러한 내용을 반영한 r956을 공개한다.이 내용을 포함한 수정 버전은 아래 링크에서 다운받을 수 있다.언제나 그렇듯이 한/..
프로그램을 만들 때 아이콘은 대부분 자작하는 편이다.그러다 삽질한 내용을 까먹지 않기 위해 기록. 내가 아이콘을 만드는 과정은 대략 아래와 같았다. 1. 적절한 이미지 선택2. 프로그램을 써서 주변을 적당히 잘라냄3. paint.net의 아이콘 플러그인을 이용해서 저장 문제는 2, 3번에서 모두 발생했는데…2번: 잘라낸 뒤에 투명한 영역의 색을 (0, 0, 0)으로 변경 → 나름 파일의 크기를 조금 줄이겠다는 심산이었는데, 리사이징에 심각한 악영향3번: 플러그인의 리사이징 품질 자체가 좋지 않음 결국, 투명 영역의 색을 그대로 유지하고 직접 리사이징 한 뒤, ImageMagick을 사용해서 아이콘을 생성하는 것으로 변경. 오늘의 교훈: 불투명도가 0이라고 그 색이 무의미한 게 결코 아님. 특히 리사이징 ..
며칠간 삽질한 것을 잊지 않으려고 적는 포스팅 jpeg 파일에서 다양한 정보를 담는 Exif영역은 IFD로 구분되고, 제일 먼저 등장하는 것이 IFD0이다. 그리고, 각 IFD와 데이터의 저장 위치는 TIFF 헤더로부터의 offset으로 위치를 표현한다. 그리고, IFD0의 offset는 당연하게도 8이다. 자작 프로그램들 중에 exif를 수정하는 프로그램들은 이 값을 8로 하드코딩해서 만들었다. 그런데, 이 값이 8이 아닌 jpeg 파일을 만나게 됐다. 당연히 프로그램은 오류를 유발하고 exif 영역이 망가졌다. 결국 8로 하드코딩한 부분을 모두 정상적으로 읽어서 처리하도록 수정해서 문제 해결.
새 버전이 나왔습니다. 새 버전을 사용해주시기 바랍니다. 2013/05/06 - 한/글(HwpML) 파일 압축기(HIS) 1.6 업데이트 오랜만에 한/글 파일 압축기를 업데이트했다.1년이 넘는 기간동안 JPEG 쪽은 mozjpeg가, PNG 쪽은 pngquant가 나오는 등, 많은 기술들이 나왔다.이러한 기능들을 반영하고, 그동안 사용하며 발견한 문제점들을 수정한 2.2를 공개한다. (2015.5.4에 2.6으로 업데이트) 그동안 수정된 내용들은 아래와 같다. 1. 버그 수정: 이미지를 회전하거나 묶은 경우 이미지가 깨지는 문제 수정 2. 버그 수정: jpeg 등의 이미지가 다시 zlib로 압축된 경우 제대로 처리하지 못하는 문제 수정 3. 버그 수정: 8비트 grayscale PNG를 정상적으로 인식하..
실로 오랜만의, 두 달만의 업데이트. 그동안 Scintilla는 3.5.4에 이어 3.5.5까지 업데이트되었는데, 이를 반영한 업데이트다.Scintilla의 기능 자체가 변경된 부분은 거의 없으며, Windows에서는 언제나 유니코드만을 사용하도록 수정되었다. 그리고, 64비트 윈도우 8.x에서는 메모장 대신 사용 기능을 사용할 수 없도록 수정되었다. 윈도우 7까지는 레지스트리에서 Image File Execution Options을 지정해 notepad.exe대신 다른 프로그램을 실행할 수 있었다. 하지만, 64비트 윈도우 8부터는 이 기능이 막혀버렸기 때문에, 이를 반영하였다. 이 내용들을 포함한 수정 버전은 아래 링크에서 다운받을 수 있다.언제나 그렇듯이 한/영 x86/x64 버전이 모두 들어있다.
최초 단초가 됐던 트윗에 나와 앞의 테스트들에 사용됐던 이미지들의 원출처를 확인했다. hadto.net의 GENERATION LOSS란 글이다. 글의 핵심은 최고 화질에서 조금씩 낮춰가며 jpeg 포맷으로 계속 읽었다 저장했을 때의 화질 저하를 확인하는 것. 같은 방식으로 사진 하나를 저장한 뒤 그 결과를 동영상으로 만들어봤다.우선, 사진을 하나 준비… 이 사진을 Q를 100에서 0까지 줄여가며 저장하면 아래와 같은 영상을 뽑을 수 있다. 위 영상을 보면 Q가 50 이하로 줄어들면 화면이 다소 심하게 깨지는 결과를 확인할 수 있다.그런데, 이 동영상/사진은 자칫 오독의 우려가 있다. 해당 이미지를 Q=30으로만 50번 저장한 결과를 보자. 그런데, 서서히 줄여가며 저장한 경우 Q=30으로 저장한 이미지는..
jpeg 인코더들의 화질 관련 마지막 포스팅. 이전 포스팅들에서 확인했듯이, jpeg로 수백번씩 읽었다 저장해도 심각한 수준의 화질 저하는 없었다.그런데, 바로 앞 포스팅에서 잠깐 확인해봤던 서로 다른 jpeg 인코더로 반복하는 경우를 조금 더 확인을 해보기로 했다.앞 포스팅의 그래프엔 샘플링 간격이 짝수이기 때문에 한 쪽 인코더의 결과만 나와있다는 점도 신경쓰였고. 선택한 인코더는 jpeglib-turbo와 mozjpeg.두 인코더를 번갈아가며 100회 저장한 결과의 PSNR은 아래 그래프와 같다. 뭔가 이상하다. 일정한 범위에서 계속 진동하는 결과를 보여준다.이건 좀 생각해볼 필요가 있는 묘한 부분이다. 더불어 앞의 포스팅 때 시험한 결과를 70회 반복 저장하면서, 저장 간격을 조금 다르게 출력해서 ..
Mozilla JPEG Encoder ProjectThis project's goal is to reduce the size of JPEG files without reducing quality or compatibility with the vast majority of the world's deployed decoders. 나는 jpeg 라이브러리로 mozjpeg을 사용한다.이 라이브러리는 위에서 보는 것과 같이 같은 화질에서 품질의 저하 없이 파일의 크기를 줄이는 목적으로 시작된 프로젝트다. 첫 버전이 출시되었을 때는 libjpeg-turbo에 jpegcrush 기능을 추가한 형태였는데, 이 때는 정말로 화질의 변화가 전혀 없었다. 그런데, 이제 3.0까지 업데이트되었고, 확인해보니 화질의 저하도 약..
2015/04/05 - jpeg#1 : 같은 이미지를 jpeg로 반복 저장하면 정말로 박살나는가? 지난 포스팅에 이어지는 글이자, 위 트윗들 보고 어이 없어서 쓰는 포스팅. 물론, 위의 트윗들은 아래 트윗의 답글 중 일부다. 저 트윗을 쓴 분의 얘기는 그러니까… 1. 윈도우의 jpeg encoder는 DCT 변환 테이블을 잘못 만들었다고 추정함 2. C언어는 math.h의 오류로 sin/cos 함수는 오차가 꽤 나올 수 있음 대략 이렇게 정리될 수 있고, 요약하면 MS의 프로그래머들은 등신이라 저런 오류가 실제로 발생한다는 얘기다. 정말 저런 결과를 보여주는지 확인하기 위해 앞의 포스팅과 같은 기능을 하는 프로그램을 C#으로 만들었다. 이 프로그램은 이전의 프로그램과 사실상 동일한 기능을 한다. 딱 한 ..
발단은 한 줄의 트윗이었다.jpeg로 반복 저장을 600회하면 원래 없던 붉은 점이 가득 끼며 화질이 열화되는 것을 넘어 박살이 난다는 얘기다…이 트윗에 대한 답글로 온갖 이론이 난무하고, 결국 MS의 jpeg 인코더가 범인이라는 아무런 근거 없는 결론(?)이 났다. 근데, 근본적으로 생각해봤다.jpeg는 이미지를 저장할 때 코사인을 기반으로 하는 DCT 변환을 하고, 고주파 성분을 제거하는 방식으로 손실압축을 한다.즉, jpeg에서 화질의 열화는 있는 성분이 사라지는 것이지, 없던 게 태어나는 게 아니다.좀 쉽게 표현하면 날카로움이 사라지고, 흐릿해지며, 두리뭉실해지는 것이다. 반복 저장을 하면 화질이 열화되는 건 당연한데, 결코 저런 방식일 수가 없는 것이다. 이론은 이론일 뿐이고, 과연 얼마나 손상..
키보드를 GTune MBF100 PLUNGER로 바꾸고 보니 한영/한자 키의 위치가 일반 키보드와 다르다. 레이아웃이 한국식 106키가 아니라 US-International 103키와 거의 같기 때문에 한영/한자 키의 위치가 굉장히 낯설다. 그래서 오랜만에 예전에 쓰던 트릭을 꺼내들기로 했다. Shift/Ctrl + Space로 한영/한자 키를 대신하는 것. 이 트릭을 적용하려면 다음과 같이 하면 된다. 우선, 레지스트리 편집기로 아래 위치로 이동해보면 대략 아래 캡쳐화면과 같이 되어있다. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters 여기서 표시된 두 부분의 값을 각각 다음과 같이 바꿔주고 재부팅하면 끝난다. 바뀐 부분..
난 키보드 덕질은 안 하지만, 은근 기계식 키보드에 대한 로망 같은 게 있었다. 고민 끝에, 멤브레인과 기계식의 중간쯤이라고 얘기되는 플런저 키보드를 하나 사기로 했다. 선택한 제품은 한성컴퓨터에서 나온 GTune MBF100 PLUNGER. 이 제품은 독특한 특징이 몇 있다. 1. 비용은 상당히 저렴함. 특히, 기계식과 비교하면 하늘과 땅 차이 2. 당연한 얘기지만, 누르는 감이 충분히 괜찮음. 살짝 사각거리는 소리도 은근 기계식 필이 느껴짐 3. LED가 적절히 은은하며, 색과 밝기를 쉽게 조절할 수 있음 4. 키보드 레이아웃은 완전히 US-인터내셔널 레이아웃임. 즉, 스페이스 바 왼쪽에 3개, 오른쪽에 4개의 키만 있음 5. Scroll Lock 램프가 없고, 그 자리엔 Game Mode 램프가 위..
iOS의 훌륭한 기능 중 하나는 차단 기능을 별도로 두어 특히, 아이들의 사용을 적절히 통제할 수 있다는 것이다. 울 아이들은 아이폰4를 사용하는데, 이 기능을 잘 쓰다가 망테크를 탔다!암호를 잃어버린 것이다!! 아이폰/아이패드에서 시스템 자체의 문제가 발생하면 대체로 답은 iBackupBot으로 백업해서 편집하는 것에 있다.차단 기능의 비번 분실도 마찬가지. 일단 백업을 한 뒤 다음 위치로 이동한다. \System Files\HomeDomain\Library\Preferences 여기서 com.apple.springboard.plist를 찾는다. 이 문제는 여기서 해결할 수 있다.이 파일을 더블클릭해서 편집을 하면 된다.핵심은 두 가지다. 1. SBParentalControlsFailedAttempts..
2014/11/16 - 가장 빠른 iDevice용 동영상 변환기 v10.7a 공개 iDevice용 동영상 변환기를 11.0으로 업데이트했다. ('15.3.15에 11.4로 업데이트) 10.x대의 마지막 버전인 10.7a 이후 한달만의 업데이트이다. 이번 업데이트에는 (아이폰에서 재생되지 않는) Full HD 이상의 H.264 동영상을 생성하는 기능이 추가되었다. 더불어, 기존의 기능들을 안정화하고, 코드를 전체적으로 정비했다. 변환기는 아래 링크에서 다운받을 수 있으며, 여전히 별도의 설치 프로그램따위는 없다. iTrans_20150314_11_4.rar 관심 있는 분들의 수많은 지적과 질타 부탁드립니다. 이 프로그램은 여러분 덕에 완성되어 갑니다. ▲ iTrans의 상세한 기능 및 특징 #일반 1. 대..
처음으로 컴퓨터를 밤새며 돌렸던 작업이 뭐였나 생각해봤다.아마도, 처음으로 그렇게 돌렸던 작업은 80년대 중반 MSX에서 Mandelbrot 프랙탈을 그려본 것 같았다. 월간 마이크로 소프트웨어에 소개된 기사를 읽고서 (개념을 제대로 이해도 못하면서) MSX Basic으로 돌려본 것이었다.굉장히 낮은 해상도임에도 화면 하나를 채우려면 몇 시간 돌려야 했기 때문에 자기 전에 좌표를 지정하고 돌린 뒤에 아침에 결과를 확인했었다. 이후 CPU가 비약적으로 향상된 MSX Turbo R에서 조금 더 빠르게 동작하는 솔루션도 나왔지만, 그래봤자 아래와 같은 수준… 결국 HW와 SW 모두 장족의 발전을 하고, Mandelbrot 그래픽은 몇 초 내에 결과를 보여주는 세상이 왔다. 다음으로 밤을 새서 돌린 건 90년대..
몇년간 묵혀뒀던 닌텐도 Wii를 꺼냈다. 원래는 지인께서 구입을 희망해서 팔려고 했는데, 아이들의 강려크한 요청으로 안 팔고 우리가 다시 하기로 했다. 그런데, 확인해 보니 Wii 스포츠는 타이틀을 분실(ㅡ.ㅡ;)했고, Wii 스포츠 리조트는 디스크가 깨진 상태… 혹시나 깨진 디스크도 수리나 교환이 가능한지 닌텐도 홈페이지를 확인해보니 뭔가 문구가 좀 애매하다… 그런데, 전화로 문의해보니 디스크 파손에 대한 방안은 단순ㆍ명확하다. 디스크는 소비자가 대비 60% 지불시 교환 가능 즉, Wii 스포츠 리조트의 경우 27,000원을 지불하면 교환이 가능한 것이다.현재 Wii 스포츠와 Wii 스포츠 리조트 합본팩을 36,000원 정도에 판매하고 있으니, 교환할 의미가 별로 없다.Wii 스포츠도 사야 하고… 그래..
CoffeeScript 강조 기능이 추가된 것을 반영한 릴리즈. 사실, 지난번 배포 버전(r940)에서는 원본에 비해 버그 하나를 수정해서 배포했었다.Scintilla에서 Win 9x 지원 코드를 제거했지만, Notepad2-mod에는 제대로 반영되지 않았다.Scintilla 내부적으로 폰트명을 ASCII 대신 UTF-8로 전송하도록 변경됐는데, Notepad2-mod에선 여전히 ASCII로 전송했던 것. 본 블로그의 배포판은 수정해서 문제 없었지만, 공식 배포판엔 반영되지 않았었는데, 공식적 문제제기를 통해 이 수정이 반영됐다. 이 내용들을 포함한 수정 버전은 아래 링크에서 다운받을 수 있다.언제나 그렇듯이 한/영 x86/x64 버전이 모두 들어있다.
iTrans를 업데이트하면서 이미지의 해상도를 읽어야 할 상황이 생겼다.IJG 및 libpng를 사용하면 되긴 하지만, 고작 해상도 정보 얻자고 라이브러리까지 쓰긴 좀 그래서 간단한 방법을 쓰기로 했다. 간단히(응?) 파일을 뒤져서 해상도 정보를 찾는 것. cplusplus.com에서 관련된 소스를 찾을 수 있었다.그런데, 이 코드에는 사소한 문제들이 있다. - GIF도 포함된 소스인데, 난 GIF는 안 쓰기 때문에 제거 가능 - 파일 크기를 얻기 위해 fseek() 등을 쓰는데, 필요 없음- JPEG 헤더를 읽을 때 EXIF가 앞에 들어있는 경우는 제대로 처리하지 못함- 파일의 형식은 알려주지 않음 아래 코드는 이 내용이 반영된 코드이다. // itype: 1=JPEG 2=PNG bool getImag..
이번에 iTrans를 업데이트하면서 커버아트 기능에서 이상한 부분을 하나 발견했다.아이튠즈에서는 커버아트를 확인 가능하지만, iDevice에 표시가 되지 않는 경우가 발견된 것이다. 그래서 한땀한땀 커버아트를 만들어 적용시켜봤다… 확인 결과 커버아트는 다음과 같은 규칙을 만족할 때에만 iDevice에 표시가 된다. - 포맷은 RGB 형식의 jpeg/png만 허용. CMYK 포맷의 jpeg도 허용하지 않음- 가로 세로 비율은 1.3:1 이상일 때만 표시함. 4:1까지도 가로를 늘려봤는데, 정상적으로 표시- 파일 크기가 10MB 이하일 때만 출력 iTrans 11.3a에는 이 내용이 모두 반영되어 있다. 단, 파일 크기까지 적용하기엔 뭔가 복잡해져서 가로의 크기를 2000px로 제한하기로 했다. 덧. 찾아보..
Notepad2-mod r940은 Scintilla 3.5.3을 반영한 버전이다. Scintilla 3.5.3은 Windows 95/98/Me를 지원하던 코드를 제거했다.이 과정에서 글꼴 이름을 ANSI로 넘기지 않고 UTF-8로 넘기도록 바꿨다. 문제는 Notepad2(및 Notepad2-mod)는 글꼴 이름을 ANSI로 넘긴다는 것.한글 글꼴을 지정하면 아래와 같이 시스템 기본 글꼴이 적용된다. 이 문제를 수정하려면 Styles.c에서 아래 함수를 찾아서 void Style_SetStyles(HWND hwnd,int iStyle,LPCWSTR lpszStyle) { } 아래 내용을… WideCharToMultiByte(CP_ACP,0,tch,-1,mch,COUNTOF(mch),NULL,NULL); 아..