3 * Copyright (C) 2018 Georg Ottinger
4 * Copyright (C) 2019-2020 Intel Corporation
5 * Author: Georg Ottinger <g.ottinger@gmx.at>
6 * Author: Junyan He <junyan.he@hotmail.com>
7 * Author: Victor Jaquez <vjaquez@igalia.com>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22 * Boston, MA 02110-1301, USA.
25 * SECTION:gstav1parser
26 * @title: GstAV1Parser
27 * @short_description: Convenience library for parsing AV1 video bitstream.
29 * For more details about the structures, you can refer to the AV1 Bitstream &
30 * Decoding Process Specification V1.0.0
31 * [specification](https://aomediacodec.github.io/av1-spec/av1-spec.pdf)
33 * It offers you bitstream parsing of low overhead bistream format (Section 5)
34 * or Annex B according to the setting of the parser. By calling the function of
35 * gst_av1_parser_reset(), user can switch between bistream mode and Annex B mode.
37 * To retrieve OBUs and parse its headers, you should firstly call the function of
38 * gst_av1_parser_identify_one_obu() to get the OBU type if succeeds or just discard
41 * Then, depending on the #GstAV1OBUType of the newly parsed #GstAV1OBU,
42 * you should call the differents functions to parse the structure details:
44 * * #GST_AV1_OBU_SEQUENCE_HEADER: gst_av1_parser_parse_sequence_header_obu()
46 * * #GST_AV1_OBU_TEMPORAL_DELIMITER: gst_av1_parser_parse_temporal_delimiter_obu()
48 * * #GST_AV1_OBU_FRAME: gst_av1_parser_parse_frame_obu()
50 * * #GST_AV1_OBU_FRAME_HEADER: gst_av1_parser_parse_frame_header_obu()
52 * * #GST_AV1_OBU_TILE_GROUP: gst_av1_parser_parse_tile_group_obu()
54 * * #GST_AV1_OBU_METADATA: gst_av1_parser_parse_metadata_obu()
56 * * #GST_AV1_OBU_REDUNDANT_FRAME_HEADER: gst_av1_parser_parse_frame_header_obu()
58 * * #GST_AV1_OBU_TILE_LIST: gst_av1_parser_parse_tile_list_obu()
60 * Note: Some parser functions are dependent on information provided in the sequence
61 * header and reference frame's information. It maintains a state inside itself, which
62 * contains all global vars and reference information during the whole parsing process.
63 * Calling gst_av1_parser_reset() or a new sequence's arriving can clear and reset this
66 * After successfully handled a frame(for example, decode a frame successfully), you
67 * should call gst_av1_parser_reference_frame_update() to update the parser's inside
68 * state(such as reference information, global segmentation information, etc).
70 * Note: If the frame is actived by show_existing_frame in #GST_AV1_OBU_FRAME_HEADER,
71 * the function of gst_av1_parser_reference_frame_loading() should be called before
72 * really showing that frame.
81 #include "gstav1parser.h"
83 #include <gst/base/gstbitreader.h>
88 #ifndef GST_DISABLE_GST_DEBUG
89 #define GST_CAT_DEFAULT gst_av1_debug_category_get ()
90 static GstDebugCategory *
91 gst_av1_debug_category_get (void)
93 static gsize cat_gonce = 0;
95 if (g_once_init_enter (&cat_gonce)) {
96 GstDebugCategory *cat = NULL;
98 GST_DEBUG_CATEGORY_INIT (cat, "codecparsers_av1", 0, "av1 parse library");
100 g_once_init_leave (&cat_gonce, (gsize) cat);
103 return (GstDebugCategory *) cat_gonce;
105 #endif /* GST_DISABLE_GST_DEBUG */
107 #define AV1_READ_BIT(br) ((guint8) gst_bit_reader_get_bits_uint32_unchecked (br, 1))
108 #define AV1_READ_UINT8(br) ((guint8) gst_bit_reader_get_bits_uint32_unchecked (br, 8))
109 #define AV1_READ_UINT16(br) ((guint16) gst_bit_reader_get_bits_uint32_unchecked (br, 16))
110 #define AV1_READ_UINT32(br) gst_bit_reader_get_bits_uint32_unchecked (br, 32)
111 #define AV1_READ_UINT64(br) gst_bit_reader_get_bits_uint64_unchecked (br, 64)
112 #define AV1_READ_BITS(br, nbits) \
113 ((nbits <= 32) ? (gst_bit_reader_get_bits_uint32_unchecked (br, nbits)) : \
114 (gst_bit_reader_get_bits_uint64_unchecked (br, nbits)))
117 av1_read_bits_checked (GstBitReader * br, guint nbits,
118 GstAV1ParserResult * retval, const char *func_name, gint line)
120 guint64 read_bits = 0;
124 result = gst_bit_reader_get_bits_uint64 (br, &read_bits, nbits);
128 if (result == TRUE) {
129 *retval = GST_AV1_PARSER_OK;
132 *retval = GST_AV1_PARSER_NO_MORE_DATA;
133 GST_WARNING ("Read %d bits failed in func: %s, line %d", nbits, func_name,
139 #define AV1_READ_BIT_CHECKED(br, ret) \
140 ((guint8) av1_read_bits_checked (br, 1, ret, __func__, __LINE__))
141 #define AV1_READ_UINT8_CHECKED(br, ret) \
142 ((guint8) av1_read_bits_checked (br, 8, ret, __func__, __LINE__))
143 #define AV1_READ_UINT16_CHECKED(br, ret) \
144 ((guint16) av1_read_bits_checked (br, 16, ret, __func__, __LINE__))
145 #define AV1_READ_UINT32_CHECKED(br, ret) \
146 ((guint32) av1_read_bits_checked (br, 32, ret, __func__, __LINE__))
147 #define AV1_READ_BITS_CHECKED(br, nbits, ret) \
148 av1_read_bits_checked (br, nbits, ret, __func__, __LINE__)
150 #define AV1_REMAINING_BYTES(br) (gst_bit_reader_get_remaining (br) / 8)
151 #define AV1_REMAINING_BITS(br) (gst_bit_reader_get_remaining (br))
153 /*************************************
157 *************************************/
161 * floor of the base 2 logarithm of the input x */
163 av1_helpers_floor_log2 (guint32 x)
174 /* 5.9.16 Tile size calculation
176 * returns the smallest value for k such that blkSize << k is greater
177 * than or equal to target */
179 av1_helper_tile_log2 (gint blkSize, gint target)
182 for (k = 0; (blkSize << k) < target; k++);
188 av1_helper_inverse_recenter (gint r, gint v)
193 return r - ((v + 1) >> 1);
198 /* Shift down with rounding for use when n >= 0, value >= 0 */
200 av1_helper_round_power_of_two (guint64 value, guint16 n)
202 return (value + (((guint64) (1) << n) >> 1)) >> n;
205 /* Shift down with rounding for signed integers, for use when n >= 0 */
207 av1_helper_round_power_of_two_signed (gint64 value, guint16 n)
209 return (value < 0) ? -((gint64) (av1_helper_round_power_of_two (-value, n)))
210 : (gint64) av1_helper_round_power_of_two (value, n);
214 av1_helper_msb (guint n)
222 for (i = 4; i >= 0; --i) {
223 const gint shift = (1 << i);
224 const guint x = value >> shift;
233 static const guint16 div_lut[GST_AV1_DIV_LUT_NUM + 1] = {
234 16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768,
235 15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142,
236 15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564,
237 14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028,
238 13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530,
239 13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066,
240 13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633,
241 12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228,
242 12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848,
243 11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491,
244 11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155,
245 11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838,
246 10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538,
247 10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255,
248 10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986,
249 9963, 9939, 9916, 9892, 9869, 9846, 9823, 9800, 9777, 9754, 9732,
250 9709, 9687, 9664, 9642, 9620, 9598, 9576, 9554, 9533, 9511, 9489,
251 9468, 9447, 9425, 9404, 9383, 9362, 9341, 9321, 9300, 9279, 9259,
252 9239, 9218, 9198, 9178, 9158, 9138, 9118, 9098, 9079, 9059, 9039,
253 9020, 9001, 8981, 8962, 8943, 8924, 8905, 8886, 8867, 8849, 8830,
254 8812, 8793, 8775, 8756, 8738, 8720, 8702, 8684, 8666, 8648, 8630,
255 8613, 8595, 8577, 8560, 8542, 8525, 8508, 8490, 8473, 8456, 8439,
256 8422, 8405, 8389, 8372, 8355, 8339, 8322, 8306, 8289, 8273, 8257,
257 8240, 8224, 8208, 8192,
261 av1_helper_resolve_divisor_32 (guint32 D, gint16 * shift)
266 *shift = av1_helper_msb (D);
267 // e is obtained from D after resetting the most significant 1 bit.
268 e = D - ((guint32) 1 << *shift);
269 // Get the most significant DIV_LUT_BITS (8) bits of e into f
270 if (*shift > GST_AV1_DIV_LUT_BITS)
271 f = av1_helper_round_power_of_two (e, *shift - GST_AV1_DIV_LUT_BITS);
273 f = e << (GST_AV1_DIV_LUT_BITS - *shift);
274 g_assert (f <= GST_AV1_DIV_LUT_NUM);
275 *shift += GST_AV1_DIV_LUT_PREC_BITS;
276 // Use f as lookup into the precomputed table of multipliers
280 /*************************************
282 * Bitstream Functions *
284 *************************************/
287 * Unsigned integer represented by a variable number of little-endian
290 av1_bitstreamfn_leb128 (GstBitReader * br, GstAV1ParserResult * retval)
292 guint8 leb128_byte = 0;
296 for (i = 0; i < 8; i++) {
297 leb128_byte = AV1_READ_UINT8_CHECKED (br, retval);
298 if (*retval != GST_AV1_PARSER_OK)
301 value |= (((gint) leb128_byte & 0x7f) << (i * 7));
302 if (!(leb128_byte & 0x80))
306 /* check for bitstream conformance see chapter4.10.5 */
307 if (value < G_MAXUINT32) {
308 return (guint32) value;
310 GST_WARNING ("invalid leb128");
311 *retval = GST_AV1_PARSER_BITSTREAM_ERROR;
318 * Variable length unsigned n-bit number appearing directly in the
321 av1_bitstreamfn_uvlc (GstBitReader * br, GstAV1ParserResult * retval)
323 guint8 leadingZero = 0;
329 done = AV1_READ_BIT_CHECKED (br, retval);
330 if (*retval != GST_AV1_PARSER_OK) {
331 GST_WARNING ("invalid uvlc");
340 if (leadingZero >= 32) {
344 readv = AV1_READ_BITS_CHECKED (br, leadingZero, retval);
345 if (*retval != GST_AV1_PARSER_OK) {
346 GST_WARNING ("invalid uvlc");
350 value = readv + (1 << leadingZero) - 1;
357 * Signed integer converted from an n bits unsigned integer in the
360 av1_bitstreamfn_su (GstBitReader * br, guint8 n, GstAV1ParserResult * retval)
364 v = AV1_READ_BITS_CHECKED (br, n, retval);
365 if (*retval != GST_AV1_PARSER_OK)
368 signMask = 1 << (n - 1);
370 return v - 2 * signMask;
377 * Unsigned encoded integer with maximum number of values n */
379 av1_bitstreamfn_ns (GstBitReader * br, guint32 n, GstAV1ParserResult * retval)
384 w = av1_helpers_floor_log2 (n) + 1;
386 v = AV1_READ_BITS_CHECKED (br, w - 1, retval);
387 if (*retval != GST_AV1_PARSER_OK)
392 extra_bit = AV1_READ_BITS_CHECKED (br, 1, retval);
393 if (*retval != GST_AV1_PARSER_OK)
396 return (v << 1) - m + extra_bit;
401 * Unsigned little-endian n-byte number appearing directly in the
404 av1_bitstreamfn_le (GstBitReader * br, guint8 n, GstAV1ParserResult * retval)
410 for (i = 0; i < n; i++) {
411 byte = AV1_READ_BITS_CHECKED (br, 8, retval);
412 if (*retval != GST_AV1_PARSER_OK)
415 t += (byte << (i * 8));
424 av1_bitstreamfn_delta_q (GstBitReader * br, GstAV1ParserResult * retval)
428 delta_coded = AV1_READ_BIT_CHECKED (br, retval);
429 if (*retval != GST_AV1_PARSER_OK)
433 gint delta_q = av1_bitstreamfn_su (br, 7, retval);
434 if (*retval != GST_AV1_PARSER_OK)
445 static GstAV1ParserResult
446 av1_bitstreamfn_trailing_bits (GstBitReader * br, guint32 nbBits)
448 guint8 trailing_one_bit, trailing_zero_bit;
452 trailing_one_bit = AV1_READ_BIT (br);
453 if (trailing_one_bit != 1) {
454 return GST_AV1_PARSER_BITSTREAM_ERROR;
459 trailing_zero_bit = AV1_READ_BIT (br);
460 if (trailing_zero_bit != 0)
461 return GST_AV1_PARSER_BITSTREAM_ERROR;
465 return GST_AV1_PARSER_OK;
468 static GstAV1ParserResult
469 av1_skip_trailing_bits (GstAV1Parser * parser, GstBitReader * br,
472 guint32 payloadBits = gst_bit_reader_get_pos (br);
473 GstAV1ParserResult ret;
475 if (obu->obu_size > 0
476 && obu->obu_type != GST_AV1_OBU_TILE_GROUP
477 && obu->obu_type != GST_AV1_OBU_TILE_LIST
478 && obu->obu_type != GST_AV1_OBU_FRAME) {
479 if (payloadBits >= obu->obu_size * 8)
480 return GST_AV1_PARSER_NO_MORE_DATA;
482 ret = av1_bitstreamfn_trailing_bits (br, obu->obu_size * 8 - payloadBits);
483 if (ret != GST_AV1_PARSER_OK)
486 return GST_AV1_PARSER_OK;
490 av1_seq_level_idx_is_valid (GstAV1SeqLevels seq_level_idx)
492 return seq_level_idx == GST_AV1_SEQ_LEVEL_MAX
493 || (seq_level_idx < GST_AV1_SEQ_LEVELS
494 /* The following levels are currently undefined. */
495 && seq_level_idx != GST_AV1_SEQ_LEVEL_2_2
496 && seq_level_idx != GST_AV1_SEQ_LEVEL_2_3
497 && seq_level_idx != GST_AV1_SEQ_LEVEL_3_2
498 && seq_level_idx != GST_AV1_SEQ_LEVEL_3_3
499 && seq_level_idx != GST_AV1_SEQ_LEVEL_4_2
500 && seq_level_idx != GST_AV1_SEQ_LEVEL_4_3
501 && seq_level_idx != GST_AV1_SEQ_LEVEL_7_0
502 && seq_level_idx != GST_AV1_SEQ_LEVEL_7_1
503 && seq_level_idx != GST_AV1_SEQ_LEVEL_7_2
504 && seq_level_idx != GST_AV1_SEQ_LEVEL_7_3);
508 av1_parser_init_sequence_header (GstAV1SequenceHeaderOBU * seq_header)
510 memset (seq_header, 0, sizeof (*seq_header));
511 seq_header->bit_depth = 8;
512 seq_header->num_planes = 1;
515 /*************************************
519 *************************************/
521 gst_av1_parse_reset_state (GstAV1Parser * parser, gboolean free_sps)
523 parser->state.begin_first_frame = FALSE;
525 parser->state.prev_frame_id = 0;
526 parser->state.current_frame_id = 0;
527 memset (&parser->state.ref_info, 0, sizeof (parser->state.ref_info));
528 parser->state.frame_width = 0;
529 parser->state.frame_height = 0;
530 parser->state.upscaled_width = 0;
531 parser->state.mi_cols = 0;
532 parser->state.mi_rows = 0;
533 parser->state.render_width = 0;
534 parser->state.render_height = 0;
536 memset (parser->state.mi_col_starts, 0, sizeof (parser->state.mi_col_starts));
537 memset (parser->state.mi_row_starts, 0, sizeof (parser->state.mi_row_starts));
539 parser->state.tile_cols_log2 = 0;
540 parser->state.tile_cols = 0;
541 parser->state.tile_rows_log2 = 0;
542 parser->state.tile_rows = 0;
543 parser->state.tile_size_bytes = 0;
545 parser->state.seen_frame_header = 0;
548 parser->state.sequence_changed = FALSE;
550 if (parser->seq_header) {
551 g_slice_free (GstAV1SequenceHeaderOBU, parser->seq_header);
552 parser->seq_header = NULL;
558 * gst_av1_parser_reset:
559 * @parser: the #GstAV1Parser
560 * @annex_b: indicate whether conforms to annex b
562 * Reset the current #GstAV1Parser's state totally.
567 gst_av1_parser_reset (GstAV1Parser * parser, gboolean annex_b)
569 g_return_if_fail (parser != NULL);
571 if (parser->annex_b) {
572 g_assert (parser->temporal_unit_consumed <= parser->temporal_unit_size);
573 if (parser->temporal_unit_consumed < parser->temporal_unit_size)
574 GST_DEBUG ("temporal_unit_consumed: %d, temporal_unit_size:%d, "
575 "discard the left %d bytes for a temporal_unit.",
576 parser->temporal_unit_consumed, parser->temporal_unit_size,
577 parser->temporal_unit_size - parser->temporal_unit_consumed);
579 g_assert (parser->frame_unit_consumed <= parser->frame_unit_size);
580 if (parser->frame_unit_consumed < parser->frame_unit_size)
581 GST_DEBUG (" frame_unit_consumed %d, frame_unit_size: %d "
582 "discard the left %d bytes for a frame_unit.",
583 parser->frame_unit_consumed, parser->frame_unit_size,
584 parser->frame_unit_size - parser->frame_unit_consumed);
587 parser->temporal_unit_consumed = 0;
588 parser->temporal_unit_size = 0;
589 parser->frame_unit_consumed = 0;
590 parser->frame_unit_size = 0;
591 parser->annex_b = annex_b;
593 gst_av1_parse_reset_state (parser, TRUE);
597 static GstAV1ParserResult
598 gst_av1_parse_obu_header (GstAV1Parser * parser, GstBitReader * br,
599 GstAV1OBUHeader * obu_header)
601 guint8 obu_forbidden_bit;
602 guint8 obu_reserved_1bit;
603 guint8 obu_extension_header_reserved_3bits;
604 GstAV1ParserResult ret = GST_AV1_PARSER_OK;
606 if (AV1_REMAINING_BYTES (br) < 1) {
607 ret = GST_AV1_PARSER_NO_MORE_DATA;
611 obu_forbidden_bit = AV1_READ_BIT (br);
612 if (obu_forbidden_bit != 0) {
613 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
617 obu_header->obu_type = AV1_READ_BITS (br, 4);
618 obu_header->obu_extention_flag = AV1_READ_BIT (br);
619 obu_header->obu_has_size_field = AV1_READ_BIT (br);
620 obu_reserved_1bit = AV1_READ_BIT (br);
621 if (obu_reserved_1bit != 0) {
622 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
626 if (obu_header->obu_extention_flag) {
627 if (AV1_REMAINING_BYTES (br) < 1) {
628 ret = GST_AV1_PARSER_NO_MORE_DATA;
632 /* 5.3.3 OBU extension header */
633 obu_header->obu_temporal_id = AV1_READ_BITS (br, 3);
634 obu_header->obu_spatial_id = AV1_READ_BITS (br, 2);
635 obu_extension_header_reserved_3bits = AV1_READ_BITS (br, 3);
636 if (obu_extension_header_reserved_3bits != 0) {
637 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
642 return GST_AV1_PARSER_OK;
645 GST_WARNING ("parse OBU header error %d", ret);
650 * gst_av1_parser_identify_one_obu:
651 * @parser: the #GstAV1Parser
652 * @data: the data to parse
653 * @size: the size of @data
654 * @obu: a #GstAV1OBU to store the identified result
655 * @consumed: (out): the consumed data size
657 * Identify one @obu's type from the incoming data stream. This function
658 * should be called first to know the type of @obu before other parse APIs.
660 * Returns: The #GstAV1ParserResult.
665 gst_av1_parser_identify_one_obu (GstAV1Parser * parser, const guint8 * data,
666 guint32 size, GstAV1OBU * obu, guint32 * consumed)
668 GstAV1ParserResult ret = GST_AV1_PARSER_OK;
670 guint obu_length = 0;
673 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
674 g_return_val_if_fail (obu != NULL, GST_AV1_PARSER_INVALID_OPERATION);
675 g_return_val_if_fail (data != NULL, GST_AV1_PARSER_INVALID_OPERATION);
676 g_return_val_if_fail (consumed != NULL, GST_AV1_PARSER_INVALID_OPERATION);
679 memset (obu, 0, sizeof (*obu));
681 if (parser->annex_b) {
682 GST_LOG ("temporal_unit_consumed: %d, temporal_unit_size:%d,"
683 " frame_unit_consumed %d, frame_unit_size: %d",
684 parser->temporal_unit_consumed, parser->temporal_unit_size,
685 parser->frame_unit_consumed, parser->frame_unit_size);
689 return ret = GST_AV1_PARSER_NO_MORE_DATA;
693 /* parse the data size if annex_b */
694 if (parser->annex_b) {
699 if (*consumed > size)
701 if (*consumed == size) {
702 ret = GST_AV1_PARSER_NO_MORE_DATA;
705 gst_bit_reader_init (&br, data + *consumed, size - *consumed);
707 if (parser->temporal_unit_consumed > parser->temporal_unit_size)
710 if (parser->temporal_unit_consumed &&
711 parser->temporal_unit_consumed == parser->temporal_unit_size) {
712 GST_LOG ("Complete a temporal unit of size %d",
713 parser->temporal_unit_size);
714 parser->temporal_unit_consumed = parser->temporal_unit_size = 0;
717 if (parser->temporal_unit_size == 0) {
718 parser->temporal_unit_size = av1_bitstreamfn_leb128 (&br, &ret);
719 if (ret != GST_AV1_PARSER_OK)
722 g_assert (gst_bit_reader_get_pos (&br) % 8 == 0);
723 used = (gst_bit_reader_get_pos (&br) / 8 - last_pos);
724 last_pos = gst_bit_reader_get_pos (&br) / 8;
727 if (parser->temporal_unit_consumed == parser->temporal_unit_size) {
728 /* Some extreme case like a temporal unit just
729 hold a temporal_unit_size = 0 */
734 if (parser->frame_unit_consumed > parser->frame_unit_size)
737 if (parser->frame_unit_consumed &&
738 parser->frame_unit_consumed == parser->frame_unit_size) {
739 GST_LOG ("Complete a frame unit of size %d", parser->frame_unit_size);
740 parser->frame_unit_size = parser->frame_unit_consumed = 0;
743 if (parser->frame_unit_size == 0) {
744 parser->frame_unit_size = av1_bitstreamfn_leb128 (&br, &ret);
745 if (ret != GST_AV1_PARSER_OK)
748 g_assert (gst_bit_reader_get_pos (&br) % 8 == 0);
749 used = gst_bit_reader_get_pos (&br) / 8 - last_pos;
750 last_pos = gst_bit_reader_get_pos (&br) / 8;
752 parser->temporal_unit_consumed += used;
754 if (parser->frame_unit_size >
755 parser->temporal_unit_size - parser->temporal_unit_consumed) {
756 GST_INFO ("Error stream, frame unit size %d, bigger than the left"
757 "temporal unit size %d", parser->frame_unit_size,
758 parser->temporal_unit_size - parser->temporal_unit_consumed);
759 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
763 if (parser->temporal_unit_consumed == parser->temporal_unit_size ||
764 parser->frame_unit_consumed == parser->frame_unit_size) {
765 /* Some extreme case like a temporal unit just hold a frame_unit_size,
766 or a frame unit just hold frame_unit_size = 0 */
771 obu_length = av1_bitstreamfn_leb128 (&br, &ret);
772 if (ret != GST_AV1_PARSER_OK)
775 if (obu_length > parser->frame_unit_size - parser->frame_unit_consumed) {
776 GST_INFO ("Error stream, obu_length is %d, bigger than the left"
777 "frame unit size %d", obu_length,
778 parser->frame_unit_size - parser->frame_unit_consumed);
779 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
782 /* update the consumed */
783 used = gst_bit_reader_get_pos (&br) / 8 - last_pos;
784 last_pos = gst_bit_reader_get_pos (&br) / 8;
786 parser->temporal_unit_consumed += used;
787 parser->frame_unit_consumed += used;
789 if (obu_length == 0) {
790 /* An empty obu? let continue to the next */
791 ret = GST_AV1_PARSER_DROP;
796 if (*consumed > size)
798 if (*consumed == size) {
799 ret = GST_AV1_PARSER_NO_MORE_DATA;
802 gst_bit_reader_init (&br, data + *consumed, size - *consumed);
804 ret = gst_av1_parse_obu_header (parser, &br, &obu->header);
805 if (ret != GST_AV1_PARSER_OK)
808 obu->obu_type = obu->header.obu_type;
809 GST_LOG ("identify obu type is %d", obu->obu_type);
811 if (obu->header.obu_has_size_field) {
812 obu->obu_size = av1_bitstreamfn_leb128 (&br, &ret);
813 if (ret != GST_AV1_PARSER_OK)
817 && obu_length - 1 - obu->header.obu_extention_flag != obu->obu_size) {
818 /* If obu_size and obu_length are both present, but inconsistent,
819 then the packed bitstream is deemed invalid. */
820 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
824 if (AV1_REMAINING_BYTES (&br) < obu->obu_size) {
825 ret = GST_AV1_PARSER_NO_MORE_DATA;
829 if (obu_length == 0) {
830 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
834 obu->obu_size = obu_length - 1 - obu->header.obu_extention_flag;
837 g_assert (gst_bit_reader_get_pos (&br) % 8 == 0);
838 used = gst_bit_reader_get_pos (&br) / 8;
839 /* fail if not a complete obu */
840 if (size - *consumed - used < obu->obu_size) {
841 ret = GST_AV1_PARSER_NO_MORE_DATA;
845 /* update the consumed */
847 if (parser->annex_b) {
848 parser->temporal_unit_consumed += used;
849 parser->frame_unit_consumed += used;
852 obu->data = (guint8 *) (data + *consumed);
854 *consumed += obu->obu_size;
855 if (parser->annex_b) {
856 parser->temporal_unit_consumed += obu->obu_size;
857 parser->frame_unit_consumed += obu->obu_size;
860 if (obu->obu_type != GST_AV1_OBU_SEQUENCE_HEADER
861 && obu->obu_type != GST_AV1_OBU_TEMPORAL_DELIMITER
862 && parser->state.operating_point_idc && obu->header.obu_extention_flag) {
863 guint32 inTemporalLayer =
864 (parser->state.operating_point_idc >> obu->header.obu_temporal_id) & 1;
865 guint32 inSpatialLayer =
866 (parser->state.operating_point_idc >> (obu->header.obu_spatial_id +
868 if (!inTemporalLayer || !inSpatialLayer) {
869 ret = GST_AV1_PARSER_DROP;
874 return GST_AV1_PARSER_OK;
877 GST_WARNING ("can not identify obu, error %d", ret);
882 static GstAV1ParserResult
883 gst_av1_parse_color_config (GstAV1Parser * parser, GstBitReader * br,
884 GstAV1SequenceHeaderOBU * seq_header, GstAV1ColorConfig * color_config)
886 GstAV1ParserResult ret = GST_AV1_PARSER_OK;
888 color_config->high_bitdepth = AV1_READ_BIT_CHECKED (br, &ret);
889 if (ret != GST_AV1_PARSER_OK)
892 if (seq_header->seq_profile == GST_AV1_PROFILE_2
893 && color_config->high_bitdepth) {
894 color_config->twelve_bit = AV1_READ_BIT_CHECKED (br, &ret);
895 if (ret != GST_AV1_PARSER_OK)
898 seq_header->bit_depth = color_config->twelve_bit ? 12 : 10;
899 } else if (seq_header->seq_profile <= GST_AV1_PROFILE_2) {
900 seq_header->bit_depth = color_config->high_bitdepth ? 10 : 8;
902 GST_INFO ("Unsupported profile/bit-depth combination");
903 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
907 if (seq_header->seq_profile == GST_AV1_PROFILE_1)
908 color_config->mono_chrome = 0;
910 color_config->mono_chrome = AV1_READ_BIT_CHECKED (br, &ret);
911 if (ret != GST_AV1_PARSER_OK)
914 seq_header->num_planes = color_config->mono_chrome ? 1 : 3;
916 color_config->color_description_present_flag =
917 AV1_READ_BIT_CHECKED (br, &ret);
918 if (ret != GST_AV1_PARSER_OK)
921 if (color_config->color_description_present_flag) {
922 if (AV1_REMAINING_BITS (br) < 8 + 8 + 8) {
923 ret = GST_AV1_PARSER_NO_MORE_DATA;
926 color_config->color_primaries = AV1_READ_BITS (br, 8);
927 color_config->transfer_characteristics = AV1_READ_BITS (br, 8);
928 color_config->matrix_coefficients = AV1_READ_BITS (br, 8);
930 color_config->color_primaries = GST_AV1_CP_UNSPECIFIED;
931 color_config->transfer_characteristics = GST_AV1_TC_UNSPECIFIED;
932 color_config->matrix_coefficients = GST_AV1_MC_UNSPECIFIED;
935 if (color_config->mono_chrome) {
936 color_config->color_range = AV1_READ_BIT_CHECKED (br, &ret);
937 if (ret != GST_AV1_PARSER_OK)
940 color_config->subsampling_x = 1;
941 color_config->subsampling_y = 1;
942 color_config->chroma_sample_position = GST_AV1_CSP_UNKNOWN;
943 color_config->separate_uv_delta_q = 0;
945 } else if (color_config->color_primaries == GST_AV1_CP_BT_709 &&
946 color_config->transfer_characteristics == GST_AV1_TC_SRGB &&
947 color_config->matrix_coefficients == GST_AV1_MC_IDENTITY) {
948 color_config->color_range = 1;
949 color_config->subsampling_x = 0;
950 color_config->subsampling_y = 0;
951 if (!(seq_header->seq_profile == GST_AV1_PROFILE_1 ||
952 (seq_header->seq_profile == GST_AV1_PROFILE_2
953 && seq_header->bit_depth == 12))) {
954 GST_INFO ("sRGB colorspace not compatible with specified profile");
955 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
959 color_config->color_range = AV1_READ_BIT_CHECKED (br, &ret);
960 if (ret != GST_AV1_PARSER_OK)
963 if (seq_header->seq_profile == GST_AV1_PROFILE_0) {
965 color_config->subsampling_x = 1;
966 color_config->subsampling_y = 1;
967 } else if (seq_header->seq_profile == GST_AV1_PROFILE_1) {
969 color_config->subsampling_x = 0;
970 color_config->subsampling_y = 0;
972 g_assert (seq_header->seq_profile == GST_AV1_PROFILE_2);
973 if (seq_header->bit_depth == 12) {
974 color_config->subsampling_x = AV1_READ_BIT_CHECKED (br, &ret);
975 if (ret != GST_AV1_PARSER_OK)
978 if (color_config->subsampling_x) {
980 color_config->subsampling_y = AV1_READ_BIT_CHECKED (br, &ret);
981 if (ret != GST_AV1_PARSER_OK)
985 color_config->subsampling_y = 0;
988 color_config->subsampling_x = 1;
989 color_config->subsampling_y = 0;
993 if (color_config->matrix_coefficients == GST_AV1_MC_IDENTITY &&
994 (color_config->subsampling_x || color_config->subsampling_y)) {
995 GST_INFO ("Identity CICP Matrix incompatible with"
996 " non 4:4:4 color sampling");
997 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
1001 if (color_config->subsampling_x && color_config->subsampling_y) {
1002 color_config->chroma_sample_position =
1003 AV1_READ_BITS_CHECKED (br, 2, &ret);
1004 if (ret != GST_AV1_PARSER_OK)
1009 color_config->separate_uv_delta_q = AV1_READ_BIT_CHECKED (br, &ret);
1010 if (ret != GST_AV1_PARSER_OK)
1013 if (!(color_config->subsampling_x == 0 && color_config->subsampling_y == 0) &&
1014 !(color_config->subsampling_x == 1 && color_config->subsampling_y == 1) &&
1015 !(color_config->subsampling_x == 1 && color_config->subsampling_y == 0)) {
1016 GST_INFO ("Only 4:4:4, 4:2:2 and 4:2:0 are currently supported, "
1017 "%d %d subsampling is not supported.\n",
1018 color_config->subsampling_x, color_config->subsampling_y);
1019 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
1024 return GST_AV1_PARSER_OK;
1027 GST_WARNING ("parse color config error %d", ret);
1032 static GstAV1ParserResult
1033 gst_av1_parse_timing_info (GstAV1Parser * parser, GstBitReader * br,
1034 GstAV1TimingInfo * timing_info)
1036 GstAV1ParserResult ret = GST_AV1_PARSER_OK;
1038 if (AV1_REMAINING_BITS (br) < 32 + 32 + 1) {
1039 ret = GST_AV1_PARSER_NO_MORE_DATA;
1043 timing_info->num_units_in_display_tick = AV1_READ_UINT32 (br);
1044 timing_info->time_scale = AV1_READ_UINT32 (br);
1045 if (timing_info->num_units_in_display_tick == 0 ||
1046 timing_info->time_scale == 0) {
1047 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
1051 timing_info->equal_picture_interval = AV1_READ_BIT (br);
1052 if (timing_info->equal_picture_interval) {
1053 timing_info->num_ticks_per_picture_minus_1 =
1054 av1_bitstreamfn_uvlc (br, &ret);
1055 if (ret != GST_AV1_PARSER_OK)
1058 if (timing_info->num_ticks_per_picture_minus_1 == G_MAXUINT) {
1059 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
1064 return GST_AV1_PARSER_OK;
1067 GST_WARNING ("parse timing info error %d", ret);
1072 static GstAV1ParserResult
1073 gst_av1_parse_decoder_model_info (GstAV1Parser * parser, GstBitReader * br,
1074 GstAV1DecoderModelInfo * decoder_model_info)
1076 if (AV1_REMAINING_BITS (br) < 5 + 32 + 5 + 5)
1077 return GST_AV1_PARSER_NO_MORE_DATA;
1079 decoder_model_info->buffer_delay_length_minus_1 = AV1_READ_BITS (br, 5);
1080 decoder_model_info->num_units_in_decoding_tick = AV1_READ_BITS (br, 32);
1081 decoder_model_info->buffer_removal_time_length_minus_1 =
1082 AV1_READ_BITS (br, 5);
1083 decoder_model_info->frame_presentation_time_length_minus_1 =
1084 AV1_READ_BITS (br, 5);
1086 return GST_AV1_PARSER_OK;
1090 static GstAV1ParserResult
1091 gst_av1_parse_operating_parameters_info (GstAV1Parser * parser,
1092 GstBitReader * br, GstAV1SequenceHeaderOBU * seq_header,
1093 GstAV1OperatingPoint * op_point)
1095 guint32 n = seq_header->decoder_model_info.buffer_delay_length_minus_1 + 1;
1097 if (AV1_REMAINING_BITS (br) < n + n + 1)
1098 return GST_AV1_PARSER_NO_MORE_DATA;
1100 op_point->decoder_buffer_delay = AV1_READ_BITS (br, n);
1101 op_point->encoder_buffer_delay = AV1_READ_BITS (br, n);
1102 op_point->low_delay_mode_flag = AV1_READ_BIT (br);
1103 return GST_AV1_PARSER_OK;
1106 /* 5.5.1 General sequence header OBU */
1108 * gst_av1_parser_parse_sequence_header_obu:
1109 * @parser: the #GstAV1Parser
1110 * @obu: a #GstAV1OBU to be parsed
1111 * @seq_header: a #GstAV1SequenceHeaderOBU to store the parsed result.
1113 * Parse one sequence header @obu based on the @parser context, store the
1114 * result in the @seq_header.
1116 * Returns: The #GstAV1ParserResult.
1121 gst_av1_parser_parse_sequence_header_obu (GstAV1Parser * parser,
1122 GstAV1OBU * obu, GstAV1SequenceHeaderOBU * seq_header)
1124 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
1126 GstBitReader bit_reader;
1127 GstBitReader *br = &bit_reader;
1129 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
1130 g_return_val_if_fail (obu != NULL, GST_AV1_PARSER_INVALID_OPERATION);
1131 g_return_val_if_fail (obu->obu_type == GST_AV1_OBU_SEQUENCE_HEADER,
1132 GST_AV1_PARSER_INVALID_OPERATION);
1133 g_return_val_if_fail (seq_header != NULL, GST_AV1_PARSER_INVALID_OPERATION);
1135 av1_parser_init_sequence_header (seq_header);
1136 gst_bit_reader_init (br, obu->data, obu->obu_size);
1138 if (AV1_REMAINING_BITS (br) < 8) {
1139 retval = GST_AV1_PARSER_NO_MORE_DATA;
1143 seq_header->seq_profile = AV1_READ_BITS (br, 3);
1144 if (seq_header->seq_profile > GST_AV1_PROFILE_2) {
1145 GST_INFO ("Unsupported profile %d", seq_header->seq_profile);
1146 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
1150 seq_header->still_picture = AV1_READ_BIT (br);
1151 seq_header->reduced_still_picture_header = AV1_READ_BIT (br);
1152 if (!seq_header->still_picture && seq_header->reduced_still_picture_header) {
1153 GST_INFO (" If reduced_still_picture_header is equal to 1, it is a"
1154 " requirement of bitstream conformance that still_picture is equal"
1156 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
1160 if (seq_header->reduced_still_picture_header) {
1161 seq_header->timing_info_present_flag = 0;
1162 seq_header->decoder_model_info_present_flag = 0;
1163 seq_header->initial_display_delay_present_flag = 0;
1164 seq_header->operating_points_cnt_minus_1 = 0;
1165 seq_header->operating_points[0].idc = 0;
1166 seq_header->operating_points[0].seq_level_idx = AV1_READ_BITS (br, 5);
1167 if (!av1_seq_level_idx_is_valid
1168 (seq_header->operating_points[0].seq_level_idx)) {
1169 GST_INFO ("The seq_level_idx is unsupported");
1170 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
1173 seq_header->operating_points[0].seq_tier = 0;
1174 seq_header->operating_points[0].decoder_model_present_for_this_op = 0;
1175 seq_header->operating_points[0].initial_display_delay_present_for_this_op =
1178 seq_header->timing_info_present_flag = AV1_READ_BIT (br);
1180 if (seq_header->timing_info_present_flag) {
1182 gst_av1_parse_timing_info (parser, br, &(seq_header->timing_info));
1183 if (retval != GST_AV1_PARSER_OK)
1186 seq_header->decoder_model_info_present_flag =
1187 AV1_READ_BIT_CHECKED (br, &retval);
1188 if (retval != GST_AV1_PARSER_OK)
1191 if (seq_header->decoder_model_info_present_flag) {
1192 retval = gst_av1_parse_decoder_model_info (parser, br,
1193 &(seq_header->decoder_model_info));
1194 if (retval != GST_AV1_PARSER_OK)
1198 seq_header->decoder_model_info_present_flag = 0;
1201 if (AV1_REMAINING_BITS (br) < 6) {
1202 retval = GST_AV1_PARSER_NO_MORE_DATA;
1205 seq_header->initial_display_delay_present_flag = AV1_READ_BIT (br);
1206 seq_header->operating_points_cnt_minus_1 = AV1_READ_BITS (br, 5);
1207 if (seq_header->operating_points_cnt_minus_1 + 1 >
1208 GST_AV1_MAX_OPERATING_POINTS) {
1209 GST_INFO ("The operating points number %d is too big",
1210 seq_header->operating_points_cnt_minus_1 + 1);
1211 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
1215 for (i = 0; i < seq_header->operating_points_cnt_minus_1 + 1; i++) {
1216 if (AV1_REMAINING_BITS (br) < 17) {
1217 retval = GST_AV1_PARSER_NO_MORE_DATA;
1220 seq_header->operating_points[i].idc = AV1_READ_BITS (br, 12);
1221 seq_header->operating_points[i].seq_level_idx = AV1_READ_BITS (br, 5);
1222 if (!av1_seq_level_idx_is_valid
1223 (seq_header->operating_points[0].seq_level_idx)) {
1224 GST_INFO ("The seq_level_idx is unsupported");
1225 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
1228 if (seq_header->operating_points[i].seq_level_idx > GST_AV1_SEQ_LEVEL_3_3) {
1229 seq_header->operating_points[i].seq_tier = AV1_READ_BIT (br);
1231 seq_header->operating_points[i].seq_tier = 0;
1233 if (seq_header->decoder_model_info_present_flag) {
1234 seq_header->operating_points[i].decoder_model_present_for_this_op =
1236 if (seq_header->operating_points[i].decoder_model_present_for_this_op)
1238 gst_av1_parse_operating_parameters_info (parser, br, seq_header,
1239 &(seq_header->operating_points[i]));
1240 if (retval != GST_AV1_PARSER_OK)
1243 seq_header->operating_points[i].decoder_model_present_for_this_op = 0;
1246 if (seq_header->initial_display_delay_present_flag) {
1248 operating_points[i].initial_display_delay_present_for_this_op =
1249 AV1_READ_BIT_CHECKED (br, &retval);
1250 if (retval != GST_AV1_PARSER_OK)
1254 operating_points[i].initial_display_delay_present_for_this_op) {
1255 seq_header->operating_points[i].initial_display_delay_minus_1 =
1256 AV1_READ_BITS_CHECKED (br, 4, &retval);
1257 if (retval != GST_AV1_PARSER_OK)
1260 if (seq_header->operating_points[i].initial_display_delay_minus_1 +
1262 GST_INFO ("AV1 does not support more than 10 decoded frames delay");
1263 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
1267 seq_header->operating_points[i].initial_display_delay_minus_1 = 9;
1271 operating_points[i].initial_display_delay_present_for_this_op = 0;
1272 seq_header->operating_points[i].initial_display_delay_minus_1 = 9;
1277 /* Let user decide the operatingPoint, move it later
1278 operatingPoint = choose_operating_point( )
1279 operating_point_idc = operating_point_idc[ operatingPoint ] */
1281 if (AV1_REMAINING_BITS (br) < 4 + 4 +
1282 (seq_header->frame_width_bits_minus_1 + 1) +
1283 (seq_header->frame_height_bits_minus_1 + 1)) {
1284 retval = GST_AV1_PARSER_NO_MORE_DATA;
1288 seq_header->frame_width_bits_minus_1 = AV1_READ_BITS (br, 4);
1289 seq_header->frame_height_bits_minus_1 = AV1_READ_BITS (br, 4);
1290 seq_header->max_frame_width_minus_1 =
1291 AV1_READ_BITS (br, seq_header->frame_width_bits_minus_1 + 1);
1292 seq_header->max_frame_height_minus_1 =
1293 AV1_READ_BITS (br, seq_header->frame_height_bits_minus_1 + 1);
1295 if (seq_header->reduced_still_picture_header)
1296 seq_header->frame_id_numbers_present_flag = 0;
1298 seq_header->frame_id_numbers_present_flag =
1299 AV1_READ_BIT_CHECKED (br, &retval);
1300 if (retval != GST_AV1_PARSER_OK)
1304 if (seq_header->frame_id_numbers_present_flag) {
1305 if (AV1_REMAINING_BITS (br) < 4 + 3) {
1306 retval = GST_AV1_PARSER_NO_MORE_DATA;
1309 seq_header->delta_frame_id_length_minus_2 = AV1_READ_BITS (br, 4);
1310 seq_header->additional_frame_id_length_minus_1 = AV1_READ_BITS (br, 3);
1312 if (seq_header->additional_frame_id_length_minus_1 + 1 +
1313 seq_header->delta_frame_id_length_minus_2 + 2 > 16) {
1314 GST_INFO ("Invalid frame_id_length");
1315 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
1320 if (AV1_REMAINING_BITS (br) < 3) {
1321 retval = GST_AV1_PARSER_NO_MORE_DATA;
1324 seq_header->use_128x128_superblock = AV1_READ_BIT (br);
1325 seq_header->enable_filter_intra = AV1_READ_BIT (br);
1326 seq_header->enable_intra_edge_filter = AV1_READ_BIT (br);
1328 if (seq_header->reduced_still_picture_header) {
1329 seq_header->enable_interintra_compound = 0;
1330 seq_header->enable_masked_compound = 0;
1331 seq_header->enable_warped_motion = 0;
1332 seq_header->enable_dual_filter = 0;
1333 seq_header->enable_order_hint = 0;
1334 seq_header->enable_jnt_comp = 0;
1335 seq_header->enable_ref_frame_mvs = 0;
1336 seq_header->seq_force_screen_content_tools =
1337 GST_AV1_SELECT_SCREEN_CONTENT_TOOLS;
1338 seq_header->seq_force_integer_mv = GST_AV1_SELECT_INTEGER_MV;
1339 seq_header->order_hint_bits_minus_1 = -1;
1340 seq_header->order_hint_bits = 0;
1342 if (AV1_REMAINING_BITS (br) < 5) {
1343 retval = GST_AV1_PARSER_NO_MORE_DATA;
1346 seq_header->enable_interintra_compound = AV1_READ_BIT (br);
1347 seq_header->enable_masked_compound = AV1_READ_BIT (br);
1348 seq_header->enable_warped_motion = AV1_READ_BIT (br);
1349 seq_header->enable_dual_filter = AV1_READ_BIT (br);
1350 seq_header->enable_order_hint = AV1_READ_BIT (br);
1351 if (seq_header->enable_order_hint) {
1352 if (AV1_REMAINING_BITS (br) < 2) {
1353 retval = GST_AV1_PARSER_NO_MORE_DATA;
1356 seq_header->enable_jnt_comp = AV1_READ_BIT (br);
1357 seq_header->enable_ref_frame_mvs = AV1_READ_BIT (br);
1359 seq_header->enable_jnt_comp = 0;
1360 seq_header->enable_ref_frame_mvs = 0;
1363 seq_header->seq_choose_screen_content_tools =
1364 AV1_READ_BIT_CHECKED (br, &retval);
1365 if (retval != GST_AV1_PARSER_OK)
1367 if (seq_header->seq_choose_screen_content_tools)
1368 seq_header->seq_force_screen_content_tools =
1369 GST_AV1_SELECT_SCREEN_CONTENT_TOOLS;
1371 seq_header->seq_force_screen_content_tools =
1372 AV1_READ_BIT_CHECKED (br, &retval);
1373 if (retval != GST_AV1_PARSER_OK)
1377 if (seq_header->seq_force_screen_content_tools > 0) {
1378 seq_header->seq_choose_integer_mv = AV1_READ_BIT_CHECKED (br, &retval);
1379 if (retval != GST_AV1_PARSER_OK)
1381 if (seq_header->seq_choose_integer_mv)
1382 seq_header->seq_force_integer_mv = GST_AV1_SELECT_INTEGER_MV;
1384 seq_header->seq_force_integer_mv = AV1_READ_BIT_CHECKED (br, &retval);
1385 if (retval != GST_AV1_PARSER_OK)
1389 seq_header->seq_force_integer_mv = GST_AV1_SELECT_INTEGER_MV;
1391 if (seq_header->enable_order_hint) {
1392 seq_header->order_hint_bits_minus_1 =
1393 AV1_READ_BITS_CHECKED (br, 3, &retval);
1394 if (retval != GST_AV1_PARSER_OK)
1396 seq_header->order_hint_bits = seq_header->order_hint_bits_minus_1 + 1;
1398 seq_header->order_hint_bits_minus_1 = -1;
1399 seq_header->order_hint_bits = 0;
1403 if (AV1_REMAINING_BITS (br) < 3) {
1404 retval = GST_AV1_PARSER_NO_MORE_DATA;
1407 seq_header->enable_superres = AV1_READ_BIT (br);
1408 seq_header->enable_cdef = AV1_READ_BIT (br);
1409 seq_header->enable_restoration = AV1_READ_BIT (br);
1411 retval = gst_av1_parse_color_config (parser, br, seq_header,
1412 &seq_header->color_config);
1413 if (retval != GST_AV1_PARSER_OK)
1416 seq_header->film_grain_params_present = AV1_READ_BIT_CHECKED (br, &retval);
1417 if (retval != GST_AV1_PARSER_OK)
1420 retval = av1_skip_trailing_bits (parser, br, obu);
1421 if (retval != GST_AV1_PARSER_OK)
1424 if (parser->seq_header) {
1425 if (!memcmp (parser->seq_header, seq_header,
1426 sizeof (GstAV1SequenceHeaderOBU)))
1429 g_slice_free (GstAV1SequenceHeaderOBU, parser->seq_header);
1432 parser->seq_header = g_slice_dup (GstAV1SequenceHeaderOBU, seq_header);
1433 gst_av1_parse_reset_state (parser, FALSE);
1435 /* choose_operating_point() set the operating_point */
1436 if (parser->state.operating_point < 0 ||
1437 parser->state.operating_point >
1438 seq_header->operating_points_cnt_minus_1) {
1439 GST_INFO ("Invalid operating_point %d set by user, just use 0",
1440 parser->state.operating_point);
1441 parser->state.operating_point_idc = seq_header->operating_points[0].idc;
1443 parser->state.operating_point_idc =
1444 seq_header->operating_points[parser->state.operating_point].idc;
1447 parser->state.sequence_changed = TRUE;
1450 return GST_AV1_PARSER_OK;
1453 GST_WARNING ("parse sequence header error %d", retval);
1459 * gst_av1_parser_parse_temporal_delimiter_obu:
1460 * @parser: the #GstAV1Parser
1461 * @obu: a #GstAV1OBU to be parsed
1463 * Parse one temporal delimiter @obu based on the @parser context.
1464 * The temporal delimiter is just delimiter and contains no content.
1466 * Returns: The #GstAV1ParserResult.
1471 gst_av1_parser_parse_temporal_delimiter_obu (GstAV1Parser * parser,
1474 GstBitReader bit_reader;
1475 GstAV1ParserResult ret;
1477 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
1478 g_return_val_if_fail (obu != NULL, GST_AV1_PARSER_INVALID_OPERATION);
1479 g_return_val_if_fail (obu->obu_type == GST_AV1_OBU_TEMPORAL_DELIMITER,
1480 GST_AV1_PARSER_INVALID_OPERATION);
1482 gst_bit_reader_init (&bit_reader, obu->data, obu->obu_size);
1484 parser->state.seen_frame_header = 0;
1486 ret = av1_skip_trailing_bits (parser, &bit_reader, obu);
1487 if (ret != GST_AV1_PARSER_OK)
1488 GST_WARNING ("parse temporal delimiter error %d", ret);
1494 static GstAV1ParserResult
1495 gst_av1_parse_metadata_itut_t35 (GstAV1Parser * parser, GstBitReader * br,
1496 GstAV1MetadataITUT_T35 * itut_t35)
1498 GstAV1ParserResult ret;
1500 itut_t35->itu_t_t35_country_code = AV1_READ_BITS_CHECKED (br, 8, &ret);
1501 if (ret != GST_AV1_PARSER_OK)
1504 if (itut_t35->itu_t_t35_country_code == 0xFF) {
1505 itut_t35->itu_t_t35_country_code_extention_byte =
1506 AV1_READ_BITS_CHECKED (br, 8, &ret);
1507 if (ret != GST_AV1_PARSER_OK)
1510 /* itu_t_t35_payload_bytes is not defined in specification.
1511 Just skip this part. */
1513 return GST_AV1_PARSER_OK;
1517 static GstAV1ParserResult
1518 gst_av1_parse_metadata_hdr_cll (GstAV1Parser * parser, GstBitReader * br,
1519 GstAV1MetadataHdrCll * hdr_cll)
1521 if (AV1_REMAINING_BITS (br) < 32)
1522 return GST_AV1_PARSER_NO_MORE_DATA;
1524 hdr_cll->max_cll = AV1_READ_UINT16 (br);
1525 hdr_cll->max_fall = AV1_READ_UINT16 (br);
1527 return GST_AV1_PARSER_OK;
1531 static GstAV1ParserResult
1532 gst_av1_parse_metadata_hdr_mdcv (GstAV1Parser * parser, GstBitReader * br,
1533 GstAV1MetadataHdrMdcv * hdr_mdcv)
1537 if (AV1_REMAINING_BITS (br) < 3 * (16 + 16) + 16 + 16 + 32 + 32)
1538 return GST_AV1_PARSER_NO_MORE_DATA;
1540 for (i = 0; i < 3; i++) {
1541 hdr_mdcv->primary_chromaticity_x[i] = AV1_READ_UINT16 (br);
1542 hdr_mdcv->primary_chromaticity_y[i] = AV1_READ_UINT16 (br);
1545 hdr_mdcv->white_point_chromaticity_x = AV1_READ_UINT16 (br);
1546 hdr_mdcv->white_point_chromaticity_y = AV1_READ_UINT16 (br);
1548 hdr_mdcv->luminance_max = AV1_READ_UINT32 (br);
1549 hdr_mdcv->luminance_min = AV1_READ_UINT32 (br);
1551 return GST_AV1_PARSER_OK;
1555 static GstAV1ParserResult
1556 gst_av1_parse_metadata_scalability (GstAV1Parser * parser,
1557 GstBitReader * br, GstAV1MetadataScalability * scalability)
1560 GstAV1ParserResult ret = GST_AV1_PARSER_OK;
1561 guint8 scalability_structure_reserved_3bits;
1563 scalability->scalability_mode_idc = AV1_READ_UINT8_CHECKED (br, &ret);
1564 if (ret != GST_AV1_PARSER_OK)
1567 if (scalability->scalability_mode_idc != GST_AV1_SCALABILITY_SS)
1570 if (AV1_REMAINING_BITS (br) < 8) {
1571 ret = GST_AV1_PARSER_NO_MORE_DATA;
1576 scalability->spatial_layers_cnt_minus_1 = AV1_READ_BITS (br, 2);
1577 scalability->spatial_layer_dimensions_present_flag = AV1_READ_BIT (br);
1578 scalability->spatial_layer_description_present_flag = AV1_READ_BIT (br);
1579 scalability->temporal_group_description_present_flag = AV1_READ_BIT (br);
1580 scalability_structure_reserved_3bits = AV1_READ_BITS (br, 3);
1581 /* scalability_structure_reserved_3bits: must be set to zero and
1582 be ignored by decoders. */
1583 if (scalability_structure_reserved_3bits) {
1584 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
1588 if (scalability->spatial_layer_dimensions_present_flag) {
1589 for (i = 0; i <= scalability->spatial_layers_cnt_minus_1; i++) {
1590 if (AV1_REMAINING_BITS (br) < 16 * 2) {
1591 ret = GST_AV1_PARSER_NO_MORE_DATA;
1595 scalability->spatial_layer_max_width[i] = AV1_READ_UINT16 (br);
1596 scalability->spatial_layer_max_height[i] = AV1_READ_UINT16 (br);
1600 if (scalability->spatial_layer_description_present_flag) {
1601 for (i = 0; i <= scalability->spatial_layers_cnt_minus_1; i++) {
1602 scalability->spatial_layer_ref_id[i] = AV1_READ_UINT8_CHECKED (br, &ret);
1603 if (ret != GST_AV1_PARSER_OK)
1608 if (scalability->temporal_group_description_present_flag) {
1609 scalability->temporal_group_size = AV1_READ_UINT8_CHECKED (br, &ret);
1610 if (ret != GST_AV1_PARSER_OK)
1613 for (i = 0; i < scalability->temporal_group_size; i++) {
1614 if (AV1_REMAINING_BITS (br) < 8) {
1615 ret = GST_AV1_PARSER_NO_MORE_DATA;
1619 scalability->temporal_group_temporal_id[i] = AV1_READ_BITS (br, 3);
1620 scalability->temporal_group_temporal_switching_up_point_flag[i] =
1622 scalability->temporal_group_spatial_switching_up_point_flag[i] =
1624 scalability->temporal_group_ref_cnt[i] = AV1_READ_BITS (br, 3);
1625 for (j = 0; j < scalability->temporal_group_ref_cnt[i]; j++) {
1626 scalability->temporal_group_ref_pic_diff[i][j] =
1627 AV1_READ_UINT8_CHECKED (br, &ret);
1628 if (ret != GST_AV1_PARSER_OK)
1635 return GST_AV1_PARSER_OK;
1638 GST_WARNING ("parse metadata scalability error %d", ret);
1643 static GstAV1ParserResult
1644 gst_av1_parse_metadata_timecode (GstAV1Parser * parser, GstBitReader * br,
1645 GstAV1MetadataTimecode * timecode)
1647 GstAV1ParserResult ret = GST_AV1_PARSER_OK;
1649 if (AV1_REMAINING_BITS (br) < 17) {
1650 ret = GST_AV1_PARSER_NO_MORE_DATA;
1654 timecode->counting_type = AV1_READ_BITS (br, 5);
1655 timecode->full_timestamp_flag = AV1_READ_BIT (br);
1656 timecode->discontinuity_flag = AV1_READ_BIT (br);
1657 timecode->cnt_dropped_flag = AV1_READ_BIT (br);
1658 timecode->n_frames = AV1_READ_BITS (br, 9);
1660 if (timecode->full_timestamp_flag) {
1661 if (AV1_REMAINING_BITS (br) < 17) {
1662 ret = GST_AV1_PARSER_NO_MORE_DATA;
1665 timecode->seconds_value = AV1_READ_BITS (br, 6);
1666 timecode->minutes_value = AV1_READ_BITS (br, 6);
1667 timecode->hours_value = AV1_READ_BITS (br, 5);
1669 timecode->seconds_flag = AV1_READ_BIT_CHECKED (br, &ret);
1670 if (ret != GST_AV1_PARSER_OK)
1673 if (timecode->seconds_flag) {
1674 if (AV1_REMAINING_BITS (br) < 7) {
1675 ret = GST_AV1_PARSER_NO_MORE_DATA;
1678 timecode->seconds_value = AV1_READ_BITS (br, 6);
1679 timecode->minutes_flag = AV1_READ_BIT (br);
1681 if (timecode->minutes_flag) {
1682 if (AV1_REMAINING_BITS (br) < 7) {
1683 ret = GST_AV1_PARSER_NO_MORE_DATA;
1686 timecode->minutes_value = AV1_READ_BITS (br, 6);
1687 timecode->hours_flag = AV1_READ_BIT (br);
1689 if (timecode->hours_flag) {
1690 timecode->hours_value = AV1_READ_BITS_CHECKED (br, 6, &ret);
1691 if (ret != GST_AV1_PARSER_OK)
1698 timecode->time_offset_length = AV1_READ_BITS_CHECKED (br, 5, &ret);
1699 if (ret != GST_AV1_PARSER_OK)
1702 if (timecode->time_offset_length > 0) {
1703 timecode->time_offset_value =
1704 AV1_READ_BITS_CHECKED (br, timecode->time_offset_length, &ret);
1705 if (ret != GST_AV1_PARSER_OK)
1709 return GST_AV1_PARSER_OK;
1712 GST_WARNING ("parse metadata timecode error %d", ret);
1718 * gst_av1_parser_parse_metadata_obu:
1719 * @parser: the #GstAV1Parser
1720 * @obu: a #GstAV1OBU to be parsed
1721 * @metadata: a #GstAV1MetadataOBU to store the parsed result.
1723 * Parse one meta data @obu based on the @parser context.
1725 * Returns: The #GstAV1ParserResult.
1730 gst_av1_parser_parse_metadata_obu (GstAV1Parser * parser, GstAV1OBU * obu,
1731 GstAV1MetadataOBU * metadata)
1733 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
1734 GstBitReader bit_reader;
1736 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
1737 g_return_val_if_fail (obu != NULL, GST_AV1_PARSER_INVALID_OPERATION);
1738 g_return_val_if_fail (obu->obu_type == GST_AV1_OBU_METADATA,
1739 GST_AV1_PARSER_INVALID_OPERATION);
1740 g_return_val_if_fail (metadata != NULL, GST_AV1_PARSER_INVALID_OPERATION);
1742 gst_bit_reader_init (&bit_reader, obu->data, obu->obu_size);
1744 memset (metadata, 0, sizeof (*metadata));
1746 metadata->metadata_type = av1_bitstreamfn_leb128 (&bit_reader, &retval);
1747 if (retval != GST_AV1_PARSER_OK)
1750 switch (metadata->metadata_type) {
1751 case GST_AV1_METADATA_TYPE_ITUT_T35:
1752 retval = gst_av1_parse_metadata_itut_t35 (parser,
1753 &bit_reader, &(metadata->itut_t35));
1755 case GST_AV1_METADATA_TYPE_HDR_CLL:
1756 retval = gst_av1_parse_metadata_hdr_cll (parser,
1757 &bit_reader, &(metadata->hdr_cll));
1759 case GST_AV1_METADATA_TYPE_HDR_MDCV:
1760 retval = gst_av1_parse_metadata_hdr_mdcv (parser,
1761 &bit_reader, &(metadata->hdr_mdcv));
1763 case GST_AV1_METADATA_TYPE_SCALABILITY:
1764 retval = gst_av1_parse_metadata_scalability (parser,
1765 &bit_reader, &(metadata->scalability));
1767 case GST_AV1_METADATA_TYPE_TIMECODE:
1768 retval = gst_av1_parse_metadata_timecode (parser,
1769 &bit_reader, &(metadata->timecode));
1772 return GST_AV1_PARSER_BITSTREAM_ERROR;
1775 if (retval != GST_AV1_PARSER_OK)
1778 retval = av1_skip_trailing_bits (parser, &bit_reader, obu);
1779 if (retval != GST_AV1_PARSER_OK) {
1780 GST_WARNING ("Metadata type %d may have wrong trailings.",
1781 metadata->metadata_type);
1782 retval = GST_AV1_PARSER_OK;
1788 GST_WARNING ("parse metadata error %d", retval);
1793 static GstAV1ParserResult
1794 gst_av1_parse_superres_params_compute_image_size (GstAV1Parser * parser,
1795 GstBitReader * br, GstAV1FrameHeaderOBU * frame_header)
1797 GstAV1ParserResult ret;
1798 GstAV1SequenceHeaderOBU *seq_header;
1800 g_assert (parser->seq_header);
1801 seq_header = parser->seq_header;
1803 if (seq_header->enable_superres) {
1804 frame_header->use_superres = AV1_READ_BIT_CHECKED (br, &ret);
1805 if (ret != GST_AV1_PARSER_OK)
1808 frame_header->use_superres = 0;
1811 if (frame_header->use_superres) {
1813 coded_denom = AV1_READ_BITS_CHECKED (br, GST_AV1_SUPERRES_DENOM_BITS, &ret);
1814 if (ret != GST_AV1_PARSER_OK)
1817 frame_header->superres_denom = coded_denom + GST_AV1_SUPERRES_DENOM_MIN;
1819 frame_header->superres_denom = GST_AV1_SUPERRES_NUM;
1821 parser->state.upscaled_width = parser->state.frame_width;
1822 parser->state.frame_width =
1823 (parser->state.upscaled_width * GST_AV1_SUPERRES_NUM +
1824 (frame_header->superres_denom / 2)) / frame_header->superres_denom;
1826 /* 5.9.9 compute_image_size */
1827 parser->state.mi_cols = 2 * ((parser->state.frame_width + 7) >> 3);
1828 parser->state.mi_rows = 2 * ((parser->state.frame_height + 7) >> 3);
1830 return GST_AV1_PARSER_OK;
1834 static GstAV1ParserResult
1835 gst_av1_parse_frame_size (GstAV1Parser * parser, GstBitReader * br,
1836 GstAV1FrameHeaderOBU * frame_header)
1838 GstAV1ParserResult retval;
1839 GstAV1SequenceHeaderOBU *seq_header;
1841 g_assert (parser->seq_header);
1842 seq_header = parser->seq_header;
1844 if (frame_header->frame_size_override_flag) {
1845 guint16 frame_width_minus_1;
1846 guint16 frame_height_minus_1;
1848 if (AV1_REMAINING_BITS (br) <
1849 seq_header->frame_width_bits_minus_1 + 1 +
1850 seq_header->frame_height_bits_minus_1 + 1)
1851 return GST_AV1_PARSER_NO_MORE_DATA;
1853 frame_width_minus_1 =
1854 AV1_READ_BITS (br, seq_header->frame_width_bits_minus_1 + 1);
1855 frame_height_minus_1 =
1856 AV1_READ_BITS (br, seq_header->frame_height_bits_minus_1 + 1);
1857 parser->state.frame_width = frame_width_minus_1 + 1;
1858 parser->state.frame_height = frame_height_minus_1 + 1;
1860 parser->state.frame_width = seq_header->max_frame_width_minus_1 + 1;
1861 parser->state.frame_height = seq_header->max_frame_height_minus_1 + 1;
1864 retval = gst_av1_parse_superres_params_compute_image_size (parser, br,
1870 static GstAV1ParserResult
1871 gst_av1_parse_render_size (GstAV1Parser * parser, GstBitReader * br,
1872 GstAV1FrameHeaderOBU * frame_header)
1874 GstAV1ParserResult retval;
1876 frame_header->render_and_frame_size_different =
1877 AV1_READ_BIT_CHECKED (br, &retval);
1878 if (retval != GST_AV1_PARSER_OK)
1881 if (frame_header->render_and_frame_size_different) {
1882 guint16 render_width_minus_1;
1883 guint16 render_height_minus_1;
1885 if (AV1_REMAINING_BITS (br) < 16 + 16)
1886 return GST_AV1_PARSER_NO_MORE_DATA;
1888 render_width_minus_1 = AV1_READ_UINT16 (br);
1889 render_height_minus_1 = AV1_READ_UINT16 (br);
1890 parser->state.render_width = render_width_minus_1 + 1;
1891 parser->state.render_height = render_height_minus_1 + 1;
1893 parser->state.render_width = parser->state.upscaled_width;
1894 parser->state.render_height = parser->state.frame_height;
1897 return GST_AV1_PARSER_OK;
1901 static GstAV1ParserResult
1902 gst_av1_parse_frame_size_with_refs (GstAV1Parser * parser,
1903 GstBitReader * br, GstAV1FrameHeaderOBU * frame_header)
1905 GstAV1ParserResult retval;
1906 GstAV1ReferenceFrameInfo *ref_info;
1907 gboolean found_ref = FALSE;
1910 ref_info = &(parser->state.ref_info);
1912 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++) {
1913 found_ref = AV1_READ_BIT_CHECKED (br, &retval);
1914 if (retval != GST_AV1_PARSER_OK)
1917 if (found_ref == 1) {
1918 gint ref_idx = frame_header->ref_frame_idx[i];
1919 parser->state.upscaled_width =
1920 ref_info->entry[ref_idx].ref_upscaled_width;
1921 parser->state.frame_width = parser->state.upscaled_width;
1922 parser->state.frame_height = ref_info->entry[ref_idx].ref_frame_height;
1923 parser->state.render_width = ref_info->entry[ref_idx].ref_render_width;
1924 parser->state.render_height = ref_info->entry[ref_idx].ref_render_height;
1928 if (found_ref == 0) {
1929 retval = gst_av1_parse_frame_size (parser, br, frame_header);
1930 if (retval != GST_AV1_PARSER_OK)
1933 retval = gst_av1_parse_render_size (parser, br, frame_header);
1934 if (retval != GST_AV1_PARSER_OK)
1937 retval = gst_av1_parse_superres_params_compute_image_size (parser, br,
1939 if (retval != GST_AV1_PARSER_OK)
1943 return GST_AV1_PARSER_OK;
1947 static GstAV1ParserResult
1948 gst_av1_parse_quantization_params (GstAV1Parser * parser, GstBitReader * br,
1949 GstAV1FrameHeaderOBU * frame_header)
1951 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
1952 GstAV1ColorConfig *color_config;
1953 GstAV1QuantizationParams *quant_params = &(frame_header->quantization_params);
1955 g_assert (parser->seq_header);
1957 color_config = &(parser->seq_header->color_config);
1959 quant_params->base_q_idx = AV1_READ_UINT8_CHECKED (br, &retval);
1960 if (retval != GST_AV1_PARSER_OK)
1963 frame_header->quantization_params.delta_q_y_dc =
1964 av1_bitstreamfn_delta_q (br, &retval);
1965 if (retval != GST_AV1_PARSER_OK)
1968 if (parser->seq_header->num_planes > 1) {
1969 if (color_config->separate_uv_delta_q) {
1970 quant_params->diff_uv_delta = AV1_READ_BIT_CHECKED (br, &retval);
1971 if (retval != GST_AV1_PARSER_OK)
1974 quant_params->diff_uv_delta = 0;
1976 frame_header->quantization_params.delta_q_u_dc =
1977 av1_bitstreamfn_delta_q (br, &retval);
1978 if (retval != GST_AV1_PARSER_OK)
1981 frame_header->quantization_params.delta_q_u_ac =
1982 av1_bitstreamfn_delta_q (br, &retval);
1983 if (retval != GST_AV1_PARSER_OK)
1986 if (quant_params->diff_uv_delta) {
1987 frame_header->quantization_params.delta_q_v_dc =
1988 av1_bitstreamfn_delta_q (br, &retval);
1989 if (retval != GST_AV1_PARSER_OK)
1992 frame_header->quantization_params.delta_q_v_ac =
1993 av1_bitstreamfn_delta_q (br, &retval);
1994 if (retval != GST_AV1_PARSER_OK)
1997 frame_header->quantization_params.delta_q_v_dc =
1998 frame_header->quantization_params.delta_q_u_dc;
1999 frame_header->quantization_params.delta_q_v_ac =
2000 frame_header->quantization_params.delta_q_u_ac;
2003 frame_header->quantization_params.delta_q_u_dc = 0;
2004 frame_header->quantization_params.delta_q_u_ac = 0;
2005 frame_header->quantization_params.delta_q_v_dc = 0;
2006 frame_header->quantization_params.delta_q_v_ac = 0;
2009 quant_params->using_qmatrix = AV1_READ_BIT_CHECKED (br, &retval);
2010 if (retval != GST_AV1_PARSER_OK)
2013 if (quant_params->using_qmatrix) {
2014 if (AV1_REMAINING_BITS (br) < 4 + 4) {
2015 retval = GST_AV1_PARSER_NO_MORE_DATA;
2019 quant_params->qm_y = AV1_READ_BITS (br, 4);
2020 quant_params->qm_u = AV1_READ_BITS (br, 4);
2022 if (!color_config->separate_uv_delta_q) {
2023 quant_params->qm_v = quant_params->qm_u;
2025 quant_params->qm_v = AV1_READ_BITS_CHECKED (br, 4, &retval);
2026 if (retval != GST_AV1_PARSER_OK)
2031 return GST_AV1_PARSER_OK;
2034 GST_WARNING ("parse quantization params error %d", retval);
2039 static GstAV1ParserResult
2040 gst_av1_parse_segmentation_params (GstAV1Parser * parser, GstBitReader * br,
2041 GstAV1FrameHeaderOBU * frame_header)
2044 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
2045 gint clipped_value /* clippedValue */ ;
2046 GstAV1SegmenationParams *seg_params;
2047 gint feature_value = 0;
2049 const guint8 segmentation_feature_bits[GST_AV1_SEG_LVL_MAX] = {
2050 8, 6, 6, 6, 6, 3, 0, 0
2052 const guint8 segmentation_feature_signed[GST_AV1_SEG_LVL_MAX] = {
2053 1, 1, 1, 1, 1, 0, 0, 0
2055 const guint8 segmentation_feature_max[GST_AV1_SEG_LVL_MAX] = {
2056 255, GST_AV1_MAX_LOOP_FILTER, GST_AV1_MAX_LOOP_FILTER,
2057 GST_AV1_MAX_LOOP_FILTER, GST_AV1_MAX_LOOP_FILTER, 7, 0, 0
2060 seg_params = &frame_header->segmentation_params;
2062 seg_params->segmentation_enabled = AV1_READ_BIT_CHECKED (br, &retval);
2063 if (retval != GST_AV1_PARSER_OK)
2066 if (seg_params->segmentation_enabled) {
2067 if (frame_header->primary_ref_frame == GST_AV1_PRIMARY_REF_NONE) {
2068 seg_params->segmentation_update_map = 1;
2069 seg_params->segmentation_temporal_update = 0;
2070 seg_params->segmentation_update_data = 1;
2072 seg_params->segmentation_update_map = AV1_READ_BIT_CHECKED (br, &retval);
2073 if (retval != GST_AV1_PARSER_OK)
2076 if (seg_params->segmentation_update_map) {
2077 seg_params->segmentation_temporal_update =
2078 AV1_READ_BIT_CHECKED (br, &retval);
2079 if (retval != GST_AV1_PARSER_OK)
2082 seg_params->segmentation_update_data = AV1_READ_BIT_CHECKED (br, &retval);
2083 if (retval != GST_AV1_PARSER_OK)
2087 if (seg_params->segmentation_update_data) {
2088 for (i = 0; i < GST_AV1_MAX_SEGMENTS; i++) {
2089 for (j = 0; j < GST_AV1_SEG_LVL_MAX; j++) {
2090 seg_params->feature_enabled[i][j] =
2091 AV1_READ_BIT_CHECKED (br, &retval);
2092 if (retval != GST_AV1_PARSER_OK)
2097 if (seg_params->feature_enabled[i][j]) {
2098 gint bits_to_read = segmentation_feature_bits[j];
2099 gint limit = segmentation_feature_max[j];
2100 if (segmentation_feature_signed[j]) {
2102 av1_bitstreamfn_su (br, 1 + bits_to_read, &retval);
2103 if (retval != GST_AV1_PARSER_OK)
2106 clipped_value = CLAMP (feature_value, limit * (-1), limit);
2108 feature_value = AV1_READ_BITS_CHECKED (br, bits_to_read, &retval);
2109 if (retval != GST_AV1_PARSER_OK)
2112 clipped_value = CLAMP (feature_value, 0, limit);
2115 seg_params->feature_data[i][j] = clipped_value;
2119 /* Copy it from prime_ref */
2120 g_assert (frame_header->primary_ref_frame != GST_AV1_PRIMARY_REF_NONE);
2121 g_assert (parser->state.ref_info.
2122 entry[frame_header->ref_frame_idx[frame_header->primary_ref_frame]].
2125 &parser->state.ref_info.
2126 entry[frame_header->ref_frame_idx[frame_header->
2127 primary_ref_frame]].ref_segmentation_params,
2128 sizeof (GstAV1SegmenationParams));
2130 seg_params->segmentation_update_map = 0;
2131 seg_params->segmentation_temporal_update = 0;
2132 seg_params->segmentation_update_data = 0;
2135 seg_params->segmentation_update_map = 0;
2136 seg_params->segmentation_temporal_update = 0;
2137 seg_params->segmentation_update_data = 0;
2138 for (i = 0; i < GST_AV1_MAX_SEGMENTS; i++) {
2139 for (j = 0; j < GST_AV1_SEG_LVL_MAX; j++) {
2140 seg_params->feature_enabled[i][j] = 0;
2141 seg_params->feature_data[i][j] = 0;
2146 seg_params->seg_id_pre_skip = 0;
2147 seg_params->last_active_seg_id = 0;
2148 for (i = 0; i < GST_AV1_MAX_SEGMENTS; i++) {
2149 for (j = 0; j < GST_AV1_SEG_LVL_MAX; j++) {
2150 if (seg_params->feature_enabled[i][j]) {
2151 seg_params->last_active_seg_id = i;
2152 if (j >= GST_AV1_SEG_LVL_REF_FRAME) {
2153 seg_params->seg_id_pre_skip = 1;
2159 return GST_AV1_PARSER_OK;
2162 GST_WARNING ("parse segmentation params error %d", retval);
2167 static GstAV1ParserResult
2168 gst_av1_parse_tile_info (GstAV1Parser * parser, GstBitReader * br,
2169 GstAV1FrameHeaderOBU * frame_header)
2171 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
2172 GstAV1SequenceHeaderOBU *seq_header;
2173 GstAV1TileInfo *tile_info;
2175 gint start_sb /* startSb */ ;
2176 gint sb_cols /* sbCols */ ;
2177 gint sb_rows /* sbRows */ ;
2178 gint sb_shift /*sbShift */ ;
2179 gint sb_size /* sbSize */ ;
2180 gint max_tile_width_sb /* maxTileWidthSb */ ;
2181 gint max_tile_height_sb /* maxTileHeightSb */ ;
2182 gint max_tile_area_sb /* maxTileAreaSb */ ;
2183 gint min_log2_tile_cols /* minLog2TileCols */ ;
2184 gint max_log2_tile_cols /* maxLog2TileCols */ ;
2185 gint min_log2_tile_rows /* minLog2TileRows */ ;
2186 gint max_log2_tile_rows /* maxLog2TileRows */ ;
2187 gint min_log2_tiles /* minLog2Tiles */ ;
2188 gint tile_width_sb /* tileWidthSb */ ;
2189 gint tile_height_sb /* tileHeightSb */ ;
2190 gint max_width /* maxWidth */ , max_height /* maxHeight */ ;
2191 gint size_sb /* sizeSb */ ;
2192 gint widest_tile_sb /* widestTileSb */ ;
2194 g_assert (parser->seq_header);
2195 seq_header = parser->seq_header;
2196 tile_info = &frame_header->tile_info;
2198 sb_cols = seq_header->use_128x128_superblock ?
2199 ((parser->state.mi_cols + 31) >> 5) : ((parser->state.mi_cols + 15) >> 4);
2200 sb_rows = seq_header->use_128x128_superblock ? ((parser->state.mi_rows +
2201 31) >> 5) : ((parser->state.mi_rows + 15) >> 4);
2202 sb_shift = seq_header->use_128x128_superblock ? 5 : 4;
2203 sb_size = sb_shift + 2;
2204 max_tile_width_sb = GST_AV1_MAX_TILE_WIDTH >> sb_size;
2205 max_tile_area_sb = GST_AV1_MAX_TILE_AREA >> (2 * sb_size);
2206 min_log2_tile_cols = av1_helper_tile_log2 (max_tile_width_sb, sb_cols);
2207 max_log2_tile_cols = av1_helper_tile_log2 (1, MIN (sb_cols,
2208 GST_AV1_MAX_TILE_COLS));
2209 max_log2_tile_rows = av1_helper_tile_log2 (1, MIN (sb_rows,
2210 GST_AV1_MAX_TILE_ROWS));
2211 min_log2_tiles = MAX (min_log2_tile_cols,
2212 av1_helper_tile_log2 (max_tile_area_sb, sb_rows * sb_cols));
2214 tile_info->uniform_tile_spacing_flag = AV1_READ_BIT_CHECKED (br, &retval);
2215 if (retval != GST_AV1_PARSER_OK)
2218 if (tile_info->uniform_tile_spacing_flag) {
2219 parser->state.tile_cols_log2 = min_log2_tile_cols;
2220 while (parser->state.tile_cols_log2 < max_log2_tile_cols) {
2221 gint increment_tile_cols_log2 = AV1_READ_BIT_CHECKED (br, &retval);
2222 if (retval != GST_AV1_PARSER_OK)
2225 if (increment_tile_cols_log2 == 1)
2226 parser->state.tile_cols_log2++;
2230 tile_width_sb = (sb_cols + (1 << parser->state.tile_cols_log2) -
2231 1) >> parser->state.tile_cols_log2;
2233 for (start_sb = 0; start_sb < sb_cols; start_sb += tile_width_sb) {
2234 parser->state.mi_col_starts[i] = start_sb << sb_shift;
2237 parser->state.mi_col_starts[i] = parser->state.mi_cols;
2238 parser->state.tile_cols = i;
2241 tile_info->width_in_sbs_minus_1[i - 1] =
2242 ((parser->state.mi_col_starts[i] - parser->state.mi_col_starts[i - 1]
2243 + ((1 << sb_shift) - 1)) >> sb_shift) - 1;
2247 min_log2_tile_rows = MAX (min_log2_tiles - parser->state.tile_cols_log2, 0);
2248 parser->state.tile_rows_log2 = min_log2_tile_rows;
2249 while (parser->state.tile_rows_log2 < max_log2_tile_rows) {
2250 tile_info->increment_tile_rows_log2 = AV1_READ_BIT_CHECKED (br, &retval);
2251 if (retval != GST_AV1_PARSER_OK)
2254 if (tile_info->increment_tile_rows_log2 == 1)
2255 parser->state.tile_rows_log2++;
2259 tile_height_sb = (sb_rows + (1 << parser->state.tile_rows_log2) -
2260 1) >> parser->state.tile_rows_log2;
2262 for (start_sb = 0; start_sb < sb_rows; start_sb += tile_height_sb) {
2263 parser->state.mi_row_starts[i] = start_sb << sb_shift;
2266 parser->state.mi_row_starts[i] = parser->state.mi_rows;
2267 parser->state.tile_rows = i;
2269 tile_info->height_in_sbs_minus_1[i - 1] =
2270 ((parser->state.mi_row_starts[i] - parser->state.mi_row_starts[i - 1]
2271 + ((1 << sb_shift) - 1)) >> sb_shift) - 1;
2277 for (i = 0; start_sb < sb_cols; i++) {
2278 parser->state.mi_col_starts[i] = start_sb << sb_shift;
2279 max_width = MIN (sb_cols - start_sb, max_tile_width_sb);
2280 tile_info->width_in_sbs_minus_1[i] =
2281 av1_bitstreamfn_ns (br, max_width, &retval);
2282 if (retval != GST_AV1_PARSER_OK)
2285 size_sb = tile_info->width_in_sbs_minus_1[i] + 1;
2286 widest_tile_sb = MAX (size_sb, widest_tile_sb);
2287 start_sb += size_sb;
2289 parser->state.mi_col_starts[i] = parser->state.mi_cols;
2290 parser->state.tile_cols = i;
2291 parser->state.tile_cols_log2 =
2292 av1_helper_tile_log2 (1, parser->state.tile_cols);
2294 if (min_log2_tiles > 0)
2295 max_tile_area_sb = (sb_rows * sb_cols) >> (min_log2_tiles + 1);
2297 max_tile_area_sb = sb_rows * sb_cols;
2299 max_tile_height_sb = MAX (max_tile_area_sb / widest_tile_sb, 1);
2302 for (i = 0; start_sb < sb_rows; i++) {
2303 parser->state.mi_row_starts[i] = start_sb << sb_shift;
2304 max_height = MIN (sb_rows - start_sb, max_tile_height_sb);
2305 tile_info->height_in_sbs_minus_1[i] =
2306 av1_bitstreamfn_ns (br, max_height, &retval);
2307 if (retval != GST_AV1_PARSER_OK)
2310 size_sb = tile_info->height_in_sbs_minus_1[i] + 1;
2311 start_sb += size_sb;
2314 parser->state.mi_row_starts[i] = parser->state.mi_rows;
2315 parser->state.tile_rows = i;
2316 parser->state.tile_rows_log2 =
2317 av1_helper_tile_log2 (1, parser->state.tile_rows);
2320 if (parser->state.tile_cols_log2 > 0 || parser->state.tile_rows_log2 > 0) {
2321 tile_info->context_update_tile_id =
2322 AV1_READ_BITS_CHECKED (br,
2323 parser->state.tile_cols_log2 + parser->state.tile_rows_log2, &retval);
2324 if (retval != GST_AV1_PARSER_OK)
2327 tile_info->tile_size_bytes_minus_1 = AV1_READ_BITS_CHECKED (br, 2, &retval);
2328 if (retval != GST_AV1_PARSER_OK)
2331 parser->state.tile_size_bytes = tile_info->tile_size_bytes_minus_1 + 1;
2333 tile_info->context_update_tile_id = 0;
2336 memcpy (tile_info->mi_col_starts, parser->state.mi_col_starts,
2337 sizeof (guint32) * (GST_AV1_MAX_TILE_COLS + 1));
2338 memcpy (tile_info->mi_row_starts, parser->state.mi_row_starts,
2339 sizeof (guint32) * (GST_AV1_MAX_TILE_ROWS + 1));
2340 tile_info->tile_cols_log2 = parser->state.tile_cols_log2;
2341 tile_info->tile_cols = parser->state.tile_cols;
2342 tile_info->tile_rows_log2 = parser->state.tile_rows_log2;
2343 tile_info->tile_rows = parser->state.tile_rows;
2344 tile_info->tile_size_bytes = parser->state.tile_size_bytes;
2346 return GST_AV1_PARSER_OK;
2349 GST_WARNING ("parse tile info error %d", retval);
2353 static GstAV1ParserResult
2354 gst_av1_parse_loop_filter_params (GstAV1Parser * parser,
2355 GstBitReader * br, GstAV1FrameHeaderOBU * frame_header)
2357 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
2358 GstAV1LoopFilterParams *lf_params;
2360 guint8 update_ref_deltas = 0;
2361 guint8 update_mode_deltas = 0;
2363 g_assert (parser->seq_header);
2365 lf_params = &frame_header->loop_filter_params;
2367 if (frame_header->coded_lossless || frame_header->allow_intrabc) {
2368 lf_params->loop_filter_level[0] = 0;
2369 lf_params->loop_filter_level[1] = 0;
2370 lf_params->loop_filter_ref_deltas[GST_AV1_REF_INTRA_FRAME] = 1;
2371 lf_params->loop_filter_ref_deltas[GST_AV1_REF_LAST_FRAME] = 0;
2372 lf_params->loop_filter_ref_deltas[GST_AV1_REF_LAST2_FRAME] = 0;
2373 lf_params->loop_filter_ref_deltas[GST_AV1_REF_LAST3_FRAME] = 0;
2374 lf_params->loop_filter_ref_deltas[GST_AV1_REF_BWDREF_FRAME] = 0;
2375 lf_params->loop_filter_ref_deltas[GST_AV1_REF_GOLDEN_FRAME] = -1;
2376 lf_params->loop_filter_ref_deltas[GST_AV1_REF_ALTREF_FRAME] = -1;
2377 lf_params->loop_filter_ref_deltas[GST_AV1_REF_ALTREF2_FRAME] = -1;
2378 for (i = 0; i < 2; i++)
2379 lf_params->loop_filter_mode_deltas[i] = 0;
2384 if (AV1_REMAINING_BITS (br) < 6 + 6) {
2385 retval = GST_AV1_PARSER_NO_MORE_DATA;
2389 lf_params->loop_filter_level[0] = AV1_READ_BITS (br, 6);
2390 lf_params->loop_filter_level[1] = AV1_READ_BITS (br, 6);
2391 if (parser->seq_header->num_planes > 1) {
2392 if (lf_params->loop_filter_level[0] || lf_params->loop_filter_level[1]) {
2393 if (AV1_REMAINING_BITS (br) < 6 + 6) {
2394 retval = GST_AV1_PARSER_NO_MORE_DATA;
2398 lf_params->loop_filter_level[2] = AV1_READ_BITS (br, 6);
2399 lf_params->loop_filter_level[3] = AV1_READ_BITS (br, 6);
2403 if (AV1_REMAINING_BITS (br) < 3 + 1) {
2404 retval = GST_AV1_PARSER_NO_MORE_DATA;
2408 lf_params->loop_filter_sharpness = AV1_READ_BITS (br, 3);
2410 lf_params->loop_filter_delta_enabled = AV1_READ_BIT (br);
2411 if (lf_params->loop_filter_delta_enabled) {
2412 lf_params->loop_filter_delta_update = AV1_READ_BIT_CHECKED (br, &retval);
2413 if (retval != GST_AV1_PARSER_OK)
2416 if (lf_params->loop_filter_delta_update) {
2417 for (i = 0; i < GST_AV1_TOTAL_REFS_PER_FRAME; i++) {
2418 update_ref_deltas = AV1_READ_BIT_CHECKED (br, &retval);
2419 if (retval != GST_AV1_PARSER_OK)
2422 if (update_ref_deltas) {
2423 lf_params->loop_filter_ref_deltas[i] =
2424 av1_bitstreamfn_su (br, 7, &retval);
2425 if (retval != GST_AV1_PARSER_OK)
2429 for (i = 0; i < 2; i++) {
2430 update_mode_deltas = AV1_READ_BIT_CHECKED (br, &retval);
2431 if (retval != GST_AV1_PARSER_OK)
2434 if (update_mode_deltas) {
2435 lf_params->loop_filter_mode_deltas[i] =
2436 av1_bitstreamfn_su (br, 7, &retval);
2437 if (retval != GST_AV1_PARSER_OK)
2445 return GST_AV1_PARSER_OK;
2448 GST_WARNING ("parse loop filter params error %d", retval);
2453 static GstAV1ParserResult
2454 gst_av1_parse_delta_q_params (GstAV1Parser * parser,
2455 GstBitReader * br, GstAV1QuantizationParams * quant_params)
2457 GstAV1ParserResult retval;
2459 quant_params->delta_q_res = 0;
2460 quant_params->delta_q_present = 0;
2461 if (quant_params->base_q_idx > 0) {
2462 quant_params->delta_q_present = AV1_READ_BIT_CHECKED (br, &retval);
2463 if (retval != GST_AV1_PARSER_OK)
2467 if (quant_params->delta_q_present) {
2468 quant_params->delta_q_res = AV1_READ_BITS_CHECKED (br, 2, &retval);
2469 if (retval != GST_AV1_PARSER_OK)
2473 return GST_AV1_PARSER_OK;
2477 static GstAV1ParserResult
2478 gst_av1_parse_delta_lf_params (GstAV1Parser * parser,
2479 GstBitReader * br, GstAV1FrameHeaderOBU * frame_header)
2481 GstAV1ParserResult retval;
2482 GstAV1LoopFilterParams *lf_params;
2484 lf_params = &frame_header->loop_filter_params;
2485 lf_params->delta_lf_present = 0;
2486 lf_params->delta_lf_res = 0;
2487 lf_params->delta_lf_multi = 0;
2489 if (frame_header->quantization_params.delta_q_present) {
2490 if (!frame_header->allow_intrabc) {
2491 lf_params->delta_lf_present = AV1_READ_BIT_CHECKED (br, &retval);
2492 if (retval != GST_AV1_PARSER_OK)
2495 if (lf_params->delta_lf_present) {
2496 if (AV1_REMAINING_BITS (br) < 2 + 1)
2497 return GST_AV1_PARSER_NO_MORE_DATA;
2498 lf_params->delta_lf_res = AV1_READ_BITS (br, 2);
2499 lf_params->delta_lf_multi = AV1_READ_BIT (br);
2503 return GST_AV1_PARSER_OK;
2507 static GstAV1ParserResult
2508 gst_av1_parse_cdef_params (GstAV1Parser * parser, GstBitReader * br,
2509 GstAV1FrameHeaderOBU * frame_header)
2511 GstAV1SequenceHeaderOBU *seq_header;
2512 GstAV1CDEFParams *cdef_params;
2513 guint8 cdef_damping_minus_3;
2516 g_assert (parser->seq_header);
2518 cdef_params = &frame_header->cdef_params;
2519 seq_header = parser->seq_header;
2521 if (frame_header->coded_lossless || frame_header->allow_intrabc
2522 || !seq_header->enable_cdef) {
2523 cdef_params->cdef_bits = 0;
2524 cdef_params->cdef_y_pri_strength[0] = 0;
2525 cdef_params->cdef_y_sec_strength[0] = 0;
2526 cdef_params->cdef_uv_pri_strength[0] = 0;
2527 cdef_params->cdef_uv_sec_strength[0] = 0;
2528 cdef_params->cdef_damping = 3;
2529 return GST_AV1_PARSER_OK;
2532 if (AV1_REMAINING_BITS (br) < 2 + 2)
2533 return GST_AV1_PARSER_NO_MORE_DATA;
2535 cdef_damping_minus_3 = AV1_READ_BITS (br, 2);
2536 cdef_params->cdef_damping = cdef_damping_minus_3 + 3;
2537 cdef_params->cdef_bits = AV1_READ_BITS (br, 2);
2538 for (i = 0; i < (1 << cdef_params->cdef_bits); i++) {
2539 if (AV1_REMAINING_BITS (br) < 4 + 2)
2540 return GST_AV1_PARSER_NO_MORE_DATA;
2542 cdef_params->cdef_y_pri_strength[i] = AV1_READ_BITS (br, 4);
2543 cdef_params->cdef_y_sec_strength[i] = AV1_READ_BITS (br, 2);
2544 if (cdef_params->cdef_y_sec_strength[i] == 3)
2545 cdef_params->cdef_y_sec_strength[i] += 1;
2547 if (parser->seq_header->num_planes > 1) {
2548 if (AV1_REMAINING_BITS (br) < 4 + 2)
2549 return GST_AV1_PARSER_NO_MORE_DATA;
2551 cdef_params->cdef_uv_pri_strength[i] = AV1_READ_BITS (br, 4);
2552 cdef_params->cdef_uv_sec_strength[i] = AV1_READ_BITS (br, 2);
2553 if (cdef_params->cdef_uv_sec_strength[i] == 3)
2554 cdef_params->cdef_uv_sec_strength[i] += 1;
2558 return GST_AV1_PARSER_OK;
2562 static GstAV1ParserResult
2563 gst_av1_parse_loop_restoration_params (GstAV1Parser * parser,
2564 GstBitReader * br, GstAV1FrameHeaderOBU * frame_header)
2566 GstAV1LoopRestorationParams *lr_params;
2567 GstAV1SequenceHeaderOBU *seq_header;
2568 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
2571 guint8 use_chroma_lr /* useChromaLr */ ;
2572 const GstAV1FrameRestorationType remap_lr_type /* Remap_Lr_Type */ [4] = {
2573 GST_AV1_FRAME_RESTORE_NONE,
2574 GST_AV1_FRAME_RESTORE_SWITCHABLE,
2575 GST_AV1_FRAME_RESTORE_WIENER, GST_AV1_FRAME_RESTORE_SGRPROJ
2578 g_assert (parser->seq_header);
2580 lr_params = &frame_header->loop_restoration_params;
2581 seq_header = parser->seq_header;
2583 if (frame_header->all_lossless || frame_header->allow_intrabc
2584 || !seq_header->enable_restoration) {
2585 lr_params->frame_restoration_type[0] = GST_AV1_FRAME_RESTORE_NONE;
2586 lr_params->frame_restoration_type[0] = GST_AV1_FRAME_RESTORE_NONE;
2587 lr_params->frame_restoration_type[0] = GST_AV1_FRAME_RESTORE_NONE;
2588 lr_params->uses_lr = 0;
2592 lr_params->uses_lr = 0;
2594 for (i = 0; i < seq_header->num_planes; i++) {
2595 lr_type = AV1_READ_BITS_CHECKED (br, 2, &retval);
2596 if (retval != GST_AV1_PARSER_OK)
2599 lr_params->frame_restoration_type[i] = remap_lr_type[lr_type];
2600 if (lr_params->frame_restoration_type[i] != GST_AV1_FRAME_RESTORE_NONE) {
2601 lr_params->uses_lr = 1;
2608 if (lr_params->uses_lr) {
2609 if (seq_header->use_128x128_superblock) {
2610 lr_params->lr_unit_shift = AV1_READ_BIT_CHECKED (br, &retval);
2611 if (retval != GST_AV1_PARSER_OK)
2614 lr_params->lr_unit_shift++;
2616 guint8 lr_unit_extra_shift;
2618 lr_params->lr_unit_shift = AV1_READ_BIT_CHECKED (br, &retval);
2619 if (retval != GST_AV1_PARSER_OK)
2622 if (lr_params->lr_unit_shift) {
2623 lr_unit_extra_shift = AV1_READ_BIT_CHECKED (br, &retval);
2624 if (retval != GST_AV1_PARSER_OK)
2627 lr_params->lr_unit_shift += lr_unit_extra_shift;
2631 lr_params->loop_restoration_size[0] =
2632 GST_AV1_RESTORATION_TILESIZE_MAX >> (2 - lr_params->lr_unit_shift);
2633 if (seq_header->color_config.subsampling_x
2634 && seq_header->color_config.subsampling_y && use_chroma_lr) {
2635 lr_params->lr_uv_shift = AV1_READ_BIT_CHECKED (br, &retval);
2636 if (retval != GST_AV1_PARSER_OK)
2639 lr_params->lr_uv_shift = 0;
2642 lr_params->loop_restoration_size[1] =
2643 lr_params->loop_restoration_size[0] >> lr_params->lr_uv_shift;
2644 lr_params->loop_restoration_size[2] =
2645 lr_params->loop_restoration_size[0] >> lr_params->lr_uv_shift;
2649 return GST_AV1_PARSER_OK;
2652 GST_WARNING ("parse loop restoration params error %d", retval);
2657 static GstAV1ParserResult
2658 gst_av1_parse_tx_mode (GstAV1Parser * parser, GstBitReader * br,
2659 GstAV1FrameHeaderOBU * frame_header)
2661 GstAV1ParserResult retval;
2663 if (frame_header->coded_lossless == 1) {
2664 frame_header->tx_mode = GST_AV1_TX_MODE_ONLY_4x4;
2666 frame_header->tx_mode_select = AV1_READ_BIT_CHECKED (br, &retval);
2667 if (retval != GST_AV1_PARSER_OK)
2670 if (frame_header->tx_mode_select) {
2671 frame_header->tx_mode = GST_AV1_TX_MODE_SELECT;
2673 frame_header->tx_mode = GST_AV1_TX_MODE_LARGEST;
2677 return GST_AV1_PARSER_OK;
2682 gst_av1_get_relative_dist (GstAV1SequenceHeaderOBU * seq_header, gint a, gint b)
2685 if (!seq_header->enable_order_hint)
2688 m = 1 << seq_header->order_hint_bits_minus_1;
2689 diff = (diff & (m - 1)) - (diff & m);
2694 static GstAV1ParserResult
2695 gst_av1_parse_skip_mode_params (GstAV1Parser * parser, GstBitReader * br,
2696 GstAV1FrameHeaderOBU * frame_header)
2698 GstAV1ReferenceFrameInfo *ref_info;
2699 GstAV1SequenceHeaderOBU *seq_header;
2701 gint skip_mode_allowed /* skipModeAllowed */ ;
2702 GstAV1ParserResult retval;
2704 g_assert (parser->seq_header);
2706 seq_header = parser->seq_header;
2707 ref_info = &(parser->state.ref_info);
2708 skip_mode_allowed = 0;
2709 if (frame_header->frame_is_intra || !frame_header->reference_select
2710 || !seq_header->enable_order_hint) {
2711 skip_mode_allowed = 0;
2713 gint forward_idx = -1 /* forwardIdx */ ;
2714 gint forward_hint = 0 /* forwardHint */ ;
2715 gint backward_idx = -1 /* backwardIdx */ ;
2716 gint backward_hint = 0 /* backwardHint */ ;
2717 gint ref_hint = 0 /* refHint */ ;
2719 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++) {
2720 ref_hint = ref_info->entry[frame_header->ref_frame_idx[i]].ref_order_hint;
2721 if (gst_av1_get_relative_dist (parser->seq_header, ref_hint,
2722 frame_header->order_hint) < 0) {
2724 || gst_av1_get_relative_dist (parser->seq_header, ref_hint,
2725 forward_hint) > 0) {
2727 forward_hint = ref_hint;
2730 if (gst_av1_get_relative_dist (parser->seq_header, ref_hint,
2731 frame_header->order_hint) > 0) {
2732 if (backward_idx < 0
2733 || gst_av1_get_relative_dist (parser->seq_header, ref_hint,
2734 backward_hint) < 0) {
2736 backward_hint = ref_hint;
2741 if (forward_idx < 0) {
2742 skip_mode_allowed = 0;
2743 } else if (backward_idx >= 0) {
2744 skip_mode_allowed = 1;
2745 frame_header->skip_mode_frame[0] =
2746 GST_AV1_REF_LAST_FRAME + MIN (forward_idx, backward_idx);
2747 frame_header->skip_mode_frame[1] =
2748 GST_AV1_REF_LAST_FRAME + MAX (forward_idx, backward_idx);
2750 gint second_forward_idx = -1 /* secondForwardIdx */ ;
2751 gint second_forward_hint = 0 /* secondForwardHint */ ;
2752 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++) {
2754 ref_info->entry[frame_header->ref_frame_idx[i]].ref_order_hint;
2755 if (gst_av1_get_relative_dist (parser->seq_header, ref_hint,
2756 forward_hint) < 0) {
2757 if (second_forward_idx < 0
2758 || gst_av1_get_relative_dist (parser->seq_header, ref_hint,
2759 second_forward_hint) > 0) {
2760 second_forward_idx = i;
2761 second_forward_hint = ref_hint;
2766 if (second_forward_idx < 0) {
2767 skip_mode_allowed = 0;
2769 skip_mode_allowed = 1;
2770 frame_header->skip_mode_frame[0] =
2771 GST_AV1_REF_LAST_FRAME + MIN (forward_idx, second_forward_idx);
2772 frame_header->skip_mode_frame[1] =
2773 GST_AV1_REF_LAST_FRAME + MAX (forward_idx, second_forward_idx);
2778 if (skip_mode_allowed) {
2779 frame_header->skip_mode_present = AV1_READ_BIT_CHECKED (br, &retval);
2780 if (retval != GST_AV1_PARSER_OK)
2783 frame_header->skip_mode_present = 0;
2786 return GST_AV1_PARSER_OK;
2791 gst_av1_decode_subexp (GstBitReader * br, gint numSyms,
2792 GstAV1ParserResult * retval)
2797 gint subexp_final_bits = 0;
2798 gint subexp_more_bits = 0;
2799 gint subexp_bits = 0;
2802 gint b2 = i ? k + i - 1 : k;
2804 if (numSyms <= mk + 3 * a) {
2805 subexp_final_bits = av1_bitstreamfn_ns (br, numSyms - mk, retval);
2806 if (*retval != GST_AV1_PARSER_OK)
2808 return subexp_final_bits + mk;
2810 subexp_more_bits = AV1_READ_BITS_CHECKED (br, 1, retval);
2811 if (*retval != GST_AV1_PARSER_OK)
2813 if (subexp_more_bits) {
2817 subexp_bits = AV1_READ_BITS_CHECKED (br, b2, retval);
2818 if (*retval != GST_AV1_PARSER_OK)
2820 return subexp_bits + mk;
2828 gst_av1_decode_unsigned_subexp_with_ref (GstBitReader * br, gint mx,
2829 gint r, GstAV1ParserResult * retval)
2833 v = gst_av1_decode_subexp (br, mx, retval);
2834 if ((r << 1) <= mx) {
2835 return av1_helper_inverse_recenter (r, v);
2837 return mx - 1 - av1_helper_inverse_recenter (mx - 1 - r, v);
2843 gst_av1_decode_signed_subexp_with_ref (GstBitReader * br, gint low,
2844 gint high, gint r, GstAV1ParserResult * retval)
2846 return gst_av1_decode_unsigned_subexp_with_ref (br,
2847 high - low, r - low, retval) + low;
2851 static GstAV1ParserResult
2852 gst_av1_parse_global_param (GstAV1Parser * parser,
2853 GstAV1FrameHeaderOBU * frame_header, GstBitReader * br,
2854 GstAV1GlobalMotionParams * gm_params, GstAV1WarpModelType type,
2855 gint32 prev_gm_params[GST_AV1_NUM_REF_FRAMES][6], gint ref, gint idx)
2857 GstAV1ParserResult retval;
2858 gint prec_diff /* precDiff */ , wm_round, mx, r;
2859 gint abs_bits /* absBits */ = GST_AV1_GM_ABS_ALPHA_BITS;
2860 gint prec_bits /* precBits */ = GST_AV1_GM_ALPHA_PREC_BITS;
2864 if (type == GST_AV1_WARP_MODEL_TRANSLATION) {
2866 GST_AV1_GM_ABS_TRANS_ONLY_BITS -
2867 (frame_header->allow_high_precision_mv ? 0 : 1);
2869 GST_AV1_GM_TRANS_ONLY_PREC_BITS -
2870 (frame_header->allow_high_precision_mv ? 0 : 1);
2872 abs_bits = GST_AV1_GM_ABS_TRANS_BITS;
2873 prec_bits = GST_AV1_GM_TRANS_PREC_BITS;
2877 prec_diff = GST_AV1_WARPEDMODEL_PREC_BITS - prec_bits;
2878 wm_round = (idx % 3) == 2 ? (1 << GST_AV1_WARPEDMODEL_PREC_BITS) : 0;
2879 sub = (idx % 3) == 2 ? (1 << prec_bits) : 0;
2880 mx = (1 << abs_bits);
2881 r = (prev_gm_params[ref][idx] >> prec_diff) - sub;
2882 gm_params->gm_params[ref][idx] =
2883 (gst_av1_decode_signed_subexp_with_ref (br, -mx, mx + 1, r,
2884 &retval) << prec_diff) + wm_round;
2885 if (retval != GST_AV1_PARSER_OK)
2887 return GST_AV1_PARSER_OK;
2891 gst_av1_parser_is_shear_params_valid (gint32 gm_params[6])
2893 const gint32 *mat = gm_params;
2894 gint16 alpha, beta, gamma, delta;
2899 gboolean default_warp_params;
2904 default_warp_params = TRUE;
2905 for (i = 0; i < 6; i++) {
2906 if (gm_params[i] != ((i % 3 == 2) ? 1 << GST_AV1_WARPEDMODEL_PREC_BITS : 0)) {
2907 default_warp_params = FALSE;
2911 if (default_warp_params)
2914 alpha = CLAMP (mat[2] - (1 << GST_AV1_WARPEDMODEL_PREC_BITS),
2915 G_MININT16, G_MAXINT16);
2916 beta = CLAMP (mat[3], G_MININT16, G_MAXINT16);
2917 y = av1_helper_resolve_divisor_32 (ABS (mat[2]), &shift)
2918 * (mat[2] < 0 ? -1 : 1);
2919 v = ((gint64) mat[4] * (1 << GST_AV1_WARPEDMODEL_PREC_BITS)) * y;
2921 CLAMP ((gint) av1_helper_round_power_of_two_signed (v, shift), G_MININT16,
2923 v = ((gint64) mat[3] * mat[4]) * y;
2925 CLAMP (mat[5] - (gint) av1_helper_round_power_of_two_signed (v,
2926 shift) - (1 << GST_AV1_WARPEDMODEL_PREC_BITS), G_MININT16,
2930 av1_helper_round_power_of_two_signed (alpha,
2931 GST_AV1_WARP_PARAM_REDUCE_BITS) * (1 << GST_AV1_WARP_PARAM_REDUCE_BITS);
2933 av1_helper_round_power_of_two_signed (beta,
2934 GST_AV1_WARP_PARAM_REDUCE_BITS) * (1 << GST_AV1_WARP_PARAM_REDUCE_BITS);
2936 av1_helper_round_power_of_two_signed (gamma,
2937 GST_AV1_WARP_PARAM_REDUCE_BITS) * (1 << GST_AV1_WARP_PARAM_REDUCE_BITS);
2939 av1_helper_round_power_of_two_signed (delta,
2940 GST_AV1_WARP_PARAM_REDUCE_BITS) * (1 << GST_AV1_WARP_PARAM_REDUCE_BITS);
2942 if ((4 * ABS (alpha) + 7 * ABS (beta) >= (1 << GST_AV1_WARPEDMODEL_PREC_BITS))
2943 || (4 * ABS (gamma) + 4 * ABS (delta) >=
2944 (1 << GST_AV1_WARPEDMODEL_PREC_BITS)))
2951 static GstAV1ParserResult
2952 gst_av1_parse_global_motion_params (GstAV1Parser * parser,
2953 GstBitReader * br, GstAV1FrameHeaderOBU * frame_header)
2955 GstAV1WarpModelType type;
2956 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
2958 GstAV1GlobalMotionParams *gm_params = &(frame_header->global_motion_params);
2959 gint32 prev_gm_params[GST_AV1_NUM_REF_FRAMES][6] /* PrevGmParams */ ;
2962 gm_params->gm_type[GST_AV1_REF_INTRA_FRAME] = GST_AV1_WARP_MODEL_IDENTITY;
2963 for (ref = GST_AV1_REF_LAST_FRAME; ref <= GST_AV1_REF_ALTREF_FRAME; ref++) {
2964 gm_params->invalid[ref] = 0;
2965 gm_params->gm_type[ref] = GST_AV1_WARP_MODEL_IDENTITY;
2966 for (i = 0; i < 6; i++) {
2967 gm_params->gm_params[ref][i] =
2968 ((i % 3 == 2) ? 1 << GST_AV1_WARPEDMODEL_PREC_BITS : 0);
2972 if (frame_header->frame_is_intra)
2975 if (frame_header->primary_ref_frame != GST_AV1_PRIMARY_REF_NONE) {
2976 GstAV1GlobalMotionParams *ref_global_motion_params =
2977 &parser->state.ref_info.entry[frame_header->
2978 ref_frame_idx[frame_header->primary_ref_frame]].
2979 ref_global_motion_params;
2980 memcpy (prev_gm_params, ref_global_motion_params->gm_params,
2981 sizeof (gint32) * GST_AV1_NUM_REF_FRAMES * 6);
2983 for (ref = GST_AV1_REF_INTRA_FRAME; ref < GST_AV1_NUM_REF_FRAMES; ref++)
2984 for (i = 0; i < 6; i++)
2985 prev_gm_params[ref][i] =
2986 ((i % 3 == 2) ? 1 << GST_AV1_WARPEDMODEL_PREC_BITS : 0);
2989 for (ref = GST_AV1_REF_LAST_FRAME; ref <= GST_AV1_REF_ALTREF_FRAME; ref++) {
2990 gm_params->is_global[ref] = AV1_READ_BIT_CHECKED (br, &retval);
2991 if (retval != GST_AV1_PARSER_OK)
2994 if (gm_params->is_global[ref]) {
2995 gm_params->is_rot_zoom[ref] = AV1_READ_BIT_CHECKED (br, &retval);
2996 if (retval != GST_AV1_PARSER_OK)
2999 if (gm_params->is_rot_zoom[ref]) {
3000 type = GST_AV1_WARP_MODEL_ROTZOOM;
3002 gm_params->is_translation[ref] = AV1_READ_BIT_CHECKED (br, &retval);
3003 if (retval != GST_AV1_PARSER_OK)
3006 gm_params->is_translation[ref] ? GST_AV1_WARP_MODEL_TRANSLATION :
3007 GST_AV1_WARP_MODEL_AFFINE;
3010 type = GST_AV1_WARP_MODEL_IDENTITY;
3012 gm_params->gm_type[ref] = type;
3014 if (type >= GST_AV1_WARP_MODEL_ROTZOOM) {
3016 gst_av1_parse_global_param (parser, frame_header, br, gm_params, type,
3017 prev_gm_params, ref, 2);
3018 if (retval != GST_AV1_PARSER_OK)
3022 gst_av1_parse_global_param (parser, frame_header, br, gm_params, type,
3023 prev_gm_params, ref, 3);
3024 if (retval != GST_AV1_PARSER_OK)
3027 if (type == GST_AV1_WARP_MODEL_AFFINE) {
3029 gst_av1_parse_global_param (parser, frame_header, br, gm_params,
3030 type, prev_gm_params, ref, 4);
3031 if (retval != GST_AV1_PARSER_OK)
3035 gst_av1_parse_global_param (parser, frame_header, br, gm_params,
3036 type, prev_gm_params, ref, 5);
3037 if (retval != GST_AV1_PARSER_OK)
3040 gm_params->gm_params[ref][4] = gm_params->gm_params[ref][3] * (-1);
3041 gm_params->gm_params[ref][5] = gm_params->gm_params[ref][2];
3044 if (type >= GST_AV1_WARP_MODEL_TRANSLATION) {
3046 gst_av1_parse_global_param (parser, frame_header, br, gm_params, type,
3047 prev_gm_params, ref, 0);
3048 if (retval != GST_AV1_PARSER_OK)
3051 gst_av1_parse_global_param (parser, frame_header, br, gm_params, type,
3052 prev_gm_params, ref, 1);
3053 if (retval != GST_AV1_PARSER_OK)
3057 if (type <= GST_AV1_WARP_MODEL_AFFINE)
3058 gm_params->invalid[ref] =
3059 !gst_av1_parser_is_shear_params_valid (gm_params->gm_params[ref]);
3063 return GST_AV1_PARSER_OK;
3066 GST_WARNING ("parse global motion params error %d", retval);
3071 static GstAV1ParserResult
3072 gst_av1_parse_film_grain_params (GstAV1Parser * parser, GstBitReader * br,
3073 GstAV1FrameHeaderOBU * frame_header)
3075 GstAV1FilmGrainParams *fg_params;
3076 GstAV1SequenceHeaderOBU *seq_header;
3078 gint num_pos_chroma /* numPosChroma */ , num_pos_luma /* numPosLuma */ ;
3079 GstAV1ParserResult ret = GST_AV1_PARSER_OK;
3081 g_assert (parser->seq_header);
3083 fg_params = &frame_header->film_grain_params;
3084 seq_header = parser->seq_header;
3085 if (!seq_header->film_grain_params_present || (!frame_header->show_frame
3086 && !frame_header->showable_frame)) {
3087 /* reset_grain_params() is a function call that indicates that all the
3088 syntax elements read in film_grain_params should be set equal to 0. */
3089 memset (fg_params, 0, sizeof (*fg_params));
3093 fg_params->apply_grain = AV1_READ_BIT_CHECKED (br, &ret);
3094 if (ret != GST_AV1_PARSER_OK)
3096 if (!fg_params->apply_grain) {
3097 /* reset_grain_params() */
3098 memset (fg_params, 0, sizeof (*fg_params));
3102 fg_params->grain_seed = AV1_READ_UINT16_CHECKED (br, &ret);
3103 if (ret != GST_AV1_PARSER_OK)
3106 if (frame_header->frame_type == GST_AV1_INTER_FRAME) {
3107 fg_params->update_grain = AV1_READ_BIT_CHECKED (br, &ret);
3108 if (ret != GST_AV1_PARSER_OK)
3111 fg_params->update_grain = 1;
3114 if (!fg_params->update_grain) {
3115 guint16 temp_grain_seed /* tempGrainSeed */ ;
3117 gboolean found = FALSE;
3119 fg_params->film_grain_params_ref_idx = AV1_READ_BITS_CHECKED (br, 3, &ret);
3120 if (ret != GST_AV1_PARSER_OK)
3123 for (j = 0; j < GST_AV1_REFS_PER_FRAME; j++) {
3124 if (frame_header->ref_frame_idx[j] ==
3125 fg_params->film_grain_params_ref_idx) {
3132 GST_INFO ("Invalid film grain reference idx %d.",
3133 fg_params->film_grain_params_ref_idx);
3134 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
3138 if (!parser->state.ref_info.entry[fg_params->film_grain_params_ref_idx].
3140 GST_INFO ("Invalid ref info of film grain idx %d.",
3141 fg_params->film_grain_params_ref_idx);
3142 ret = GST_AV1_PARSER_BITSTREAM_ERROR;
3146 temp_grain_seed = fg_params->grain_seed;
3148 &parser->state.ref_info.entry[fg_params->film_grain_params_ref_idx].
3149 ref_film_grain_params, sizeof (GstAV1FilmGrainParams));
3150 fg_params->grain_seed = temp_grain_seed;
3155 fg_params->num_y_points = AV1_READ_BITS_CHECKED (br, 4, &ret);
3156 if (ret != GST_AV1_PARSER_OK)
3159 for (i = 0; i < fg_params->num_y_points; i++) {
3160 if (AV1_REMAINING_BITS (br) < 8 + 8) {
3161 ret = GST_AV1_PARSER_NO_MORE_DATA;
3164 fg_params->point_y_value[i] = AV1_READ_UINT8 (br);
3165 fg_params->point_y_scaling[i] = AV1_READ_UINT8 (br);
3168 if (seq_header->color_config.mono_chrome) {
3169 fg_params->chroma_scaling_from_luma = 0;
3171 fg_params->chroma_scaling_from_luma = AV1_READ_BIT_CHECKED (br, &ret);
3172 if (ret != GST_AV1_PARSER_OK)
3176 if (seq_header->color_config.mono_chrome
3177 || fg_params->chroma_scaling_from_luma
3178 || (seq_header->color_config.subsampling_x == 1
3179 && seq_header->color_config.subsampling_y == 1
3180 && fg_params->num_y_points == 0)) {
3181 fg_params->num_cb_points = 0;
3182 fg_params->num_cr_points = 0;
3184 fg_params->num_cb_points = AV1_READ_BITS_CHECKED (br, 4, &ret);
3185 if (ret != GST_AV1_PARSER_OK)
3187 for (i = 0; i < fg_params->num_cb_points; i++) {
3188 if (AV1_REMAINING_BITS (br) < 8 + 8) {
3189 ret = GST_AV1_PARSER_NO_MORE_DATA;
3192 fg_params->point_cb_value[i] = AV1_READ_UINT8 (br);
3193 fg_params->point_cb_scaling[i] = AV1_READ_UINT8 (br);
3196 fg_params->num_cr_points = AV1_READ_BITS_CHECKED (br, 4, &ret);
3197 if (ret != GST_AV1_PARSER_OK)
3199 for (i = 0; i < fg_params->num_cr_points; i++) {
3200 if (AV1_REMAINING_BITS (br) < 8 + 8) {
3201 ret = GST_AV1_PARSER_NO_MORE_DATA;
3204 fg_params->point_cr_value[i] = AV1_READ_UINT8 (br);
3205 fg_params->point_cr_scaling[i] = AV1_READ_UINT8 (br);
3209 fg_params->grain_scaling_minus_8 = AV1_READ_BITS_CHECKED (br, 2, &ret);
3210 if (ret != GST_AV1_PARSER_OK)
3213 fg_params->ar_coeff_lag = AV1_READ_BITS_CHECKED (br, 2, &ret);
3214 if (ret != GST_AV1_PARSER_OK)
3217 num_pos_luma = 2 * fg_params->ar_coeff_lag * (fg_params->ar_coeff_lag + 1);
3218 if (fg_params->num_y_points) {
3219 num_pos_chroma = num_pos_luma + 1;
3220 for (i = 0; i < num_pos_luma; i++) {
3221 fg_params->ar_coeffs_y_plus_128[i] = AV1_READ_UINT8_CHECKED (br, &ret);
3222 if (ret != GST_AV1_PARSER_OK)
3226 num_pos_chroma = num_pos_luma;
3229 if (fg_params->chroma_scaling_from_luma || fg_params->num_cb_points) {
3230 for (i = 0; i < num_pos_chroma; i++) {
3231 fg_params->ar_coeffs_cb_plus_128[i] = AV1_READ_UINT8_CHECKED (br, &ret);
3232 if (ret != GST_AV1_PARSER_OK)
3237 if (fg_params->chroma_scaling_from_luma || fg_params->num_cr_points) {
3238 for (i = 0; i < num_pos_chroma; i++) {
3239 fg_params->ar_coeffs_cr_plus_128[i] = AV1_READ_UINT8_CHECKED (br, &ret);
3240 if (ret != GST_AV1_PARSER_OK)
3245 if (AV1_REMAINING_BITS (br) < 2 + 2) {
3246 ret = GST_AV1_PARSER_NO_MORE_DATA;
3249 fg_params->ar_coeff_shift_minus_6 = AV1_READ_BITS (br, 2);
3250 fg_params->grain_scale_shift = AV1_READ_BITS (br, 2);
3252 if (fg_params->num_cb_points) {
3253 if (AV1_REMAINING_BITS (br) < 8 + 8 + 9) {
3254 ret = GST_AV1_PARSER_NO_MORE_DATA;
3257 fg_params->cb_mult = AV1_READ_BITS (br, 8);
3258 fg_params->cb_luma_mult = AV1_READ_BITS (br, 8);
3259 fg_params->cb_offset = AV1_READ_BITS (br, 9);
3262 if (fg_params->num_cr_points) {
3263 if (AV1_REMAINING_BITS (br) < 8 + 8 + 9) {
3264 ret = GST_AV1_PARSER_NO_MORE_DATA;
3267 fg_params->cr_mult = AV1_READ_BITS (br, 8);
3268 fg_params->cr_luma_mult = AV1_READ_BITS (br, 8);
3269 fg_params->cr_offset = AV1_READ_BITS (br, 9);
3272 if (AV1_REMAINING_BITS (br) < 2) {
3273 ret = GST_AV1_PARSER_NO_MORE_DATA;
3276 fg_params->overlap_flag = AV1_READ_BIT (br);
3277 fg_params->clip_to_restricted_range = AV1_READ_BIT (br);
3280 return GST_AV1_PARSER_OK;
3283 GST_WARNING ("parse film grain params error %d", ret);
3289 gst_av1_mark_ref_frames (GstAV1Parser * parser, GstBitReader * br, gint idLen)
3291 GstAV1ReferenceFrameInfo *ref_info;
3292 GstAV1SequenceHeaderOBU *seq_header;
3293 gint i, diff_len /* diffLen */ ;
3295 seq_header = parser->seq_header;
3296 ref_info = &(parser->state.ref_info);
3297 diff_len = seq_header->delta_frame_id_length_minus_2 + 2;
3299 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) {
3300 if (parser->state.current_frame_id > (1 << diff_len)) {
3301 if (ref_info->entry[i].ref_frame_id > parser->state.current_frame_id
3302 || ref_info->entry[i].ref_frame_id <
3303 (parser->state.current_frame_id - (1 << diff_len)))
3304 ref_info->entry[i].ref_valid = 0;
3306 if (ref_info->entry[i].ref_frame_id > parser->state.current_frame_id
3307 && ref_info->entry[i].ref_frame_id <
3308 ((1 << idLen) + parser->state.current_frame_id - (1 << diff_len)))
3309 ref_info->entry[i].ref_valid = 0;
3316 gst_av1_seg_feature_active_idx (GstAV1Parser * parser,
3317 GstAV1FrameHeaderOBU * frame_header, gint idx, gint feature)
3319 return frame_header->segmentation_params.segmentation_enabled
3320 && frame_header->segmentation_params.feature_enabled[idx][feature];
3325 gst_av1_get_qindex (GstAV1Parser * parser,
3326 GstAV1FrameHeaderOBU * frame_header, gboolean ignoreDeltaQ, gint segmentId)
3329 if (gst_av1_seg_feature_active_idx (parser, frame_header, segmentId,
3330 GST_AV1_SEG_LVL_ALT_Q)) {
3333 segmentation_params.feature_data[segmentId][GST_AV1_SEG_LVL_ALT_Q];
3334 qindex = frame_header->quantization_params.base_q_idx + data;
3335 if (ignoreDeltaQ == 0 && frame_header->quantization_params.delta_q_present)
3336 qindex = qindex + frame_header->quantization_params.delta_q_res;
3337 return CLAMP (qindex, 0, 255);
3339 return frame_header->quantization_params.base_q_idx;
3344 gst_av1_set_frame_refs (GstAV1Parser * parser,
3345 GstAV1SequenceHeaderOBU * seq_header, GstAV1FrameHeaderOBU * frame_header)
3347 const GstAV1ReferenceFrame ref_frame_list[GST_AV1_REFS_PER_FRAME - 2] = {
3348 GST_AV1_REF_LAST2_FRAME,
3349 GST_AV1_REF_LAST3_FRAME,
3350 GST_AV1_REF_BWDREF_FRAME,
3351 GST_AV1_REF_ALTREF2_FRAME,
3352 GST_AV1_REF_ALTREF_FRAME
3354 gboolean used_frame[GST_AV1_NUM_REF_FRAMES];
3355 gint shifted_order_hints[GST_AV1_NUM_REF_FRAMES];
3356 gint cur_frame_hint = 1 << (seq_header->order_hint_bits - 1);
3357 gint last_order_hint, earliest_order_hint;
3361 g_assert (seq_header->enable_order_hint);
3362 g_assert (seq_header->order_hint_bits_minus_1 >= 0);
3364 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++)
3365 frame_header->ref_frame_idx[i] = -1;
3366 frame_header->ref_frame_idx[GST_AV1_REF_LAST_FRAME -
3367 GST_AV1_REF_LAST_FRAME] = frame_header->last_frame_idx;
3368 frame_header->ref_frame_idx[GST_AV1_REF_GOLDEN_FRAME -
3369 GST_AV1_REF_LAST_FRAME] = frame_header->gold_frame_idx;
3371 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++)
3373 used_frame[frame_header->last_frame_idx] = 1;
3374 used_frame[frame_header->gold_frame_idx] = 1;
3376 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++)
3377 shifted_order_hints[i] = cur_frame_hint +
3378 gst_av1_get_relative_dist (seq_header,
3379 parser->state.ref_info.entry[i].ref_order_hint,
3380 frame_header->order_hint);
3382 last_order_hint = shifted_order_hints[frame_header->last_frame_idx];
3384 /* === Backward Reference Frames === */
3385 /* The ALTREF_FRAME reference is set to be a backward
3386 reference to the frame with highest output order. */
3388 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) {
3389 hint = shifted_order_hints[i];
3390 if (!used_frame[i] && hint >= cur_frame_hint
3391 && (ref < 0 || hint >= last_order_hint)) {
3393 last_order_hint = hint;
3397 frame_header->ref_frame_idx[GST_AV1_REF_ALTREF_FRAME -
3398 GST_AV1_REF_LAST_FRAME] = ref;
3399 used_frame[ref] = 1;
3402 /* The BWDREF_FRAME reference is set to be a backward reference
3403 to the closest frame. */
3405 earliest_order_hint = last_order_hint;
3406 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) {
3407 hint = shifted_order_hints[i];
3408 if (!used_frame[i] && hint >= cur_frame_hint
3409 && (ref < 0 || hint < earliest_order_hint)) {
3411 earliest_order_hint = hint;
3415 frame_header->ref_frame_idx[GST_AV1_REF_BWDREF_FRAME -
3416 GST_AV1_REF_LAST_FRAME] = ref;
3417 used_frame[ref] = 1;
3420 /* The ALTREF2_FRAME reference is set to the next closest
3421 backward reference. */
3423 earliest_order_hint = last_order_hint;
3424 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) {
3425 hint = shifted_order_hints[i];
3426 if (!used_frame[i] && hint >= cur_frame_hint
3427 && (ref < 0 || hint < earliest_order_hint)) {
3429 earliest_order_hint = hint;
3433 frame_header->ref_frame_idx[GST_AV1_REF_ALTREF2_FRAME -
3434 GST_AV1_REF_LAST_FRAME] = ref;
3435 used_frame[ref] = 1;
3438 /* === Forward Reference Frames === */
3440 /* The remaining references are set to be forward references
3441 in anti-chronological order. */
3442 last_order_hint = 0;
3443 for (i = 0; i < GST_AV1_REFS_PER_FRAME - 2; i++) {
3444 GstAV1ReferenceFrame ref_frame = ref_frame_list[i];
3445 if (frame_header->ref_frame_idx[ref_frame - GST_AV1_REF_LAST_FRAME] < 0) {
3447 for (j = 0; j < GST_AV1_NUM_REF_FRAMES; j++) {
3448 hint = shifted_order_hints[j];
3449 if (!used_frame[j] && hint < cur_frame_hint &&
3450 (ref < 0 || hint >= last_order_hint)) {
3452 last_order_hint = hint;
3457 frame_header->ref_frame_idx[ref_frame - GST_AV1_REF_LAST_FRAME] = ref;
3458 used_frame[ref] = 1;
3463 /* Finally, any remaining references are set to the reference frame
3464 with smallest output order. */
3466 earliest_order_hint = cur_frame_hint * 2;
3467 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) {
3468 hint = shifted_order_hints[i];
3469 if (ref < 0 || hint < earliest_order_hint) {
3471 earliest_order_hint = hint;
3474 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++)
3475 if (frame_header->ref_frame_idx[i] < 0)
3476 frame_header->ref_frame_idx[i] = ref;
3480 static GstAV1ParserResult
3481 gst_av1_parse_uncompressed_frame_header (GstAV1Parser * parser, GstAV1OBU * obu,
3482 GstBitReader * br, GstAV1FrameHeaderOBU * frame_header)
3484 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
3485 GstAV1ReferenceFrameInfo *ref_info;
3486 GstAV1SequenceHeaderOBU *seq_header;
3487 gint i, op_num /* opNum */ ;
3488 gint segment_id /* segmentId */ , all_frames /* allFrames */ ;
3489 gint id_len /* idLen */ = 0;
3491 if (!parser->seq_header) {
3492 GST_WARNING ("Missing OBU Reference: seq_header");
3493 retval = GST_AV1_PARSER_MISSING_OBU_REFERENCE;
3497 seq_header = parser->seq_header;
3498 ref_info = &(parser->state.ref_info);
3499 if (seq_header->frame_id_numbers_present_flag)
3500 id_len = seq_header->additional_frame_id_length_minus_1 + 1 +
3501 seq_header->delta_frame_id_length_minus_2 + 2;
3502 all_frames = (1 << GST_AV1_NUM_REF_FRAMES) - 1;
3504 if (seq_header->reduced_still_picture_header) {
3505 frame_header->show_existing_frame = 0;
3506 frame_header->frame_type = GST_AV1_KEY_FRAME;
3507 frame_header->frame_is_intra = 1;
3508 frame_header->show_frame = 1;
3509 frame_header->showable_frame = 0;
3510 if (parser->state.sequence_changed) {
3511 /* This is the start of a new coded video sequence. */
3512 parser->state.sequence_changed = 0;
3513 parser->state.begin_first_frame = 1;
3516 frame_header->show_existing_frame = AV1_READ_BIT_CHECKED (br, &retval);
3517 if (retval != GST_AV1_PARSER_OK)
3520 if (frame_header->show_existing_frame) {
3521 if (parser->state.sequence_changed) {
3522 GST_INFO ("New sequence header starts with a show_existing_frame.");
3523 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3527 frame_header->frame_to_show_map_idx =
3528 AV1_READ_BITS_CHECKED (br, 3, &retval);
3529 if (retval != GST_AV1_PARSER_OK)
3532 if (!ref_info->entry[frame_header->frame_to_show_map_idx].ref_valid) {
3533 GST_INFO ("The frame_to_show %d is invalid.",
3534 frame_header->frame_to_show_map_idx);
3535 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3539 if (seq_header->decoder_model_info_present_flag
3540 && !seq_header->timing_info.equal_picture_interval)
3541 frame_header->frame_presentation_time =
3542 AV1_READ_BITS_CHECKED (br,
3544 decoder_model_info.frame_presentation_time_length_minus_1 + 1,
3546 if (retval != GST_AV1_PARSER_OK)
3549 frame_header->refresh_frame_flags = 0;
3550 if (seq_header->frame_id_numbers_present_flag) {
3551 g_assert (id_len > 0);
3552 frame_header->display_frame_id =
3553 AV1_READ_BITS_CHECKED (br, id_len, &retval);
3554 if (retval != GST_AV1_PARSER_OK)
3556 if (frame_header->display_frame_id !=
3557 ref_info->entry[frame_header->frame_to_show_map_idx].ref_frame_id) {
3558 GST_INFO ("Reference frame ID mismatch");
3559 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3564 frame_header->frame_type =
3565 ref_info->entry[frame_header->frame_to_show_map_idx].ref_frame_type;
3566 if (frame_header->frame_type == GST_AV1_KEY_FRAME) {
3567 frame_header->refresh_frame_flags = all_frames;
3570 /* just use the frame_to_show's grain_params
3571 * if (seq_header->film_grain_params_present)
3572 * load_grain_params () */
3577 frame_header->frame_type = AV1_READ_BITS_CHECKED (br, 2, &retval);
3578 if (retval != GST_AV1_PARSER_OK)
3581 if (parser->state.sequence_changed) {
3582 if (frame_header->frame_type == GST_AV1_KEY_FRAME) {
3583 /* This is the start of a new coded video sequence. */
3584 parser->state.sequence_changed = FALSE;
3585 parser->state.begin_first_frame = TRUE;
3587 GST_INFO ("Sequence header has changed without a keyframe.");
3588 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3593 frame_header->frame_is_intra =
3594 (frame_header->frame_type == GST_AV1_INTRA_ONLY_FRAME
3595 || frame_header->frame_type == GST_AV1_KEY_FRAME);
3597 frame_header->show_frame = AV1_READ_BIT_CHECKED (br, &retval);
3598 if (retval != GST_AV1_PARSER_OK)
3601 if (seq_header->still_picture &&
3602 (frame_header->frame_type != GST_AV1_KEY_FRAME
3603 || !frame_header->show_frame)) {
3604 GST_INFO ("Still pictures must be coded as shown keyframes");
3605 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3609 if (frame_header->show_frame
3610 && seq_header->decoder_model_info_present_flag
3611 && !seq_header->timing_info.equal_picture_interval) {
3612 frame_header->frame_presentation_time =
3613 AV1_READ_BITS_CHECKED (br,
3614 seq_header->decoder_model_info.
3615 frame_presentation_time_length_minus_1 + 1, &retval);
3616 if (retval != GST_AV1_PARSER_OK)
3620 if (frame_header->show_frame) {
3621 frame_header->showable_frame =
3622 (frame_header->frame_type != GST_AV1_KEY_FRAME);
3624 frame_header->showable_frame = AV1_READ_BIT_CHECKED (br, &retval);
3625 if (retval != GST_AV1_PARSER_OK)
3629 if (frame_header->frame_type == GST_AV1_SWITCH_FRAME
3630 || (frame_header->frame_type == GST_AV1_KEY_FRAME
3631 && frame_header->show_frame))
3632 frame_header->error_resilient_mode = 1;
3634 frame_header->error_resilient_mode = AV1_READ_BIT_CHECKED (br, &retval);
3635 if (retval != GST_AV1_PARSER_OK)
3640 if (frame_header->frame_type == GST_AV1_KEY_FRAME && frame_header->show_frame) {
3641 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) {
3642 ref_info->entry[i].ref_valid = 0;
3643 ref_info->entry[i].ref_order_hint = 0;
3645 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++) {
3646 frame_header->order_hints[GST_AV1_REF_LAST_FRAME + i] = 0;
3650 frame_header->disable_cdf_update = AV1_READ_BIT_CHECKED (br, &retval);
3651 if (retval != GST_AV1_PARSER_OK)
3654 if (seq_header->seq_force_screen_content_tools ==
3655 GST_AV1_SELECT_SCREEN_CONTENT_TOOLS) {
3656 frame_header->allow_screen_content_tools =
3657 AV1_READ_BIT_CHECKED (br, &retval);
3658 if (retval != GST_AV1_PARSER_OK)
3661 frame_header->allow_screen_content_tools =
3662 seq_header->seq_force_screen_content_tools;
3665 if (frame_header->allow_screen_content_tools) {
3666 if (seq_header->seq_force_integer_mv == GST_AV1_SELECT_INTEGER_MV) {
3667 frame_header->force_integer_mv = AV1_READ_BIT_CHECKED (br, &retval);
3668 if (retval != GST_AV1_PARSER_OK)
3671 frame_header->force_integer_mv = seq_header->seq_force_integer_mv;
3674 frame_header->force_integer_mv = 0;
3677 if (frame_header->frame_is_intra) {
3678 frame_header->force_integer_mv = 1;
3681 if (seq_header->frame_id_numbers_present_flag) {
3682 gboolean have_prev_frame_id =
3683 !parser->state.begin_first_frame &&
3684 (!(frame_header->frame_type == GST_AV1_KEY_FRAME
3685 && frame_header->show_frame));
3686 if (have_prev_frame_id)
3687 parser->state.prev_frame_id = parser->state.current_frame_id;
3689 g_assert (id_len > 0);
3690 frame_header->current_frame_id =
3691 AV1_READ_BITS_CHECKED (br, id_len, &retval);
3692 if (retval != GST_AV1_PARSER_OK)
3695 parser->state.current_frame_id = frame_header->current_frame_id;
3696 /* Check whether the id and id diff is valid */
3697 if (have_prev_frame_id) {
3698 gint32 diff_frame_id;
3699 if (parser->state.current_frame_id > parser->state.prev_frame_id) {
3701 parser->state.current_frame_id - parser->state.prev_frame_id;
3703 diff_frame_id = (1 << id_len) +
3704 parser->state.current_frame_id - parser->state.prev_frame_id;
3706 if (parser->state.current_frame_id == parser->state.prev_frame_id ||
3707 diff_frame_id >= (1 << (id_len - 1))) {
3708 GST_INFO ("Invalid value of current_frame_id");
3709 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3714 gst_av1_mark_ref_frames (parser, br, id_len);
3716 frame_header->current_frame_id = 0;
3717 parser->state.prev_frame_id = parser->state.current_frame_id;
3718 parser->state.current_frame_id = frame_header->current_frame_id;
3721 if (frame_header->frame_type == GST_AV1_SWITCH_FRAME) {
3722 frame_header->frame_size_override_flag = 1;
3723 } else if (seq_header->reduced_still_picture_header) {
3724 frame_header->frame_size_override_flag = 0;
3726 frame_header->frame_size_override_flag = AV1_READ_BIT_CHECKED (br, &retval);
3727 if (retval != GST_AV1_PARSER_OK)
3731 frame_header->order_hint =
3732 AV1_READ_BITS_CHECKED (br, seq_header->order_hint_bits_minus_1 + 1,
3734 if (retval != GST_AV1_PARSER_OK)
3737 if (frame_header->frame_is_intra || frame_header->error_resilient_mode) {
3738 frame_header->primary_ref_frame = GST_AV1_PRIMARY_REF_NONE;
3740 frame_header->primary_ref_frame = AV1_READ_BITS_CHECKED (br, 3, &retval);
3741 if (retval != GST_AV1_PARSER_OK)
3745 if (seq_header->decoder_model_info_present_flag) {
3746 frame_header->buffer_removal_time_present_flag =
3747 AV1_READ_BIT_CHECKED (br, &retval);
3748 if (retval != GST_AV1_PARSER_OK)
3751 if (frame_header->buffer_removal_time_present_flag) {
3752 for (op_num = 0; op_num <= seq_header->operating_points_cnt_minus_1;
3755 operating_points[op_num].decoder_model_present_for_this_op) {
3756 gint op_pt_idc = seq_header->operating_points[op_num].idc;
3757 gint in_temporal_layer =
3758 (op_pt_idc >> obu->header.obu_temporal_id) & 1;
3759 gint in_spatial_layer =
3760 (op_pt_idc >> (obu->header.obu_spatial_id + 8)) & 1;
3761 if (op_pt_idc == 0 || (in_temporal_layer && in_spatial_layer)) {
3762 frame_header->buffer_removal_time[op_num] =
3763 AV1_READ_BITS_CHECKED (br,
3764 seq_header->decoder_model_info.
3765 buffer_removal_time_length_minus_1 + 1, &retval);
3766 if (retval != GST_AV1_PARSER_OK)
3769 frame_header->buffer_removal_time[op_num] = 0;
3772 frame_header->buffer_removal_time[op_num] = 0;
3778 frame_header->allow_high_precision_mv = 0;
3779 frame_header->use_ref_frame_mvs = 0;
3780 frame_header->allow_intrabc = 0;
3781 if (frame_header->frame_type == GST_AV1_SWITCH_FRAME ||
3782 (frame_header->frame_type == GST_AV1_KEY_FRAME
3783 && frame_header->show_frame)) {
3784 frame_header->refresh_frame_flags = all_frames;
3786 frame_header->refresh_frame_flags = AV1_READ_UINT8_CHECKED (br, &retval);
3787 if (retval != GST_AV1_PARSER_OK)
3790 if (frame_header->frame_type == GST_AV1_INTRA_ONLY_FRAME) {
3791 if (frame_header->refresh_frame_flags == 0xFF) {
3792 GST_INFO ("Intra only frames cannot have refresh flags 0xFF");
3793 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3798 if (!frame_header->frame_is_intra
3799 || frame_header->refresh_frame_flags != all_frames) {
3800 if (frame_header->error_resilient_mode && seq_header->enable_order_hint) {
3801 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) {
3802 frame_header->ref_order_hint[i] = AV1_READ_BITS_CHECKED (br,
3803 seq_header->order_hint_bits_minus_1 + 1, &retval);
3804 if (retval != GST_AV1_PARSER_OK)
3807 if (frame_header->ref_order_hint[i] !=
3808 ref_info->entry[i].ref_order_hint)
3809 ref_info->entry[i].ref_valid = 0;
3814 if (frame_header->frame_is_intra) {
3815 retval = gst_av1_parse_frame_size (parser, br, frame_header);
3816 if (retval != GST_AV1_PARSER_OK)
3818 retval = gst_av1_parse_render_size (parser, br, frame_header);
3819 if (retval != GST_AV1_PARSER_OK)
3821 if (frame_header->allow_screen_content_tools
3822 && parser->state.upscaled_width == parser->state.frame_width) {
3823 frame_header->allow_intrabc = AV1_READ_BIT_CHECKED (br, &retval);
3824 if (retval != GST_AV1_PARSER_OK)
3828 frame_header->upscaled_width = parser->state.upscaled_width;
3829 frame_header->frame_width = parser->state.frame_width;
3830 frame_header->frame_height = parser->state.frame_height;
3831 frame_header->render_width = parser->state.render_width;
3832 frame_header->render_height = parser->state.render_height;
3834 if (!seq_header->enable_order_hint) {
3835 frame_header->frame_refs_short_signaling = 0;
3837 frame_header->frame_refs_short_signaling =
3838 AV1_READ_BIT_CHECKED (br, &retval);
3839 if (retval != GST_AV1_PARSER_OK)
3842 if (frame_header->frame_refs_short_signaling) {
3843 if (AV1_REMAINING_BITS (br) < 3 + 3) {
3844 retval = GST_AV1_PARSER_NO_MORE_DATA;
3847 frame_header->last_frame_idx = AV1_READ_BITS (br, 3);
3848 frame_header->gold_frame_idx = AV1_READ_BITS (br, 3);
3849 gst_av1_set_frame_refs (parser, seq_header, frame_header);
3853 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++) {
3854 if (!frame_header->frame_refs_short_signaling) {
3855 frame_header->ref_frame_idx[i] = AV1_READ_BITS_CHECKED (br, 3, &retval);
3856 if (retval != GST_AV1_PARSER_OK)
3860 if (seq_header->frame_id_numbers_present_flag) {
3861 gint32 delta_frame_id /* DeltaFrameId */ ;
3862 gint32 expected_frame_id;
3863 guint32 delta_frame_id_minus_1;
3865 g_assert (id_len > 0);
3867 delta_frame_id_minus_1 = AV1_READ_BITS_CHECKED (br,
3868 seq_header->delta_frame_id_length_minus_2 + 2, &retval);
3869 if (retval != GST_AV1_PARSER_OK)
3872 delta_frame_id = delta_frame_id_minus_1 + 1;
3873 expected_frame_id = (frame_header->current_frame_id + (1 << id_len) -
3874 delta_frame_id) % (1 << id_len);
3875 if (expected_frame_id !=
3876 parser->state.ref_info.entry[frame_header->
3877 ref_frame_idx[i]].ref_frame_id) {
3878 GST_INFO ("Reference buffer frame ID mismatch, expectedFrameId"
3879 " is %d wihle ref frame id is %d", expected_frame_id,
3880 parser->state.ref_info.entry[frame_header->
3881 ref_frame_idx[i]].ref_frame_id);
3882 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3888 if (frame_header->frame_size_override_flag
3889 && !frame_header->error_resilient_mode) {
3890 retval = gst_av1_parse_frame_size_with_refs (parser, br, frame_header);
3891 if (retval != GST_AV1_PARSER_OK)
3894 retval = gst_av1_parse_frame_size (parser, br, frame_header);
3895 if (retval != GST_AV1_PARSER_OK)
3897 retval = gst_av1_parse_render_size (parser, br, frame_header);
3898 if (retval != GST_AV1_PARSER_OK)
3901 frame_header->upscaled_width = parser->state.upscaled_width;
3902 frame_header->frame_width = parser->state.frame_width;
3903 frame_header->frame_height = parser->state.frame_height;
3904 frame_header->render_width = parser->state.render_width;
3905 frame_header->render_height = parser->state.render_height;
3907 if (frame_header->force_integer_mv) {
3908 frame_header->allow_high_precision_mv = 0;
3910 frame_header->allow_high_precision_mv =
3911 AV1_READ_BIT_CHECKED (br, &retval);
3912 if (retval != GST_AV1_PARSER_OK)
3916 /* read_interpolation_filter() expand */
3917 frame_header->is_filter_switchable = AV1_READ_BIT_CHECKED (br, &retval);
3918 if (retval != GST_AV1_PARSER_OK)
3921 if (frame_header->is_filter_switchable) {
3922 frame_header->interpolation_filter =
3923 GST_AV1_INTERPOLATION_FILTER_SWITCHABLE;
3925 frame_header->interpolation_filter =
3926 AV1_READ_BITS_CHECKED (br, 2, &retval);
3927 if (retval != GST_AV1_PARSER_OK)
3931 frame_header->is_motion_mode_switchable =
3932 AV1_READ_BIT_CHECKED (br, &retval);
3933 if (retval != GST_AV1_PARSER_OK)
3936 if (frame_header->error_resilient_mode || !seq_header->enable_ref_frame_mvs) {
3937 frame_header->use_ref_frame_mvs = 0;
3939 frame_header->use_ref_frame_mvs = AV1_READ_BIT_CHECKED (br, &retval);
3940 if (retval != GST_AV1_PARSER_OK)
3945 if (!frame_header->frame_is_intra) {
3946 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++) {
3947 gint refFrame = GST_AV1_REF_LAST_FRAME + i;
3949 ref_info->entry[frame_header->ref_frame_idx[i]].ref_order_hint;
3950 frame_header->order_hints[refFrame] = hint;
3951 if (!seq_header->enable_order_hint) {
3952 frame_header->ref_frame_sign_bias[refFrame] = 0;
3954 frame_header->ref_frame_sign_bias[refFrame] =
3955 (gst_av1_get_relative_dist (parser->seq_header, hint,
3956 frame_header->order_hint) > 0);
3961 if (seq_header->reduced_still_picture_header
3962 || frame_header->disable_cdf_update)
3963 frame_header->disable_frame_end_update_cdf = 1;
3965 frame_header->disable_frame_end_update_cdf =
3966 AV1_READ_BIT_CHECKED (br, &retval);
3967 if (retval != GST_AV1_PARSER_OK)
3971 if (frame_header->primary_ref_frame != GST_AV1_PRIMARY_REF_NONE &&
3972 !ref_info->entry[frame_header->ref_frame_idx[frame_header->
3973 primary_ref_frame]].ref_valid) {
3974 GST_INFO ("Primary ref point to an invalid frame");
3975 retval = GST_AV1_PARSER_BITSTREAM_ERROR;
3979 if (frame_header->primary_ref_frame == GST_AV1_PRIMARY_REF_NONE) {
3980 /* do something in setup_past_independence() of parser level */
3981 gint8 *loop_filter_ref_deltas =
3982 frame_header->loop_filter_params.loop_filter_ref_deltas;
3984 frame_header->loop_filter_params.loop_filter_delta_enabled = 1;
3985 loop_filter_ref_deltas[GST_AV1_REF_INTRA_FRAME] = 1;
3986 loop_filter_ref_deltas[GST_AV1_REF_LAST_FRAME] = 0;
3987 loop_filter_ref_deltas[GST_AV1_REF_LAST2_FRAME] = 0;
3988 loop_filter_ref_deltas[GST_AV1_REF_LAST3_FRAME] = 0;
3989 loop_filter_ref_deltas[GST_AV1_REF_BWDREF_FRAME] = 0;
3990 loop_filter_ref_deltas[GST_AV1_REF_GOLDEN_FRAME] = -1;
3991 loop_filter_ref_deltas[GST_AV1_REF_ALTREF_FRAME] = -1;
3992 loop_filter_ref_deltas[GST_AV1_REF_ALTREF2_FRAME] = -1;
3993 frame_header->loop_filter_params.loop_filter_mode_deltas[0] = 0;
3994 frame_header->loop_filter_params.loop_filter_mode_deltas[1] = 0;
3996 /* do something in load_previous() of parser level */
3997 /* load_loop_filter_params() */
3998 GstAV1LoopFilterParams *ref_lf_params =
3999 &parser->state.ref_info.entry[frame_header->
4000 ref_frame_idx[frame_header->primary_ref_frame]].ref_lf_params;
4001 gint8 *loop_filter_ref_deltas =
4002 frame_header->loop_filter_params.loop_filter_ref_deltas;
4004 /* Copy all from prime_ref */
4005 g_assert (parser->state.ref_info.
4006 entry[frame_header->ref_frame_idx[frame_header->primary_ref_frame]].
4008 loop_filter_ref_deltas[GST_AV1_REF_INTRA_FRAME] =
4009 ref_lf_params->loop_filter_ref_deltas[GST_AV1_REF_INTRA_FRAME];
4010 loop_filter_ref_deltas[GST_AV1_REF_LAST_FRAME] =
4011 ref_lf_params->loop_filter_ref_deltas[GST_AV1_REF_LAST_FRAME];
4012 loop_filter_ref_deltas[GST_AV1_REF_LAST2_FRAME] =
4013 ref_lf_params->loop_filter_ref_deltas[GST_AV1_REF_LAST2_FRAME];
4014 loop_filter_ref_deltas[GST_AV1_REF_LAST3_FRAME] =
4015 ref_lf_params->loop_filter_ref_deltas[GST_AV1_REF_LAST3_FRAME];
4016 loop_filter_ref_deltas[GST_AV1_REF_BWDREF_FRAME] =
4017 ref_lf_params->loop_filter_ref_deltas[GST_AV1_REF_BWDREF_FRAME];
4018 loop_filter_ref_deltas[GST_AV1_REF_GOLDEN_FRAME] =
4019 ref_lf_params->loop_filter_ref_deltas[GST_AV1_REF_GOLDEN_FRAME];
4020 loop_filter_ref_deltas[GST_AV1_REF_ALTREF2_FRAME] =
4021 ref_lf_params->loop_filter_ref_deltas[GST_AV1_REF_ALTREF2_FRAME];
4022 loop_filter_ref_deltas[GST_AV1_REF_ALTREF_FRAME] =
4023 ref_lf_params->loop_filter_ref_deltas[GST_AV1_REF_ALTREF_FRAME];
4024 for (i = 0; i < 2; i++)
4025 frame_header->loop_filter_params.loop_filter_mode_deltas[i] =
4026 ref_lf_params->loop_filter_mode_deltas[i];
4030 if ( primary_ref_frame == PRIMARY_REF_NONE ) {
4031 init_non_coeff_cdfs( )
4033 load_cdfs( ref_frame_idx[primary_ref_frame] )
4037 if ( use_ref_frame_mvs == 1 )
4038 motion_field_estimation( )
4041 retval = gst_av1_parse_tile_info (parser, br, frame_header);
4042 if (retval != GST_AV1_PARSER_OK)
4045 retval = gst_av1_parse_quantization_params (parser, br, frame_header);
4046 if (retval != GST_AV1_PARSER_OK)
4049 retval = gst_av1_parse_segmentation_params (parser, br, frame_header);
4050 if (retval != GST_AV1_PARSER_OK)
4053 retval = gst_av1_parse_delta_q_params (parser, br,
4054 &(frame_header->quantization_params));
4055 if (retval != GST_AV1_PARSER_OK)
4058 retval = gst_av1_parse_delta_lf_params (parser, br, frame_header);
4059 if (retval != GST_AV1_PARSER_OK)
4063 if ( primary_ref_frame == PRIMARY_REF_NONE ) {
4066 load_previous_segment_ids( )
4070 frame_header->coded_lossless = 1;
4071 for (segment_id = 0; segment_id < GST_AV1_MAX_SEGMENTS; segment_id++) {
4072 gint qindex = gst_av1_get_qindex (parser, frame_header, 1, segment_id);
4073 frame_header->lossless_array[segment_id] = (qindex == 0)
4074 && (frame_header->quantization_params.delta_q_y_dc == 0)
4075 && (frame_header->quantization_params.delta_q_u_ac == 0)
4076 && (frame_header->quantization_params.delta_q_u_dc == 0)
4077 && (frame_header->quantization_params.delta_q_v_ac == 0)
4078 && (frame_header->quantization_params.delta_q_v_dc == 0);
4079 if (!frame_header->lossless_array[segment_id])
4080 frame_header->coded_lossless = 0;
4081 if (frame_header->quantization_params.using_qmatrix) {
4082 if (frame_header->lossless_array[segment_id]) {
4083 frame_header->seg_qm_Level[0][segment_id] = 15;
4084 frame_header->seg_qm_Level[1][segment_id] = 15;
4085 frame_header->seg_qm_Level[2][segment_id] = 15;
4087 frame_header->seg_qm_Level[0][segment_id] =
4088 frame_header->quantization_params.qm_y;
4089 frame_header->seg_qm_Level[1][segment_id] =
4090 frame_header->quantization_params.qm_u;
4091 frame_header->seg_qm_Level[2][segment_id] =
4092 frame_header->quantization_params.qm_v;
4096 frame_header->all_lossless = frame_header->coded_lossless
4097 && (parser->state.frame_width == parser->state.upscaled_width);
4099 retval = gst_av1_parse_loop_filter_params (parser, br, frame_header);
4100 if (retval != GST_AV1_PARSER_OK)
4103 retval = gst_av1_parse_cdef_params (parser, br, frame_header);
4104 if (retval != GST_AV1_PARSER_OK)
4107 retval = gst_av1_parse_loop_restoration_params (parser, br, frame_header);
4108 if (retval != GST_AV1_PARSER_OK)
4111 retval = gst_av1_parse_tx_mode (parser, br, frame_header);
4112 if (retval != GST_AV1_PARSER_OK)
4115 /* 5.9.23 inlined frame_reference_mode () */
4116 if (frame_header->frame_is_intra) {
4117 frame_header->reference_select = 0;
4119 frame_header->reference_select = AV1_READ_BIT_CHECKED (br, &retval);
4120 if (retval != GST_AV1_PARSER_OK)
4124 retval = gst_av1_parse_skip_mode_params (parser, br, frame_header);
4125 if (retval != GST_AV1_PARSER_OK)
4128 if (frame_header->frame_is_intra ||
4129 frame_header->error_resilient_mode || !seq_header->enable_warped_motion)
4130 frame_header->allow_warped_motion = 0;
4132 frame_header->allow_warped_motion = AV1_READ_BIT_CHECKED (br, &retval);
4133 if (retval != GST_AV1_PARSER_OK)
4137 frame_header->reduced_tx_set = AV1_READ_BIT_CHECKED (br, &retval);
4138 if (retval != GST_AV1_PARSER_OK)
4141 retval = gst_av1_parse_global_motion_params (parser, br, frame_header);
4142 if (retval != GST_AV1_PARSER_OK)
4145 retval = gst_av1_parse_film_grain_params (parser, br, frame_header);
4146 if (retval != GST_AV1_PARSER_OK)
4150 return GST_AV1_PARSER_OK;
4153 GST_WARNING ("parse uncompressed frame header error %d", retval);
4159 * gst_av1_parser_reference_frame_loading:
4160 * @parser: the #GstAV1Parser
4161 * @frame_header: a #GstAV1FrameHeaderOBU to load
4163 * Load the context of @frame_header to parser's state. This function is
4164 * used when we want to show already parsed frames before.
4166 * Returns: The #GstAV1ParserResult.
4171 gst_av1_parser_reference_frame_loading (GstAV1Parser * parser,
4172 GstAV1FrameHeaderOBU * frame_header)
4174 GstAV1ReferenceFrameInfo *ref_info;
4175 GstAV1TileInfo *ref_tile_info;
4177 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4178 g_return_val_if_fail (frame_header != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4180 if (!parser->seq_header) {
4181 GST_WARNING ("Missing OBU Reference: seq_header");
4182 return GST_AV1_PARSER_MISSING_OBU_REFERENCE;
4185 ref_info = &(parser->state.ref_info);
4187 if (frame_header->frame_to_show_map_idx > GST_AV1_NUM_REF_FRAMES - 1)
4188 return GST_AV1_PARSER_BITSTREAM_ERROR;
4190 g_assert (ref_info->entry[frame_header->frame_to_show_map_idx].ref_valid);
4192 parser->state.current_frame_id =
4193 ref_info->entry[frame_header->frame_to_show_map_idx].ref_frame_id;
4194 parser->state.upscaled_width =
4195 ref_info->entry[frame_header->frame_to_show_map_idx].ref_upscaled_width;
4196 parser->state.frame_width =
4197 ref_info->entry[frame_header->frame_to_show_map_idx].ref_frame_width;
4198 parser->state.frame_height =
4199 ref_info->entry[frame_header->frame_to_show_map_idx].ref_frame_height;
4200 parser->state.render_width =
4201 ref_info->entry[frame_header->frame_to_show_map_idx].ref_render_width;
4202 parser->state.render_height =
4203 ref_info->entry[frame_header->frame_to_show_map_idx].ref_render_height;
4204 parser->state.mi_cols =
4205 ref_info->entry[frame_header->frame_to_show_map_idx].ref_mi_cols;
4206 parser->state.mi_rows =
4207 ref_info->entry[frame_header->frame_to_show_map_idx].ref_mi_rows;
4210 &ref_info->entry[frame_header->frame_to_show_map_idx].ref_tile_info;
4212 memcpy (parser->state.mi_col_starts, ref_tile_info->mi_col_starts,
4213 sizeof (guint32) * (GST_AV1_MAX_TILE_COLS + 1));
4214 memcpy (parser->state.mi_row_starts, ref_tile_info->mi_row_starts,
4215 sizeof (guint32) * (GST_AV1_MAX_TILE_ROWS + 1));
4216 parser->state.tile_cols_log2 = ref_tile_info->tile_cols_log2;
4217 parser->state.tile_cols = ref_tile_info->tile_cols;
4218 parser->state.tile_rows_log2 = ref_tile_info->tile_rows_log2;
4219 parser->state.tile_rows = ref_tile_info->tile_rows;
4220 parser->state.tile_size_bytes = ref_tile_info->tile_size_bytes;
4222 return GST_AV1_PARSER_OK;
4226 * gst_av1_parser_reference_frame_update:
4227 * @parser: the #GstAV1Parser
4228 * @frame_header: a #GstAV1FrameHeaderOBU to load
4230 * Update the context of @frame_header to parser's state. This function is
4231 * used when we finish one frame's decoding/showing, and need to update info
4232 * such as reference, global parameters.
4234 * Returns: The #GstAV1ParserResult.
4239 gst_av1_parser_reference_frame_update (GstAV1Parser * parser,
4240 GstAV1FrameHeaderOBU * frame_header)
4243 GstAV1SequenceHeaderOBU *seq_header;
4244 GstAV1ReferenceFrameInfo *ref_info;
4246 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4247 g_return_val_if_fail (frame_header != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4249 if (!parser->seq_header) {
4250 GST_WARNING ("Missing OBU Reference: seq_header");
4251 return GST_AV1_PARSER_MISSING_OBU_REFERENCE;
4254 seq_header = parser->seq_header;
4255 ref_info = &(parser->state.ref_info);
4256 if (frame_header->frame_type == GST_AV1_INTRA_ONLY_FRAME
4257 && frame_header->refresh_frame_flags == 0xff)
4258 return GST_AV1_PARSER_BITSTREAM_ERROR;
4260 for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) {
4261 if ((frame_header->refresh_frame_flags >> i) & 1) {
4262 ref_info->entry[i].ref_valid = 1;
4263 ref_info->entry[i].ref_frame_id = frame_header->current_frame_id;
4264 ref_info->entry[i].ref_frame_type = frame_header->frame_type;
4265 ref_info->entry[i].ref_upscaled_width = frame_header->upscaled_width;
4266 ref_info->entry[i].ref_frame_width = frame_header->frame_width;
4267 ref_info->entry[i].ref_frame_height = frame_header->frame_height;
4268 ref_info->entry[i].ref_render_width = frame_header->render_width;
4269 ref_info->entry[i].ref_render_height = frame_header->render_height;
4270 ref_info->entry[i].ref_order_hint = frame_header->order_hint;
4271 ref_info->entry[i].ref_mi_cols = parser->state.mi_cols;
4272 ref_info->entry[i].ref_mi_rows = parser->state.mi_rows;
4273 ref_info->entry[i].ref_subsampling_x =
4274 seq_header->color_config.subsampling_x;
4275 ref_info->entry[i].ref_subsampling_y =
4276 seq_header->color_config.subsampling_y;
4277 ref_info->entry[i].ref_bit_depth = seq_header->bit_depth;
4278 ref_info->entry[i].ref_segmentation_params =
4279 frame_header->segmentation_params;
4280 ref_info->entry[i].ref_global_motion_params =
4281 frame_header->global_motion_params;
4282 ref_info->entry[i].ref_lf_params = frame_header->loop_filter_params;
4283 ref_info->entry[i].ref_tile_info = frame_header->tile_info;
4284 if (seq_header->film_grain_params_present)
4285 ref_info->entry[i].ref_film_grain_params =
4286 frame_header->film_grain_params;
4290 return GST_AV1_PARSER_OK;
4295 * gst_av1_parser_parse_tile_list_obu:
4296 * @parser: the #GstAV1Parser
4297 * @obu: a #GstAV1OBU to be parsed
4298 * @tile_list: a #GstAV1TileListOBU to store the parsed result.
4300 * Parse one tile list @obu based on the @parser context, store the result
4301 * in the @tile_list. It is for large scale tile coding mode.
4303 * Returns: The #GstAV1ParserResult.
4308 gst_av1_parser_parse_tile_list_obu (GstAV1Parser * parser,
4309 GstAV1OBU * obu, GstAV1TileListOBU * tile_list)
4311 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
4313 GstBitReader bitreader;
4316 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4317 g_return_val_if_fail (obu != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4318 g_return_val_if_fail (obu->obu_type == GST_AV1_OBU_TILE_LIST,
4319 GST_AV1_PARSER_INVALID_OPERATION);
4320 g_return_val_if_fail (tile_list != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4323 memset (tile_list, 0, sizeof (*tile_list));
4324 gst_bit_reader_init (br, obu->data, obu->obu_size);
4325 if (AV1_REMAINING_BITS (br) < 8 + 8 + 16) {
4326 retval = GST_AV1_PARSER_NO_MORE_DATA;
4330 tile_list->output_frame_width_in_tiles_minus_1 = AV1_READ_BITS (br, 8);
4331 tile_list->output_frame_height_in_tiles_minus_1 = AV1_READ_BITS (br, 8);
4332 tile_list->tile_count_minus_1 = AV1_READ_BITS (br, 16);
4333 for (tile = 0; tile <= tile_list->tile_count_minus_1; tile++) {
4334 if (AV1_REMAINING_BITS (br) < 8 + 8 + 8 + 16) {
4335 retval = GST_AV1_PARSER_NO_MORE_DATA;
4338 tile_list->entry[tile].anchor_frame_idx = AV1_READ_BITS (br, 8);
4339 tile_list->entry[tile].anchor_tile_row = AV1_READ_BITS (br, 8);
4340 tile_list->entry[tile].anchor_tile_col = AV1_READ_BITS (br, 8);
4341 tile_list->entry[tile].tile_data_size_minus_1 = AV1_READ_BITS (br, 16);
4343 g_assert (gst_bit_reader_get_pos (br) % 8 == 0);
4345 tile_list->entry[tile].coded_tile_data =
4346 obu->data + gst_bit_reader_get_pos (br) / 8;
4347 /* skip the coded_tile_data */
4348 if (!gst_bit_reader_skip (br,
4349 tile_list->entry[tile].tile_data_size_minus_1 + 1)) {
4350 retval = GST_AV1_PARSER_NO_MORE_DATA;
4355 retval = av1_skip_trailing_bits (parser, br, obu);
4356 if (retval != GST_AV1_PARSER_OK)
4359 return GST_AV1_PARSER_OK;
4362 GST_WARNING ("parse tile list error %d", retval);
4367 static GstAV1ParserResult
4368 gst_av1_parse_tile_group (GstAV1Parser * parser, GstBitReader * br,
4369 GstAV1TileGroupOBU * tile_group)
4371 GstAV1ParserResult retval = GST_AV1_PARSER_OK;
4372 gint tile_num /* TileNum */ , end_bit_pos /* endBitPos */ ;
4373 gint header_bytes /* headerBytes */ , start_bitpos /* startBitPos */ ;
4374 guint32 sz = AV1_REMAINING_BYTES (br);
4375 guint32 tile_row /* tileRow */ ;
4376 guint32 tile_col /* tileCol */ ;
4377 guint32 tile_size /* tileSize */ ;
4379 memset (tile_group, 0, sizeof (*tile_group));
4380 tile_group->num_tiles = parser->state.tile_cols * parser->state.tile_rows;
4381 start_bitpos = gst_bit_reader_get_pos (br);
4382 tile_group->tile_start_and_end_present_flag = 0;
4384 if (tile_group->num_tiles > 1) {
4385 tile_group->tile_start_and_end_present_flag =
4386 AV1_READ_BIT_CHECKED (br, &retval);
4387 if (retval != GST_AV1_PARSER_OK)
4390 if (tile_group->num_tiles == 1
4391 || !tile_group->tile_start_and_end_present_flag) {
4392 tile_group->tg_start = 0;
4393 tile_group->tg_end = tile_group->num_tiles - 1;
4395 gint tileBits = parser->state.tile_cols_log2 + parser->state.tile_rows_log2;
4396 tile_group->tg_start = AV1_READ_BITS_CHECKED (br, tileBits, &retval);
4397 if (retval != GST_AV1_PARSER_OK)
4400 tile_group->tg_end = AV1_READ_BITS_CHECKED (br, tileBits, &retval);
4401 if (retval != GST_AV1_PARSER_OK)
4405 if (tile_group->tg_end < tile_group->tg_start) {
4406 retval = GST_AV1_PARSER_NO_MORE_DATA;
4410 if (!gst_bit_reader_skip_to_byte (br)) {
4411 retval = GST_AV1_PARSER_NO_MORE_DATA;
4415 end_bit_pos = gst_bit_reader_get_pos (br);
4416 header_bytes = (end_bit_pos - start_bitpos) / 8;
4419 for (tile_num = tile_group->tg_start; tile_num <= tile_group->tg_end;
4421 tile_row = tile_num / parser->state.tile_cols;
4422 tile_col = tile_num % parser->state.tile_cols;
4424 if (tile_num == tile_group->tg_end) {
4427 gint tile_size_minus_1 = av1_bitstreamfn_le (br,
4428 parser->state.tile_size_bytes, &retval);
4429 if (retval != GST_AV1_PARSER_OK)
4431 tile_size = tile_size_minus_1 + 1;
4432 sz -= tile_size - parser->state.tile_size_bytes;
4435 tile_group->entry[tile_num].tile_size = tile_size;
4436 tile_group->entry[tile_num].tile_offset = gst_bit_reader_get_pos (br) / 8;
4437 tile_group->entry[tile_num].tile_row = tile_row;
4438 tile_group->entry[tile_num].tile_col = tile_col;
4440 tile_group->entry[tile_num].mi_row_start =
4441 parser->state.mi_row_starts[tile_row];
4442 tile_group->entry[tile_num].mi_row_end =
4443 parser->state.mi_row_starts[tile_row + 1];
4444 tile_group->entry[tile_num].mi_col_start =
4445 parser->state.mi_col_starts[tile_col];
4446 tile_group->entry[tile_num].mi_col_end =
4447 parser->state.mi_col_starts[tile_col + 1];
4448 /* Not implement here, the real decoder process
4449 init_symbol( tileSize )
4454 /* Skip the real data to the next one */
4455 if (tile_num < tile_group->tg_end &&
4456 !gst_bit_reader_skip (br, tile_size * 8)) {
4457 retval = GST_AV1_PARSER_NO_MORE_DATA;
4462 if (tile_group->tg_end == tile_group->num_tiles - 1) {
4463 /* Not implement here, the real decoder process
4464 if ( !disable_frame_end_update_cdf ) {
4465 frame_end_update_cdf( )
4467 decode_frame_wrapup( )
4469 parser->state.seen_frame_header = 0;
4472 return GST_AV1_PARSER_OK;
4475 GST_WARNING ("parse tile group error %d", retval);
4480 * gst_av1_parser_parse_tile_group_obu:
4481 * @parser: the #GstAV1Parser
4482 * @obu: a #GstAV1OBU to be parsed
4483 * @tile_group: a #GstAV1TileGroupOBU to store the parsed result.
4485 * Parse one tile group @obu based on the @parser context, store the result
4486 * in the @tile_group.
4488 * Returns: The #GstAV1ParserResult.
4493 gst_av1_parser_parse_tile_group_obu (GstAV1Parser * parser, GstAV1OBU * obu,
4494 GstAV1TileGroupOBU * tile_group)
4496 GstAV1ParserResult ret;
4497 GstBitReader bit_reader;
4499 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4500 g_return_val_if_fail (obu != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4501 g_return_val_if_fail (obu->obu_type == GST_AV1_OBU_TILE_GROUP,
4502 GST_AV1_PARSER_INVALID_OPERATION);
4503 g_return_val_if_fail (tile_group != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4505 if (!parser->state.seen_frame_header) {
4506 GST_WARNING ("Missing OBU Reference: frame_header");
4507 return GST_AV1_PARSER_MISSING_OBU_REFERENCE;
4510 gst_bit_reader_init (&bit_reader, obu->data, obu->obu_size);
4511 ret = gst_av1_parse_tile_group (parser, &bit_reader, tile_group);
4515 static GstAV1ParserResult
4516 gst_av1_parse_frame_header (GstAV1Parser * parser, GstAV1OBU * obu,
4517 GstBitReader * bit_reader, GstAV1FrameHeaderOBU * frame_header)
4519 GstAV1ParserResult ret;
4522 memset (frame_header, 0, sizeof (*frame_header));
4523 frame_header->frame_is_intra = 1;
4524 frame_header->last_frame_idx = -1;
4525 frame_header->gold_frame_idx = -1;
4526 for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++)
4527 frame_header->ref_frame_idx[i] = -1;
4529 ret = gst_av1_parse_uncompressed_frame_header (parser, obu, bit_reader,
4531 if (ret != GST_AV1_PARSER_OK)
4534 if (frame_header->show_existing_frame) {
4535 parser->state.seen_frame_header = 0;
4537 parser->state.seen_frame_header = 1;
4540 return GST_AV1_PARSER_OK;
4544 * gst_av1_parser_parse_frame_header_obu:
4545 * @parser: the #GstAV1Parser
4546 * @obu: a #GstAV1OBU to be parsed
4547 * @frame_header: a #GstAV1FrameHeaderOBU to store the parsed result.
4549 * Parse one frame header @obu based on the @parser context, store the result
4552 * Returns: The #GstAV1ParserResult.
4557 gst_av1_parser_parse_frame_header_obu (GstAV1Parser * parser,
4558 GstAV1OBU * obu, GstAV1FrameHeaderOBU * frame_header)
4560 GstAV1ParserResult ret;
4561 GstBitReader bit_reader;
4563 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4564 g_return_val_if_fail (obu != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4565 g_return_val_if_fail (obu->obu_type == GST_AV1_OBU_FRAME_HEADER ||
4566 obu->obu_type == GST_AV1_OBU_REDUNDANT_FRAME_HEADER,
4567 GST_AV1_PARSER_INVALID_OPERATION);
4568 g_return_val_if_fail (frame_header != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4570 if (obu->obu_type == GST_AV1_OBU_REDUNDANT_FRAME_HEADER
4571 && !parser->state.seen_frame_header) {
4572 GST_WARNING ("no seen of frame header while get redundant frame header");
4573 return GST_AV1_PARSER_BITSTREAM_ERROR;
4576 if (obu->obu_type == GST_AV1_OBU_FRAME_HEADER
4577 && parser->state.seen_frame_header) {
4578 GST_WARNING ("already seen a frame header");
4579 return GST_AV1_PARSER_BITSTREAM_ERROR;
4582 gst_bit_reader_init (&bit_reader, obu->data, obu->obu_size);
4583 ret = gst_av1_parse_frame_header (parser, obu, &bit_reader, frame_header);
4584 if (ret != GST_AV1_PARSER_OK)
4587 ret = av1_skip_trailing_bits (parser, &bit_reader, obu);
4592 * gst_av1_parser_parse_frame_obu:
4593 * @parser: the #GstAV1Parser
4594 * @obu: a #GstAV1OBU to be parsed
4595 * @frame: a #GstAV1FrameOBU to store the parsed result.
4597 * Parse one frame @obu based on the @parser context, store the result
4600 * Returns: The #GstAV1ParserResult.
4605 gst_av1_parser_parse_frame_obu (GstAV1Parser * parser, GstAV1OBU * obu,
4606 GstAV1FrameOBU * frame)
4608 GstAV1ParserResult retval;
4609 GstBitReader bit_reader;
4611 g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4612 g_return_val_if_fail (obu != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4613 g_return_val_if_fail (obu->obu_type == GST_AV1_OBU_FRAME,
4614 GST_AV1_PARSER_INVALID_OPERATION);
4615 g_return_val_if_fail (frame != NULL, GST_AV1_PARSER_INVALID_OPERATION);
4617 if (parser->state.seen_frame_header) {
4618 GST_WARNING ("already seen a frame header");
4619 return GST_AV1_PARSER_BITSTREAM_ERROR;
4622 gst_bit_reader_init (&bit_reader, obu->data, obu->obu_size);
4623 retval = gst_av1_parse_frame_header (parser, obu, &bit_reader,
4624 &(frame->frame_header));
4625 if (retval != GST_AV1_PARSER_OK)
4628 if (!gst_bit_reader_skip_to_byte (&bit_reader))
4629 return GST_AV1_PARSER_NO_MORE_DATA;
4631 retval = gst_av1_parse_tile_group (parser, &bit_reader, &(frame->tile_group));
4636 * gst_av1_parser_new:
4638 * Allocates a new #GstAV1Parser,
4640 * Returns: (transfer full): a newly-allocated #GstAV1Parser
4645 gst_av1_parser_new (void)
4647 return g_slice_new0 (GstAV1Parser);
4651 * gst_av1_parser_free:
4652 * @parser: the #GstAV1Parser to free
4654 * If parser is not %NULL, frees its allocated memory.
4656 * It cannot be used afterwards.
4661 gst_av1_parser_free (GstAV1Parser * parser)
4663 g_return_if_fail (parser != NULL);
4665 if (parser->seq_header)
4666 g_slice_free (GstAV1SequenceHeaderOBU, parser->seq_header);
4667 g_slice_free (GstAV1Parser, parser);