Signed-off-by: Ilkka Ollakka <ileoo@videolan.org>
bool b_reinit;
int i_granule_shift;
bool b_reinit;
int i_granule_shift;
+ /* offset of first keyframe for theora; can be 0 or 1 depending on version number */
+ int64_t i_keyframe_offset;
+
/* kate streams have the number of headers in the ID header */
int i_kate_num_headers;
/* kate streams have the number of headers in the ID header */
int i_kate_num_headers;
ogg_int64_t pframe = p_oggpacket->granulepos -
( iframe << p_stream->i_granule_shift );
ogg_int64_t pframe = p_oggpacket->granulepos -
( iframe << p_stream->i_granule_shift );
- p_stream->i_pcr = ( iframe + pframe ) * INT64_C(1000000)
- / p_stream->f_rate;
+ p_stream->i_pcr = ( iframe + pframe - p_stream->i_keyframe_offset )
+ * INT64_C(1000000) / p_stream->f_rate;
}
else if( p_stream->fmt.i_codec == VLC_CODEC_DIRAC )
{
}
else if( p_stream->fmt.i_codec == VLC_CODEC_DIRAC )
{
p_stream->p_headers = realloc( p_stream->p_headers, p_stream->i_headers );
if( p_stream->p_headers )
{
p_stream->p_headers = realloc( p_stream->p_headers, p_stream->i_headers );
if( p_stream->p_headers )
{
- memcpy( p_stream->p_headers + p_stream->i_headers - p_oggpacket->bytes,
+ memcpy( (unsigned char *)p_stream->p_headers + p_stream->i_headers - p_oggpacket->bytes,
p_oggpacket->packet, p_stream->i_headers );
}
else
p_oggpacket->packet, p_stream->i_headers );
}
else
p_stream->p_headers = 0;
p_stream->i_secondary_header_packets = 0;
p_stream->p_headers = 0;
p_stream->i_secondary_header_packets = 0;
+ p_stream->i_keyframe_offset = 0;
+
es_format_Init( &p_stream->fmt, 0, 0 );
es_format_Init( &p_stream->fmt_old, 0, 0 );
es_format_Init( &p_stream->fmt, 0, 0 );
es_format_Init( &p_stream->fmt_old, 0, 0 );
p_stream->fmt.i_bitrate, p_stream->f_rate );
}
/* Check for Dirac header */
p_stream->fmt.i_bitrate, p_stream->f_rate );
}
/* Check for Dirac header */
- else if( oggpacket.bytes >= 5 &&
- ! memcmp( oggpacket.packet, "BBCD\x00", 5 ) )
- {
- if( Ogg_ReadDiracHeader( p_stream, &oggpacket ) )
- msg_Dbg( p_demux, "found dirac header" );
+ else if( ( oggpacket.bytes >= 5 &&
+ ! memcmp( oggpacket.packet, "BBCD\x00", 5 ) ) ||
+ ( oggpacket.bytes >= 9 &&
+ ! memcmp( oggpacket.packet, "KW-DIRAC\x00", 9 ) ) )
+ {
+ if( Ogg_ReadDiracHeader( p_stream, &oggpacket ) )
+ msg_Dbg( p_demux, "found dirac header" );
else
{
msg_Warn( p_demux, "found dirac header isn't decodable" );
else
{
msg_Warn( p_demux, "found dirac header isn't decodable" );
int i_fps_numerator;
int i_fps_denominator;
int i_keyframe_frequency_force;
int i_fps_numerator;
int i_fps_denominator;
int i_keyframe_frequency_force;
+ int i_major;
+ int i_minor;
+ int i_subminor;
+ int i_version;
p_stream->fmt.i_cat = VIDEO_ES;
p_stream->fmt.i_codec = VLC_CODEC_THEORA;
p_stream->fmt.i_cat = VIDEO_ES;
p_stream->fmt.i_codec = VLC_CODEC_THEORA;
/* Cheat and get additionnal info ;) */
bs_init( &bitstream, p_oggpacket->packet, p_oggpacket->bytes );
bs_skip( &bitstream, 56 );
/* Cheat and get additionnal info ;) */
bs_init( &bitstream, p_oggpacket->packet, p_oggpacket->bytes );
bs_skip( &bitstream, 56 );
- bs_read( &bitstream, 8 ); /* major version num */
- bs_read( &bitstream, 8 ); /* minor version num */
- bs_read( &bitstream, 8 ); /* subminor version num */
+
+ i_major = bs_read( &bitstream, 8 ); /* major version num */
+ i_minor = bs_read( &bitstream, 8 ); /* minor version num */
+ i_subminor = bs_read( &bitstream, 8 ); /* subminor version num */
+
bs_read( &bitstream, 16 ) /*<< 4*/; /* width */
bs_read( &bitstream, 16 ) /*<< 4*/; /* height */
bs_read( &bitstream, 24 ); /* frame width */
bs_read( &bitstream, 16 ) /*<< 4*/; /* width */
bs_read( &bitstream, 16 ) /*<< 4*/; /* height */
bs_read( &bitstream, 24 ); /* frame width */
i_keyframe_frequency_force >>= 1;
}
i_keyframe_frequency_force >>= 1;
}
+ i_version = i_major * 1000000 + i_minor * 1000 + i_subminor;
+ p_stream->i_keyframe_offset = 0;
+
+ if ( i_version >= 3002001 )
+ {
+ p_stream->i_keyframe_offset = 1;
+ }
+
p_stream->f_rate = ((float)i_fps_numerator) / i_fps_denominator;
}
p_stream->f_rate = ((float)i_fps_numerator) / i_fps_denominator;
}