[vlc-commits] hevc: use pic timing

Francois Cartegnie git at videolan.org
Wed Apr 5 14:19:58 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Apr  4 18:25:58 2017 +0200| [7653141d902946c7d9424b5169c976c9623be62a] | committer: Francois Cartegnie

hevc: use pic timing

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

 modules/packetizer/hevc.c | 45 +++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 41 insertions(+), 4 deletions(-)

diff --git a/modules/packetizer/hevc.c b/modules/packetizer/hevc.c
index 935ba0e..da73435 100644
--- a/modules/packetizer/hevc.c
+++ b/modules/packetizer/hevc.c
@@ -89,6 +89,7 @@ struct decoder_sys_t
     const hevc_video_parameter_set_t    *p_active_vps;
     const hevc_sequence_parameter_set_t *p_active_sps;
     const hevc_picture_parameter_set_t  *p_active_pps;
+    hevc_sei_pic_timing_t *p_timing;
     bool b_init_sequence_complete;
 
     date_t dts;
@@ -190,7 +191,7 @@ static int Open(vlc_object_t *p_this)
         date_Init( &p_sys->dts, p_dec->fmt_in.video.i_frame_rate * 2,
                                 p_dec->fmt_in.video.i_frame_rate_base );
     else
-        date_Init( &p_sys->dts, 1, 1 );
+        date_Init( &p_sys->dts, 2 * 30000, 1001 );
     date_Set( &p_sys->dts, VLC_TS_INVALID );
     p_sys->pts = VLC_TS_INVALID;
     p_sys->b_need_ts = true;
@@ -262,6 +263,8 @@ static void Close(vlc_object_t *p_this)
             hevc_rbsp_release_vps(p_sys->rgi_p_decvps[i]);
     }
 
+    hevc_release_sei_pic_timing( p_sys->p_timing );
+
     cc_storage_delete( p_sys->p_ccs );
 
     free(p_sys);
@@ -453,9 +456,14 @@ static void ActivateSets(decoder_t *p_dec,
     {
         if(!p_dec->fmt_in.video.i_frame_rate)
         {
-            (void) hevc_get_frame_rate( p_sps, p_dec->p_sys->rgi_p_decvps,
-                                        &p_dec->fmt_out.video.i_frame_rate,
-                                        &p_dec->fmt_out.video.i_frame_rate_base );
+            unsigned num, den;
+            if(hevc_get_frame_rate( p_sps, p_dec->p_sys->rgi_p_decvps, &num, &den ))
+            {
+                p_dec->fmt_out.video.i_frame_rate = num;
+                p_dec->fmt_out.video.i_frame_rate_base = den;
+                if(p_sys->dts.i_divider_den != den && p_sys->dts.i_divider_num != num)
+                    date_Change(&p_sys->dts, 2 * num, den);
+            }
         }
 
         if(p_dec->fmt_in.video.primaries == COLOR_PRIMARIES_UNDEF)
@@ -708,6 +716,23 @@ static block_t *GatherAndValidateChain(block_t *p_outputchain)
     return p_output;
 }
 
+static void SetOutputBlockProperties(decoder_t *p_dec, block_t *p_output)
+{
+    decoder_sys_t *p_sys = p_dec->p_sys;
+    /* Set frame duration */
+    if(p_sys->p_active_sps)
+    {
+        uint8_t i_num_clock_ts = hevc_get_num_clock_ts(p_sys->p_active_sps,
+                                                       p_sys->p_timing);
+        const mtime_t i_start = date_Get(&p_sys->dts);
+        date_Increment(&p_sys->dts, i_num_clock_ts);
+        p_output->i_length = date_Get(&p_sys->dts) - i_start;
+        p_sys->pts = VLC_TS_INVALID;
+    }
+    hevc_release_sei_pic_timing(p_sys->p_timing);
+    p_sys->p_timing = NULL;
+}
+
 /*****************************************************************************
  * ParseNALBlock: parses annexB type NALs
  * All p_frag blocks are required to start with 0 0 0 1 4-byte startcode
@@ -760,7 +785,10 @@ static block_t *ParseNALBlock(decoder_t *p_dec, bool *pb_ts_used, block_t *p_fra
 
     p_output = GatherAndValidateChain(p_output);
     if(p_output)
+    {
         p_sys->b_need_ts = true;
+        SetOutputBlockProperties( p_dec, p_output );
+    }
 
     return p_output;
 }
@@ -795,6 +823,15 @@ static bool ParseSEICallback( const hxxx_sei_data_t *p_sei_data, void *cbdata )
 
     switch( p_sei_data->i_type )
     {
+        case HXXX_SEI_PIC_TIMING:
+        {
+            if( p_sys->p_active_sps )
+            {
+                hevc_release_sei_pic_timing( p_sys->p_timing );
+                p_sys->p_timing = hevc_decode_sei_pic_timing( p_sei_data->p_bs,
+                                                              p_sys->p_active_sps );
+            }
+        } break;
         case HXXX_SEI_USER_DATA_REGISTERED_ITU_T_T35:
         {
             if( p_sei_data->itu_t35.type == HXXX_ITU_T35_TYPE_CC )



More information about the vlc-commits mailing list