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/attributes.h"
24 #include "libavutil/avassert.h"
25 
26 #include "av1_parse.h"
27 #include "avcodec.h"
28 #include "cbs.h"
29 #include "cbs_av1.h"
30 #include "parser_internal.h"
31 
32 typedef struct AV1ParseContext {
37 
38 static const enum AVPixelFormat pix_fmts_8bit[2][2] = {
41 };
42 static const enum AVPixelFormat pix_fmts_10bit[2][2] = {
45 };
46 static const enum AVPixelFormat pix_fmts_12bit[2][2] = {
49 };
50 
51 static const enum AVPixelFormat pix_fmts_rgb[3] = {
53 };
54 
56  AVCodecContext *avctx,
57  const uint8_t **out_data, int *out_size,
58  const uint8_t *data, int size)
59 {
61  CodedBitstreamFragment *td = &s->temporal_unit;
62  const CodedBitstreamAV1Context *av1 = s->cbc->priv_data;
63  const AV1RawSequenceHeader *seq;
64  const AV1RawColorConfig *color;
65  int ret;
66 
67  *out_data = data;
68  *out_size = size;
69 
70  ctx->key_frame = -1;
71  ctx->pict_type = AV_PICTURE_TYPE_NONE;
72  ctx->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN;
73 
74  s->cbc->log_ctx = avctx;
75 
76  if (avctx->extradata_size && !s->parsed_extradata) {
77  s->parsed_extradata = 1;
78 
79  ret = ff_cbs_read_extradata_from_codec(s->cbc, td, avctx);
80  if (ret < 0) {
81  av_log(avctx, AV_LOG_WARNING, "Failed to parse extradata.\n");
82  }
83 
84  ff_cbs_fragment_reset(td);
85  }
86 
87  ret = ff_cbs_read(s->cbc, td, NULL, data, size);
88  if (ret < 0) {
89  av_log(avctx, AV_LOG_ERROR, "Failed to parse temporal unit.\n");
90  goto end;
91  }
92 
93  if (!av1->sequence_header) {
94  av_log(avctx, AV_LOG_ERROR, "No sequence header available\n");
95  goto end;
96  }
97 
98  seq = av1->sequence_header;
99  color = &seq->color_config;
100 
101  for (int i = 0; i < td->nb_units; i++) {
102  const CodedBitstreamUnit *unit = &td->units[i];
103  const AV1RawOBU *obu = unit->content;
104  const AV1RawFrameHeader *frame;
105 
106  if (unit->type == AV1_OBU_FRAME)
107  frame = &obu->obu.frame.header;
108  else if (unit->type == AV1_OBU_FRAME_HEADER)
109  frame = &obu->obu.frame_header;
110  else
111  continue;
112 
113  if (obu->header.spatial_id > 0)
114  continue;
115 
116  if (!frame->show_frame && !frame->show_existing_frame)
117  continue;
118 
119  ctx->width = frame->frame_width_minus_1 + 1;
120  ctx->height = frame->frame_height_minus_1 + 1;
121 
122  ctx->key_frame = frame->frame_type == AV1_FRAME_KEY && !frame->show_existing_frame;
123 
124  switch (frame->frame_type) {
125  case AV1_FRAME_KEY:
127  ctx->pict_type = AV_PICTURE_TYPE_I;
128  break;
129  case AV1_FRAME_INTER:
130  ctx->pict_type = AV_PICTURE_TYPE_P;
131  break;
132  case AV1_FRAME_SWITCH:
133  ctx->pict_type = AV_PICTURE_TYPE_SP;
134  break;
135  }
136  ctx->picture_structure = AV_PICTURE_STRUCTURE_FRAME;
137  }
138 
139  switch (av1->bit_depth) {
140  case 8:
141  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY8
142  : pix_fmts_8bit [color->subsampling_x][color->subsampling_y];
143  break;
144  case 10:
145  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY10
146  : pix_fmts_10bit[color->subsampling_x][color->subsampling_y];
147  break;
148  case 12:
149  ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY12
150  : pix_fmts_12bit[color->subsampling_x][color->subsampling_y];
151  break;
152  }
153  av_assert2(ctx->format != AV_PIX_FMT_NONE);
154 
155  if (!color->subsampling_x && !color->subsampling_y &&
156  color->matrix_coefficients == AVCOL_SPC_RGB &&
157  color->color_primaries == AVCOL_PRI_BT709 &&
158  color->transfer_characteristics == AVCOL_TRC_IEC61966_2_1)
159  ctx->format = pix_fmts_rgb[color->high_bitdepth + color->twelve_bit];
160 
161  avctx->profile = seq->seq_profile;
162  avctx->level = seq->seq_level_idx[0];
163 
164  avctx->colorspace = (enum AVColorSpace) color->matrix_coefficients;
165  avctx->color_primaries = (enum AVColorPrimaries) color->color_primaries;
166  avctx->color_trc = (enum AVColorTransferCharacteristic) color->transfer_characteristics;
167  avctx->color_range = color->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
168 
172  seq->timing_info.time_scale);
173 
174 end:
175  ff_cbs_fragment_reset(td);
176 
177  s->cbc->log_ctx = NULL;
178 
179  return size;
180 }
181 
188 };
189 
191 {
193  int ret;
194 
195  ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_AV1, NULL);
196  if (ret < 0)
197  return ret;
198 
199  s->cbc->decompose_unit_types = decompose_unit_types;
200  s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types);
201 
202  return 0;
203 }
204 
206 {
208 
209  ff_cbs_fragment_free(&s->temporal_unit);
210  ff_cbs_close(&s->cbc);
211 }
212 
215  .priv_data_size = sizeof(AV1ParseContext),
219 };
cbs.h
AV1RawTimingInfo::num_units_in_display_tick
uint32_t num_units_in_display_tick
Definition: cbs_av1.h:68
AV1RawTimingInfo::time_scale
uint32_t time_scale
Definition: cbs_av1.h:69
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
pix_fmts_rgb
static enum AVPixelFormat pix_fmts_rgb[3]
Definition: av1_parser.c:51
AV1RawSequenceHeader::seq_level_idx
uint8_t seq_level_idx[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:96
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:659
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:666
AV1RawSequenceHeader::timing_info_present_flag
uint8_t timing_info_present_flag
Definition: cbs_av1.h:87
AV1RawSequenceHeader
Definition: cbs_av1.h:82
color
Definition: vf_paletteuse.c:513
av1_parser_close
static av_cold void av1_parser_close(AVCodecParserContext *ctx)
Definition: av1_parser.c:205
AV_PICTURE_STRUCTURE_UNKNOWN
@ AV_PICTURE_STRUCTURE_UNKNOWN
unknown
Definition: avcodec.h:2569
pix_fmts_8bit
static enum AVPixelFormat pix_fmts_8bit[2][2]
Definition: av1_parser.c:38
CodedBitstreamUnit::content
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:114
out_size
int out_size
Definition: movenc.c:56
parser_internal.h
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:652
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition: cbs.h:226
data
const char data[16]
Definition: mxf.c:149
AV1RawSequenceHeader::timing_info
AV1RawTimingInfo timing_info
Definition: cbs_av1.h:92
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:539
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:701
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:81
AVColorPrimaries
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition: pixfmt.h:636
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:190
AV1RawOBU::header
AV1RawOBUHeader header
Definition: cbs_av1.h:414
AV1RawOBU::obu
union AV1RawOBU::@77 obu
AV1RawSequenceHeader::seq_profile
uint8_t seq_profile
Definition: cbs_av1.h:83
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:77
AV1RawFrame::header
AV1RawFrameHeader header
Definition: cbs_av1.h:319
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:551
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:136
AV1RawColorConfig
Definition: cbs_av1.h:50
av1_parse.h
AVCOL_TRC_IEC61966_2_1
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:680
AV1_OBU_FRAME_HEADER
@ AV1_OBU_FRAME_HEADER
Definition: av1.h:32
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:558
AV1_FRAME_SWITCH
@ AV1_FRAME_SWITCH
Definition: av1.h:56
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:542
CodedBitstreamFragment::units
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:175
cbs_av1.h
avassert.h
AV_PICTURE_STRUCTURE_FRAME
@ AV_PICTURE_STRUCTURE_FRAME
coded as frame
Definition: avcodec.h:2572
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:645
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:106
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:515
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:129
s
#define s(width, name)
Definition: cbs_vp9.c:198
CodedBitstreamUnitType
uint32_t CodedBitstreamUnitType
The codec-specific type of a bitstream unit.
Definition: cbs.h:54
ctx
AVFormatContext * ctx
Definition: movenc.c:49
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
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:519
if
if(ret)
Definition: filter_design.txt:179
AV1_FRAME_INTER
@ AV1_FRAME_INTER
Definition: av1.h:54
AV1RawOBU
Definition: cbs_av1.h:413
NULL
#define NULL
Definition: coverity.c:32
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:669
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:284
AV1RawFrameHeader
Definition: cbs_av1.h:174
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition: pixfmt.h:638
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:55
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
AV1_OBU_TILE_GROUP
@ AV1_OBU_TILE_GROUP
Definition: av1.h:33
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:540
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
parse
static int parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition: apv_parser.c:46
AVCodecContext::level
int level
Encoding level descriptor.
Definition: avcodec.h:1628
AV_PICTURE_TYPE_SP
@ AV_PICTURE_TYPE_SP
Switching Predicted.
Definition: avutil.h:283
AV1_OBU_FRAME
@ AV1_OBU_FRAME
Definition: av1.h:35
AV1ParseContext
Definition: av1_parser.c:32
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
AV1RawTimingInfo::num_ticks_per_picture_minus_1
uint32_t num_ticks_per_picture_minus_1
Definition: cbs_av1.h:72
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:544
AV1RawOBUHeader::spatial_id
uint8_t spatial_id
Definition: cbs_av1.h:46
size
int size
Definition: twinvq_data.h:10344
color
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:97
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:546
AV1_OBU_SEQUENCE_HEADER
@ AV1_OBU_SEQUENCE_HEADER
Definition: av1.h:30
AV_PICTURE_TYPE_NONE
@ AV_PICTURE_TYPE_NONE
Undefined.
Definition: avutil.h:277
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
attributes.h
AV1RawOBU::frame_header
AV1RawFrameHeader frame_header
Definition: cbs_av1.h:420
FFCodecParser
Definition: parser_internal.h:29
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:68
decompose_unit_types
static const CodedBitstreamUnitType decompose_unit_types[]
Definition: av1_parser.c:182
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
pix_fmts_12bit
static enum AVPixelFormat pix_fmts_12bit[2][2]
Definition: av1_parser.c:46
CodedBitstreamAV1Context::bit_depth
int bit_depth
Definition: cbs_av1.h:473
AV1ParseContext::cbc
CodedBitstreamContext * cbc
Definition: av1_parser.c:33
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:559
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:700
AV1RawSequenceHeader::color_config
AV1RawColorConfig color_config
Definition: cbs_av1.h:137
AV1ParseContext::parsed_extradata
int parsed_extradata
Definition: av1_parser.c:35
PARSER_CODEC_LIST
#define PARSER_CODEC_LIST(...)
Definition: parser_internal.h:76
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
avcodec.h
AVCodecParserContext
Definition: avcodec.h:2575
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:265
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:543
AVCodecContext
main external API structure.
Definition: avcodec.h:431
CodedBitstreamAV1Context::sequence_header
AV1RawSequenceHeader * sequence_header
Definition: cbs_av1.h:460
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1618
AV1_FRAME_KEY
@ AV1_FRAME_KEY
Definition: av1.h:53
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:279
AV1RawOBU::frame
AV1RawFrame frame
Definition: cbs_av1.h:421
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
ff_av1_parser
const FFCodecParser ff_av1_parser
Definition: av1_parser.c:213
pix_fmts_10bit
static enum AVPixelFormat pix_fmts_10bit[2][2]
Definition: av1_parser.c:42
AV1_FRAME_INTRA_ONLY
@ AV1_FRAME_INTRA_ONLY
Definition: av1.h:55
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:520
AV1ParseContext::temporal_unit
CodedBitstreamFragment temporal_unit
Definition: av1_parser.c:34
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1292
CodedBitstreamFragment::nb_units
int nb_units
Number of units in this fragment.
Definition: cbs.h:160
CodedBitstreamAV1Context
Definition: cbs_av1.h:457