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 "libavutil/avassert.h"
24 
25 #include "av1_parse.h"
26 #include "cbs.h"
27 #include "cbs_av1.h"
28 #include "parser.h"
29 
30 typedef struct AV1ParseContext {
35 
36 static const enum AVPixelFormat pix_fmts_8bit[2][2] = {
39 };
40 static const enum AVPixelFormat pix_fmts_10bit[2][2] = {
43 };
44 static const enum AVPixelFormat pix_fmts_12bit[2][2] = {
47 };
48 
49 static const enum AVPixelFormat pix_fmts_rgb[3] = {
51 };
52 
54  AVCodecContext *avctx,
55  const uint8_t **out_data, int *out_size,
56  const uint8_t *data, int size)
57 {
59  CodedBitstreamFragment *td = &s->temporal_unit;
60  const CodedBitstreamAV1Context *av1 = s->cbc->priv_data;
61  const AV1RawSequenceHeader *seq;
62  const AV1RawColorConfig *color;
63  int ret;
64 
65  *out_data = data;
66  *out_size = size;
67 
68  ctx->key_frame = -1;
69  ctx->pict_type = AV_PICTURE_TYPE_NONE;
70  ctx->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN;
71 
72  s->cbc->log_ctx = avctx;
73 
74  if (avctx->extradata_size && !s->parsed_extradata) {
75  s->parsed_extradata = 1;
76 
77  ret = ff_cbs_read_extradata_from_codec(s->cbc, td, avctx);
78  if (ret < 0) {
79  av_log(avctx, AV_LOG_WARNING, "Failed to parse extradata.\n");
80  }
81 
83  }
84 
85  ret = ff_cbs_read(s->cbc, td, data, size);
86  if (ret < 0) {
87  av_log(avctx, AV_LOG_ERROR, "Failed to parse temporal unit.\n");
88  goto end;
89  }
90 
91  if (!av1->sequence_header) {
92  av_log(avctx, AV_LOG_ERROR, "No sequence header available\n");
93  goto end;
94  }
95 
96  seq = av1->sequence_header;
97  color = &seq->color_config;
98 
99  for (int i = 0; i < td->nb_units; i++) {
100  const CodedBitstreamUnit *unit = &td->units[i];
101  const AV1RawOBU *obu = unit->content;
102  const AV1RawFrameHeader *frame;
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_frame && !frame->show_existing_frame)
115  continue;
116 
117  ctx->width = frame->frame_width_minus_1 + 1;
118  ctx->height = frame->frame_height_minus_1 + 1;
119 
120  ctx->key_frame = frame->frame_type == AV1_FRAME_KEY && !frame->show_existing_frame;
121 
122  switch (frame->frame_type) {
123  case AV1_FRAME_KEY:
125  ctx->pict_type = AV_PICTURE_TYPE_I;
126  break;
127  case AV1_FRAME_INTER:
128  ctx->pict_type = AV_PICTURE_TYPE_P;
129  break;
130  case AV1_FRAME_SWITCH:
131  ctx->pict_type = AV_PICTURE_TYPE_SP;
132  break;
133  }
134  ctx->picture_structure = AV_PICTURE_STRUCTURE_FRAME;
135  }
136 
137  switch (av1->bit_depth) {
138  case 8:
139  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY8
140  : pix_fmts_8bit [color->subsampling_x][color->subsampling_y];
141  break;
142  case 10:
143  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY10
144  : pix_fmts_10bit[color->subsampling_x][color->subsampling_y];
145  break;
146  case 12:
147  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY12
148  : pix_fmts_12bit[color->subsampling_x][color->subsampling_y];
149  break;
150  }
151  av_assert2(ctx->format != AV_PIX_FMT_NONE);
152 
153  if (!color->subsampling_x && !color->subsampling_y &&
154  color->matrix_coefficients == AVCOL_SPC_RGB &&
155  color->color_primaries == AVCOL_PRI_BT709 &&
156  color->transfer_characteristics == AVCOL_TRC_IEC61966_2_1)
157  ctx->format = pix_fmts_rgb[color->high_bitdepth + color->twelve_bit];
158 
159  avctx->profile = seq->seq_profile;
160  avctx->level = seq->seq_level_idx[0];
161 
162  avctx->colorspace = (enum AVColorSpace) color->matrix_coefficients;
163  avctx->color_primaries = (enum AVColorPrimaries) color->color_primaries;
164  avctx->color_trc = (enum AVColorTransferCharacteristic) color->transfer_characteristics;
165  avctx->color_range = color->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
166 
170  seq->timing_info.time_scale);
171 
172 end:
174 
175  s->cbc->log_ctx = NULL;
176 
177  return size;
178 }
179 
186 };
187 
189 {
191  int ret;
192 
193  ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_AV1, NULL);
194  if (ret < 0)
195  return ret;
196 
197  s->cbc->decompose_unit_types = decompose_unit_types;
198  s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types);
199 
200  return 0;
201 }
202 
204 {
206 
207  ff_cbs_fragment_free(&s->temporal_unit);
208  ff_cbs_close(&s->cbc);
209 }
210 
212  .codec_ids = { AV_CODEC_ID_AV1 },
213  .priv_data_size = sizeof(AV1ParseContext),
214  .parser_init = av1_parser_init,
215  .parser_close = av1_parser_close,
216  .parser_parse = av1_parser_parse,
217 };
AV1RawTimingInfo::num_units_in_display_tick
uint32_t num_units_in_display_tick
Definition: cbs_av1.h:59
AV1RawTimingInfo::time_scale
uint32_t time_scale
Definition: cbs_av1.h:60
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
td
#define td
Definition: regdef.h:70
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
AV1_FRAME_SWITCH
@ AV1_FRAME_SWITCH
Definition: av1.h:56
pix_fmts_rgb
static enum AVPixelFormat pix_fmts_rgb[3]
Definition: av1_parser.c:49
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:1033
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:584
AV1RawSequenceHeader::timing_info_present_flag
uint8_t timing_info_present_flag
Definition: cbs_av1.h:78
AV1RawSequenceHeader
Definition: cbs_av1.h:73
color
Definition: vf_paletteuse.c:511
ff_cbs_fragment_free
av_cold 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:185
AV_PICTURE_STRUCTURE_UNKNOWN
@ AV_PICTURE_STRUCTURE_UNKNOWN
unknown
Definition: avcodec.h:2775
pix_fmts_8bit
static enum AVPixelFormat pix_fmts_8bit[2][2]
Definition: av1_parser.c:36
CodedBitstreamUnit::content
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:107
out_size
int out_size
Definition: movenc.c:55
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:1026
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:687
ff_cbs_fragment_reset
void ff_cbs_fragment_reset(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:171
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition: cbs.h:219
data
const char data[16]
Definition: mxf.c:148
AV1RawSequenceHeader::timing_info
AV1RawTimingInfo timing_info
Definition: cbs_av1.h:83
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:482
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition: pixfmt.h:614
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:74
cbs.h
AVColorPrimaries
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition: pixfmt.h:559
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:188
AV1RawOBU::header
AV1RawOBUHeader header
Definition: cbs_av1.h:401
AV1RawSequenceHeader::seq_profile
uint8_t seq_profile
Definition: cbs_av1.h:74
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:70
ff_cbs_close
av_cold void ff_cbs_close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
Definition: cbs.c:141
AV1RawFrame::header
AV1RawFrameHeader header
Definition: cbs_av1.h:306
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:1807
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:598
AV1_OBU_FRAME_HEADER
@ AV1_OBU_FRAME_HEADER
Definition: av1.h:32
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:498
AV1_FRAME_INTRA_ONLY
@ AV1_FRAME_INTRA_ONLY
Definition: av1.h:55
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:324
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:485
cbs_av1.h
avassert.h
AV_PICTURE_STRUCTURE_FRAME
@ AV_PICTURE_STRUCTURE_FRAME
coded as frame
Definition: avcodec.h:2778
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:1019
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:547
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:122
s
#define s(width, name)
Definition: cbs_vp9.c:198
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:73
frame
static AVFrame * frame
Definition: demux_decode.c:54
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:463
if
if(ret)
Definition: filter_design.txt:179
AV1RawOBU
Definition: cbs_av1.h:400
NULL
#define NULL
Definition: coverity.c:32
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:1043
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:283
AV1RawFrameHeader
Definition: cbs_av1.h:165
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition: pixfmt.h:561
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:53
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:279
AV1_OBU_TILE_GROUP
@ AV1_OBU_TILE_GROUP
Definition: av1.h:33
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:483
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
AVCodecContext::level
int level
Encoding level descriptor.
Definition: avcodec.h:1744
AV_PICTURE_TYPE_SP
@ AV_PICTURE_TYPE_SP
Switching Predicted.
Definition: avutil.h:284
av1_parser_close
static void av1_parser_close(AVCodecParserContext *ctx)
Definition: av1_parser.c:203
AV1_OBU_FRAME
@ AV1_OBU_FRAME
Definition: av1.h:35
AV1ParseContext
Definition: av1_parser.c:30
AVCodecParser::codec_ids
int codec_ids[7]
Definition: avcodec.h:2941
AV1RawTimingInfo::num_ticks_per_picture_minus_1
uint32_t num_ticks_per_picture_minus_1
Definition: cbs_av1.h:63
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:487
AV1RawOBUHeader::spatial_id
uint8_t spatial_id
Definition: cbs_av1.h:37
size
int size
Definition: twinvq_data.h:10344
color
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:94
AV1RawOBU::obu
union AV1RawOBU::@38 obu
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:489
AV1_OBU_SEQUENCE_HEADER
@ AV1_OBU_SEQUENCE_HEADER
Definition: av1.h:30
AV_PICTURE_TYPE_NONE
@ AV_PICTURE_TYPE_NONE
Undefined.
Definition: avutil.h:278
ff_av1_framerate
AVRational ff_av1_framerate(int64_t ticks_per_frame, int64_t units_per_tick, int64_t time_scale)
Definition: av1_parse.c:110
ff_av1_parser
const AVCodecParser ff_av1_parser
Definition: av1_parser.c:211
AV1RawOBU::frame_header
AV1RawFrameHeader frame_header
Definition: cbs_av1.h:407
ff_cbs_read_extradata_from_codec
int ff_cbs_read_extradata_from_codec(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVCodecContext *avctx)
Definition: cbs.c:294
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:67
decompose_unit_types
static const CodedBitstreamUnitType decompose_unit_types[]
Definition: av1_parser.c:180
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:245
pix_fmts_12bit
static enum AVPixelFormat pix_fmts_12bit[2][2]
Definition: av1_parser.c:44
AV1_FRAME_KEY
@ AV1_FRAME_KEY
Definition: av1.h:53
CodedBitstreamAV1Context::bit_depth
int bit_depth
Definition: cbs_av1.h:452
AV1ParseContext::cbc
CodedBitstreamContext * cbc
Definition: av1_parser.c:31
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:499
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:613
AV1RawSequenceHeader::color_config
AV1RawColorConfig color_config
Definition: cbs_av1.h:128
parser.h
AV1ParseContext::parsed_extradata
int parsed_extradata
Definition: av1_parser.c:33
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:670
AVCodecParserContext
Definition: avcodec.h:2781
ret
ret
Definition: filter_design.txt:187
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:486
AVCodecContext
main external API structure.
Definition: avcodec.h:445
CodedBitstreamAV1Context::sequence_header
AV1RawSequenceHeader * sequence_header
Definition: cbs_av1.h:439
CodedBitstreamUnitType
uint32_t CodedBitstreamUnitType
The codec-specific type of a bitstream unit.
Definition: cbs.h:47
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1600
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:78
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:165
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:280
AV1RawOBU::frame
AV1RawFrame frame
Definition: cbs_av1.h:408
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:77
pix_fmts_10bit
static enum AVPixelFormat pix_fmts_10bit[2][2]
Definition: av1_parser.c:40
ff_cbs_init
av_cold 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:89
AV1_FRAME_INTER
@ AV1_FRAME_INTER
Definition: av1.h:54
AVCodecParser
Definition: avcodec.h:2940
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:464
AV1ParseContext::temporal_unit
CodedBitstreamFragment temporal_unit
Definition: av1_parser.c:32
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1230
CodedBitstreamAV1Context
Definition: cbs_av1.h:436