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 {
57  AV1ParseContext *s = ctx->priv_data;
62  int ret;
63 
64  *out_data = data;
65  *out_size = size;
66 
67  ctx->key_frame = -1;
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 
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 
103  if (unit->type == AV1_OBU_FRAME)
104  frame = &obu->obu.frame.header;
105  else if (unit->type == AV1_OBU_FRAME_HEADER)
106  frame = &obu->obu.frame_header;
107  else
108  continue;
109 
110  if (obu->header.spatial_id > 0)
111  continue;
112 
113  if (!frame->show_frame && !frame->show_existing_frame)
114  continue;
115 
116  ctx->width = frame->frame_width_minus_1 + 1;
117  ctx->height = frame->frame_height_minus_1 + 1;
118 
119  ctx->key_frame = frame->frame_type == AV1_FRAME_KEY && !frame->show_existing_frame;
120 
121  switch (frame->frame_type) {
122  case AV1_FRAME_KEY:
125  break;
126  case AV1_FRAME_INTER:
128  break;
129  case AV1_FRAME_SWITCH:
131  break;
132  }
134  }
135 
136  switch (av1->bit_depth) {
137  case 8:
138  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY8
139  : pix_fmts_8bit [color->subsampling_x][color->subsampling_y];
140  break;
141  case 10:
142  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY10
143  : pix_fmts_10bit[color->subsampling_x][color->subsampling_y];
144  break;
145  case 12:
146  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY12
147  : pix_fmts_12bit[color->subsampling_x][color->subsampling_y];
148  break;
149  }
151 
152  if (!color->subsampling_x && !color->subsampling_y &&
154  color->color_primaries == AVCOL_PRI_BT709 &&
156  ctx->format = pix_fmts_rgb[color->high_bitdepth + color->twelve_bit];
157 
158  avctx->profile = seq->seq_profile;
159  avctx->level = seq->seq_level_idx[0];
160 
161  avctx->colorspace = (enum AVColorSpace) color->matrix_coefficients;
162  avctx->color_primaries = (enum AVColorPrimaries) color->color_primaries;
165 
166  if (avctx->framerate.num)
167  avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
168 
169 end:
171 
172  s->cbc->log_ctx = NULL;
173 
174  return size;
175 }
176 
183 };
184 
186 {
187  AV1ParseContext *s = ctx->priv_data;
188  int ret;
189 
190  ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_AV1, NULL);
191  if (ret < 0)
192  return ret;
193 
196 
197  return 0;
198 }
199 
201 {
202  AV1ParseContext *s = ctx->priv_data;
203 
205  ff_cbs_close(&s->cbc);
206 }
207 
209  const uint8_t *buf, int buf_size)
210 {
211  AV1OBU obu;
212  const uint8_t *ptr = buf, *end = buf + buf_size;
213 
214  while (ptr < end) {
215  int len = ff_av1_extract_obu(&obu, ptr, buf_size, avctx);
216  if (len < 0)
217  break;
218 
219  if (obu.type == AV1_OBU_FRAME_HEADER ||
220  obu.type == AV1_OBU_FRAME) {
221  return ptr - buf;
222  }
223  ptr += len;
224  buf_size -= len;
225  }
226 
227  return 0;
228 }
229 
231  .codec_ids = { AV_CODEC_ID_AV1 },
232  .priv_data_size = sizeof(AV1ParseContext),
233  .parser_init = av1_parser_init,
234  .parser_close = av1_parser_close,
235  .parser_parse = av1_parser_parse,
237 };
#define NULL
Definition: coverity.c:32
AVRational framerate
Definition: avcodec.h:2069
int nb_units
Number of units in this fragment.
Definition: cbs.h:149
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:100
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:200
uint8_t mono_chrome
Definition: cbs_av1.h:44
int width
Dimensions of the decoded video intended for presentation.
Definition: avcodec.h:3500
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
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:70
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:1161
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:168
int num
Numerator.
Definition: rational.h:59
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:415
int codec_ids[5]
Definition: avcodec.h:3521
int out_size
Definition: movenc.c:55
static enum AVPixelFormat pix_fmts_10bit[2][2]
Definition: av1_parser.c:39
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:403
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
uint8_t color_range
Definition: cbs_av1.h:51
int profile
profile
Definition: avcodec.h:1859
uint16_t frame_width_minus_1
Definition: cbs_av1.h:156
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB)
Definition: pixfmt.h:513
uint8_t seq_profile
Definition: cbs_av1.h:74
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:483
static const CodedBitstreamUnitType decompose_unit_types[]
Definition: av1_parser.c:177
static enum AVPixelFormat pix_fmts_12bit[2][2]
Definition: av1_parser.c:43
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avcodec.h:649
Undefined.
Definition: avutil.h:273
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:380
CodedBitstreamFragment temporal_unit
Definition: av1_parser.c:31
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:381
uint8_t matrix_coefficients
Definition: cbs_av1.h:49
enum AVPictureStructure picture_structure
Indicate whether a picture is coded as a frame, top field or bottom field.
Definition: avcodec.h:3487
uint8_t
#define av_cold
Definition: attributes.h:88
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:92
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:512
uint32_t CodedBitstreamUnitType
The codec-specific type of a bitstream unit.
Definition: cbs.h:43
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:92
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:627
uint8_t high_bitdepth
Definition: cbs_av1.h:42
Coded bitstream unit structure.
Definition: cbs.h:66
ptrdiff_t size
Definition: opengl_enc.c:100
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:103
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:164
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:404
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition: pixfmt.h:458
static int av1_parser_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
Definition: av1_parser.c:208
AVCodecParser ff_av1_parser
Definition: av1_parser.c:230
#define av_log(a,...)
void ff_cbs_fragment_reset(CodedBitstreamFragment *frag)
Free the units contained in a fragment as well as the fragment&#39;s own data buffer, but not the units a...
Definition: cbs.c:141
static enum AVPixelFormat pix_fmts_8bit[2][2]
Definition: av1_parser.c:35
int parsed_extradata
Definition: av1_parser.c:32
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
#define td
Definition: regdef.h:70
uint16_t frame_height_minus_1
Definition: cbs_av1.h:157
uint8_t twelve_bit
Definition: cbs_av1.h:43
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
AV1RawFrame frame
Definition: cbs_av1.h:395
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B
Definition: pixfmt.h:460
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:402
union AV1RawOBU::@26 obu
static av_cold int av1_parser_init(AVCodecParserContext *ctx)
Definition: av1_parser.c:185
static void av1_parser_close(AVCodecParserContext *ctx)
Definition: av1_parser.c:200
static char * split(char *message, char delim)
Definition: af_channelmap.c:81
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
AV1RawColorConfig color_config
Definition: cbs_av1.h:128
void * log_ctx
Logging context to be passed to all av_log() calls associated with this context.
Definition: cbs.h:175
uint8_t frame_type
Definition: cbs_av1.h:139
AV1RawOBUHeader header
Definition: cbs_av1.h:388
AVFormatContext * ctx
Definition: movenc.c:48
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:1140
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
#define s(width, name)
Definition: cbs_vp9.c:257
int level
level
Definition: avcodec.h:1982
uint8_t color_primaries
Definition: cbs_av1.h:47
#define FF_ARRAY_ELEMS(a)
Full range content.
Definition: pixfmt.h:586
if(ret)
uint8_t subsampling_y
Definition: cbs_av1.h:53
int nb_decompose_unit_types
Length of the decompose_unit_types array.
Definition: cbs.h:203
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:118
uint8_t subsampling_x
Definition: cbs_av1.h:52
main external API structure.
Definition: avcodec.h:526
int extradata_size
Definition: avcodec.h:628
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:399
Switching Predicted.
Definition: avutil.h:279
Context structure for coded bitstream operations.
Definition: cbs.h:170
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:1154
Rational number (pair of numerator and denominator).
Definition: rational.h:58
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:1147
int type
Definition: av1_parse.h:51
uint8_t show_existing_frame
Definition: cbs_av1.h:134
CodedBitstreamContext * cbc
Definition: av1_parser.c:30
void ff_cbs_close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
Definition: cbs.c:115
static enum AVPixelFormat pix_fmts_rgb[3]
Definition: av1_parser.c:48
AV1RawSequenceHeader * sequence_header
Definition: cbs_av1.h:419
uint8_t spatial_id
Definition: cbs_av1.h:37
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:416
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:400
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:406
Narrow or limited range content.
Definition: pixfmt.h:569
void * priv_data
Internal codec-specific data.
Definition: cbs.h:191
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
Y , 8bpp.
Definition: pixfmt.h:74
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:497
common internal api header.
CodedBitstreamUnitType * decompose_unit_types
Array of unit types which should be decomposed when reading.
Definition: cbs.h:199
int len
int format
The format of the coded data, corresponds to enum AVPixelFormat for video and for enum AVSampleFormat...
Definition: avcodec.h:3517
void ff_cbs_fragment_free(CodedBitstreamFragment *frag)
Free the units array of a fragment in addition to what ff_cbs_fragment_reset does.
Definition: cbs.c:155
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
AV1RawFrameHeader frame_header
Definition: cbs_av1.h:394
uint8_t show_frame
Definition: cbs_av1.h:140
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:265
AV1RawFrameHeader header
Definition: cbs_av1.h:300
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
int key_frame
Set by parser to 1 for key frames and 0 for non-key frames.
Definition: avcodec.h:3402
uint8_t seq_level_idx[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:87
uint8_t transfer_characteristics
Definition: cbs_av1.h:48
int i
Definition: input.c:407
Predicted.
Definition: avutil.h:275