[FFmpeg-devel] [PATCH 1/5] avcodec/hevc_parse: check for parameter set decoding failure

James Almer jamrial at gmail.com
Mon Apr 3 16:46:40 EEST 2017


On 4/3/2017 7:00 AM, Michael Niedermayer wrote:
> On Sun, Apr 02, 2017 at 10:45:41PM -0300, James Almer wrote:
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>>  libavcodec/hevc_parse.c | 32 +++++++++++++++++++++++++-------
>>  1 file changed, 25 insertions(+), 7 deletions(-)
>>
>> diff --git a/libavcodec/hevc_parse.c b/libavcodec/hevc_parse.c
>> index 6c1138e015..028ca5afe5 100644
>> --- a/libavcodec/hevc_parse.c
>> +++ b/libavcodec/hevc_parse.c
>> @@ -22,7 +22,8 @@
>>  #include "hevc_parse.h"
>>  
>>  static int hevc_decode_nal_units(const uint8_t *buf, int buf_size, HEVCParamSets *ps,
>> -                                 int is_nalff, int nal_length_size, void *logctx)
>> +                                 int is_nalff, int nal_length_size, int err_recognition,
>> +                                 void *logctx)
>>  {
>>      int i;
>>      int ret = 0;
>> @@ -38,9 +39,21 @@ static int hevc_decode_nal_units(const uint8_t *buf, int buf_size, HEVCParamSets
>>  
>>          /* ignore everything except parameter sets and VCL NALUs */
>>          switch (nal->type) {
>> -        case HEVC_NAL_VPS: ff_hevc_decode_nal_vps(&nal->gb, logctx, ps);    break;
>> -        case HEVC_NAL_SPS: ff_hevc_decode_nal_sps(&nal->gb, logctx, ps, 1); break;
>> -        case HEVC_NAL_PPS: ff_hevc_decode_nal_pps(&nal->gb, logctx, ps);    break;
>> +        case HEVC_NAL_VPS:
>> +            ret = ff_hevc_decode_nal_vps(&nal->gb, logctx, ps);
>> +            if (ret < 0)
>> +                goto done;
>> +            break;
>> +        case HEVC_NAL_SPS:
>> +            ret = ff_hevc_decode_nal_sps(&nal->gb, logctx, ps, 1);
>> +            if (ret < 0)
>> +                goto done;
>> +            break;
>> +        case HEVC_NAL_PPS:
>> +            ret = ff_hevc_decode_nal_pps(&nal->gb, logctx, ps);
>> +            if (ret < 0)
>> +                goto done;
>> +            break;
>>          case HEVC_NAL_TRAIL_R:
>>          case HEVC_NAL_TRAIL_N:
>>          case HEVC_NAL_TSA_N:
> 
> I didnt investigate how exactly this is used but from just the patch
> this seems not optimal
> For example, if you have 3 PPS NALs and the first fails to decode
> you might still be able to fully decode the other 2

I'm mimicking the behavior of decode_nal_unit() in hevcdec.c, which is
currently used during frame decoding and extradata decoding.
This patchset aims at removing duplicate code while keeping the hevc
decoder behaving the same as it was before. I could skip this change
if that's preferred, but if this behavior is not optimal then someone
who better understands the codec should look at it.



More information about the ffmpeg-devel mailing list