@ -378,6 +378,15 @@ typedef struct MatroskaDemuxContext {
int bandwidth ;
} MatroskaDemuxContext ;
# define CHILD_OF(parent) { .def = { .n = parent } }
static const EbmlSyntax ebml_syntax [ ] , matroska_segment [ ] , matroska_track_video_color [ ] , matroska_track_video [ ] ,
matroska_track [ ] , matroska_track_encoding [ ] , matroska_track_encodings [ ] ,
matroska_track_combine_planes [ ] , matroska_track_operation [ ] , matroska_tracks [ ] ,
matroska_attachments [ ] , matroska_chapter_entry [ ] , matroska_chapter [ ] , matroska_chapters [ ] ,
matroska_index_entry [ ] , matroska_index [ ] , matroska_tag [ ] , matroska_tags [ ] , matroska_seekhead [ ] ,
matroska_blockadditions [ ] , matroska_blockgroup [ ] , matroska_cluster_parsing [ ] ;
static const EbmlSyntax ebml_header [ ] = {
{ EBML_ID_EBMLREADVERSION , EBML_UINT , 0 , offsetof ( Ebml , version ) , { . u = EBML_VERSION } } ,
{ EBML_ID_EBMLMAXSIZELENGTH , EBML_UINT , 0 , offsetof ( Ebml , max_size ) , { . u = 8 } } ,
@ -386,11 +395,12 @@ static const EbmlSyntax ebml_header[] = {
{ EBML_ID_DOCTYPEREADVERSION , EBML_UINT , 0 , offsetof ( Ebml , doctype_version ) , { . u = 1 } } ,
{ EBML_ID_EBMLVERSION , EBML_NONE } ,
{ EBML_ID_DOCTYPEVERSION , EBML_NONE } ,
{ 0 }
CHILD_OF ( ebml_syntax )
} ;
static const EbmlSyntax ebml_syntax [ ] = {
{ EBML_ID_HEADER , EBML_NEST , 0 , 0 , { . n = ebml_header } } ,
{ EBML_ID_HEADER , EBML_NEST , 0 , 0 , { . n = ebml_header } } ,
{ MATROSKA_ID_SEGMENT , EBML_STOP } ,
{ 0 }
} ;
@ -402,7 +412,7 @@ static const EbmlSyntax matroska_info[] = {
{ MATROSKA_ID_MUXINGAPP , EBML_UTF8 , 0 , offsetof ( MatroskaDemuxContext , muxingapp ) } ,
{ MATROSKA_ID_DATEUTC , EBML_BIN , 0 , offsetof ( MatroskaDemuxContext , date_utc ) } ,
{ MATROSKA_ID_SEGMENTUID , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_segment )
} ;
static const EbmlSyntax matroska_mastering_meta [ ] = {
@ -416,7 +426,7 @@ static const EbmlSyntax matroska_mastering_meta[] = {
{ MATROSKA_ID_VIDEOCOLOR_WHITEY , EBML_FLOAT , 0 , offsetof ( MatroskaMasteringMeta , white_y ) , { . f = - 1 } } ,
{ MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN , EBML_FLOAT , 0 , offsetof ( MatroskaMasteringMeta , min_luminance ) , { . f = - 1 } } ,
{ MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX , EBML_FLOAT , 0 , offsetof ( MatroskaMasteringMeta , max_luminance ) , { . f = - 1 } } ,
{ 0 }
CHILD_OF ( matroska_track_video_color )
} ;
static const EbmlSyntax matroska_track_video_color [ ] = {
@ -434,7 +444,7 @@ static const EbmlSyntax matroska_track_video_color[] = {
{ MATROSKA_ID_VIDEOCOLORMAXCLL , EBML_UINT , 0 , offsetof ( MatroskaTrackVideoColor , max_cll ) , { . u = 0 } } ,
{ MATROSKA_ID_VIDEOCOLORMAXFALL , EBML_UINT , 0 , offsetof ( MatroskaTrackVideoColor , max_fall ) , { . u = 0 } } ,
{ MATROSKA_ID_VIDEOCOLORMASTERINGMETA , EBML_NEST , 0 , offsetof ( MatroskaTrackVideoColor , mastering_meta ) , { . n = matroska_mastering_meta } } ,
{ 0 }
CHILD_OF ( matroska_track_video )
} ;
static const EbmlSyntax matroska_track_video_projection [ ] = {
@ -443,7 +453,7 @@ static const EbmlSyntax matroska_track_video_projection[] = {
{ MATROSKA_ID_VIDEOPROJECTIONPOSEYAW , EBML_FLOAT , 0 , offsetof ( MatroskaTrackVideoProjection , yaw ) , { . f = 0.0 } } ,
{ MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH , EBML_FLOAT , 0 , offsetof ( MatroskaTrackVideoProjection , pitch ) , { . f = 0.0 } } ,
{ MATROSKA_ID_VIDEOPROJECTIONPOSEROLL , EBML_FLOAT , 0 , offsetof ( MatroskaTrackVideoProjection , roll ) , { . f = 0.0 } } ,
{ 0 }
CHILD_OF ( matroska_track_video )
} ;
static const EbmlSyntax matroska_track_video [ ] = {
@ -465,7 +475,7 @@ static const EbmlSyntax matroska_track_video[] = {
{ MATROSKA_ID_VIDEOFIELDORDER , EBML_UINT , 0 , offsetof ( MatroskaTrackVideo , field_order ) , { . u = MATROSKA_VIDEO_FIELDORDER_UNDETERMINED } } ,
{ MATROSKA_ID_VIDEOSTEREOMODE , EBML_UINT , 0 , offsetof ( MatroskaTrackVideo , stereo_mode ) , { . u = MATROSKA_VIDEO_STEREOMODE_TYPE_NB } } ,
{ MATROSKA_ID_VIDEOASPECTRATIO , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_track )
} ;
static const EbmlSyntax matroska_track_audio [ ] = {
@ -473,13 +483,13 @@ static const EbmlSyntax matroska_track_audio[] = {
{ MATROSKA_ID_AUDIOOUTSAMPLINGFREQ , EBML_FLOAT , 0 , offsetof ( MatroskaTrackAudio , out_samplerate ) } ,
{ MATROSKA_ID_AUDIOBITDEPTH , EBML_UINT , 0 , offsetof ( MatroskaTrackAudio , bitdepth ) } ,
{ MATROSKA_ID_AUDIOCHANNELS , EBML_UINT , 0 , offsetof ( MatroskaTrackAudio , channels ) , { . u = 1 } } ,
{ 0 }
CHILD_OF ( matroska_track )
} ;
static const EbmlSyntax matroska_track_encoding_compression [ ] = {
{ MATROSKA_ID_ENCODINGCOMPALGO , EBML_UINT , 0 , offsetof ( MatroskaTrackCompression , algo ) , { . u = 0 } } ,
{ MATROSKA_ID_ENCODINGCOMPSETTINGS , EBML_BIN , 0 , offsetof ( MatroskaTrackCompression , settings ) } ,
{ 0 }
CHILD_OF ( matroska_track_encoding )
} ;
static const EbmlSyntax matroska_track_encoding_encryption [ ] = {
@ -490,7 +500,7 @@ static const EbmlSyntax matroska_track_encoding_encryption[] = {
{ MATROSKA_ID_ENCODINGSIGHASHALGO , EBML_NONE } ,
{ MATROSKA_ID_ENCODINGSIGKEYID , EBML_NONE } ,
{ MATROSKA_ID_ENCODINGSIGNATURE , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_track_encoding )
} ;
static const EbmlSyntax matroska_track_encoding [ ] = {
{ MATROSKA_ID_ENCODINGSCOPE , EBML_UINT , 0 , offsetof ( MatroskaTrackEncoding , scope ) , { . u = 1 } } ,
@ -498,28 +508,28 @@ static const EbmlSyntax matroska_track_encoding[] = {
{ MATROSKA_ID_ENCODINGCOMPRESSION , EBML_NEST , 0 , offsetof ( MatroskaTrackEncoding , compression ) , { . n = matroska_track_encoding_compression } } ,
{ MATROSKA_ID_ENCODINGENCRYPTION , EBML_NEST , 0 , offsetof ( MatroskaTrackEncoding , encryption ) , { . n = matroska_track_encoding_encryption } } ,
{ MATROSKA_ID_ENCODINGORDER , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_track_encodings )
} ;
static const EbmlSyntax matroska_track_encodings [ ] = {
{ MATROSKA_ID_TRACKCONTENTENCODING , EBML_NEST , sizeof ( MatroskaTrackEncoding ) , offsetof ( MatroskaTrack , encodings ) , { . n = matroska_track_encoding } } ,
{ 0 }
CHILD_OF ( matroska_track )
} ;
static const EbmlSyntax matroska_track_plane [ ] = {
{ MATROSKA_ID_TRACKPLANEUID , EBML_UINT , 0 , offsetof ( MatroskaTrackPlane , uid ) } ,
{ MATROSKA_ID_TRACKPLANETYPE , EBML_UINT , 0 , offsetof ( MatroskaTrackPlane , type ) } ,
{ 0 }
CHILD_OF ( matroska_track_combine_planes )
} ;
static const EbmlSyntax matroska_track_combine_planes [ ] = {
{ MATROSKA_ID_TRACKPLANE , EBML_NEST , sizeof ( MatroskaTrackPlane ) , offsetof ( MatroskaTrackOperation , combine_planes ) , { . n = matroska_track_plane } } ,
{ 0 }
CHILD_OF ( matroska_track_operation )
} ;
static const EbmlSyntax matroska_track_operation [ ] = {
{ MATROSKA_ID_TRACKCOMBINEPLANES , EBML_NEST , 0 , 0 , { . n = matroska_track_combine_planes } } ,
{ 0 }
CHILD_OF ( matroska_track )
} ;
static const EbmlSyntax matroska_track [ ] = {
@ -549,12 +559,12 @@ static const EbmlSyntax matroska_track[] = {
{ MATROSKA_ID_CODECDOWNLOADURL , EBML_NONE } ,
{ MATROSKA_ID_TRACKMINCACHE , EBML_NONE } ,
{ MATROSKA_ID_TRACKMAXCACHE , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_tracks )
} ;
static const EbmlSyntax matroska_tracks [ ] = {
{ MATROSKA_ID_TRACKENTRY , EBML_NEST , sizeof ( MatroskaTrack ) , offsetof ( MatroskaDemuxContext , tracks ) , { . n = matroska_track } } ,
{ 0 }
CHILD_OF ( matroska_segment )
} ;
static const EbmlSyntax matroska_attachment [ ] = {
@ -563,19 +573,19 @@ static const EbmlSyntax matroska_attachment[] = {
{ MATROSKA_ID_FILEMIMETYPE , EBML_STR , 0 , offsetof ( MatroskaAttachment , mime ) } ,
{ MATROSKA_ID_FILEDATA , EBML_BIN , 0 , offsetof ( MatroskaAttachment , bin ) } ,
{ MATROSKA_ID_FILEDESC , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_attachments )
} ;
static const EbmlSyntax matroska_attachments [ ] = {
{ MATROSKA_ID_ATTACHEDFILE , EBML_NEST , sizeof ( MatroskaAttachment ) , offsetof ( MatroskaDemuxContext , attachments ) , { . n = matroska_attachment } } ,
{ 0 }
CHILD_OF ( matroska_segment )
} ;
static const EbmlSyntax matroska_chapter_display [ ] = {
{ MATROSKA_ID_CHAPSTRING , EBML_UTF8 , 0 , offsetof ( MatroskaChapter , title ) } ,
{ MATROSKA_ID_CHAPLANG , EBML_NONE } ,
{ MATROSKA_ID_CHAPCOUNTRY , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_chapter_entry )
} ;
static const EbmlSyntax matroska_chapter_entry [ ] = {
@ -587,7 +597,7 @@ static const EbmlSyntax matroska_chapter_entry[] = {
{ MATROSKA_ID_CHAPTERFLAGENABLED , EBML_NONE } ,
{ MATROSKA_ID_CHAPTERPHYSEQUIV , EBML_NONE } ,
{ MATROSKA_ID_CHAPTERATOM , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_chapter )
} ;
static const EbmlSyntax matroska_chapter [ ] = {
@ -596,12 +606,12 @@ static const EbmlSyntax matroska_chapter[] = {
{ MATROSKA_ID_EDITIONFLAGHIDDEN , EBML_NONE } ,
{ MATROSKA_ID_EDITIONFLAGDEFAULT , EBML_NONE } ,
{ MATROSKA_ID_EDITIONFLAGORDERED , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_chapters )
} ;
static const EbmlSyntax matroska_chapters [ ] = {
{ MATROSKA_ID_EDITIONENTRY , EBML_NEST , 0 , 0 , { . n = matroska_chapter } } ,
{ 0 }
CHILD_OF ( matroska_segment )
} ;
static const EbmlSyntax matroska_index_pos [ ] = {
@ -610,18 +620,18 @@ static const EbmlSyntax matroska_index_pos[] = {
{ MATROSKA_ID_CUERELATIVEPOSITION , EBML_NONE } ,
{ MATROSKA_ID_CUEDURATION , EBML_NONE } ,
{ MATROSKA_ID_CUEBLOCKNUMBER , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_index_entry )
} ;
static const EbmlSyntax matroska_index_entry [ ] = {
{ MATROSKA_ID_CUETIME , EBML_UINT , 0 , offsetof ( MatroskaIndex , time ) } ,
{ MATROSKA_ID_CUETRACKPOSITION , EBML_NEST , sizeof ( MatroskaIndexPos ) , offsetof ( MatroskaIndex , pos ) , { . n = matroska_index_pos } } ,
{ 0 }
CHILD_OF ( matroska_index )
} ;
static const EbmlSyntax matroska_index [ ] = {
{ MATROSKA_ID_POINTENTRY , EBML_NEST , sizeof ( MatroskaIndex ) , offsetof ( MatroskaDemuxContext , index ) , { . n = matroska_index_entry } } ,
{ 0 }
CHILD_OF ( matroska_segment )
} ;
static const EbmlSyntax matroska_simpletag [ ] = {
@ -631,7 +641,7 @@ static const EbmlSyntax matroska_simpletag[] = {
{ MATROSKA_ID_TAGDEFAULT , EBML_UINT , 0 , offsetof ( MatroskaTag , def ) } ,
{ MATROSKA_ID_TAGDEFAULT_BUG , EBML_UINT , 0 , offsetof ( MatroskaTag , def ) } ,
{ MATROSKA_ID_SIMPLETAG , EBML_NEST , sizeof ( MatroskaTag ) , offsetof ( MatroskaTag , sub ) , { . n = matroska_simpletag } } ,
{ 0 }
CHILD_OF ( matroska_tag )
} ;
static const EbmlSyntax matroska_tagtargets [ ] = {
@ -640,29 +650,29 @@ static const EbmlSyntax matroska_tagtargets[] = {
{ MATROSKA_ID_TAGTARGETS_TRACKUID , EBML_UINT , 0 , offsetof ( MatroskaTagTarget , trackuid ) } ,
{ MATROSKA_ID_TAGTARGETS_CHAPTERUID , EBML_UINT , 0 , offsetof ( MatroskaTagTarget , chapteruid ) } ,
{ MATROSKA_ID_TAGTARGETS_ATTACHUID , EBML_UINT , 0 , offsetof ( MatroskaTagTarget , attachuid ) } ,
{ 0 }
CHILD_OF ( matroska_tag )
} ;
static const EbmlSyntax matroska_tag [ ] = {
{ MATROSKA_ID_SIMPLETAG , EBML_NEST , sizeof ( MatroskaTag ) , offsetof ( MatroskaTags , tag ) , { . n = matroska_simpletag } } ,
{ MATROSKA_ID_TAGTARGETS , EBML_NEST , 0 , offsetof ( MatroskaTags , target ) , { . n = matroska_tagtargets } } ,
{ 0 }
CHILD_OF ( matroska_tags )
} ;
static const EbmlSyntax matroska_tags [ ] = {
{ MATROSKA_ID_TAG , EBML_NEST , sizeof ( MatroskaTags ) , offsetof ( MatroskaDemuxContext , tags ) , { . n = matroska_tag } } ,
{ 0 }
CHILD_OF ( matroska_segment )
} ;
static const EbmlSyntax matroska_seekhead_entry [ ] = {
{ MATROSKA_ID_SEEKID , EBML_UINT , 0 , offsetof ( MatroskaSeekhead , id ) } ,
{ MATROSKA_ID_SEEKPOSITION , EBML_UINT , 0 , offsetof ( MatroskaSeekhead , pos ) , { . u = - 1 } } ,
{ 0 }
CHILD_OF ( matroska_seekhead )
} ;
static const EbmlSyntax matroska_seekhead [ ] = {
{ MATROSKA_ID_SEEKENTRY , EBML_NEST , sizeof ( MatroskaSeekhead ) , offsetof ( MatroskaDemuxContext , seekhead ) , { . n = matroska_seekhead_entry } } ,
{ 0 }
CHILD_OF ( matroska_segment )
} ;
static const EbmlSyntax matroska_segment [ ] = {
@ -674,7 +684,7 @@ static const EbmlSyntax matroska_segment[] = {
{ MATROSKA_ID_TAGS , EBML_LEVEL1 , 0 , 0 , { . n = matroska_tags } } ,
{ MATROSKA_ID_SEEKHEAD , EBML_LEVEL1 , 0 , 0 , { . n = matroska_seekhead } } ,
{ MATROSKA_ID_CLUSTER , EBML_STOP } ,
{ 0 }
{ 0 } /* We don't want to go back to level 0, so don't add the parent. */
} ;
static const EbmlSyntax matroska_segments [ ] = {
@ -685,12 +695,12 @@ static const EbmlSyntax matroska_segments[] = {
static const EbmlSyntax matroska_blockmore [ ] = {
{ MATROSKA_ID_BLOCKADDID , EBML_UINT , 0 , offsetof ( MatroskaBlock , additional_id ) } ,
{ MATROSKA_ID_BLOCKADDITIONAL , EBML_BIN , 0 , offsetof ( MatroskaBlock , additional ) } ,
{ 0 }
CHILD_OF ( matroska_blockadditions )
} ;
static const EbmlSyntax matroska_blockadditions [ ] = {
{ MATROSKA_ID_BLOCKMORE , EBML_NEST , 0 , 0 , { . n = matroska_blockmore } } ,
{ 0 }
CHILD_OF ( matroska_blockgroup )
} ;
static const EbmlSyntax matroska_blockgroup [ ] = {
@ -701,7 +711,7 @@ static const EbmlSyntax matroska_blockgroup[] = {
{ MATROSKA_ID_BLOCKREFERENCE , EBML_SINT , 0 , offsetof ( MatroskaBlock , reference ) , { . i = INT64_MIN } } ,
{ MATROSKA_ID_CODECSTATE , EBML_NONE } ,
{ 1 , EBML_UINT , 0 , offsetof ( MatroskaBlock , non_simple ) , { . u = 1 } } ,
{ 0 }
CHILD_OF ( matroska_cluster_parsing )
} ;
static const EbmlSyntax matroska_cluster_parsing [ ] = {
@ -715,7 +725,7 @@ static const EbmlSyntax matroska_cluster_parsing[] = {
{ MATROSKA_ID_TAGS , EBML_NONE } ,
{ MATROSKA_ID_SEEKHEAD , EBML_NONE } ,
{ MATROSKA_ID_CLUSTER , EBML_STOP } ,
{ 0 }
{ 0 } /* We don't want to go back to level 0, so don't add the parent. */
} ;
static const EbmlSyntax matroska_cluster [ ] = {
@ -724,7 +734,7 @@ static const EbmlSyntax matroska_cluster[] = {
{ MATROSKA_ID_SIMPLEBLOCK , EBML_STOP } ,
{ MATROSKA_ID_CLUSTERPOSITION , EBML_NONE } ,
{ MATROSKA_ID_CLUSTERPREVSIZE , EBML_NONE } ,
{ 0 }
CHILD_OF ( matroska_segment )
} ;
static const EbmlSyntax matroska_clusters [ ] = {
@ -733,8 +743,9 @@ static const EbmlSyntax matroska_clusters[] = {
{ MATROSKA_ID_CUES , EBML_NONE } ,
{ MATROSKA_ID_TAGS , EBML_NONE } ,
{ MATROSKA_ID_SEEKHEAD , EBML_NONE } ,
{ 0 }
{ 0 } /* We don't want to go back to level 0, so don't add the parent. */
} ;
# undef CHILD_OF
static const char * const matroska_doctypes [ ] = { " matroska " , " webm " } ;