X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fmkv%2Fmatroska_segment_parse.cpp;h=f756cd338d7592be3ea09336f89bf4c08efd42ad;hb=d91338c6f6a68601f9eedaa5d95dac749f6281f7;hp=28442e2568b91bf9dd917839d5afe5bf3fe6d464;hpb=a4cc75569bca5fd1ab774dc5f660f90fd6469b90;p=vlc diff --git a/modules/demux/mkv/matroska_segment_parse.cpp b/modules/demux/mkv/matroska_segment_parse.cpp index 28442e2568..f756cd338d 100644 --- a/modules/demux/mkv/matroska_segment_parse.cpp +++ b/modules/demux/mkv/matroska_segment_parse.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * mkv.cpp : matroska demuxer ***************************************************************************** - * Copyright (C) 2003-2004 the VideoLAN team + * Copyright (C) 2003-2010 the VideoLAN team * $Id$ * * Authors: Laurent Aimar @@ -60,7 +60,9 @@ void matroska_segment_c::ParseSeekHead( KaxSeekHead *seekhead ) EbmlId id = EbmlVoid::ClassInfos.GlobalId; int64_t i_pos = -1; +#ifdef MKV_DEBUG msg_Dbg( &sys.demuxer, "| | + Seek" ); +#endif ep->Down(); while( ( l = ep->Get() ) != NULL ) { @@ -121,8 +123,10 @@ void matroska_segment_c::ParseSeekHead( KaxSeekHead *seekhead ) msg_Dbg( &sys.demuxer, "| - attachments at %"PRId64, i_pos ); LoadSeekHeadItem( KaxAttachments::ClassInfos, i_pos ); } +#ifdef MKV_DEBUG else msg_Dbg( &sys.demuxer, "| - unknown seekhead reference at %"PRId64, i_pos ); +#endif } } else @@ -140,7 +144,7 @@ static void MkvTree( demux_t & demuxer, int i_level, const char *psz_format, ... va_list args; if( i_level > 9 ) { - msg_Err( &demuxer, "too deep tree" ); + msg_Err( &demuxer, "MKV tree is too deep" ); return; } va_start( args, psz_format ); @@ -161,46 +165,42 @@ static void MkvTree( demux_t & demuxer, int i_level, const char *psz_format, ... *****************************************************************************/ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m ) { - size_t i, j, k, n; bool bSupported = true; - mkv_track_t *tk; - - msg_Dbg( &sys.demuxer, "| | + Track Entry" ); - - tk = new mkv_track_t(); - /* Init the track */ + mkv_track_t *tk = new mkv_track_t(); memset( tk, 0, sizeof( mkv_track_t ) ); es_format_Init( &tk->fmt, UNKNOWN_ES, 0 ); - tk->fmt.psz_language = strdup("English"); - tk->fmt.psz_description = NULL; - - tk->b_default = true; - tk->b_enabled = true; - tk->b_silent = false; - tk->i_number = tracks.size() - 1; - tk->i_extra_data = 0; - tk->p_extra_data = NULL; - tk->psz_codec = NULL; - tk->b_dts_only = false; - tk->i_default_duration = 0; - tk->f_timecodescale = 1.0; - - tk->b_inited = false; - tk->i_data_init = 0; - tk->p_data_init = NULL; - - tk->psz_codec_name = NULL; - tk->psz_codec_settings = NULL; - tk->psz_codec_info_url = NULL; + tk->fmt.psz_language = strdup("English"); + tk->fmt.psz_description = NULL; + + tk->b_default = true; + tk->b_enabled = true; + tk->b_silent = false; + tk->i_number = tracks.size() - 1; + tk->i_extra_data = 0; + tk->p_extra_data = NULL; + tk->psz_codec = NULL; + tk->b_dts_only = false; + tk->i_default_duration = 0; + tk->f_timecodescale = 1.0; + + tk->b_inited = false; + tk->i_data_init = 0; + tk->p_data_init = NULL; + + tk->psz_codec_name = NULL; + tk->psz_codec_settings = NULL; + tk->psz_codec_info_url = NULL; tk->psz_codec_download_url = NULL; - - tk->i_compression_type = MATROSKA_COMPRESSION_NONE; - tk->p_compression_data = NULL; - for( i = 0; i < m->ListSize(); i++ ) + tk->i_compression_type = MATROSKA_COMPRESSION_NONE; + tk->p_compression_data = NULL; + + msg_Dbg( &sys.demuxer, "| | + Track Entry" ); + + for( size_t i = 0; i < m->ListSize(); i++ ) { EbmlElement *l = (*m)[i]; @@ -370,14 +370,14 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m ) msg_Err( &sys.demuxer, "Multiple Compression method not supported" ); bSupported = false; } - for( j = 0; j < cencs->ListSize(); j++ ) + for( size_t j = 0; j < cencs->ListSize(); j++ ) { EbmlElement *l2 = (*cencs)[j]; if( MKV_IS_ID( l2, KaxContentEncoding ) ) { MkvTree( sys.demuxer, 4, "Content Encoding" ); EbmlMaster *cenc = static_cast(l2); - for( k = 0; k < cenc->ListSize(); k++ ) + for( size_t k = 0; k < cenc->ListSize(); k++ ) { EbmlElement *l3 = (*cenc)[k]; if( MKV_IS_ID( l3, KaxContentEncodingOrder ) ) @@ -399,7 +399,9 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m ) { EbmlMaster *compr = static_cast(l3); MkvTree( sys.demuxer, 5, "Content Compression" ); - for( n = 0; n < compr->ListSize(); n++ ) + //Default compression type is 0 (Zlib) + tk->i_compression_type = MATROSKA_COMPRESSION_ZLIB; + for( size_t n = 0; n < compr->ListSize(); n++ ) { EbmlElement *l4 = (*compr)[n]; if( MKV_IS_ID( l4, KaxContentCompAlgo ) ) @@ -461,7 +463,6 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m ) else if( MKV_IS_ID( l, KaxTrackVideo ) ) { EbmlMaster *tkv = static_cast(l); - unsigned int j; unsigned int i_crop_right = 0, i_crop_left = 0, i_crop_top = 0, i_crop_bottom = 0; unsigned int i_display_unit = 0, i_display_width = 0, i_display_height = 0; @@ -470,8 +471,8 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m ) tk->fmt.video.i_frame_rate_base = (unsigned int)(tk->i_default_duration / 1000); tk->fmt.video.i_frame_rate = 1000000; - - for( j = 0; j < tkv->ListSize(); j++ ) + + for( unsigned int j = 0; j < tkv->ListSize(); j++ ) { EbmlElement *l = (*tkv)[j]; if( MKV_IS_ID( l, KaxVideoFlagInterlaced ) ) // UNUSED @@ -582,11 +583,11 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m ) } if( i_crop_left || i_crop_right || i_crop_top || i_crop_bottom ) { - tk->fmt.video.i_visible_width = tk->fmt.video.i_width; - tk->fmt.video.i_visible_height = tk->fmt.video.i_height; - tk->fmt.video.i_x_offset = i_crop_left; - tk->fmt.video.i_y_offset = i_crop_top; - tk->fmt.video.i_visible_width -= i_crop_left + i_crop_right; + tk->fmt.video.i_visible_width = tk->fmt.video.i_width; + tk->fmt.video.i_visible_height = tk->fmt.video.i_height; + tk->fmt.video.i_x_offset = i_crop_left; + tk->fmt.video.i_y_offset = i_crop_top; + tk->fmt.video.i_visible_width -= i_crop_left + i_crop_right; tk->fmt.video.i_visible_height -= i_crop_top + i_crop_bottom; } /* FIXME: i_display_* allows you to not only set DAR, but also a zoom factor. @@ -595,11 +596,10 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m ) else if( MKV_IS_ID( l, KaxTrackAudio ) ) { EbmlMaster *tka = static_cast(l); - unsigned int j; msg_Dbg( &sys.demuxer, "| | | + Track Audio" ); - for( j = 0; j < tka->ListSize(); j++ ) + for( unsigned int j = 0; j < tka->ListSize(); j++ ) { EbmlElement *l = (*tka)[j]; @@ -661,13 +661,12 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m ) void matroska_segment_c::ParseTracks( KaxTracks *tracks ) { EbmlElement *el; - unsigned int i; int i_upper_level = 0; /* Master elements */ tracks->Read( es, tracks->Generic().Context, i_upper_level, el, true ); - for( i = 0; i < tracks->ListSize(); i++ ) + for( size_t i = 0; i < tracks->ListSize(); i++ ) { EbmlElement *l = (*tracks)[i]; @@ -689,14 +688,13 @@ void matroska_segment_c::ParseInfo( KaxInfo *info ) { EbmlElement *el; EbmlMaster *m; - size_t i, j; int i_upper_level = 0; /* Master elements */ m = static_cast(info); m->Read( es, info->Generic().Context, i_upper_level, el, true ); - for( i = 0; i < m->ListSize(); i++ ) + for( size_t i = 0; i < m->ListSize(); i++ ) { EbmlElement *l = (*m)[i]; @@ -804,7 +802,7 @@ void matroska_segment_c::ParseInfo( KaxInfo *info ) chapter_translation_c *p_translate = new chapter_translation_c(); p_trans->Read( es, p_trans->Generic().Context, i_upper_level, el, true ); - for( j = 0; j < p_trans->ListSize(); j++ ) + for( size_t j = 0; j < p_trans->ListSize(); j++ ) { EbmlElement *l = (*p_trans)[j]; @@ -840,10 +838,8 @@ void matroska_segment_c::ParseInfo( KaxInfo *info ) *****************************************************************************/ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chapter_item_c & chapters ) { - size_t i, j; - msg_Dbg( &sys.demuxer, "| | | + ChapterAtom (level=%d)", i_level ); - for( i = 0; i < ca->ListSize(); i++ ) + for( size_t i = 0; i < ca->ListSize(); i++ ) { EbmlElement *l = (*ca)[i]; @@ -878,16 +874,14 @@ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chap EbmlMaster *cd = static_cast(l); msg_Dbg( &sys.demuxer, "| | | | + ChapterDisplay" ); - for( j = 0; j < cd->ListSize(); j++ ) + for( size_t j = 0; j < cd->ListSize(); j++ ) { EbmlElement *l= (*cd)[j]; if( MKV_IS_ID( l, KaxChapterString ) ) { - int k; - KaxChapterString &name =*(KaxChapterString*)l; - for (k = 0; k < i_level; k++) + for ( int k = 0; k < i_level; k++) chapters.psz_name += '+'; chapters.psz_name += ' '; char *psz_tmp_utf8 = ToUTF8( UTFstring( name ) ); @@ -920,7 +914,7 @@ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chap KaxChapterProcess *cp = static_cast(l); chapter_codec_cmds_c *p_ccodec = NULL; - for( j = 0; j < cp->ListSize(); j++ ) + for( size_t j = 0; j < cp->ListSize(); j++ ) { EbmlElement *k= (*cp)[j]; @@ -937,7 +931,7 @@ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chap if ( p_ccodec != NULL ) { - for( j = 0; j < cp->ListSize(); j++ ) + for( size_t j = 0; j < cp->ListSize(); j++ ) { EbmlElement *k= (*cp)[j]; @@ -1012,21 +1006,20 @@ void matroska_segment_c::ParseAttachments( KaxAttachments *attachments ) void matroska_segment_c::ParseChapters( KaxChapters *chapters ) { EbmlElement *el; - size_t i; int i_upper_level = 0; mtime_t i_dur; /* Master elements */ chapters->Read( es, chapters->Generic().Context, i_upper_level, el, true ); - for( i = 0; i < chapters->ListSize(); i++ ) + for( size_t i = 0; i < chapters->ListSize(); i++ ) { EbmlElement *l = (*chapters)[i]; if( MKV_IS_ID( l, KaxEditionEntry ) ) { chapter_edition_c *p_edition = new chapter_edition_c(); - + EbmlMaster *E = static_cast(l ); msg_Dbg( &sys.demuxer, "| | + EditionEntry" ); for( size_t j = 0; j < E->ListSize(); j++ ) @@ -1045,7 +1038,7 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters ) } else if( MKV_IS_ID( l, KaxEditionFlagOrdered ) ) { - p_edition->b_ordered = var_InheritInteger( &sys.demuxer, "mkv-use-ordered-chapters" ) ? (uint8(*static_cast( l )) != 0) : 0; + p_edition->b_ordered = var_InheritBool( &sys.demuxer, "mkv-use-ordered-chapters" ) ? (uint8(*static_cast( l )) != 0) : 0; } else if( MKV_IS_ID( l, KaxEditionFlagDefault ) ) { @@ -1069,11 +1062,11 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters ) } } - for( i = 0; i < stored_editions.size(); i++ ) + for( size_t i = 0; i < stored_editions.size(); i++ ) { stored_editions[i]->RefreshChapters( ); } - + if ( stored_editions.size() != 0 && stored_editions[i_default_edition]->b_ordered ) { /* update the duration of the segment according to the sum of all sub chapters */ @@ -1087,14 +1080,13 @@ void matroska_segment_c::ParseCluster( ) { EbmlElement *el; EbmlMaster *m; - unsigned int i; int i_upper_level = 0; /* Master elements */ m = static_cast( cluster ); m->Read( es, cluster->Generic().Context, i_upper_level, el, true ); - for( i = 0; i < m->ListSize(); i++ ) + for( unsigned int i = 0; i < m->ListSize(); i++ ) { EbmlElement *l = (*m)[i]; @@ -1110,4 +1102,3 @@ void matroska_segment_c::ParseCluster( ) i_start_time = cluster->GlobalTimecode() / 1000; } -