/*****************************************************************************
* demux.c: demuxer using ffmpeg (libavformat).
*****************************************************************************
- * Copyright (C) 2004-2007 the VideoLAN team
+ * Copyright (C) 2004-2009 the VideoLAN team
* $Id$
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
av_free_packet( &pkt );
return 1;
}
+ const AVStream *p_stream = p_sys->ic->streams[pkt.stream_index];
+
if( ( p_frame = block_New( p_demux, pkt.size ) ) == NULL )
{
return 0;
p_frame->i_dts = ( pkt.dts == (int64_t)AV_NOPTS_VALUE ) ?
0 : (pkt.dts) * 1000000 *
- p_sys->ic->streams[pkt.stream_index]->time_base.num /
- p_sys->ic->streams[pkt.stream_index]->time_base.den - i_start_time;
+ p_stream->time_base.num /
+ p_stream->time_base.den - i_start_time;
p_frame->i_pts = ( pkt.pts == (int64_t)AV_NOPTS_VALUE ) ?
0 : (pkt.pts) * 1000000 *
- p_sys->ic->streams[pkt.stream_index]->time_base.num /
- p_sys->ic->streams[pkt.stream_index]->time_base.den - i_start_time;
+ p_stream->time_base.num /
+ p_stream->time_base.den - i_start_time;
if( pkt.duration > 0 )
p_frame->i_length = pkt.duration * 1000000 *
- p_sys->ic->streams[pkt.stream_index]->time_base.num /
- p_sys->ic->streams[pkt.stream_index]->time_base.den - i_start_time;
+ p_stream->time_base.num /
+ p_stream->time_base.den - i_start_time;
+ if( pkt.dts != AV_NOPTS_VALUE && pkt.dts == pkt.pts &&
+ p_stream->codec->codec_type == CODEC_TYPE_VIDEO )
+ {
+ /* Add here notoriously bugged file formats/samples regarding PTS */
+ if( !strcmp( p_sys->fmt->name, "flv" ) )
+ p_frame->i_pts = 0;
+ }
#ifdef AVFORMAT_DEBUG
msg_Dbg( p_demux, "tk[%d] dts=%"PRId64" pts=%"PRId64,
pkt.stream_index, p_frame->i_dts, p_frame->i_pts );
case DEMUX_SET_POSITION:
f = (double) va_arg( args, double );
- i64 = stream_Tell( p_demux->s );
if( p_sys->i_pcr > 0 )
{
i64 = p_sys->ic->duration * f;
(av_seek_frame( p_sys->ic, -1, i64, 0 ) < 0) )
{
int64_t i_size = stream_Size( p_demux->s );
+ i64 = (i_size * f);
msg_Warn( p_demux, "DEMUX_SET_BYTE_POSITION: %"PRId64, i64 );
- if( av_seek_frame( p_sys->ic, -1, (i_size * f), AVSEEK_FLAG_BYTE ) < 0 )
+ if( av_seek_frame( p_sys->ic, -1, i64, AVSEEK_FLAG_BYTE ) < 0 )
return VLC_EGENERIC;
}
- UpdateSeekPoint( p_demux, i64 );
+ else
+ {
+ UpdateSeekPoint( p_demux, i64 );
+ }
p_sys->i_pcr = -1; /* Invalidate time display */
}
return VLC_SUCCESS;
{
URLContext *p_url = opaque;
demux_t *p_demux = p_url->priv_data;
- int64_t i_absolute = (int64_t)offset;
+ int64_t i_absolute;
int64_t i_size = stream_Size( p_demux->s );
#ifdef AVFORMAT_DEBUG