QuickTime reference movie에 대하여

QuickTime은 그동안 Reference Movie라는 것을 제공해 왔다.
Reference Movie라는 것은, 예를 들어 Movie file A가 있을때, 그 안에는 실제로 영상이나 소리와 같은 데이터가 있지 않고, 그 파일 외부에 별로도, 영상과 소리 데이터를 가지고 있는 파일(들)을 가르치는 pointer(reference)만 있는 것을 의미한다. 물론 영상 데이터는 내부에 있는데, 소리 데이터만 외부에 있는 경우도 reference movie라고 할 수있다.

그런데, 이 reference movie는 프로그래머 입장에서 볼 때, 그 구성이 다양할 수있다.
이를 알아보려면 movie 파일과 QTMovie 혹은 Movie로 표현되는 audio/visual data를 포함할 수있는, container 구조의 atom, 그리고 실제 audio/visual data (이를 essence라고 한다)에 대한 이해가 필요하다.

movie file은 말 그대로, 동영상 파일이다. 디스크에 특정한 포맷으로 저장이 된다.
QTMovie/Movie는 movie file 속에서 실제로 audio/visual 데이터나 외부 파일에 대한 reference, QuickTime VR, sprite 혹은 (이젠 deprecated되었지만) QuickDraw 3D와 같은 비 시간적 데이터들, 그리고 자막이나 timecode와 같은 다양한 media를 포함하는 최상위 data structure이다.

QuickTime은 파일속에 QTMovie/Movie가 있고, 그 속에 QTTrack/Track으로 대변되는 트랙들, 그리고 각 트랙위에 QTMedia/Media로 대변되는 미디어가, 그리고 각 미디어 속에는 실제 data sample들이 있다.

여기서 File부터 Media까지는 이해가 될텐데, 미디어와 실제 data sample의 차이는 무엇이냐 싶을 것이다.
Video tape과 같은 실제 물리적 장비(?)를 보면, 그 안에 어떻게든 여러개의 트랙 (이를테면 복수개의 영상 트랙/오디오 트랙)들이 있을테고,각 트랙에 비디오나 오디오 데이터가 저장된다.
그러므로 쉽게 생각하면 Track까지는 이해가 쉽게 되고, 그냥 Track위에 audio/video 데이터들을 얹을 수있게 만들면 되지 않겠나 싶은데, 이게 생각보다 한 층의 레이어가 더 필요하다.
예를 들어 한 트랙에 오디오 데이터를 얹는다 하자. 오디오 데이터의 특정한 형식이 필요할 것이다. 그럼 그런 것을 받아들이게 만든 track의 데이터 스트럭쳐가 다른 데이터 형도 쉽게 받아들일 수있을 까? 즉 비디오 데이터를 받아들일까?
아. 물론 받아 들이게 만들 수는 있다. 하지만 점점 어떤 체계가 잘 잡힌 모양은 무너지기 시작할 것이다.

여기에 더 생각해보자. 자막을 넣는다면? 타임 코드를 넣는다면? 혹은 비 시간적 데이터들, 예를 들어 sprite를 넣는다면?
( 93년쯤이었던 것으로 기억한다. Apple의 샘플 QuickTime 영상 중에는 동영상 내에 sprite가 들어가서, 일종의 갤라거 비디오 게임처럼, 움직이는 동화상을 배경으로 비행기였던가 공이었던가가 왔다 갔다 하는, 그리고 그 물체를 키보드론가 조작이 가능했던 것이 있었던 것으로 기억한다)

아.. 굉장히 복잡해진다. 어떻게 데이터 구조와 알고리즘의 일관성을 유지하면서 이런 다양한 미디어를 트랙에 잡아 넣을까?
여전히 잘 이해가 되지 않는 부분이다.
실제로 2000년 쯤이었나? 1999년이었나. 광주 KAIST에서 MPEG-4의 의장이었던 프랑스 사람인가가 와서, 그때 MPEG-4의 표준이 막 정해지고 나서, MPEG-4가 어떤 것을 지향하고 어떻게 바뀔 것인지 등에 대해서 설명을 해주었던 session이라고 할까 conference라고 할까에 갔었다. (KAIST 학생들은 이런게 부럽다. 질 좋은, 그 현장에서의 실제 관련된 사람들이 방문해서 설명해 주니까. 물론 막상 참여해서 내용을 들으면 그 내용이 별거 아닐 수도 있다. 하지만 그런 기회를 갖느냐 안갖느냐 자체가 의미가 상당하다.)
거기서 MPEG-4를 연구하시던 교수님 두어분이 질문을 했는데, 어떻게 MPEG-4가 비 시간적 데이터를 시간적 데이터와 같이 한 파일에서 처리할 수있느냐는 것이었다. 지금은 MPEG-4가 그때에 비해서 많이 퇴색한 것 같다. 사실 최근까지 Simple Profile만 이용을 해 왔고, 최근 들어와서야 advanced codec인 AVC / H.264를 본격적으로 사용하니까. 근데 MPEG-4는 그 이외에도 지향하는 여러가지가 있다.
예를 들어, 변하지 않는 배경은 한번만 인코딩하고, 그 위에서 움직이는 사물들만 감지를 해서, 그들만 encoding하고 decoding한다던가, 비시간적 데이터를 시간적 데이터와 같이 표현을 한다던가. ) MPEG-4로 이루려고 하던 상당수를 이미 QuickTime은 하고 있었다.
자막도 검색이 가능해서, 영화를 보다가 이런 저런 대화가 나오는 부분을 키보드로 검색할 수있었다.
이런 식으로 QuickTime은 굉장히 다양한 앞선 기술을 90년대 초에 이미 지원을 하고 있었지만, 그때는 Apple이 바야흐로 암흑기로 들어가고 고생을 하기 시작하던 때라, 그다지 사람들에게 (일반인)는 appeal하지 못했던 것으로 안다. 이때가 Bill Gates가 Apple에게 AVI 포기할테니 QuickTime 내놔라라고 협박하던 때다.

사족이 길었는데, 자.. 이렇게 다양한 미디어를 표현하려면 그 데이터를 바로 트랙위에 싣는 디자인으로 갈까 아니면 일종의 adaptor 데이터 구조를 만들어서 넣을까? QuckTime은 후자의 것을 선택했다. (물론 내가 QuickTime의 소스코드를 본 것은 아니다. 하지만 구조를 보면 그것을 짐작할 수있다.)
내가 볼때 그 adaptor 역할을 하는 것이 Media data structure이고, QTKit에서는 이것을 QTMedia로 표현한다.
그래서 Track위에 오디오/비디오 데이터가 바로 올라가는게 아니라 Media란 것이 올라간다. 그리고 그 Media 안에 바야흐로 실제의 데이터들이 올라간다. 그리고 그 실제의 데이터들을 QuickTime에서는 data sample이라고 부른다.

<Fig.1> QuickTime structure

이 정도만 알면 일단 QuickTime 구조체의 대략적인 면은 훑은 거라고 할 수있다.
이제 본래의 주제로 돌아와서, Reference Movie를 살펴보자.
앞에서 잠시 말했듯이 Reference Movie라고 하면, 실제의 데이터는 다른 파일에 있고, reference movie 자체는 그 외부 파일에 대한 reference만을 가지고 있다고 했다. 그런데 여기서 잠시 생각을 해보면, 어떤 부분이 reference가 되느냐가 다를 수가 있다.
즉 audio/video 데이터가 고스란히 들어있는, Movie 파일을 위한 부분은 아닌 QTMovie/Movie만을 의미하는 부분이 외부 파일로 있고, Reference Movie file은 그 외부 파일을 pointing할 수가 있다. 그 QTMovie/Movie 만을 의미하는 부분은 CreateMovieStorage()로 만들어질 수있다. ( <Fig.2>에서 볼 수있듯이, movie 파일이 movie data structure를 가지고 외부의 데이터 파일을 참조하는 것은, QuickTime에서는 그냥 movie file이라고 불리지, reference movie file이라고 불리지 않는다. 단지 외부 파일을 reference한다고 reference movie는 아니라는 것이다. 현재까지 내가 했던 프로젝트에서, 내가 현재 있는 회사의 사람들은 두번째의 경우를 reference movie라고 부르는데, “의미상” 그렇다는 것으로 이해해야지, QuickTime에서 정의된 “정의”는 아닌 것이다. 회사에서 일하다보면 이런 것을 조심해야 한다. 기존에 하던 사람들이 설명을 해 줄때, 기술적인 부분을 잘못 기술할 수있고 그것이 헷갈리게 할 수있다. )

<Fig.2> Classification of Movie Files

이 부분에 대해서는 QTKitCreateMovie라는 샘플 프로젝트의 quicktimeMovieFromTempFile 메시지를 보면 어떻게 만들어지고 사용되는지 볼 수있다. 이 QTKitCreateMovie라는 샘플에서는 tmp 디렉토리에 Movie만을 저장하는 임시 파일을 만들어서 Reference Movie가 그것을 referencing하게 되어 있다. 그리고 flattenToFilePath라는 메시지를 보면 저장시에 flatten을 할지 말지를 정해 줄 수가 있다.
flat하게 만드는 것은 movie file을 self-contained movie로 만드는, 즉 reference movie의 반대로 만드는 것이다.
여기서 flatten을 하도록 소스를 바꾸면, 생성되는 QuickTime movie file은 더 이상 그 임시의 파일을 reference하지 않고 그 자체에 모든 데이터를 저장한다.

자. 생각을 해보자. flatten을 하지 않은 상태에서, 정지 사진을 movie에 import하면 어떻게 될까?

 

<Fig.3> A reference movie pointing to an external file with "Movie" structure which refers external files

 

<Fig.4> A reference movie pointing to an external file with "movie" structure and embedded media data

위와 같은 두 가지의 형태가 될 수있다.
그런데 flattening하는 것은 movie를 self-contained movie로 바꾸어 주는 것을 의미하는데, <Fig.3>의 경우엔 실제 미디어를 가지고 있는 파일까지 movie 파일 내부로 가지고 오는 것일까? 아니면, movie 구조를 포함한 파일을 movie file로 짚어 넣는 것일까?실제로 해보면 양쪽 다하는 것을 알 수있다. 그렇다면 각각의 형태는 어떻게 만들어야 할까?

문제는 어떻게 하느냐에 따라 달라진다.

여기에 대해서는 다음 포스트에서 알아보기로 하자. (이 포스트도 너무 길고, 이젠 좀 자야겠다)

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: