]> git.sesse.net Git - vlc/blobdiff - modules/demux/avformat/demux.c
Dead initialization.
[vlc] / modules / demux / avformat / demux.c
index 16a9cb04718bb52ed7877c007648fbfc453391d2..4bc6873e5af5cbb6e1c741d4439822c43bc3ca26 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * 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>
@@ -438,6 +438,8 @@ static int Demux( demux_t *p_demux )
         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;
@@ -453,17 +455,24 @@ static int Demux( demux_t *p_demux )
 
     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 );
@@ -535,7 +544,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
 
         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;
@@ -550,12 +558,16 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
                     (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;
@@ -706,7 +718,7 @@ static int64_t IOSeek( void *opaque, int64_t offset, int whence )
 {
     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