[vlc-devel] h264: Fix #6539

Aurélien Nephtali aurelien.nephtali at gmail.com
Thu Jun 7 18:42:19 CEST 2012


On Thu, Jun 7, 2012 at 6:35 PM, Rafaël Carré <funman at videolan.org> wrote:
> Hello,
>
> Le 07/06/2012 12:13, Aurélien Nephtali a écrit :
>> On Thu, Jun 7, 2012 at 5:06 PM, Aurélien Nephtali
>> <aurelien.nephtali at gmail.com> wrote:
>>> > Hi,
>>> >
>>> > See attached patch.
>>> >
>>> > Thanks.
>>> >
>> New patch with correct indentation.
>>
>> -- Aurélien Nephtali
>>
>>
>> 0002-h264-Fix-6539.patch
>>
>>
>> From 75d3642ea7ed63a0e71f1ac438082fa700a584d6 Mon Sep 17 00:00:00 2001
>> From: Aurelien Nephtali <aurelien.nephtali at gmail.com>
>> Date: Thu, 7 Jun 2012 18:11:39 +0200
>> Subject: [PATCH 2/2] h264: Fix #6539
>>
>> It is a very naive approach : if we have an AUD and no PTS to use we use the previous one
>> No side effect so far.
>> ---
>>  modules/packetizer/h264.c |   18 ++++++++++++++++--
>>  1 file changed, 16 insertions(+), 2 deletions(-)
>>
>> diff --git a/modules/packetizer/h264.c b/modules/packetizer/h264.c
>> index a680454..ed8a7b9 100644
>> --- a/modules/packetizer/h264.c
>> +++ b/modules/packetizer/h264.c
>> @@ -122,6 +122,8 @@ struct decoder_sys_t
>>      /* */
>>      mtime_t i_frame_pts;
>>      mtime_t i_frame_dts;
>> +    mtime_t i_last_frame_pts;
>> +    mtime_t i_last_frame_dts;
>>
>>      /* */
>>      uint32_t i_cc_flags;
>> @@ -233,6 +235,8 @@ static int Open( vlc_object_t *p_this )
>>
>>      p_sys->i_frame_dts = VLC_TS_INVALID;
>>      p_sys->i_frame_pts = VLC_TS_INVALID;
>> +    p_sys->i_last_frame_dts = VLC_TS_INVALID;
>> +    p_sys->i_last_frame_pts = VLC_TS_INVALID;
>>
>>      /* Setup properties */
>>      es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
>> @@ -516,6 +520,8 @@ static void PacketizeReset( void *p_private, bool b_broken )
>>      }
>>      p_sys->i_frame_pts = VLC_TS_INVALID;
>>      p_sys->i_frame_dts = VLC_TS_INVALID;
>> +    p_sys->i_last_frame_pts = VLC_TS_INVALID;
>> +    p_sys->i_last_frame_dts = VLC_TS_INVALID;
>>  }
>>  static block_t *PacketizeParse( void *p_private, bool *pb_ts_used, block_t *p_block )
>>  {
>> @@ -610,8 +616,8 @@ static block_t *ParseNALBlock( decoder_t *p_dec, bool *pb_used_ts, block_t *p_fr
>>
>>      const int i_nal_ref_idc = (p_frag->p_buffer[4] >> 5)&0x03;
>>      const int i_nal_type = p_frag->p_buffer[4]&0x1f;
>> -    const mtime_t i_frag_dts = p_frag->i_dts;
>> -    const mtime_t i_frag_pts = p_frag->i_pts;
>> +    /* const */ mtime_t i_frag_dts = p_frag->i_dts;
>> +    /* const */ mtime_t i_frag_pts = p_frag->i_pts;
>
> Please remove the const, there is no point in keeping it commented
> because it can only cause confusion to the reader.
>

Ok.

>>
>>      if( p_sys->b_slice && ( !p_sys->b_sps || !p_sys->b_pps ) )
>>      {
>> @@ -684,6 +690,12 @@ static block_t *ParseNALBlock( decoder_t *p_dec, bool *pb_used_ts, block_t *p_fr
>>          }
>>          else if( i_nal_type == NAL_AU_DELIMITER )
>>          {
>> +            if( i_frag_pts <= VLC_TS_INVALID )
>> +            {
>> +                i_frag_dts = p_sys->i_last_frame_dts;
>> +                i_frag_pts = p_sys->i_last_frame_pts;
>> +            }
>
> Reading the ticket I am not sure how:
>
> AUD
> SEI
> SLICE
> AUD
> SEI
> SLICE
>
> is packetized:
>
> 2 packets containing AUD+SEI+SLICE, but have the same pts/dts ?
>

I suppose it is because it is the 2 fields of the same picture
(interlaced material).
I am no expert in packetizing H.264 into MPEG-TS and it is the first
time I see a stream like this.

>>              if( p_sys->p_frame && (p_sys->p_frame->i_flags & BLOCK_FLAG_PRIVATE_AUD) )
>>              {
>>                  block_Release( p_frag );
>> @@ -778,6 +790,8 @@ static block_t *OutputPicture( decoder_t *p_dec )
>>
>>      p_sys->slice.i_frame_type = 0;
>>      p_sys->p_frame = NULL;
>> +    p_sys->i_last_frame_dts = p_sys->i_frame_dts;
>> +    p_sys->i_last_frame_pts = p_sys->i_frame_pts;
>>      p_sys->i_frame_dts = VLC_TS_INVALID;
>>      p_sys->i_frame_pts = VLC_TS_INVALID;
>>      p_sys->b_frame_sps = false;
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel

-- 
Aurélien Nephtali



More information about the vlc-devel mailing list