[vlc-commits] packetizer: vc1: refactor frame output

Francois Cartegnie git at videolan.org
Sat Oct 19 14:03:08 CEST 2019


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Oct 14 11:16:44 2019 +0200| [7b0e47cebc3caa7950838d6f3c3527fda5f9d485] | committer: Francois Cartegnie

packetizer: vc1: refactor frame output

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7b0e47cebc3caa7950838d6f3c3527fda5f9d485
---

 modules/packetizer/vc1.c | 141 +++++++++++++++++++++++++++--------------------
 1 file changed, 81 insertions(+), 60 deletions(-)

diff --git a/modules/packetizer/vc1.c b/modules/packetizer/vc1.c
index f25e839ecc..60138ac49b 100644
--- a/modules/packetizer/vc1.c
+++ b/modules/packetizer/vc1.c
@@ -334,11 +334,90 @@ static void BuildExtraData( decoder_t *p_dec )
             p_sys->ep.p_ep->p_buffer, p_sys->ep.p_ep->i_buffer );
 }
 
+static block_t *OutputFrame( decoder_t *p_dec )
+{
+    decoder_sys_t *p_sys = p_dec->p_sys;
+    const int i_pic_flags = p_sys->p_frame->i_flags;
+
+    /* Prepend SH and EP on I */
+    if( i_pic_flags & BLOCK_FLAG_TYPE_I )
+    {
+        block_t *p_list = block_Duplicate( p_sys->sh.p_sh );
+        block_t *p_ep = block_Duplicate( p_sys->ep.p_ep );
+        if( p_ep )
+            block_ChainAppend( &p_list, p_ep );
+        block_ChainAppend( &p_list, p_sys->p_frame );
+        p_list->i_flags = i_pic_flags;
+        p_sys->p_frame = p_list;
+    }
+
+    vlc_tick_t i_dts = p_sys->i_frame_dts;
+    vlc_tick_t i_pts = p_sys->i_frame_pts;
+
+    /* */
+    block_t *p_pic = block_ChainGather( p_sys->p_frame );
+    if( p_pic )
+    {
+        p_pic->i_dts = p_sys->i_frame_dts;
+        p_pic->i_pts = p_sys->i_frame_pts;
+    }
+
+    /* */
+    if( p_sys->i_frame_dts != VLC_TICK_INVALID )
+        p_sys->i_interpolated_dts = i_dts;
+
+    /* We can interpolate dts/pts only if we have a frame rate */
+    if( p_dec->fmt_out.video.i_frame_rate != 0 && p_dec->fmt_out.video.i_frame_rate_base != 0 )
+    {
+        if( p_sys->i_interpolated_dts != VLC_TICK_INVALID )
+            p_sys->i_interpolated_dts += vlc_tick_from_samples(
+                                         p_dec->fmt_out.video.i_frame_rate_base,
+                                         p_dec->fmt_out.video.i_frame_rate);
+
+        //msg_Dbg( p_dec, "-------------- XXX0 dts=%"PRId64" pts=%"PRId64" interpolated=%"PRId64,
+        //         i_dts, i_pts, p_sys->i_interpolated_dts );
+        if( i_dts == VLC_TICK_INVALID )
+            i_dts = p_sys->i_interpolated_dts;
+
+        if( i_pts == VLC_TICK_INVALID )
+        {
+            if( !p_sys->sh.b_has_bframe || (i_pic_flags & BLOCK_FLAG_TYPE_B ) )
+                i_pts = i_dts;
+            /* TODO compute pts for other case */
+        }
+    }
+
+    if( p_pic )
+    {
+        p_pic->i_dts = i_dts;
+        p_pic->i_pts = i_pts;
+    }
+
+    //msg_Dbg( p_dec, "-------------- dts=%"PRId64" pts=%"PRId64, i_dts, i_pts );
+
+    /* CC */
+    p_sys->i_cc_pts = i_pts;
+    p_sys->i_cc_dts = i_dts;
+    p_sys->i_cc_flags = i_pic_flags;
+
+    p_sys->cc = p_sys->cc_next;
+    cc_Flush( &p_sys->cc_next );
+
+    /* Reset context */
+    p_sys->b_frame = false;
+    p_sys->i_frame_dts = VLC_TICK_INVALID;
+    p_sys->i_frame_pts = VLC_TICK_INVALID;
+    p_sys->p_frame = NULL;
+    p_sys->pp_last = &p_sys->p_frame;
+
+    return p_pic;
+}
+
 /* ParseIDU: parse an Independent Decoding Unit */
 static block_t *ParseIDU( decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
-    block_t *p_pic;
+    block_t *p_pic = NULL;
     const idu_type_t idu = p_frag->p_buffer[3];
 
     *pb_ts_used = false;
@@ -358,71 +437,13 @@ static block_t *ParseIDU( decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag )
      * But It should not be a problem for decoder */
 
     /* Do we have completed a frame */
-    p_pic = NULL;
     if( p_sys->b_frame &&
         idu != IDU_TYPE_FRAME_USER_DATA &&
         idu != IDU_TYPE_FIELD && idu != IDU_TYPE_FIELD_USER_DATA &&
         idu != IDU_TYPE_SLICE && idu != IDU_TYPE_SLICE_USER_DATA &&
         idu != IDU_TYPE_END_OF_SEQUENCE )
     {
-        /* Prepend SH and EP on I */
-        if( p_sys->p_frame->i_flags & BLOCK_FLAG_TYPE_I )
-        {
-            block_t *p_list = block_Duplicate( p_sys->sh.p_sh );
-            block_ChainAppend( &p_list, block_Duplicate( p_sys->ep.p_ep ) );
-            block_ChainAppend( &p_list, p_sys->p_frame );
-
-            p_list->i_flags = p_sys->p_frame->i_flags;
-
-            p_sys->p_frame = p_list;
-        }
-
-        /* */
-        p_pic = block_ChainGather( p_sys->p_frame );
-        p_pic->i_dts = p_sys->i_frame_dts;
-        p_pic->i_pts = p_sys->i_frame_pts;
-
-        /* */
-        if( p_pic->i_dts != VLC_TICK_INVALID )
-            p_sys->i_interpolated_dts = p_pic->i_dts;
-
-        /* We can interpolate dts/pts only if we have a frame rate */
-        if( p_dec->fmt_out.video.i_frame_rate != 0 && p_dec->fmt_out.video.i_frame_rate_base != 0 )
-        {
-            if( p_sys->i_interpolated_dts != VLC_TICK_INVALID )
-                p_sys->i_interpolated_dts += vlc_tick_from_samples(
-                                             p_dec->fmt_out.video.i_frame_rate_base,
-                                             p_dec->fmt_out.video.i_frame_rate);
-
-            //msg_Dbg( p_dec, "-------------- XXX0 dts=%"PRId64" pts=%"PRId64" interpolated=%"PRId64,
-            //         p_pic->i_dts, p_pic->i_pts, p_sys->i_interpolated_dts );
-            if( p_pic->i_dts == VLC_TICK_INVALID )
-                p_pic->i_dts = p_sys->i_interpolated_dts;
-
-            if( p_pic->i_pts == VLC_TICK_INVALID )
-            {
-                if( !p_sys->sh.b_has_bframe || (p_pic->i_flags & BLOCK_FLAG_TYPE_B ) )
-                    p_pic->i_pts = p_pic->i_dts;
-                /* TODO compute pts for other case */
-            }
-        }
-
-        //msg_Dbg( p_dec, "-------------- dts=%"PRId64" pts=%"PRId64, p_pic->i_dts, p_pic->i_pts );
-
-        /* CC */
-        p_sys->i_cc_pts = p_pic->i_pts;
-        p_sys->i_cc_dts = p_pic->i_dts;
-        p_sys->i_cc_flags = p_pic->i_flags;
-
-        p_sys->cc = p_sys->cc_next;
-        cc_Flush( &p_sys->cc_next );
-
-        /* Reset context */
-        p_sys->b_frame = false;
-        p_sys->i_frame_dts = VLC_TICK_INVALID;
-        p_sys->i_frame_pts = VLC_TICK_INVALID;
-        p_sys->p_frame = NULL;
-        p_sys->pp_last = &p_sys->p_frame;
+        p_pic = OutputFrame( p_dec );
     }
 
     /*  */



More information about the vlc-commits mailing list