4 * Copyright (C) 2018 James Almer <jamrial@gmail.com>
6 * This file is part of FFmpeg.
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.
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.
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
23 #include "libavutil/attributes.h"
24 #include "libavutil/avassert.h"
26 #include "av1_parse.h"
30 #include "parser_internal.h"
32 typedef struct AV1ParseContext
{
33 CodedBitstreamContext
*cbc
;
34 CodedBitstreamFragment temporal_unit
;
38 static const enum AVPixelFormat pix_fmts_8bit
[2][2] = {
39 { AV_PIX_FMT_YUV444P
, AV_PIX_FMT_NONE
},
40 { AV_PIX_FMT_YUV422P
, AV_PIX_FMT_YUV420P
},
42 static const enum AVPixelFormat pix_fmts_10bit
[2][2] = {
43 { AV_PIX_FMT_YUV444P10
, AV_PIX_FMT_NONE
},
44 { AV_PIX_FMT_YUV422P10
, AV_PIX_FMT_YUV420P10
},
46 static const enum AVPixelFormat pix_fmts_12bit
[2][2] = {
47 { AV_PIX_FMT_YUV444P12
, AV_PIX_FMT_NONE
},
48 { AV_PIX_FMT_YUV422P12
, AV_PIX_FMT_YUV420P12
},
51 static const enum AVPixelFormat pix_fmts_rgb
[3] = {
52 AV_PIX_FMT_GBRP
, AV_PIX_FMT_GBRP10
, AV_PIX_FMT_GBRP12
,
55 static int av1_parser_parse(AVCodecParserContext
*ctx
,
56 AVCodecContext
*avctx
,
57 const uint8_t **out_data
, int *out_size
,
58 const uint8_t *data
, int size
)
60 AV1ParseContext
*s
= ctx
->priv_data
;
61 CodedBitstreamFragment
*td
= &s
->temporal_unit
;
62 const CodedBitstreamAV1Context
*av1
= s
->cbc
->priv_data
;
63 const AV1RawSequenceHeader
*seq
;
64 const AV1RawColorConfig
*color
;
71 ctx
->pict_type
= AV_PICTURE_TYPE_NONE
;
72 ctx
->picture_structure
= AV_PICTURE_STRUCTURE_UNKNOWN
;
74 s
->cbc
->log_ctx
= avctx
;
76 if (avctx
->extradata_size
&& !s
->parsed_extradata
) {
77 s
->parsed_extradata
= 1;
79 ret
= ff_cbs_read_extradata_from_codec(s
->cbc
, td
, avctx
);
81 av_log(avctx
, AV_LOG_WARNING
, "Failed to parse extradata.\n");
84 ff_cbs_fragment_reset(td
);
87 ret
= ff_cbs_read(s
->cbc
, td
, NULL
, data
, size
);
89 av_log(avctx
, AV_LOG_ERROR
, "Failed to parse temporal unit.\n");
93 if (!av1
->sequence_header
) {
94 av_log(avctx
, AV_LOG_ERROR
, "No sequence header available\n");
98 seq
= av1
->sequence_header
;
99 color
= &seq
->color_config
;
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
;
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
;
113 if (obu
->header
.spatial_id
> 0)
116 if (!frame
->show_frame
&& !frame
->show_existing_frame
)
119 ctx
->width
= frame
->frame_width_minus_1
+ 1;
120 ctx
->height
= frame
->frame_height_minus_1
+ 1;
122 ctx
->key_frame
= frame
->frame_type
== AV1_FRAME_KEY
&& !frame
->show_existing_frame
;
124 switch (frame
->frame_type
) {
126 case AV1_FRAME_INTRA_ONLY
:
127 ctx
->pict_type
= AV_PICTURE_TYPE_I
;
129 case AV1_FRAME_INTER
:
130 ctx
->pict_type
= AV_PICTURE_TYPE_P
;
132 case AV1_FRAME_SWITCH
:
133 ctx
->pict_type
= AV_PICTURE_TYPE_SP
;
136 ctx
->picture_structure
= AV_PICTURE_STRUCTURE_FRAME
;
139 switch (av1
->bit_depth
) {
141 ctx
->format
= color
->mono_chrome
? AV_PIX_FMT_GRAY8
142 : pix_fmts_8bit
[color
->subsampling_x
][color
->subsampling_y
];
145 ctx
->format
= color
->mono_chrome
? AV_PIX_FMT_GRAY10
146 : pix_fmts_10bit
[color
->subsampling_x
][color
->subsampling_y
];
149 ctx
->format
= color
->mono_chrome
? AV_PIX_FMT_GRAY12
150 : pix_fmts_12bit
[color
->subsampling_x
][color
->subsampling_y
];
153 av_assert2(ctx
->format
!= AV_PIX_FMT_NONE
);
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
];
161 avctx
->profile
= seq
->seq_profile
;
162 avctx
->level
= seq
->seq_level_idx
[0];
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
;
169 if (seq
->timing_info_present_flag
)
170 avctx
->framerate
= ff_av1_framerate(1LL + seq
->timing_info
.num_ticks_per_picture_minus_1
,
171 seq
->timing_info
.num_units_in_display_tick
,
172 seq
->timing_info
.time_scale
);
175 ff_cbs_fragment_reset(td
);
177 s
->cbc
->log_ctx
= NULL
;
182 static const CodedBitstreamUnitType decompose_unit_types
[] = {
183 AV1_OBU_TEMPORAL_DELIMITER
,
184 AV1_OBU_SEQUENCE_HEADER
,
185 AV1_OBU_FRAME_HEADER
,
190 static av_cold
int av1_parser_init(AVCodecParserContext
*ctx
)
192 AV1ParseContext
*s
= ctx
->priv_data
;
195 ret
= ff_cbs_init(&s
->cbc
, AV_CODEC_ID_AV1
, NULL
);
199 s
->cbc
->decompose_unit_types
= decompose_unit_types
;
200 s
->cbc
->nb_decompose_unit_types
= FF_ARRAY_ELEMS(decompose_unit_types
);
205 static av_cold
void av1_parser_close(AVCodecParserContext
*ctx
)
207 AV1ParseContext
*s
= ctx
->priv_data
;
209 ff_cbs_fragment_free(&s
->temporal_unit
);
210 ff_cbs_close(&s
->cbc
);
213 const FFCodecParser ff_av1_parser
= {
214 PARSER_CODEC_LIST(AV_CODEC_ID_AV1
),
215 .priv_data_size
= sizeof(AV1ParseContext
),
216 .init
= av1_parser_init
,
217 .close
= av1_parser_close
,
218 .parse
= av1_parser_parse
,