Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
- index 3581285a47..b82b153cc9 100644
- --- a/libavcodec/cbs_av1.c
- +++ b/libavcodec/cbs_av1.c
- @@ -777,8 +777,9 @@ static int cbs_av1_get_relative_dist(const AV1RawSequenceHeader *seq,
- typedef int (*cbs_av1_split_obu_callback)(CodedBitstreamContext *ctx,
- - void *priv, int obu_type,
- - const uint8_t *data, size_t size);
- + void *priv, AV1RawOBUHeader *header,
- + const uint8_t *data, size_t size,
- + ptrdiff_t offset);
- static int cbs_av1_split_obus(CodedBitstreamContext *ctx,
- void *priv, cbs_av1_split_obu_callback cb,
- @@ -836,7 +837,7 @@ static int cbs_av1_split_obus(CodedBitstreamContext *ctx,
- goto fail;
- }
- - err = cb(ctx, priv, header.obu_type, data, obu_length);
- + err = cb(ctx, priv, &header, data, obu_length, pos / 8);
- if (err < 0)
- goto fail;
- @@ -851,11 +852,12 @@ fail:
- }
- static int cbs_av1_insert_obu(CodedBitstreamContext *ctx,
- - void *priv, int obu_type,
- - const uint8_t *data, size_t size)
- + void *priv, AV1RawOBUHeader *header,
- + const uint8_t *data, size_t size,
- + ptrdiff_t offset)
- {
- CodedBitstreamFragment *frag = priv;
- - return ff_cbs_insert_unit_data(ctx, frag, -1, obu_type,
- + return ff_cbs_insert_unit_data(ctx, frag, -1, header->obu_type,
- (uint8_t*)data, size, frag->data_ref);
- }
- @@ -910,11 +912,7 @@ static int cbs_av1_ref_tile_data(CodedBitstreamContext *ctx,
- {
- int pos;
- - if (!unit->data_ref) {
- - // Not refcounted - only parsing headers, so tile data will
- - // not be needed.
- - return 0;
- - }
- + av_assert0(unit->data_ref);
- pos = get_bits_count(gbc);
- if (pos >= 8 * unit->data_size) {
- @@ -1346,43 +1344,113 @@ static void cbs_av1_close(CodedBitstreamContext *ctx)
- }
- static int cbs_av1_parse_obu(CodedBitstreamContext *ctx,
- - void *priv, int obu_type,
- - const uint8_t *data, size_t data_size)
- + void *priv, AV1RawOBUHeader *header,
- + const uint8_t *data, size_t data_size,
- + ptrdiff_t offset)
- {
- - CodedBitstreamUnit unit;
- + CodedBitstreamAV1Context *av1 = ctx->priv_data;
- + GetBitContext gbc;
- int err;
- // These OBU types will not affect parsing.
- - if (obu_type == AV1_OBU_METADATA ||
- - obu_type == AV1_OBU_TILE_LIST ||
- - obu_type == AV1_OBU_PADDING)
- + if (header->obu_type == AV1_OBU_METADATA ||
- + header->obu_type == AV1_OBU_TILE_LIST ||
- + header->obu_type == AV1_OBU_PADDING)
- return 0;
- - unit = (CodedBitstreamUnit) {
- - .type = obu_type,
- - .data = (uint8_t*)data,
- - .data_size = data_size,
- - };
- -
- - err = cbs_av1_read_unit(ctx, &unit);
- - if (err >= 0 && priv) {
- - AV1RawOBU *obu = unit.content;
- - switch (obu->header.obu_type) {
- - case AV1_OBU_FRAME_HEADER:
- - case AV1_OBU_REDUNDANT_FRAME_HEADER:
- - memcpy(priv, &obu->obu.frame_header,
- - sizeof(obu->obu.frame_header));
- - break;
- - case AV1_OBU_FRAME:
- - memcpy(priv, &obu->obu.frame.header,
- - sizeof(obu->obu.frame.header));
- - break;
- + err = init_get_bits8(&gbc, data + offset, data_size - offset);
- + if (err < 0)
- + return err;
- +
- + if (header->obu_extension_flag) {
- + av1->temporal_id = header->temporal_id;
- + av1->spatial_id = header->spatial_id;
- +
- + if (header->obu_type != AV1_OBU_SEQUENCE_HEADER &&
- + header->obu_type != AV1_OBU_TEMPORAL_DELIMITER &&
- + av1->operating_point_idc) {
- + int in_temporal_layer =
- + (av1->operating_point_idc >> av1->temporal_id ) & 1;
- + int in_spatial_layer =
- + (av1->operating_point_idc >> (av1->spatial_id + 8)) & 1;
- + if (!in_temporal_layer || !in_spatial_layer) {
- + // Decoding will drop this OBU at this operating point.
- + }
- }
- + } else {
- + av1->temporal_id = 0;
- + av1->spatial_id = 0;
- }
- - av_buffer_unref(&unit.content_ref);
- + switch (header->obu_type) {
- + case AV1_OBU_SEQUENCE_HEADER:
- + {
- + AV1RawSequenceHeader *sequence_header;
- + AVBufferRef *sequence_header_ref = av_buffer_allocz(sizeof(AV1RawSequenceHeader));
- - return err;
- + if (!sequence_header_ref)
- + return AVERROR(ENOMEM);
- + sequence_header = (AV1RawSequenceHeader *)sequence_header_ref->data;
- +
- + err = cbs_av1_read_sequence_header_obu(ctx, &gbc, sequence_header);
- + if (err < 0) {
- + av_buffer_unref(&sequence_header_ref);
- + return err;
- + }
- +
- + av_buffer_unref(&av1->sequence_header_ref);
- + av1->sequence_header_ref = sequence_header_ref;
- + av1->sequence_header = sequence_header;
- + }
- + break;
- + case AV1_OBU_TEMPORAL_DELIMITER:
- + {
- + err = cbs_av1_read_temporal_delimiter_obu(ctx, &gbc);
- + if (err < 0)
- + return err;
- + }
- + break;
- + case AV1_OBU_FRAME_HEADER:
- + case AV1_OBU_REDUNDANT_FRAME_HEADER:
- + {
- + AV1RawFrameHeader frame_header = { 0 };
- +
- + err = cbs_av1_read_frame_header_obu(ctx, &gbc,
- + &frame_header,
- + header->obu_type ==
- + AV1_OBU_REDUNDANT_FRAME_HEADER,
- + NULL);
- + if (err < 0)
- + return err;
- + if (frame_header.show_frame || frame_header.show_existing_frame)
- + memcpy(priv, &frame_header, sizeof(frame_header));
- + }
- + break;
- + case AV1_OBU_TILE_GROUP:
- + {
- + AV1RawTileGroup tile_group = { 0 };
- +
- + err = cbs_av1_read_tile_group_obu(ctx, &gbc, &tile_group);
- + if (err < 0)
- + return err;
- + }
- + break;
- + case AV1_OBU_FRAME:
- + {
- + AV1RawFrame frame = { 0 };
- +
- + err = cbs_av1_read_frame_obu(ctx, &gbc, &frame, NULL);
- + if (err < 0)
- + return err;
- + if (frame.header.show_frame)
- + memcpy(priv, &frame.header, sizeof(frame.header));
- + }
- + break;
- + default:
- + return AVERROR(ENOSYS);
- + }
- +
- + return 0;
- }
- static int cbs_av1_parse_headers(CodedBitstreamContext *ctx, void *header,
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement