]> git.sesse.net Git - vlc/commitdiff
Fix playback of RealVideo with B frames (pts were not calculated properly)
authorGildas Bazin <gbazin@videolan.org>
Thu, 23 Sep 2010 21:22:39 +0000 (22:22 +0100)
committerGildas Bazin <gbazin@videolan.org>
Thu, 23 Sep 2010 21:56:23 +0000 (22:56 +0100)
modules/codec/avcodec/video.c

index 9313dcab3ee1323c5291f298e14a831ec5472e97..4e3904b8e4b3feca51fae0ebf77ad487bff7478d 100644 (file)
@@ -619,6 +619,12 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
             continue;
         }
 
+        /* Sanity check (seems to be needed for some streams) */
+        if( p_sys->p_ff_pic->pict_type == FF_B_TYPE )
+        {
+            p_sys->b_has_b_frames = true;
+        }
+
         /* Compute the PTS */
         mtime_t i_pts = VLC_TS_INVALID;
         if( p_sys->p_ff_pic->reordered_opaque != INT64_MIN )
@@ -632,6 +638,15 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
                     !p_sys->p_ff_pic->reference ||
                     p_sys->i_pts <= VLC_TS_INVALID )
                     i_pts = i_ts;
+
+                /* Guess what ? The rules are different for Real Video :( */
+                if( (p_dec->fmt_in.i_codec == VLC_CODEC_RV30 ||
+                     p_dec->fmt_in.i_codec == VLC_CODEC_RV40) &&
+                    p_sys->b_has_b_frames )
+                {
+                    i_pts = VLC_TS_INVALID;
+                    if(p_sys->p_ff_pic->reference) i_pts = i_ts;
+                }
             }
             else
             {
@@ -707,12 +722,6 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
             decoder_LinkPicture( p_dec, p_pic );
         }
 
-        /* Sanity check (seems to be needed for some streams) */
-        if( p_sys->p_ff_pic->pict_type == FF_B_TYPE )
-        {
-            p_sys->b_has_b_frames = true;
-        }
-
         if( !p_dec->fmt_in.video.i_sar_num || !p_dec->fmt_in.video.i_sar_den )
         {
             /* Fetch again the aspect ratio in case it changed */