[FFmpeg-devel] [PATCH 1/5] avcodec/hevc_parse: check for parameter set decoding failure
James Almer
jamrial at gmail.com
Sun Apr 9 20:14:23 EEST 2017
On 4/5/2017 6:53 PM, Hendrik Leppkes wrote:
> On Wed, Apr 5, 2017 at 11:40 PM, James Almer <jamrial at gmail.com> wrote:
>> On 4/3/2017 10:46 AM, James Almer wrote:
>>> 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.
>>
>> To add some context, the functions in hevc_parse.c are currently used
>> only by the mediacodec based hevc decoder to decode extradata, and it's
>> a duplicate of existing functionality in hevcdec.c used by the internal
>> hevc decoder.
>>
>> This set aims at putting the hevc_parse.c version on par with the
>> hevcdec.c one (in the scope of extradata parsing, not frame) to share it
>> between the two decoders and any other that may need it in the future.
>> This patch checks for PS failures and aborts if err_recog is set to
>> explode. The second makes apply_defdispwin user defined instead of
>> having it hardcoded to 1. The third avoids aborting on NALs not needed
>> or expected in extradata, and the last two patches make hevcdec.c use
>> ff_hevc_decode_extradata().
>>
>> Not aborting on PS NAL failures here would technically mean a change in
>> behavior on the internal hevc decoder once patch five is applied, and
>> I'd rather no do that as part of this set.
>>
>
> Keeping the current behavior for the HEVC software decoder seems
> ideal. If a change in behavior is wanted afterwards, it should be
> dealt with in a separate change, and not this refactoring.
>
> - Hendrik
Patchset pushed then.
Thanks.
More information about the ffmpeg-devel
mailing list