X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fmkv%2Fmatroska_segment.cpp;h=f0477d1ee21e0f18635997217b663be2b25c160a;hb=b9606f5d8b5916f0bce13f5d02bd5abdff659bfb;hp=08846787b7e9965e4f246ee0d229b6e24b11d156;hpb=ad77d955a5dc051976d94d6e08ee0f717ec3a938;p=vlc diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp index 08846787b7..f0477d1ee2 100644 --- a/modules/demux/mkv/matroska_segment.cpp +++ b/modules/demux/mkv/matroska_segment.cpp @@ -179,7 +179,8 @@ void matroska_segment_c::LoadCues( KaxCues *cues ) if( i_index >= i_index_max ) { i_index_max += 1024; - p_indexes = (mkv_index_t*)realloc( p_indexes, sizeof( mkv_index_t ) * i_index_max ); + p_indexes = (mkv_index_t*)xrealloc( p_indexes, + sizeof( mkv_index_t ) * i_index_max ); } #undef idx } @@ -372,7 +373,8 @@ void matroska_segment_c::IndexAppendCluster( KaxCluster *cluster ) if( i_index >= i_index_max ) { i_index_max += 1024; - p_indexes = (mkv_index_t*)realloc( p_indexes, sizeof( mkv_index_t ) * i_index_max ); + p_indexes = (mkv_index_t*)xrealloc( p_indexes, + sizeof( mkv_index_t ) * i_index_max ); } #undef idx } @@ -639,7 +641,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) mkv_track_t *p_tk = tracks[i_track]; es_format_t *p_fmt = &p_tk->fmt; - if( tracks[i_track]->fmt.i_cat == UNKNOWN_ES ) + if( p_fmt->i_cat == UNKNOWN_ES || !p_tk->psz_codec ) { msg_Warn( &sys.demuxer, "invalid track[%d, n=%d]", (int)i_track, tracks[i_track]->i_number ); tracks[i_track]->p_es = NULL; @@ -664,7 +666,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) tracks[i_track]->fmt.i_extra = GetDWLE( &p_bih->biSize ) - sizeof( BITMAPINFOHEADER ); if( tracks[i_track]->fmt.i_extra > 0 ) { - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->fmt.i_extra ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->fmt.i_extra ); memcpy( tracks[i_track]->fmt.p_extra, &p_bih[1], tracks[i_track]->fmt.i_extra ); } } @@ -677,73 +679,10 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) } else if( !strncmp( tracks[i_track]->psz_codec, "V_THEORA", 8 ) ) { - uint8_t *p_data = tracks[i_track]->p_extra_data; tracks[i_track]->fmt.i_codec = VLC_CODEC_THEORA; - if( tracks[i_track]->i_extra_data >= 4 ) { - if( p_data[0] == 2 ) { - int i = 1; - int i_size1 = 0, i_size2 = 0; - p_data++; - /* read size of first header packet */ - while( *p_data == 0xFF && - i < tracks[i_track]->i_extra_data ) - { - i_size1 += *p_data; - p_data++; - i++; - } - i_size1 += *p_data; - p_data++; - i++; - msg_Dbg( &sys.demuxer, "first theora header size %d", i_size1 ); - /* read size of second header packet */ - while( *p_data == 0xFF && - i < tracks[i_track]->i_extra_data ) - { - i_size2 += *p_data; - p_data++; - i++; - } - i_size2 += *p_data; - p_data++; - i++; - int i_size3 = tracks[i_track]->i_extra_data - i - i_size1 - - i_size2; - msg_Dbg( &sys.demuxer, "second theora header size %d", i_size2 ); - msg_Dbg( &sys.demuxer, "third theora header size %d", i_size3 ); - tracks[i_track]->fmt.i_extra = i_size1 + i_size2 + i_size3 - + 6; - if( i_size1 > 0 && i_size2 > 0 && i_size3 > 0 ) { - tracks[i_track]->fmt.p_extra = - malloc( tracks[i_track]->fmt.i_extra ); - uint8_t *p_out = (uint8_t*)tracks[i_track]->fmt.p_extra; - *p_out++ = (i_size1>>8) & 0xFF; - *p_out++ = i_size1 & 0xFF; - memcpy( p_out, p_data, i_size1 ); - p_data += i_size1; - p_out += i_size1; - - *p_out++ = (i_size2>>8) & 0xFF; - *p_out++ = i_size2 & 0xFF; - memcpy( p_out, p_data, i_size2 ); - p_data += i_size2; - p_out += i_size2; - - *p_out++ = (i_size3>>8) & 0xFF; - *p_out++ = i_size3 & 0xFF; - memcpy( p_out, p_data, i_size3 ); - p_data += i_size3; - p_out += i_size3; - } - else - { - msg_Err( &sys.demuxer, "inconsistant theora extradata" ); - } - } - else { - msg_Err( &sys.demuxer, "Wrong number of ogg packets with theora headers (%d)", p_data[0] + 1 ); - } - } + tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); + memcpy( tracks[i_track]->fmt.p_extra,tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } else if( !strncmp( tracks[i_track]->psz_codec, "V_REAL/RV", 9 ) ) { @@ -785,13 +724,13 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) else tracks[i_track]->fmt.i_codec = VLC_CODEC_MP4V; tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->i_extra_data ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); memcpy( tracks[i_track]->fmt.p_extra,tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } } else if( !strcmp( tracks[i_track]->psz_codec, "V_QUICKTIME" ) ) { - MP4_Box_t *p_box = (MP4_Box_t*)malloc( sizeof( MP4_Box_t ) ); + MP4_Box_t *p_box = (MP4_Box_t*)xmalloc( sizeof( MP4_Box_t ) ); stream_t *p_mp4_stream = stream_MemoryNew( VLC_OBJECT(&sys.demuxer), tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data, @@ -803,7 +742,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) tracks[i_track]->fmt.video.i_width = p_box->data.p_sample_vide->i_width; tracks[i_track]->fmt.video.i_height = p_box->data.p_sample_vide->i_height; tracks[i_track]->fmt.i_extra = p_box->data.p_sample_vide->i_qt_image_description; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->fmt.i_extra ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->fmt.i_extra ); memcpy( tracks[i_track]->fmt.p_extra, p_box->data.p_sample_vide->p_qt_image_description, tracks[i_track]->fmt.i_extra ); MP4_FreeBox_sample_vide( p_box ); } @@ -835,7 +774,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) tracks[i_track]->fmt.i_extra = GetWLE( &p_wf->cbSize ); if( tracks[i_track]->fmt.i_extra > 0 ) { - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->fmt.i_extra ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->fmt.i_extra ); memcpy( tracks[i_track]->fmt.p_extra, &p_wf[1], tracks[i_track]->fmt.i_extra ); } } @@ -872,46 +811,15 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) { tracks[i_track]->fmt.i_codec = VLC_CODEC_FLAC; tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->i_extra_data ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); memcpy( tracks[i_track]->fmt.p_extra,tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } else if( !strcmp( tracks[i_track]->psz_codec, "A_VORBIS" ) ) { - int i, i_offset = 1, i_size[3], i_extra; - uint8_t *p_extra; - tracks[i_track]->fmt.i_codec = VLC_CODEC_VORBIS; - - /* Split the 3 headers */ - if( tracks[i_track]->p_extra_data[0] != 0x02 ) - msg_Err( &sys.demuxer, "invalid vorbis header" ); - - for( i = 0; i < 2; i++ ) - { - i_size[i] = 0; - while( i_offset < tracks[i_track]->i_extra_data ) - { - i_size[i] += tracks[i_track]->p_extra_data[i_offset]; - if( tracks[i_track]->p_extra_data[i_offset++] != 0xff ) break; - } - } - - i_size[0] = __MIN(i_size[0], tracks[i_track]->i_extra_data - i_offset); - i_size[1] = __MIN(i_size[1], tracks[i_track]->i_extra_data -i_offset -i_size[0]); - i_size[2] = tracks[i_track]->i_extra_data - i_offset - i_size[0] - i_size[1]; - - tracks[i_track]->fmt.i_extra = 3 * 2 + i_size[0] + i_size[1] + i_size[2]; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->fmt.i_extra ); - p_extra = (uint8_t *)tracks[i_track]->fmt.p_extra; i_extra = 0; - for( i = 0; i < 3; i++ ) - { - *(p_extra++) = i_size[i] >> 8; - *(p_extra++) = i_size[i] & 0xFF; - memcpy( p_extra, tracks[i_track]->p_extra_data + i_offset + i_extra, - i_size[i] ); - p_extra += i_size[i]; - i_extra += i_size[i]; - } + tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); + memcpy( tracks[i_track]->fmt.p_extra,tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } else if( !strncmp( tracks[i_track]->psz_codec, "A_AAC/MPEG2/", strlen( "A_AAC/MPEG2/" ) ) || !strncmp( tracks[i_track]->psz_codec, "A_AAC/MPEG4/", strlen( "A_AAC/MPEG4/" ) ) ) @@ -958,7 +866,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) msg_Dbg( &sys.demuxer, "profile=%d srate=%d", i_profile, i_srate ); tracks[i_track]->fmt.i_extra = sbr ? 5 : 2; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->fmt.i_extra ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->fmt.i_extra ); ((uint8_t*)tracks[i_track]->fmt.p_extra)[0] = ((i_profile + 1) << 3) | ((i_srate&0xe) >> 1); ((uint8_t*)tracks[i_track]->fmt.p_extra)[1] = ((i_srate & 0x1) << 7) | (tracks[i_track]->fmt.audio.i_channels << 3); if (sbr != 0) @@ -977,22 +885,38 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) { tracks[i_track]->fmt.i_codec = VLC_CODEC_MP4A; tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->i_extra_data ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); memcpy( tracks[i_track]->fmt.p_extra, tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } else if( !strcmp( tracks[i_track]->psz_codec, "A_WAVPACK4" ) ) { tracks[i_track]->fmt.i_codec = VLC_CODEC_WAVPACK; tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->i_extra_data ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); memcpy( tracks[i_track]->fmt.p_extra, tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } else if( !strcmp( tracks[i_track]->psz_codec, "A_TTA1" ) ) { - tracks[i_track]->fmt.i_codec = VLC_CODEC_TTA; - tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->i_extra_data ); - memcpy( tracks[i_track]->fmt.p_extra, tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); + p_fmt->i_codec = VLC_CODEC_TTA; + p_fmt->i_extra = p_tk->i_extra_data; + if( p_fmt->i_extra > 0 ) + { + p_fmt->p_extra = xmalloc( p_tk->i_extra_data ); + memcpy( p_fmt->p_extra, p_tk->p_extra_data, p_tk->i_extra_data ); + } + else + { + p_fmt->i_extra = 30; + p_fmt->p_extra = xmalloc( p_fmt->i_extra ); + uint8_t *p_extra = (uint8_t*)p_fmt->p_extra; + memcpy( &p_extra[ 0], "TTA1", 4 ); + SetWLE( &p_extra[ 4], 1 ); + SetWLE( &p_extra[ 6], p_fmt->audio.i_channels ); + SetWLE( &p_extra[ 8], p_fmt->audio.i_bitspersample ); + SetDWLE( &p_extra[10], p_fmt->audio.i_rate ); + SetDWLE( &p_extra[14], 0xffffffff ); + memset( &p_extra[18], 0, 30 - 18 ); + } } else if( !strcmp( tracks[i_track]->psz_codec, "A_PCM/INT/BIG" ) || !strcmp( tracks[i_track]->psz_codec, "A_PCM/INT/LIT" ) || @@ -1017,47 +941,9 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) tracks[i_track]->fmt.i_codec = VLC_CODEC_KATE; tracks[i_track]->fmt.subs.psz_encoding = strdup( "UTF-8" ); - /* Recover the number of headers to expect */ - num_headers = tracks[i_track]->p_extra_data[0]+1; - msg_Dbg( &sys.demuxer, "kate in mkv detected: %d headers in %u bytes", - num_headers, tracks[i_track]->i_extra_data); - - /* this won't overflow the stack as is can allocate only 1020 bytes max */ - uint16_t pi_size[num_headers]; - - /* Split the headers */ - size_so_far = 0; - for( i = 0; i < num_headers-1; i++ ) - { - pi_size[i] = 0; - while( i_offset < tracks[i_track]->i_extra_data ) - { - pi_size[i] += tracks[i_track]->p_extra_data[i_offset]; - if( tracks[i_track]->p_extra_data[i_offset++] != 0xff ) break; - } - msg_Dbg( &sys.demuxer, "kate header %d is %d bytes", i, pi_size[i]); - size_so_far += pi_size[i]; - } - pi_size[num_headers-1] = tracks[i_track]->i_extra_data - (size_so_far+i_offset); - msg_Dbg( &sys.demuxer, "kate last header (%d) is %d bytes", num_headers-1, pi_size[num_headers-1]); - - tracks[i_track]->fmt.i_extra = 1 + num_headers * 2 + size_so_far + pi_size[num_headers-1]; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->fmt.i_extra ); - - p_extra = (uint8_t *)tracks[i_track]->fmt.p_extra; - i_extra = 0; - *(p_extra++) = num_headers; - ++i_extra; - for( i = 0; i < num_headers; i++ ) - { - *(p_extra++) = pi_size[i] >> 8; - *(p_extra++) = pi_size[i] & 0xFF; - memcpy( p_extra, tracks[i_track]->p_extra_data + i_offset + i_extra-1, - pi_size[i] ); - - p_extra += pi_size[i]; - i_extra += pi_size[i]; - } + tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); + memcpy( tracks[i_track]->fmt.p_extra,tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } else if( !strcmp( tracks[i_track]->psz_codec, "S_TEXT/ASCII" ) ) { @@ -1076,7 +962,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) if( tracks[i_track]->i_extra_data ) { tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->i_extra_data ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); memcpy( tracks[i_track]->fmt.p_extra, tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } } @@ -1090,7 +976,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) if( tracks[i_track]->i_extra_data ) { tracks[i_track]->fmt.i_extra = tracks[i_track]->i_extra_data; - tracks[i_track]->fmt.p_extra = malloc( tracks[i_track]->i_extra_data ); + tracks[i_track]->fmt.p_extra = xmalloc( tracks[i_track]->i_extra_data ); memcpy( tracks[i_track]->fmt.p_extra, tracks[i_track]->p_extra_data, tracks[i_track]->i_extra_data ); } } @@ -1136,6 +1022,10 @@ bool matroska_segment_c::Select( mtime_t i_start_time ) } } } + else if( !strcmp( tracks[i_track]->psz_codec, "S_HDMV/PGS" ) ) + { + tracks[i_track]->fmt.i_codec = VLC_CODEC_BD_PG; + } else if( !strcmp( tracks[i_track]->psz_codec, "B_VOBBTN" ) ) { tracks[i_track]->fmt.i_cat = NAV_ES;