> On Jan 5, 2023, at 19:21, James Almer <[email protected]> wrote: > > On 1/5/2023 1:14 PM, Zhao Zhili wrote: >> From: Zhao Zhili <[email protected]> >> It can be used to decode selected independent non-base layer. One >> use case is alpha layer decoding. >> Signed-off-by: Zhao Zhili <[email protected]> >> --- >> libavcodec/hevcdec.c | 20 +++++++++++++++++++- >> libavcodec/version.h | 2 +- >> 2 files changed, 20 insertions(+), 2 deletions(-) >> diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c >> index 567e8d81d4..9641922834 100644 >> --- a/libavcodec/hevcdec.c >> +++ b/libavcodec/hevcdec.c >> @@ -3216,7 +3216,8 @@ static int decode_nal_units(HEVCContext *s, const >> uint8_t *buf, int length) >> if (s->avctx->skip_frame >= AVDISCARD_ALL || >> (s->avctx->skip_frame >= AVDISCARD_NONREF >> - && ff_hevc_nal_is_nonref(nal->type)) || nal->nuh_layer_id > 0) >> + && ff_hevc_nal_is_nonref(nal->type)) || >> + nal->nuh_layer_id != s->nuh_layer_id) >> continue; >> ret = decode_nal_unit(s, nal); >> @@ -3637,6 +3638,21 @@ static av_cold int hevc_decode_init(AVCodecContext >> *avctx) >> HEVCContext *s = avctx->priv_data; >> int ret; >> + if (s->nuh_layer_id > 0) { >> + if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) { >> + av_log(avctx, AV_LOG_ERROR, >> + "Decode selected nuh_layer_id is undef development. " >> + "Use -strict -2 to use it anyway.\n"); > > "Undef development"? Does decoding of these non-base layers work or not? One > thing is something being experimental (thus known to be working in at least > some cases, even if not spec compliant), and another is enabling something we > don't know if it's going to work or not at all.
Undef -> Under. It works for INBL (independent non-base layer) bitstream, which is coded without using inter-layer prediction and conforms to a single layer profile. Apple’s "HEVC Video with Alpha Interoperability Profile” is this case from my test, although Apple doesn’t specify it clear. https://developer.apple.com/av-foundation/HEVC-Video-with-Alpha-Interoperability-Profile.pdf Whether it’s INBL can be checked from vps_extension, which doesn’t get parsed yet. There are at least three ways to add multi-layer extension support: 1. Fully support inside hevc soft decoder, with inter-layer prediction support, multiview and spatial scalability and so on. 2. A decoder wrapper, which has two or multi hevc decoder instances inside. Only works for INBL streams. 3. Let user handle multiple decoder instances. Only works from INBL streams. > >> + return AVERROR(EINVAL); >> + } >> + >> + if (avctx->hwaccel) { >> + av_log(avctx, AV_LOG_ERROR, >> + "Decode selected nuh_layer_id doesn't work with >> hwaccel.\n"); >> + return AVERROR(EINVAL); >> + } >> + } >> + >> if (avctx->active_thread_type & FF_THREAD_SLICE) { >> s->threads_number = avctx->thread_count; >> ret = ff_slice_thread_init_progress(avctx); >> @@ -3691,6 +3707,8 @@ static const AVOption options[] = { >> AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR }, >> { "strict-displaywin", "stricly apply default display window size", >> OFFSET(apply_defdispwin), >> AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR }, >> + { "nuh_layer_id", "Select which nuh_layer_id to decode (only works with >> INBL)", OFFSET(nuh_layer_id), >> + AV_OPT_TYPE_INT, {.i64 = 0}, 0, 62, PAR }, >> { NULL }, >> }; >> diff --git a/libavcodec/version.h b/libavcodec/version.h >> index 6b8a1dbb79..15f7c3fe3d 100644 >> --- a/libavcodec/version.h >> +++ b/libavcodec/version.h >> @@ -30,7 +30,7 @@ >> #include "version_major.h" >> #define LIBAVCODEC_VERSION_MINOR 56 >> -#define LIBAVCODEC_VERSION_MICRO 100 >> +#define LIBAVCODEC_VERSION_MICRO 101 >> #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ >> LIBAVCODEC_VERSION_MINOR, \ > _______________________________________________ > ffmpeg-devel mailing list > [email protected] > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > [email protected] with subject "unsubscribe". _______________________________________________ ffmpeg-devel mailing list [email protected] https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
