> 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".

Reply via email to