AirComix server와 encoding 문제…

홈서버가 잠시 터졌던 관계로… 불편함에 AirComix server를 php 기반 서버로 전환했는데, 이후 열리지 않는 zip archive들이 발견되었다.

처음에는 pecl:zip 문제인 줄 알고, PEAR:archive_zip 등을 사용하도록 코드를 업데이트 해야하나하는 고민을 했었지만 디버깅을 해보니 그런 큰 문제는 아니었다.

대게 단순한 문제였는데… “햏”같은 uhc/utf-8 등에는 정의되어 있지만, euc-kr에는 정의되지 않는 글자들이 사용된 경우 AirComix server가 오동작하는 문제!

단순히 handler.php에서 $source_encoding = “euc-kr”로 되어 있는걸 $source_encoding = “cp949″로 바꿔주면 잘 동작하는 것을 확인했다.

게임을 줄였더니 확실히 뭔가 생산적이 되는 것 같다.

덧: 예전에 인코딩이랑 캐릭터셋 관련해서 삽질도 많이하고 공부도 많이했는데, 덕분에 이래저래 도움이 많이 되는 것 같다. 오늘의 일기 끝!

Video Compression 자료…

오늘(어제?) 신입생 교육 때문에 만들었던 자료인데, 개인적으로 프레젠테이션 파일에 설명을 덕지덕지 붙여놓는 걸 좋아하지 않다보니 설명 없이 보기엔 조금 허전할 지도 모르겠다.

http://mytears.org/video_compression.mov

전해져 오는 자료들도 있었지만, Information theory라던가 energy compaction 등을 보여주는 자료들이 없는 등 개인적으로 맘에 들지 않아서 새로 자료를 만들어 버렸다. 어쩌면 이 정도까지 관심있는 사람들도 없었는지 모르겠지만…

그래도 만들어놓은거 2시간만에 버려지는 건 조금 아까워서 퀵타임으로 export!

간단하게 설명하자면 아래 정도?

1. 컬러 스페이스는 여러가지가 있다. RGB는 각 채널에 정보들이 고르게 분배되어 있는데 반해 YUV(Luminance + Chrominance)의 경우 Y(Luminance)성분에 대부분의 정보가 몰려있고, UV에는 상대적으로 정보가 적기 때문에 압축하는데 사용하기가 용이하다.

그렇기 때문에 영상을 압축하는데는 흔히 YUV가 사용된다.

2. 정보량을 나타내는 단위로 Entropy라는 것이 있으며, 이는 우리가 최대로 압축할 수 있는 값이라고도할 수 있다.

엔트로피에 최대한 가깝게 압축을 하기 위한 방법으로는 Shannon-Fano coding, Huffman coding, Arithmetic coding 등이 있으며, 대체로 Shannon-Fano coding보다는 Huffman coding이, Huffman coding보다는 Arithmetic coding이 엔트로피에 더 근접한 결과를 보인다.

Huffman coding은 AAC 등에, Arithmetic coding은 jpeg2k, h.264, AAC 등에 활용되고 있다.

3. Spatial 영역에서의 데이터는 어떤 위치에 얼마나 중요한 정보가 있는지를 나타낼 수 없지만 Transform을 통해 특정 위치에 중요한 정보를 위치시키는 것이 가능하다.

얘를 들어 Fourier/Cosain transform 등을 이용할 경우 저주파 성분에 대부분의 에너지를 집중 시킬 수 있고, wavelet을 사용할 경우 LL 성분에 대부분의 에너지가 모이게 된다.

4. 사람의 눈은 저주파 부분보다 고주파 부분에 민감하므로 Fourier/Cosain transform 등을 통해 도메인을 주파수 영역으로 전환시킨 뒤 저주파 영역은 여러 레벨로 quantization을 수행하고, 고주파 영역은 적은 레벨로 quantization을 수행할 경우 정보량을 줄이면서도 실제 주관적 화질에서는 큰 차이를 보이지 않게 만들 수 있다.

5. Inter frame correlation을 이용하기 위한 방법으로 motion estimation, motion compensation 등의 기법이 있으며, motion estimation을 통해 motion vector를 구하고, 앞에서 구한 motion vector를 이용 motion compensation을 수행하면 이전 프레임을 가지고 현재 프레임과 아주 유사한 프레임을 재구성해낼 수 있고, 이를 현재 프레임에서 빼줄 경우 정보량을 매우 많이 줄일 수 있다.

6. Fourier/Cosain transform을 수행한 뒤 quantization을 수행하게 되면 고주파 영역에는 0이 나올 확률이 아주 높아진다. 그렇기 때문에 Re-ordering을 수행하여 저주파->고주파 영역으로 값들을 정렬시키게 되면 특정 주파수 이후로는 0이란 값밖에 존재하질 않게 되고, 이 0들을 전부 보내기 보다는 N.C(Not coded)란 부호를 대신 보냄으로써 압축 효율을 증가시킬 수 있다.

7. 팩시밀리나 Reorder 된 transform coefficient들을 더 효율적으로 압축하기 위한 방법으로 Run Length Coding이란게 있으며, 0000011122222 같은 값을 Run Length Coding으로 압축하게 되면 051325 (값,반복된 횟수 형식)같은 식으로 표현된다.

이런 방식은 실제 RLE(BMP 압축 포멧), 비디오 코덱 등에 활용되고 있다.

CG: dithering

팩스에서 처럼 이미지를 흑/백 으로만 표현할 수 있는 경우에도 어느 정도의 명암을 표현하기 위한 방법으로 아래와 같은 오리지널 이미지가 있을 때…

한 픽셀 값은 0~255 사이의 값을 가진다고 하고, 128 이상의 값은 하얀 색으로, 128 미만 값은 검은 색으로 표현하면 결과는 다음과 같다.

보다시피 디테일은 거의 사라져버리기 때문에 이런 것을 피하기 위해 디더링이란 기법을 사용하곤 한다. 수식으로 이를 표현해보자면 다음과 같고…

말로 설명하자면 랜덤 값을 더해준 뒤 128 을 기준으로 Thresholding 을 한다! 정도로 표현이 가능할 듯… 이론적으론 매우 간단하지만 효과는 확실하다. -16~16 의 랜덤 값을 이용하여 dithering 한 결과는 다음과 같다.

-32~32 사이의 랜덤 값을 이용할 경우는…

확실히 좀 디테일이 조금 생겨나는 것을 확인할 수가 있다. 장비들이 좋아지면서 이런 식의 트릭들에 대한 연구는 사라져가는 것 같다. -_ㅠ

위 테스트에 사용한 코드:

학생분들은 이제 MS 개발툴을 무료로 사용할 수 있습니다.

컴퓨터 공학을 전공하다보면 실습을 해야할 일이 잦은데, 무료로 나와있는 편리한 개발툴이 많지 않다보니 불법 소프트웨어를 사용하는 일이 잦은 형편입니다. 아무래도 Visual Studio 등의 비싼 가격도 이런 현실에 한 몫해온 것이 사실이죠.

물론 Visual Studio Express Edition 이란 이름으로 MFC 등이 빠진 버젼을 학생들에게 무료 배포하곤 했지만, OpenGL 이라거나 MFC 등을 실습해야 하는 경우에는 이것으로 커버하기가 쉽지 않았던 것이 사실입니다.

하지만 대학생들에 한해서는 더 이상 불법 소프트웨어로 실습할 필요가 없어졌습니다.. Microsoft 에서 개발 툴들을 대학생들에 한해 무료 배포하기 시작했거든요.

http://www.microsoft.com/korea/msdn/dreamspark/index.aspx

위 URL 을 참고해보시면 알겠지만, Visual Studio 2005/2008 Professional Edition 에 국한되는 것이 아니라 Expression Studio 라거나 Windows Server 2008 Standard Edition, SQL Server 2008 Developer/Express Edition 까지 포함하고 있습니다. 용도에는 맞지는 않더라도 Windows Server 2008 를 사용하면 OS 마저 무료로 사용할 수 있겠습니다.

물론 우분투에서 gcc 와 eclipse, mysql 등을 사용하는 것도 좋은 선택일 수 있겠지만, 라이센스나 추가 비용을 걱정하지 않고 실습 할 수 있는 또 하나의 적법한 환경이 생겼다는 점은 상당히 고무적이네요.