FFmpeg
av1_parser.c
Go to the documentation of this file.
1 /*
2  * AV1 parser
3  *
4  * Copyright (C) 2018 James Almer <jamrial@gmail.com>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "av1_parse.h"
24 #include "cbs.h"
25 #include "cbs_av1.h"
26 #include "internal.h"
27 #include "parser.h"
28 
29 typedef struct AV1ParseContext {
34 
35 static const enum AVPixelFormat pix_fmts_8bit[2][2] = {
38 };
39 static const enum AVPixelFormat pix_fmts_10bit[2][2] = {
42 };
43 static const enum AVPixelFormat pix_fmts_12bit[2][2] = {
46 };
47 
48 static const enum AVPixelFormat pix_fmts_rgb[3] = {
50 };
51 
53  AVCodecContext *avctx,
54  const uint8_t **out_data, int *out_size,
55  const uint8_t *data, int size)
56 {
58  CodedBitstreamFragment *td = &s->temporal_unit;
59  CodedBitstreamAV1Context *av1 = s->cbc->priv_data;
62  int ret;
63 
64  *out_data = data;
65  *out_size = size;
66 
67  ctx->key_frame = -1;
68  ctx->pict_type = AV_PICTURE_TYPE_NONE;
69  ctx->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN;
70 
71  s->cbc->log_ctx = avctx;
72 
73  if (avctx->extradata_size && !s->parsed_extradata) {
74  s->parsed_extradata = 1;
75 
76  ret = ff_cbs_read(s->cbc, td, avctx->extradata, avctx->extradata_size);
77  if (ret < 0) {
78  av_log(avctx, AV_LOG_WARNING, "Failed to parse extradata.\n");
79  }
80 
81  ff_cbs_fragment_reset(s->cbc, td);
82  }
83 
84  ret = ff_cbs_read(s->cbc, td, data, size);
85  if (ret < 0) {
86  av_log(avctx, AV_LOG_ERROR, "Failed to parse temporal unit.\n");
87  goto end;
88  }
89 
90  if (!av1->sequence_header) {
91  av_log(avctx, AV_LOG_ERROR, "No sequence header available\n");
92  goto end;
93  }
94 
95  seq = av1->sequence_header;
96  color = &seq->color_config;
97 
98  for (int i = 0; i < td->nb_units; i++) {
99  CodedBitstreamUnit *unit = &td->units[i];
100  AV1RawOBU *obu = unit->content;
102  int frame_type;
103 
104  if (unit->type == AV1_OBU_FRAME)
105  frame = &obu->obu.frame.header;
106  else if (unit->type == AV1_OBU_FRAME_HEADER)
107  frame = &obu->obu.frame_header;
108  else
109  continue;
110 
111  if (obu->header.spatial_id > 0)
112  continue;
113 
114  if (frame->show_existing_frame) {
115  AV1ReferenceFrameState *ref = &av1->ref[frame->frame_to_show_map_idx];
116 
117  if (!ref->valid) {
118  av_log(avctx, AV_LOG_ERROR, "Invalid reference frame\n");
119  goto end;
120  }
121 
122  ctx->width = ref->frame_width;
123  ctx->height = ref->frame_height;
124  frame_type = ref->frame_type;
125 
126  ctx->key_frame = 0;
127  } else if (!frame->show_frame) {
128  continue;
129  } else {
130  ctx->width = av1->frame_width;
131  ctx->height = av1->frame_height;
132  frame_type = frame->frame_type;
133 
134  ctx->key_frame = frame_type == AV1_FRAME_KEY;
135  }
136 
137  switch (frame_type) {
138  case AV1_FRAME_KEY:
140  ctx->pict_type = AV_PICTURE_TYPE_I;
141  break;
142  case AV1_FRAME_INTER:
143  ctx->pict_type = AV_PICTURE_TYPE_P;
144  break;
145  case AV1_FRAME_SWITCH:
146  ctx->pict_type = AV_PICTURE_TYPE_SP;
147  break;
148  }
149  ctx->picture_structure = AV_PICTURE_STRUCTURE_FRAME;
150  }
151 
152  switch (av1->bit_depth) {
153  case 8:
154  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY8
155  : pix_fmts_8bit [color->subsampling_x][color->subsampling_y];
156  break;
157  case 10:
158  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY10
159  : pix_fmts_10bit[color->subsampling_x][color->subsampling_y];
160  break;
161  case 12:
162  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY12
163  : pix_fmts_12bit[color->subsampling_x][color->subsampling_y];
164  break;
165  }
166  av_assert2(ctx->format != AV_PIX_FMT_NONE);
167 
168  if (!color->subsampling_x && !color->subsampling_y &&
169  color->matrix_coefficients == AVCOL_SPC_RGB &&
170  color->color_primaries == AVCOL_PRI_BT709 &&
171  color->transfer_characteristics == AVCOL_TRC_IEC61966_2_1)
172  ctx->format = pix_fmts_rgb[color->high_bitdepth + color->twelve_bit];
173 
174  avctx->pix_fmt = ctx->format;
175 
176  avctx->profile = seq->seq_profile;
177  avctx->level = seq->seq_level_idx[0];
178 
179  avctx->colorspace = (enum AVColorSpace) color->matrix_coefficients;
180  avctx->color_primaries = (enum AVColorPrimaries) color->color_primaries;
181  avctx->color_trc = (enum AVColorTransferCharacteristic) color->transfer_characteristics;
182  avctx->color_range = color->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
183 
184  if (ctx->width != avctx->width || ctx->height != avctx->height) {
185  ret = ff_set_dimensions(avctx, ctx->width, ctx->height);
186  if (ret < 0)
187  goto end;
188  }
189 
190  if (avctx->framerate.num)
191  avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
192 
193 end:
194  ff_cbs_fragment_reset(s->cbc, td);
195 
196  s->cbc->log_ctx = NULL;
197 
198  return size;
199 }
200 
207 };
208 
210 {
212  int ret;
213 
214  ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_AV1, NULL);
215  if (ret < 0)
216  return ret;
217 
218  s->cbc->decompose_unit_types = (CodedBitstreamUnitType *)decompose_unit_types;
219  s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types);
220 
221  return 0;
222 }
223 
225 {
227 
228  ff_cbs_fragment_free(s->cbc, &s->temporal_unit);
229  ff_cbs_close(&s->cbc);
230 }
231 
233  const uint8_t *buf, int buf_size)
234 {
235  AV1OBU obu;
236  const uint8_t *ptr = buf, *end = buf + buf_size;
237 
238  while (ptr < end) {
239  int len = ff_av1_extract_obu(&obu, ptr, buf_size, avctx);
240  if (len < 0)
241  break;
242 
243  if (obu.type == AV1_OBU_FRAME_HEADER ||
244  obu.type == AV1_OBU_FRAME) {
245  return ptr - buf;
246  }
247  ptr += len;
248  buf_size -= len;
249  }
250 
251  return 0;
252 }
253 
255  .codec_ids = { AV_CODEC_ID_AV1 },
256  .priv_data_size = sizeof(AV1ParseContext),
257  .parser_init = av1_parser_init,
258  .parser_close = av1_parser_close,
259  .parser_parse = av1_parser_parse,
261 };
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
td
#define td
Definition: regdef.h:70
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
pix_fmts_rgb
static enum AVPixelFormat pix_fmts_rgb[3]
Definition: av1_parser.c:48
AV1RawSequenceHeader::seq_level_idx
uint8_t seq_level_idx[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:87
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:1154
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:480
AV1RawSequenceHeader
Definition: cbs_av1.h:73
color
Definition: vf_paletteuse.c:582
AV_PICTURE_STRUCTURE_UNKNOWN
@ AV_PICTURE_STRUCTURE_UNKNOWN
Definition: avcodec.h:3347
pix_fmts_8bit
static enum AVPixelFormat pix_fmts_8bit[2][2]
Definition: av1_parser.c:35
CodedBitstreamUnit::content
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:101
out_size
int out_size
Definition: movenc.c:55
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:92
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:1147
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
the normal 2^n-1 "JPEG" YUV ranges
Definition: pixfmt.h:535
internal.h
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition: cbs.h:168
ff_cbs_close
void ff_cbs_close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
Definition: cbs.c:115
data
const char data[16]
Definition: mxf.c:91
AV1OBU
Definition: av1_parse.h:30
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:397
ff_cbs_fragment_free
void ff_cbs_fragment_free(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
Free the units array of a fragment in addition to what ff_cbs_fragment_reset does.
Definition: cbs.c:157
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB)
Definition: pixfmt.h:510
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:68
cbs.h
AVColorPrimaries
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition: pixfmt.h:455
AV1_OBU_TEMPORAL_DELIMITER
@ AV1_OBU_TEMPORAL_DELIMITER
Definition: av1.h:31
av1_parser_init
static av_cold int av1_parser_init(AVCodecParserContext *ctx)
Definition: av1_parser.c:209
AV1RawOBU::header
AV1RawOBUHeader header
Definition: cbs_av1.h:388
AV1RawSequenceHeader::seq_profile
uint8_t seq_profile
Definition: cbs_av1.h:74
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:64
AV1RawFrame::header
AV1RawFrameHeader header
Definition: cbs_av1.h:300
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:2069
AV1RawColorConfig
Definition: cbs_av1.h:41
av1_parse.h
AVCOL_TRC_IEC61966_2_1
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:494
AV1_FRAME_SWITCH
@ AV1_FRAME_SWITCH
Definition: av1.h:56
AV1_OBU_FRAME_HEADER
@ AV1_OBU_FRAME_HEADER
Definition: av1.h:32
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:413
ff_cbs_read
int ff_cbs_read(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const uint8_t *data, size_t size)
Read a bitstream from a memory region into a fragment, then split into units and decompose.
Definition: cbs.c:269
av1_parser_split
static int av1_parser_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
Definition: av1_parser.c:232
ff_av1_parser
AVCodecParser ff_av1_parser
Definition: av1_parser.c:254
ff_av1_extract_obu
int ff_av1_extract_obu(AV1OBU *obu, const uint8_t *buf, int length, void *logctx)
Extract an OBU from a raw bitstream.
Definition: av1_parse.c:29
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:400
cbs_av1.h
AV_PICTURE_STRUCTURE_FRAME
@ AV_PICTURE_STRUCTURE_FRAME
Definition: avcodec.h:3350
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:1140
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
av_cold
#define av_cold
Definition: attributes.h:90
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:628
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:116
s
#define s(width, name)
Definition: cbs_vp9.c:257
CodedBitstreamAV1Context::frame_height
int frame_height
Definition: cbs_av1.h:434
ctx
AVFormatContext * ctx
Definition: movenc.c:48
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:378
if
if(ret)
Definition: filter_design.txt:179
AV1RawOBU::obu
union AV1RawOBU::@25 obu
AV1RawOBU
Definition: cbs_av1.h:387
NULL
#define NULL
Definition: coverity.c:32
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:1161
AVCodecParser::codec_ids
int codec_ids[5]
Definition: avcodec.h:3521
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:274
AV1RawFrameHeader
Definition: cbs_av1.h:133
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B
Definition: pixfmt.h:457
av1_parser_parse
static int av1_parser_parse(AVCodecParserContext *ctx, AVCodecContext *avctx, const uint8_t **out_data, int *out_size, const uint8_t *data, int size)
Definition: av1_parser.c:52
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
AV1_OBU_TILE_GROUP
@ AV1_OBU_TILE_GROUP
Definition: av1.h:33
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:398
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:74
AVCodecContext::level
int level
level
Definition: avcodec.h:1982
AV_PICTURE_TYPE_SP
@ AV_PICTURE_TYPE_SP
Switching Predicted.
Definition: avutil.h:279
av1_parser_close
static void av1_parser_close(AVCodecParserContext *ctx)
Definition: av1_parser.c:224
AV1_OBU_FRAME
@ AV1_OBU_FRAME
Definition: av1.h:35
AVCodecContext::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avcodec.h:649
AV1ParseContext
Definition: av1_parser.c:29
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:402
AV1RawOBUHeader::spatial_id
uint8_t spatial_id
Definition: cbs_av1.h:37
size
int size
Definition: twinvq_data.h:11134
color
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:92
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:404
AV1_OBU_SEQUENCE_HEADER
@ AV1_OBU_SEQUENCE_HEADER
Definition: av1.h:30
AV_PICTURE_TYPE_NONE
@ AV_PICTURE_TYPE_NONE
Undefined.
Definition: avutil.h:273
AV1ReferenceFrameState
Definition: cbs_av1.h:403
split
static char * split(char *message, char delim)
Definition: af_channelmap.c:81
AV1_FRAME_INTRA_ONLY
@ AV1_FRAME_INTRA_ONLY
Definition: av1.h:55
AV1_FRAME_KEY
@ AV1_FRAME_KEY
Definition: av1.h:53
AV1RawOBU::frame_header
AV1RawFrameHeader frame_header
Definition: cbs_av1.h:394
CodedBitstreamAV1Context::frame_width
int frame_width
Definition: cbs_av1.h:433
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
decompose_unit_types
static const CodedBitstreamUnitType decompose_unit_types[]
Definition: av1_parser.c:201
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
frame_type
frame_type
Definition: jpeg2000_parser.c:31
pix_fmts_12bit
static enum AVPixelFormat pix_fmts_12bit[2][2]
Definition: av1_parser.c:43
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:627
CodedBitstreamAV1Context::bit_depth
int bit_depth
Definition: cbs_av1.h:431
AV1ParseContext::cbc
CodedBitstreamContext * cbc
Definition: av1_parser.c:30
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:414
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:509
uint8_t
uint8_t
Definition: audio_convert.c:194
AV1RawSequenceHeader::color_config
AV1RawColorConfig color_config
Definition: cbs_av1.h:128
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
parser.h
AV1ParseContext::parsed_extradata
int parsed_extradata
Definition: av1_parser.c:32
len
int len
Definition: vorbis_enc_data.h:452
AVCodecContext::height
int height
Definition: avcodec.h:699
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:736
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
the normal 219*2^(n-8) "MPEG" YUV ranges
Definition: pixfmt.h:534
AVCodecParserContext
Definition: avcodec.h:3353
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
ff_cbs_init
int ff_cbs_init(CodedBitstreamContext **ctx_ptr, enum AVCodecID codec_id, void *log_ctx)
Create and initialise a new context for the given codec.
Definition: cbs.c:74
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:401
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen_template.c:38
AVCodecContext
main external API structure.
Definition: avcodec.h:526
CodedBitstreamAV1Context::ref
AV1ReferenceFrameState * ref
Definition: cbs_av1.h:445
CodedBitstreamAV1Context::sequence_header
AV1RawSequenceHeader * sequence_header
Definition: cbs_av1.h:419
CodedBitstreamUnitType
uint32_t CodedBitstreamUnitType
The codec-specific type of a bitstream unit.
Definition: cbs.h:43
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1859
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
ff_cbs_fragment_reset
void ff_cbs_fragment_reset(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
Free the units contained in a fragment as well as the fragment's own data buffer, but not the units a...
Definition: cbs.c:142
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
AV1OBU::type
int type
Definition: av1_parse.h:48
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:168
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:275
AV1RawOBU::frame
AV1RawFrame frame
Definition: cbs_av1.h:395
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:104
pix_fmts_10bit
static enum AVPixelFormat pix_fmts_10bit[2][2]
Definition: av1_parser.c:39
AVCodecParser
Definition: avcodec.h:3520
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:699
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AV1_FRAME_INTER
@ AV1_FRAME_INTER
Definition: av1.h:54
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:379
AV1ParseContext::temporal_unit
CodedBitstreamFragment temporal_unit
Definition: av1_parser.c:31
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1363
CodedBitstreamAV1Context
Definition: cbs_av1.h:418