[QTFF] Overview

JUNE·2021년 7월 22일
0

QTFF

목록 보기
2/3

QuickTime movie는 두가지 기본 구조를 사용하여 디스크에 저장된다

  • atoms(simple atoms or classic atoms 라고도 함)
  • QT atoms

QuickTime 파일 형식에서 마주하는(encounter) 대부분의 atoms는 simple or classic atoms이다.

simple atoms 와 QT atoms 둘 다 임의로 복잡한 계층적 데이터 구조를 구성할 수있다.

또한 두가지 atoms 모두 애플리케이션이 이해하지 못하는 데이터를 무시할 수 있다.


Media Description

QuickTime file은 미디어의 명세(description)을 미디어 데이터와 별도로 저장한다.

이 명세는 movie resource, movie atom 또는 단순히 moive라고 불리며, 트랙 수, 비디오 압축 포맷, 타이밍 정보(timing information)와 같은 정보들을 포함한다.

movie resource는 모든 미디어 데이터가 저장된 위치를 설명하는 인덱스도 포함한다.


Atoms

QuickTime file의 기본 데이터 단위이다.

각 atom은 다른 데이터들에 앞서, size와 type 필드를 포함한다.

size 필드는 size 필드와 type 필드를 포함한 해당 atom안의 전체 byte 수를 나타낸다.

type 필드는 atom에 저장된 데이터의 유형과 데이터의 format을 명세한다.

경우에따라, size, type 필드 뒤에 version 필드와 flag 필드가 나올 수 있다.

이런 version 필드와 flag 필드를 가진 atom을 full atom이라고 부르기도 한다.

Note: 여기서 설명하는 atom은 MPEG-4 와 Motion JPEG-2000의 box와 기능적으로 동일하다.
version, flag 필드를 포함하는 atom은 full box와 동일하다.

Atom 타입은 일반적으로 4문자 ASCII 코드로 해석되는 32bit unsigned integer로 지정된다.

Atom은 본질적으로 계층적이다. 즉, 한 atom은 다른 atom들을 포함할 수 있고, 포함된 원자는 또 다른 원자를 포함할 수 있다.

이 계층구조는 parent, children, siblings, grandchildren 등으로 설명되기도 한다.

다른 atom을 포함하는 atom을 container atom이라고 부르며, parent atom은 계층 구조에서 정확히 한단계 위에 있는 container atom이다.

예를 들어, 한 movie atom은 movie의 각 트랙마다 하나의 track atom을 포함하는 여러 종류의 atom을 담고있다. track atom은 각각 하나의 media atom을 다른 track의 특성을 정의하는 다른 atom들도 함께 담고있다.

movie atom은 track atom의 parent atom이다.
track atom들은 (서로) siblings이다.
track atom은 media atom의 parent atom이다.

다른 atom을 포함하지 않는 atom을 leaf atom 이라고 하며, 일반적으로 하나 이상의 필드나 테이블로써 데이터를 포함한다. 일부 leaf atom은 flag나 placeholder 역할을 하며, size와 type 필드 이외에는 어떠한 데이터도 포함하지 않는다.

주어진 atom 내에 저장된 데이터의 포맷이 atom의 type 필드만으로 항상 결정되지는 않는다.
parent atom의 type을 유의해야한다. 즉, 주어진 atom type은 parent atom에 따라 다른 종류의 정보를 포함할 수 있다.

모든 QuickTime file reader(이러한 구조를 따르는 MPEG-4도 마찬가지일듯)는 atom type뿐만 아니라, atom의 포함 계층도 고려해야한다.

Atom Layout


Figure 1-1 : 샘플 atom의 layout을 보여준다. 각 atom은 data 뿐만 아니라 자신의 size와 type 정보를 포함하고 있다. 이 문서 전체에서 container atom은 회색 상자로 표시되고, leaf atom은 흰색 상자로 표시된다. leaf atom은 일반적으로 테이블 형태의 데이터를 포함한다.

container atom안에 있는 atom들은 특별한 언급이 없는 한 특정한 순서대로 되어 있지 않아도 된다.

Atom Structure

Atom은 한 header로 구성되고, 그 다음에 atom data가 나온다.
헤더는 atom의 size, type 필드로 구성되며, 각 필드들은 byte로 표시한다. 또한 extended size 필드가 포함되어, 64bit 정수로 큰 사이즈의 atom을 지정할 수 있다. extended size 필드가 있는 경우, size 필드는 1로 설정된다. atom의 실제 크기는 8 byte보다 작을 수 없다.

full atom의 flag, version 필드는 atom 헤더의 일부로 처리되지 않는다 (해당 문서에서는)
이 필드들은 해당 필드를 포함하는 각 atom 유형에 특정한 data 필드로 처리된다. 이 필드들은 별도로 지정하지 않는한 항상 0으로 설정한다.

하나의 atom 헤더는 다음 필드들로 구성된다 .

Atom size

atom의 크기를 나타내는 32bit 정수.
해당 atom에 포함된 atom들과 atom의 헤더를 전부 포함한 크기를 나타낸다.
일반적으로 size 필드는 32bit unsigned int로 실제 크기(byte)가 포함된다.
그러나 atom size를 결정하는 대체 방법을 표시하는 특수한 값이 포함될 수 있다.
이런 특수 값은 일반적으로 미디어 데이터(mdat) 원자에 사용된다.

size 필드의 2개의 특수한 값이 있다.

  • 0: 최상위(top-level) atom에만 허용하며, 파일의 마지막 atom을 지정하고, 해당 atom이 파일 끝까지 확장됨을 나타낸다. (?????)

  • 1: 실제 크기는 type 필드 뒤에 오는 optional 64bit 필드인 extended size 필드에 지정된다. 2^32 바이트보다 많은 미디어 데이터 atom을 수용한다.

Type

atom의 type을 포함하는 32bit 정수이다.
이 필드는 니모닉 값을 가진 4문자 필드로 사용되는데, movie atoom은 'moov' (0x6D6F6F76), track atom은 'trak' (0x7672616B) 처럼 쓰이는데, ASCII가 아닌 값이 사용되기도 한다.(0x00000001)

atom의 type을 알면 데이터를 해석할 수 있다. 한 atom의 데이터는 field, table 또는 다른 atom들의 임의의 집합으로써 정렬될 수 있다. 데이터 구조는 atom type에 따라 다르며, 지정된(given) type의 atom은 정의된 데이터 구조를 가진다.

application에 알 수 없는 유형의 atom이 있는 경우, 해당 atom의 데이터를 해석하려고 하면 안된다. size 필드를 사용하여 해당 atom의 모든 내용을 건너뛰어야한다.

새로운 버전의 atom이 도입되면, 내부 구조가 바뀔 수 있다. version 필드가 있는 경우 항상 체크해야한다. size나 extended size 필드에 정의된 대로 atom 외부의 데이터를 해석하지 마라.

Extended Size

크기 필드를 1로 설정하면 type 필드 다음에 64bit extened size 필드가 나온다. 이 필드는 64bit unsigned int로 atom의 실제 크기가 포함된다.

미디어 데이터 atom의 크기가 2^32 byte를 초과할 때 사용된다.

size 필드에 실제 atom의 크기가 포함된 경우, extended 필드는 존재하지 않는다. 즉 데이터를 추가하여 atom을 수정했을 때 그 크기가 2^32 byte를 초과하는 경우 새 원자 크기를 기록할 extended size 필드가 존재하지 않는다.

따라서 새로운 atom에 내용을 복사하지 않고는 2^32 byte 이상으로 원자를 확장할 수 없다.

이런 불편함을 방지하기 위해 media data atom은 일반적으로 64bit placeholder atom을 동영상 파일 앞에 생성한다. placeholder atom은 kWideAtomPlaceholderType('wide') type을 가진다.

'free', 'skip' atom 처럼 'wide' atom은 예약 공간(reserved space)이다. 이 경우, 이 공간은 특정 목적을 위해 예약된다.

만약 wide atom이 두 번째 atom 바로 앞에 오는 경우, 두번째 atom은 헤더는 wide atom을 덮어쓰면서 8byte로 시작하고, size 필드를 1로 세팅하고, extended size 필드를 추가하며, 32bit에서 64bit로 확장된다. 이렇게 하면 sample data에 대한 offset 계산을 다시할 필요가 없어진다.

'wide' atom의 크기는 정확히 8byte이며, size와 type 필드만으로 구성되어 있다. 다른 데이터는 포함하지 않는다.

일반적인 오류는, 'wide' atom이 extened size를 포함하고 있다고 생각하는 것이다. wide atom은 extened size 필드를 포함하는 atom header에 의해 필요한 경우 overwritten 될뿐인 placeholder이다.

QT Atoms and Atom Containers

QT atom 은 simple atom을 사용할 때 발생하는 일부 모호성(ambiguities)을 제거하고, 보다 범용적인(general-purpose) 저장형식을 제공하는 데이터 구조이다.

QT atom은 확장된 헤더를 가지는데 size와 type 필드 뒤에 atom ID와 하위 atom의 개수가 나온다.

이렇게 하면 식별 번호를 통해 동일한 유형의 하위 atom을 여러개 지정할 수 있다. 또한 unknown type의 QT atom의 내용을 child atom의 트리를 따라가서(by walking) 분석할 수 있다.

QT atom은 일반적으로 lock count를 포함하는 헤더를 가진 data 구조인 atom container에 감싸여져 있다.

각 atom container는 정확히 하나의 root atom 즉 QT atom을 포함하고 있다.

atom container는 atom이 아니며, QuickTime movie file을 구성하는 atom 구조에서는 찾을 수 없다. 그러나 일부 atom 내부에서 데이터 구조로서 발견될 수 있다(found as.. )

예를 들어 media input map 과 media property atom 안에 포함된다.

atom container와 container atom은 다르다. atom container는 container 일 뿐, atom이 아니다.

위 그림은 QT atom의 레이아웃을 나타낸다. 각 QT atom은 QT atom container header로 시작하고, root atom으로 이어진다. root atom의 typedms QT atom의 type이다. root atom은 구조의 일부분인 다른 atom을 포함하고 있다.

각 container atom은 QT atom header로 시작되고, contents가 뒤이어 나온다.

contents는 child atom이거나 data인데, 둘 다 동시에 포함하지는 않는다. 만약 atom이 chidren을 포함한다면 children의 데이터와 descendants(자손)을 모두 포함한다.

root atom은 항상 존재하며, sibling 원자는 없다.

QT atom container header는 아래의 data들을 포함한다.

  • Reserved: 반드시 0으로 set 되어야하는 10 byte 원소
  • Lock count : 반드시 0으로 set 되어야하는 16 byte 원소

각 QT atom header는 아래의 data 들을 포함한다.

  • Size : 원자의 크기를 바이트 단위로 나타내는 32 bit 정수, 크기는 QT atom header와 atom의 contents의 크기를 포함한다. 해당 atom이 leaf atom인 경우, 이 필드는 single atom의 크기만 포함한다. Container atom의 크기는 포함된 모든 atom의 크기를 포함한다. size 필드와 child count 필드를 이용해서 atom tree를 따라 내려갈 수(walk) 있다.

  • Type : atom의 type을 담고 있는 32bit 정수. 만약 root atom인 경우, 이 type의 값은 'sean'이 된다.

  • Atom ID : atom의 ID값을 가지고 있는 32bit 정수. 이 값은 siblings들 사이에서 고유한 값이어야한다. root atom은 항상 id 값이 1이다.

  • Reserved: 항상 0으로 세팅된 16bit 정수

  • Child count: 한 atom에 포함된 child atom의 개수를 표현하는 16bit 정수. 이 count 는 바로 인근해있는 children의 개수를 포함한다. 만약 이 필드가 0으로 세팅되어있다면, 이 atom은 leaf atom이며, 오직 data만 포함하고 있다.

  • Reserved: 항상 0으로 세팅된 32bit 정수

QT Atom Containers

QuickTime atom container는 QuickTime에 정보를 저장하기 위한 기본적인 구조이다. 한 atom container는 QT atom의 트리 구조의 계층 형태이다. 새로 만든 QT atom container는 하위 항목이 없는 트리 구조의 root로 생각할 수 있다.

atom container는 atom이 아니라 container이다. 헤어에 reserved 필드와 lock count 필드를 가지고 있고, size 필드와 type 필드는 없습니다. Atom container는 atom이 아니기 때문에, QuickTime movie file의 atom 구조 안에서 찾을 수는 없다. 그러나 media input map, meida property atom, video effects sample data, twee sample data 같은 일부 atom의 내부 데이터로 찾을 수 있다.

한 QT atom container는 QT atom들을 포함한다. 각 QT atom은 data나 다른 atom을 포함한다. 만약 한 QT atom이 다른 atom을 포함한다면, 그것은 parent atom이고, 그 atom은 child atom을 포함한다. 각 parent atom의 child atom은 atom type가 atom ID로 유일하게 식별된다. data를 담고 있는 QT atom은 leaf atom이라고 불려진다.

각 QT atom은 QT atom container 내부에서 atom의 위치를 표시하는(describe) offset를 가지고 있다. 추가로 각 QT atom은 type과 ID를 가진다. atom type은 해당 atom이 나타내는 정보의 종류는 나타낸다. atom ID는 같은 parent에서 같은 type의 child atom들을 구별하기 위해 사용된다; 한 atom의 ID는 반드시 주어진 parent와 type에서 유일한 값을 가진다. atom ID 외에도, 각 atom은 같은 parent에서 같은 type을 가진 다른 child atom에 상대적인 순서를 나타내는 1-based index를 가진다. 하위의 방법으로 QT atom을 유일하게 구별할 수 있다:

  • QT atom container 안에서의 offset
  • parent atom에서 type과 index
  • parent atom에서 type과 ID

QT atom container 내에서 index나 ID 혹은 둘 다를 이용해서 저장하고 검색할 수 있다.

예를들어 dynamic array나 트리 구조로 QT atom container를 사용하려면, index로 저장하고 검색할 수 있다. database로 QT atom container를 사용하려면 ID 별로 저장하고 검색할 수 있다. 임의로 복잡하고 확장 가능한 데이터 구조를 사용하기 위해 ID와 index 둘 다를 사용하여 atom을 생성하고 저장하고 검색할 수있다.

QT atom은 데이터 구조로 offset(?)되므로, QT atom container에서 atom 삽입, 삭제같은 편집 연산을 하는 동안 변경될 수 있다. 한 atom에서 child atom들을 편집하는 것은 안전하지만 sibling이나 parent atom을 편집하면 해당 atom의 offset이 무효화된다.

Cross-platform을 위한 목적으로,QT atom의 모든 데이터는 Big-Endian 방식이어야 한다. 그러나 leaf data는 애플리케이션에서 custom 되는 경우, little-endian 방식이 될 수 있다.

위 그림에서 offset=10, 40 atom들만 데이터를 가지고 있기 때문에(?) leaf atom이 된다.
offset=30과 offset=40 atom은 같은 ID를 가지는데, type이 다르기 때문이다..? (sibling 사이에서 같은 유일 값을 가져야한다고 했던거같은데..) offset 10, 50 atom은 같은 id를 가지지만, parent가 다르기 때문에 괜찮다.

대부분의 QT atom function은 atom container와 atom container data structure를 이용해 특정 atom을 구별한다.


QuickTime Movie Files

QuickTime file format은 QuickTime movie file의 특성을 설명한다. QuickTime movie file은 QuickTime movie resource를 담고 있거나, movie reference를 사용해 하나 이상의 외부소스를 참조한다(point) moive에서 사용하는 media sample(video frame이나 audio sample)이 동영상 파일에 포함되거나, 하나 이상의 외부 file, stream 등의 source를 참조하고 있을 수 있다.

QuickTime movie는 video나 audio로만 제한되지 않는다. video, sound, still image, text, Flash, 3D model, VR panorama를 포함하여 QuickTime이 지원하는 미디어 유형의 subset이나 조합(combination)을 사용할 수 있다. time-based, nonlinear interactive media를 모두 지원한다.

filename extension(?)을 지원하는 파일 시스템에서는, QuickTime movie file이 .mov 확장명을 가져야한다. Macintosh platform에서는, QuickTime file은 'Moov'라는 확장명을 가진다. QuickTime movie file은 video 데이터를 담고 있지 않더라도 MIME type은 "video/quicktime"과 연결 되어야한다.(associated with)

출처 : https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html#//apple_ref/doc/uid/TP40000939-CH203-BBCGDDDF

profile
이것저것

0개의 댓글