On Wed, Apr 5, 2017 at 11:40 PM, James Almer <jamr...@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 <jamr...@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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel