|
|
|
@@ -17,6 +17,7 @@ |
|
|
|
*/ |
|
|
|
|
|
|
|
#include "libavutil/avassert.h" |
|
|
|
#include "libavutil/opt.h" |
|
|
|
#include "libavutil/pixfmt.h" |
|
|
|
|
|
|
|
#include "cbs.h" |
|
|
|
@@ -917,7 +918,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() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -930,6 +931,18 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, |
|
|
|
if (err < 0) |
|
|
|
return err; |
|
|
|
|
|
|
|
if (priv->operating_point >= 0) { |
|
|
|
AV1RawSequenceHeader *sequence_header = &obu->obu.sequence_header; |
|
|
|
|
|
|
|
if (priv->operating_point > sequence_header->operating_points_cnt_minus_1) { |
|
|
|
av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid Operating Point %d requested. " |
|
|
|
"Must not be higher than %u.\n", |
|
|
|
priv->operating_point, sequence_header->operating_points_cnt_minus_1); |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
priv->operating_point_idc = sequence_header->operating_point_idc[priv->operating_point]; |
|
|
|
} |
|
|
|
|
|
|
|
av_buffer_unref(&priv->sequence_header_ref); |
|
|
|
priv->sequence_header = NULL; |
|
|
|
|
|
|
|
@@ -1291,9 +1304,24 @@ 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[] = { |
|
|
|
{ "operating_point", "Set operating point to select layers to parse from a scalable bitstream", |
|
|
|
OFFSET(operating_point), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AV1_MAX_OPERATING_POINTS - 1, 0 }, |
|
|
|
{ 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_class = &cbs_av1_class, |
|
|
|
.priv_data_size = sizeof(CodedBitstreamAV1Context), |
|
|
|
|
|
|
|
.unit_types = cbs_av1_unit_types, |
|
|
|
|