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
}
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
}
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;
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 );
}
}
}
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 ) )
{
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,
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 );
}
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 );
}
}
{
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/" ) ) )
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)
{
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" ) ||
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" ) )
{
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 );
}
}
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 );
}
}
}
}
}
+ 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;