비트필드, 엔디안, MP3 프레임 헤더

@codemaru · August 25, 2007 · 7 min read

얼마전 소리통을 만들고 거기에 음악방송 기능을 추가하면 좋겠다는 생각이 들었습니다. 그래서 ShoutCAST 소스 필터를 찾아보았는데 찾기가 쉽지 않더군요. 물론 코덱팩에 들어있는 필터는 많은데 저는 별도의 코덱을 설치하지 않아도 들을 수 있게 하고 싶었습니다. 그냥 exe에 집어넣을 수 있게 소스가 있으면 좋겠다 싶었죠.

네트를 방황하던 끝에 ShoutCAST 소스 필터를 찾을 수 있었습니다. MPEG-1 Stream Splitter 필터에 연결해서 사용할 수 있는 소스 필터였습니다. 필터 소스를 분리해서 연결하니 음악 방송이 솔솔 흘러오더군요. 음. 다했네 라고 잠시 생각했습니다. 그런데 헉.. 아주 사소한 문제가 있었습니다. 바로 탐색이죠. 로컬 파일 같은 경우는 앞뒤로 이동이 되는데 음악 방송같은 경우는 원칙적으로 탐색이 불가능합니다. 그런데 이 놈은 MPEG-1 Stream Splitter에 연결해서 쓰는 놈이라 그런지 탐색이 되는 것이었죠. 탐색이 되는건 아니고 단지 되는 척만 하는 것이었죠. 물론 UI에서 체크해서 비활성화 시키면 되지만 비겁한 방법이란 생각이 들더군요.

그래서 MP3를 분석해서 직접 ShoutCAST 푸시 소스 필터를 만들어야 겠다고 생각을 했습니다. MP3 프레임 헤더는 정말 간단한 4바이트 구조로 이루어져 있습니다. 프레임 헤더 구조가 궁금하신 분은 다음 페이지를 참고하세요. http://www.dv.co.yu/mpgscript/mpeghdr.htm

4바이트 심플한데 비트가 홀수로 쪼개져서 조금 귀찮아 보이죠. 전 저걸 보고 겁없이 비트필드를 만들었답니다. 보는 순간 이건 나에게 비트필드를 만드라고 지시하는 것 같았죠. 그 날 전 하루 죈장 삽질했습니다. 제가 삽질했던 이유는 비트필드의 메모리 레이아웃을 제대로 몰랐고, 엔디안을 정확하게 판단하지 않았던 것 입니다. 파일에 저장된 4바이트는 빅엔디안 순서로 저장되어 있고, VC++의 비트필드는 리틀 엔디안과 같이 뒤에서 부터 비트를 채우는 형태더군요(http://msdn2.microsoft.com/en-us/library/ms858673.aspx 참고). 결국 작업을 하긴 했지만 굉장히 힘든 과정이었습니다. 단지 4바이트 분석하는것이. ㅠㅠ

아래는 비트필드에 관한 자료를 찾던 중 발견한 재미난 내용입니다.

첫 번째 링크는 뉴스그룹에서 비트필드에 관한 논쟁입니다.
베커 아저씨와 mlimber 아저씨의 논쟁인데 둘의 입장이 첨예하게 대립됩니다.

mlimber 아저씨는 비트필드 따위를 버려라.
임플멘테이션 디펜던트하기 때문에 플랫폼이 바뀌면 쪼다된다.
비트스트림을 추상화한 클래스를 사용해라. 라는게 주된 주장입니다.

베커 아저씨는 좀 더 현실적인데요.
비트필드가 어울리는데는 그걸 사용하는게 옳다.
사실 템플릿메타 프로그래밍으로 비트 스트림 클래스를 만드는 것보다,
다른 플랫폼에서는 거기 알맞은 비트필드로 고쳐주는 것이 옳다. 라는게 주장입니다.

두 번째 링크는 mlimber 아저씨가 참고하라고 올려준 비트 스트림 클래스입니다.
자세히 읽지는 않았지만 재미난 내용인 것 같아요.

뉴스 그룹 스레드
비트필드를 예술로 승화시킨 사나이

재미난 논쟁인데 여러분은 어떤 입장인가요? 이번달 마소 플러스에도 이와 관련된 내용을 하나 연재했는데, 저는 베커 아저씨한테 손을 들어주고 싶습니다. 왜냐하면 일반적으로 회사에서 개발하는 제품은 특정 플랫폼에서 동작하는 경우가 대부분이기 때문이죠. 멀티플랫폼을 생각하더라도 베커 아저씨 말처럼 비트필드를 스왑하는 작업은 그다지 큰 힘도 어려운 일도 아닙니다. 과거 수많은 소프트웨어들이 그런 식으로 포팅되어 왔구요. 물론 잘 만들어진 비트스트림 클래스가 있다면 사용하는 것이 바람직하겠지만 없는걸 굳이 만들어가면서 까지 시간을 소비할 필요는 없을것 같다는게 제 생각입니다. 또한 템플릿 메타 프로그래밍을 해본 사람이라면 알겠지만 쉬이 접근할 곳이 아니죠.


한참 전에 썼던 글인데 아직도 ShoutCAST 푸시 소스 필터는 만들지 못했습니다. 요즘은 회사일이 조금 바빠서 그 코드 보는 일만으로도 힘이 드는군요. 저런건 또 재미 붙었을때 만들어야 하는데 타이밍 놓치면 다시 만들라면 좀 그렇더라고요. 하지만 언젠가는 ShoutCAST 기능을 붙일 겁니다. *^^* 언젠가는 다시 재밌어 지겠죠. ~~

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중