[FFmpeg-devel] [PATCH 3/4] avcodec/cbs_av1: add an option to select an operating point
James Almer
jamrial at gmail.com
Fri Oct 2 03:31:28 EEST 2020
On 10/1/2020 9:23 PM, Mark Thompson wrote:
> On 20/09/2020 18:24, James Almer wrote:
>> This implements the function drop_obu() as defined in Setion 6.2.1
>> from the
>> spec.
>> In a reading only scenario, units that belong to an operating point the
>> caller doesn't want should not be parsed.
>>
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>> libavcodec/cbs_av1.c | 18 +++++++++++++++++-
>> libavcodec/cbs_av1.h | 5 +++++
>> libavcodec/cbs_av1_syntax_template.c | 7 +++++++
>> 3 files changed, 29 insertions(+), 1 deletion(-)
>
> I think the AVClass and option of patch 1 and this seems like a sensible
> approach.
>
>> diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
>> index dcf6c140ae..edacc29ca8 100644
>> --- a/libavcodec/cbs_av1.c
>> +++ b/libavcodec/cbs_av1.c
>> @@ -18,6 +18,7 @@
>> #include "libavutil/avassert.h"
>> #include "libavutil/pixfmt.h"
>> +#include "libavutil/opt.h"
>> #include "cbs.h"
>> #include "cbs_internal.h"
>> @@ -883,7 +884,7 @@ static int cbs_av1_read_unit(CodedBitstreamContext
>> *ctx,
>> int in_spatial_layer =
>> (priv->operating_point_idc >> (priv->spatial_id +
>> 8)) & 1;
>> if (!in_temporal_layer || !in_spatial_layer) {
>> - // Decoding will drop this OBU at this operating point.
>> + return AVERROR(EAGAIN); // drop_obu()
>> }
>> }
>> }
>> @@ -1238,10 +1239,25 @@ static const CodedBitstreamUnitTypeDescriptor
>> cbs_av1_unit_types[] = {
>> CBS_UNIT_TYPE_END_OF_LIST
>> };
>> +#define OFFSET(x) offsetof(CodedBitstreamAV1Context, x)
>> +static const AVOption cbs_av1_options[] = {
>> + { "oppoint", "Select an operating point of the scalable
>> bitstream", OFFSET(operating_point),
>> + AV_OPT_TYPE_INT, { .i64 = -1 }, -1,
>> AV1_MAX_OPERATING_POINTS - 1, 0 },
>
> "oppoint" isn't used as an abbreviation anywhere in the standard, only
> "op" (so, operating point point?). There isn't really any reason to
> shorten it, so just having "operating_point" would seem clearer.
It's used in the libdav1d decoder wrapper, so i wanted to keep it
consistent. Admittedly, CBS is not meant to face the user, so i guess i
can change it.
>
> For the help string, maybe something a little nicer like "Set operating
> point to select layers to decode from a scalable bitstream"?
Sure.
>
>> + { NULL }
>> +};
>> +
>> +static const AVClass cbs_av1_class = {
>> + .class_name = "cbs_av1",
>> + .item_name = av_default_item_name,
>> + .option = cbs_av1_options,
>> + .version = LIBAVUTIL_VERSION_INT,
>> +};
>> +
>> const CodedBitstreamType ff_cbs_type_av1 = {
>> .codec_id = AV_CODEC_ID_AV1,
>> .priv_data_size = sizeof(CodedBitstreamAV1Context),
>> + .priv_class = &cbs_av1_class,
>
> Not in the same order as patch 1. The way around doesn't matter, but
> keep it consistent.
Ok.
>
>> .unit_types = cbs_av1_unit_types,
>> diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
>> index 7a0c08c596..27b44d68ff 100644
>> --- a/libavcodec/cbs_av1.h
>> +++ b/libavcodec/cbs_av1.h
>> @@ -416,6 +416,8 @@ typedef struct AV1ReferenceFrameState {
>> } AV1ReferenceFrameState;
>> typedef struct CodedBitstreamAV1Context {
>> + const AVClass *class;
>> +
>> AV1RawSequenceHeader *sequence_header;
>> AVBufferRef *sequence_header_ref;
>> @@ -443,6 +445,9 @@ typedef struct CodedBitstreamAV1Context {
>> int tile_rows;
>> AV1ReferenceFrameState ref[AV1_NUM_REF_FRAMES];
>> +
>> + // AVOptions
>> + int operating_point;
>> } CodedBitstreamAV1Context;
>> diff --git a/libavcodec/cbs_av1_syntax_template.c
>> b/libavcodec/cbs_av1_syntax_template.c
>> index bcaa334134..34d09fab68 100644
>> --- a/libavcodec/cbs_av1_syntax_template.c
>> +++ b/libavcodec/cbs_av1_syntax_template.c
>> @@ -186,6 +186,7 @@ static int
>> FUNC(decoder_model_info)(CodedBitstreamContext *ctx, RWContext *rw,
>> static int FUNC(sequence_header_obu)(CodedBitstreamContext *ctx,
>> RWContext *rw,
>> AV1RawSequenceHeader *current)
>> {
>> + CodedBitstreamAV1Context *priv = ctx->priv_data;
>> int i, err;
>> HEADER("Sequence Header");
>> @@ -253,6 +254,12 @@ static int
>> FUNC(sequence_header_obu)(CodedBitstreamContext *ctx, RWContext *rw,
>> }
>> }
>> }
>> + if (priv->operating_point >= 0) {
>> + int op_pt = 0;
>> + if (priv->operating_point <=
>> current->operating_points_cnt_minus_1)
>> + op_pt = priv->operating_point;
>> + priv->operating_point_idc = current->operating_point_idc[op_pt];
>> + }
>
> Would it maybe make more sense to put this near cbs_av1.c:900 to only
> apply to read rather than having it in the parsing template? (I know
> there is choose_operating_point() there in the standard, but it doesn't
> affect any of the sequence header.)
Good idea, this is meant to be used only during read after all.
>
> This probably wants an error message if the selected operating point
> isn't valid, rather than silently ignoring the option.
I'm copying the current dav1d behavior, where it outputs operating point
0 if you request one that's not available. But i can make it error out,
sure.
>
>> fb(4, frame_width_bits_minus_1);
>> fb(4, frame_height_bits_minus_1);
>>
>
> Might be a good idea to document this in doc/decoders.texi.
You mean for patch 4/4?
>
> - Mark
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list