2 * Copyright (C) 2021 Seungha Yang <seungha@centricular.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
21 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions are
27 * * Redistributions of source code must retain the above copyright
28 * notice, this list of conditions and the following disclaimer.
30 * * Redistributions in binary form must reproduce the above copyright
31 * notice, this list of conditions and the following disclaimer in
32 * the documentation and/or other materials provided with the
35 * * Neither the name of Google, nor the WebM Project, nor the names
36 * of its contributors may be used to endorse or promote products
37 * derived from this software without specific prior written
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
54 * SECTION:gstvp9statefulparser
55 * @title: GstVp9StatefulParser
56 * @short_description: Convenience library for parsing vp9 video bitstream.
58 * This object is used to parse VP9 bitstream header.
68 #include <gst/base/gstbitreader.h>
69 #include "gstvp9statefulparser.h"
72 #ifndef GST_DISABLE_GST_DEBUG
73 #define GST_CAT_DEFAULT ensure_debug_category()
74 static GstDebugCategory *
75 ensure_debug_category (void)
77 static gsize cat_gonce = 0;
79 if (g_once_init_enter (&cat_gonce)) {
82 cat_done = (gsize) _gst_debug_category_new ("codecparsers_vp9stateful", 0,
83 "VP9 parser library");
85 g_once_init_leave (&cat_gonce, cat_done);
88 return (GstDebugCategory *) cat_gonce;
91 #define ensure_debug_category()
92 #endif /* GST_DISABLE_GST_DEBUG */
94 #define VP9_READ_UINT8(val,nbits) G_STMT_START { \
95 if (!gst_bit_reader_get_bits_uint8 (br, &val, nbits)) { \
96 GST_ERROR ("failed to read uint8 for '" G_STRINGIFY (val) "', nbits: %d", nbits); \
97 return GST_VP9_PARSER_BROKEN_DATA; \
101 #define VP9_READ_UINT16(val,nbits) G_STMT_START { \
102 if (!gst_bit_reader_get_bits_uint16 (br, &val, nbits)) { \
103 GST_ERROR ("failed to read uint16 for '" G_STRINGIFY (val) "', nbits: %d", nbits); \
104 return GST_VP9_PARSER_BROKEN_DATA; \
108 #define VP9_READ_UINT32(val,nbits) G_STMT_START { \
109 if (!gst_bit_reader_get_bits_uint32 (br, &val, nbits)) { \
110 GST_ERROR ("failed to read uint32 for '" G_STRINGIFY (val) "', nbits: %d", nbits); \
111 return GST_VP9_PARSER_BROKEN_DATA; \
115 #define VP9_READ_BIT(val) VP9_READ_UINT8(val, 1)
117 #define VP9_READ_SIGNED_8(val,nbits) G_STMT_START { \
120 VP9_READ_UINT8(_value, nbits); \
121 VP9_READ_BIT(_negative); \
123 val = (gint8) _value * -1; \
129 #define VP9_READ_SIGNED_16(val,nbits) G_STMT_START { \
132 VP9_READ_UINT16(_value, nbits); \
133 VP9_READ_BIT(_negative); \
135 val = (gint16) _value * -1; \
141 #define CHECK_ALLOWED_WITH_DEBUG(dbg, val, min, max) { \
142 if (val < min || val > max) { \
143 GST_WARNING ("value for '" dbg "' not in allowed range. value: %d, range %d-%d", \
145 return GST_VP9_PARSER_ERROR; \
149 #define CHECK_ALLOWED(val, min, max) \
150 CHECK_ALLOWED_WITH_DEBUG (G_STRINGIFY (val), val, min, max)
152 typedef struct _Vp9BoolDecoder
158 GstBitReader *bit_reader;
159 gboolean out_of_bits;
162 /* how much to shift to get range > 128 */
163 const static guint8 bool_shift_table[256] = {
164 0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3,
165 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
166 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,
167 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
168 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
169 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
171 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
172 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
173 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
174 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
177 static const guint8 inv_map_table[255] = {
178 7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176,
179 189, 202, 215, 228, 241, 254, 1, 2, 3, 4, 5, 6, 8, 9,
180 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24,
181 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39,
182 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54,
183 55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
184 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
185 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 100,
186 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115,
187 116, 117, 118, 119, 120, 121, 122, 123, 125, 126, 127, 128, 129, 130,
188 131, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145,
189 146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
190 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
191 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191,
192 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, 206,
193 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221,
194 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236,
195 237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
200 fill_bool (Vp9BoolDecoder * bd)
202 guint max_bits_to_read;
206 if (G_UNLIKELY (bd->bits_left < bd->count_to_fill)) {
208 ("Invalid VP9 bitstream: the boolean decoder ran out of bits to read");
209 bd->out_of_bits = TRUE;
214 8 * (sizeof (bd->value) - sizeof (guint8)) + bd->count_to_fill;
215 bits_to_read = MIN (max_bits_to_read, bd->bits_left);
218 gst_bit_reader_get_bits_uint64_unchecked (bd->bit_reader, bits_to_read);
220 bd->value |= data << (max_bits_to_read - bits_to_read);
221 bd->count_to_fill -= bits_to_read;
222 bd->bits_left -= bits_to_read;
226 read_bool (Vp9BoolDecoder * bd, guint8 probability)
233 if (bd->count_to_fill > 0)
236 split = 1 + (((bd->range - 1) * probability) >> 8);
237 big_split = split << 8 * (sizeof (bd->value) - sizeof (guint8));
239 if (bd->value < big_split) {
244 bd->value -= big_split;
248 count = bool_shift_table[bd->range];
251 bd->count_to_fill += count;
257 read_literal (Vp9BoolDecoder * bd, guint n)
262 for (i = 0; G_UNLIKELY (!bd->out_of_bits) && i < n; i++) {
263 ret = 2 * ret + read_bool (bd, 128);
269 static GstVp9ParserResult
270 init_bool (Vp9BoolDecoder * bd, GstBitReader * br, guint size_in_bytes)
274 if (size_in_bytes < 1)
275 GST_ERROR ("VP9 Boolean Decoder has no bits to read");
277 if ((gst_bit_reader_get_pos (br) % 8) != 0)
278 GST_ERROR ("VP9 Boolean Decoder was passed an unaligned buffer");
282 bd->bits_left = 8 * size_in_bytes;
284 bd->count_to_fill = 8;
285 bd->out_of_bits = FALSE;
287 marker_bit = read_literal (bd, 1);
288 if (marker_bit != 0) {
289 GST_ERROR ("Marker bit should be zero was %d", marker_bit);
290 return GST_VP9_PARSER_BROKEN_DATA;
293 return GST_VP9_PARSER_OK;
296 static GstVp9ParserResult
297 exit_bool (Vp9BoolDecoder * bd)
300 guint8 bits = bd->bits_left;
305 padding = gst_bit_reader_get_bits_uint32_unchecked (bd->bit_reader, n);
306 if (padding != 0 || (n < 8 && (padding & 0xe0) == 0xc0)) {
308 ("Invalid padding at end of frame. Total padding bits is %d and the wrong byte is: %x",
309 bd->bits_left, padding);
310 return GST_VP9_PARSER_BROKEN_DATA;
315 return GST_VP9_PARSER_OK;
319 decode_term_subexp (Vp9BoolDecoder * bd)
323 /* only coded if update_prob is set */
324 gboolean prob_is_coded_in_bitstream;
327 prob_is_coded_in_bitstream = read_bool (bd, 252);
328 if (!prob_is_coded_in_bitstream)
331 bit = read_literal (bd, 1);
333 delta = read_literal (bd, 4);
337 bit = read_literal (bd, 1);
339 delta = read_literal (bd, 4) + 16;
343 bit = read_literal (bd, 1);
345 delta = read_literal (bd, 5) + 32;
349 v = read_literal (bd, 7);
355 bit = read_literal (bd, 1);
356 delta = (v << 1) - 1 + bit;
358 return inv_map_table[delta];
362 read_mv_prob (Vp9BoolDecoder * bd)
364 gboolean update_mv_prob;
368 update_mv_prob = read_bool (bd, 252);
369 if (update_mv_prob) {
370 mv_prob = read_literal (bd, 7);
371 prob = (mv_prob << 1) | 1;
377 static GstVp9ParserResult
378 parse_mv_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
382 for (j = 0; j < GST_VP9_MV_JOINTS - 1; j++)
383 hdr->delta_probabilities.mv.joint[j] = read_mv_prob (bd);
385 for (i = 0; i < 2; i++) {
386 hdr->delta_probabilities.mv.sign[i] = read_mv_prob (bd);
388 for (j = 0; j < GST_VP9_MV_CLASSES - 1; j++)
389 hdr->delta_probabilities.mv.klass[i][j] = read_mv_prob (bd);
391 hdr->delta_probabilities.mv.class0_bit[i] = read_mv_prob (bd);
393 for (j = 0; j < GST_VP9_MV_OFFSET_BITS; j++)
394 hdr->delta_probabilities.mv.bits[i][j] = read_mv_prob (bd);
397 for (i = 0; i < 2; i++) {
398 for (j = 0; j < GST_VP9_CLASS0_SIZE; j++)
399 for (k = 0; k < GST_VP9_MV_FR_SIZE - 1; k++)
400 hdr->delta_probabilities.mv.class0_fr[i][j][k] = read_mv_prob (bd);
402 for (k = 0; k < GST_VP9_MV_FR_SIZE - 1; k++)
403 hdr->delta_probabilities.mv.fr[i][k] = read_mv_prob (bd);
406 if (hdr->allow_high_precision_mv) {
407 for (i = 0; i < 2; i++) {
408 hdr->delta_probabilities.mv.class0_hp[i] = read_mv_prob (bd);
409 hdr->delta_probabilities.mv.hp[i] = read_mv_prob (bd);
414 return GST_VP9_PARSER_OK;
417 static GstVp9ParserResult
418 parse_partition_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
422 for (i = 0; i < GST_VP9_PARTITION_CONTEXTS; i++)
423 for (j = 0; j < GST_VP9_PARTITION_TYPES - 1; j++)
424 hdr->delta_probabilities.partition[i][j] = decode_term_subexp (bd);
426 return GST_VP9_PARSER_OK;
429 static GstVp9ParserResult
430 parse_y_mode_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
434 for (i = 0; i < GST_VP9_BLOCK_SIZE_GROUPS; i++)
435 for (j = 0; j < GST_VP9_INTRA_MODES - 1; j++)
436 hdr->delta_probabilities.y_mode[i][j] = decode_term_subexp (bd);
438 return GST_VP9_PARSER_OK;
441 static GstVp9ParserResult
442 parse_frame_reference_mode_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
446 if (hdr->reference_mode == GST_VP9_REFERENCE_MODE_SELECT)
447 for (i = 0; i < GST_VP9_COMP_MODE_CONTEXTS; i++)
448 hdr->delta_probabilities.comp_mode[i] = decode_term_subexp (bd);
450 if (hdr->reference_mode != GST_VP9_REFERENCE_MODE_COMPOUND_REFERENCE)
451 for (i = 0; i < GST_VP9_REF_CONTEXTS; i++) {
452 hdr->delta_probabilities.single_ref[i][0] = decode_term_subexp (bd);
453 hdr->delta_probabilities.single_ref[i][1] = decode_term_subexp (bd);
456 if (hdr->reference_mode != GST_VP9_REFERENCE_MODE_SINGLE_REFERENCE)
457 for (i = 0; i < GST_VP9_REF_CONTEXTS; i++)
458 hdr->delta_probabilities.comp_ref[i] = decode_term_subexp (bd);
460 return GST_VP9_PARSER_OK;
463 static GstVp9ParserResult
464 parse_frame_reference (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
466 gboolean compound_ref_allowed = FALSE;
467 guint8 non_single_reference;
468 guint8 reference_select;
471 for (i = GST_VP9_REF_FRAME_LAST; i < GST_VP9_REFS_PER_FRAME; i++)
472 if (hdr->ref_frame_sign_bias[i + 1] !=
473 hdr->ref_frame_sign_bias[GST_VP9_REF_FRAME_LAST])
474 compound_ref_allowed = TRUE;
476 if (compound_ref_allowed) {
477 non_single_reference = read_literal (bd, 1);
478 if (!non_single_reference)
479 hdr->reference_mode = GST_VP9_REFERENCE_MODE_SINGLE_REFERENCE;
481 reference_select = read_literal (bd, 1);
482 if (!reference_select)
483 hdr->reference_mode = GST_VP9_REFERENCE_MODE_COMPOUND_REFERENCE;
485 hdr->reference_mode = GST_VP9_REFERENCE_MODE_SELECT;
488 hdr->reference_mode = GST_VP9_REFERENCE_MODE_SINGLE_REFERENCE;
490 return GST_VP9_PARSER_OK;
493 static GstVp9ParserResult
494 parse_is_inter_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
498 for (i = 0; i < GST_VP9_IS_INTER_CONTEXTS; i++)
499 hdr->delta_probabilities.is_inter[i] = decode_term_subexp (bd);
501 return GST_VP9_PARSER_OK;
504 static GstVp9ParserResult
505 parse_interp_filter_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
509 for (i = 0; i < GST_VP9_INTERP_FILTER_CONTEXTS; i++)
510 for (j = 0; j < GST_VP9_SWITCHABLE_FILTERS - 1; j++)
511 hdr->delta_probabilities.interp_filter[i][j] = decode_term_subexp (bd);
513 return GST_VP9_PARSER_OK;
516 static GstVp9ParserResult
517 parse_inter_mode_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
521 for (i = 0; i < GST_VP9_INTER_MODE_CONTEXTS; i++)
522 for (j = 0; j < GST_VP9_INTER_MODES - 1; j++)
523 hdr->delta_probabilities.inter_mode[i][j] = decode_term_subexp (bd);
525 return GST_VP9_PARSER_OK;
528 static GstVp9ParserResult
529 parse_skip_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
533 for (i = 0; i < GST_VP9_SKIP_CONTEXTS; i++)
534 hdr->delta_probabilities.skip[i] = decode_term_subexp (bd);
536 return GST_VP9_PARSER_OK;
539 static GstVp9ParserResult
540 parse_coef_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
542 GstVp9TxSize tx_size, max_tx_size;
543 guint8 i, j, k, l, m;
546 static const guint8 tx_mode_to_biggest_tx_size[GST_VP9_TX_MODES] = {
554 max_tx_size = tx_mode_to_biggest_tx_size[hdr->tx_mode];
555 for (tx_size = GST_VP9_TX_4x4; tx_size <= max_tx_size; tx_size++) {
556 update_probs = read_literal (bd, 1);
558 for (i = 0; i < 2; i++)
559 for (j = 0; j < 2; j++)
560 for (k = 0; k < 6; k++)
561 for (l = 0; l < ((k == 0) ? 3 : 6); l++)
562 for (m = 0; m < 3; m++)
563 hdr->delta_probabilities.coef[tx_size][i][j][k][l][m] =
564 decode_term_subexp (bd);
568 return GST_VP9_PARSER_OK;
571 static GstVp9ParserResult
572 parse_tx_mode_probs (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
576 for (i = 0; i < GST_VP9_TX_SIZE_CONTEXTS; i++)
577 for (j = 0; j < GST_VP9_TX_SIZES - 3; j++)
578 hdr->delta_probabilities.tx_probs_8x8[i][j] = decode_term_subexp (bd);
580 for (i = 0; i < GST_VP9_TX_SIZE_CONTEXTS; i++)
581 for (j = 0; j < GST_VP9_TX_SIZES - 2; j++)
582 hdr->delta_probabilities.tx_probs_16x16[i][j] = decode_term_subexp (bd);
584 for (i = 0; i < GST_VP9_TX_SIZE_CONTEXTS; i++)
585 for (j = 0; j < GST_VP9_TX_SIZES - 1; j++)
586 hdr->delta_probabilities.tx_probs_32x32[i][j] = decode_term_subexp (bd);
588 return GST_VP9_PARSER_OK;
591 static GstVp9ParserResult
592 parse_tx_mode (GstVp9FrameHeader * hdr, Vp9BoolDecoder * bd)
595 guint8 tx_mode_select;
597 if (hdr->lossless_flag) {
598 hdr->tx_mode = GST_VP9_TX_MODE_ONLY_4x4;
599 return GST_VP9_PARSER_OK;
602 tx_mode = read_literal (bd, 2);
603 if (tx_mode == GST_VP9_TX_MODE_ALLOW_32x32) {
604 tx_mode_select = read_literal (bd, 1);
605 tx_mode += tx_mode_select;
608 hdr->tx_mode = tx_mode;
609 return GST_VP9_PARSER_OK;
612 static GstVp9ParserResult
613 parse_compressed_header (GstVp9StatefulParser * self, GstVp9FrameHeader * hdr,
616 GstVp9ParserResult rst;
617 gboolean frame_is_intra_only;
620 /* consume trailing bits */
621 while (gst_bit_reader_get_pos (br) & 0x7)
622 gst_bit_reader_get_bits_uint8_unchecked (br, 1);
624 rst = init_bool (&bd, br, hdr->header_size_in_bytes);
625 if (rst != GST_VP9_PARSER_OK) {
626 GST_ERROR ("Failed to init the boolean decoder.");
630 rst = parse_tx_mode (hdr, &bd);
631 if (rst != GST_VP9_PARSER_OK)
634 if (hdr->tx_mode == GST_VP9_TX_MODE_SELECT) {
635 rst = parse_tx_mode_probs (hdr, &bd);
636 if (rst != GST_VP9_PARSER_OK)
640 rst = parse_coef_probs (hdr, &bd);
641 if (rst != GST_VP9_PARSER_OK)
644 rst = parse_skip_probs (hdr, &bd);
645 if (rst != GST_VP9_PARSER_OK)
648 frame_is_intra_only = (hdr->frame_type == GST_VP9_KEY_FRAME
651 if (!frame_is_intra_only) {
652 rst = parse_inter_mode_probs (hdr, &bd);
653 if (rst != GST_VP9_PARSER_OK)
656 if (hdr->interpolation_filter == GST_VP9_INTERPOLATION_FILTER_SWITCHABLE) {
657 rst = parse_interp_filter_probs (hdr, &bd);
658 if (rst != GST_VP9_PARSER_OK)
662 rst = parse_is_inter_probs (hdr, &bd);
663 if (rst != GST_VP9_PARSER_OK)
666 rst = parse_frame_reference (hdr, &bd);
667 if (rst != GST_VP9_PARSER_OK)
670 rst = parse_frame_reference_mode_probs (hdr, &bd);
671 if (rst != GST_VP9_PARSER_OK)
674 rst = parse_y_mode_probs (hdr, &bd);
675 if (rst != GST_VP9_PARSER_OK)
678 rst = parse_partition_probs (hdr, &bd);
679 if (rst != GST_VP9_PARSER_OK)
682 rst = parse_mv_probs (hdr, &bd);
683 if (rst != GST_VP9_PARSER_OK)
687 rst = exit_bool (&bd);
688 if (rst != GST_VP9_PARSER_OK) {
689 GST_ERROR ("The boolean decoder did not exit cleanly.");
693 return GST_VP9_PARSER_OK;
696 static const gint16 dc_qlookup[256] = {
697 4, 8, 8, 9, 10, 11, 12, 12,
698 13, 14, 15, 16, 17, 18, 19, 19,
699 20, 21, 22, 23, 24, 25, 26, 26,
700 27, 28, 29, 30, 31, 32, 32, 33,
701 34, 35, 36, 37, 38, 38, 39, 40,
702 41, 42, 43, 43, 44, 45, 46, 47,
703 48, 48, 49, 50, 51, 52, 53, 53,
704 54, 55, 56, 57, 57, 58, 59, 60,
705 61, 62, 62, 63, 64, 65, 66, 66,
706 67, 68, 69, 70, 70, 71, 72, 73,
707 74, 74, 75, 76, 77, 78, 78, 79,
708 80, 81, 81, 82, 83, 84, 85, 85,
709 87, 88, 90, 92, 93, 95, 96, 98,
710 99, 101, 102, 104, 105, 107, 108, 110,
711 111, 113, 114, 116, 117, 118, 120, 121,
712 123, 125, 127, 129, 131, 134, 136, 138,
713 140, 142, 144, 146, 148, 150, 152, 154,
714 156, 158, 161, 164, 166, 169, 172, 174,
715 177, 180, 182, 185, 187, 190, 192, 195,
716 199, 202, 205, 208, 211, 214, 217, 220,
717 223, 226, 230, 233, 237, 240, 243, 247,
718 250, 253, 257, 261, 265, 269, 272, 276,
719 280, 284, 288, 292, 296, 300, 304, 309,
720 313, 317, 322, 326, 330, 335, 340, 344,
721 349, 354, 359, 364, 369, 374, 379, 384,
722 389, 395, 400, 406, 411, 417, 423, 429,
723 435, 441, 447, 454, 461, 467, 475, 482,
724 489, 497, 505, 513, 522, 530, 539, 549,
725 559, 569, 579, 590, 602, 614, 626, 640,
726 654, 668, 684, 700, 717, 736, 755, 775,
727 796, 819, 843, 869, 896, 925, 955, 988,
728 1022, 1058, 1098, 1139, 1184, 1232, 1282, 1336,
731 static const gint16 dc_qlookup_10[256] = {
732 4, 9, 10, 13, 15, 17, 20, 22,
733 25, 28, 31, 34, 37, 40, 43, 47,
734 50, 53, 57, 60, 64, 68, 71, 75,
735 78, 82, 86, 90, 93, 97, 101, 105,
736 109, 113, 116, 120, 124, 128, 132, 136,
737 140, 143, 147, 151, 155, 159, 163, 166,
738 170, 174, 178, 182, 185, 189, 193, 197,
739 200, 204, 208, 212, 215, 219, 223, 226,
740 230, 233, 237, 241, 244, 248, 251, 255,
741 259, 262, 266, 269, 273, 276, 280, 283,
742 287, 290, 293, 297, 300, 304, 307, 310,
743 314, 317, 321, 324, 327, 331, 334, 337,
744 343, 350, 356, 362, 369, 375, 381, 387,
745 394, 400, 406, 412, 418, 424, 430, 436,
746 442, 448, 454, 460, 466, 472, 478, 484,
747 490, 499, 507, 516, 525, 533, 542, 550,
748 559, 567, 576, 584, 592, 601, 609, 617,
749 625, 634, 644, 655, 666, 676, 687, 698,
750 708, 718, 729, 739, 749, 759, 770, 782,
751 795, 807, 819, 831, 844, 856, 868, 880,
752 891, 906, 920, 933, 947, 961, 975, 988,
753 1001, 1015, 1030, 1045, 1061, 1076, 1090, 1105,
754 1120, 1137, 1153, 1170, 1186, 1202, 1218, 1236,
755 1253, 1271, 1288, 1306, 1323, 1342, 1361, 1379,
756 1398, 1416, 1436, 1456, 1476, 1496, 1516, 1537,
757 1559, 1580, 1601, 1624, 1647, 1670, 1692, 1717,
758 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929,
759 1958, 1990, 2021, 2054, 2088, 2123, 2159, 2197,
760 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561,
761 2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102,
762 3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953,
763 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347,
766 static const gint16 dc_qlookup_12[256] = {
767 4, 12, 18, 25, 33, 41, 50, 60,
768 70, 80, 91, 103, 115, 127, 140, 153,
769 166, 180, 194, 208, 222, 237, 251, 266,
770 281, 296, 312, 327, 343, 358, 374, 390,
771 405, 421, 437, 453, 469, 484, 500, 516,
772 532, 548, 564, 580, 596, 611, 627, 643,
773 659, 674, 690, 706, 721, 737, 752, 768,
774 783, 798, 814, 829, 844, 859, 874, 889,
775 904, 919, 934, 949, 964, 978, 993, 1008,
776 1022, 1037, 1051, 1065, 1080, 1094, 1108, 1122,
777 1136, 1151, 1165, 1179, 1192, 1206, 1220, 1234,
778 1248, 1261, 1275, 1288, 1302, 1315, 1329, 1342,
779 1368, 1393, 1419, 1444, 1469, 1494, 1519, 1544,
780 1569, 1594, 1618, 1643, 1668, 1692, 1717, 1741,
781 1765, 1789, 1814, 1838, 1862, 1885, 1909, 1933,
782 1957, 1992, 2027, 2061, 2096, 2130, 2165, 2199,
783 2233, 2267, 2300, 2334, 2367, 2400, 2434, 2467,
784 2499, 2532, 2575, 2618, 2661, 2704, 2746, 2788,
785 2830, 2872, 2913, 2954, 2995, 3036, 3076, 3127,
786 3177, 3226, 3275, 3324, 3373, 3421, 3469, 3517,
787 3565, 3621, 3677, 3733, 3788, 3843, 3897, 3951,
788 4005, 4058, 4119, 4181, 4241, 4301, 4361, 4420,
789 4479, 4546, 4612, 4677, 4742, 4807, 4871, 4942,
790 5013, 5083, 5153, 5222, 5291, 5367, 5442, 5517,
791 5591, 5665, 5745, 5825, 5905, 5984, 6063, 6149,
792 6234, 6319, 6404, 6495, 6587, 6678, 6769, 6867,
793 6966, 7064, 7163, 7269, 7376, 7483, 7599, 7715,
794 7832, 7958, 8085, 8214, 8352, 8492, 8635, 8788,
795 8945, 9104, 9275, 9450, 9639, 9832, 10031, 10245,
796 10465, 10702, 10946, 11210, 11482, 11776, 12081, 12409,
797 12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812,
798 16356, 16943, 17575, 18237, 18949, 19718, 20521, 21387,
801 static const gint16 ac_qlookup[256] = {
802 4, 8, 9, 10, 11, 12, 13, 14,
803 15, 16, 17, 18, 19, 20, 21, 22,
804 23, 24, 25, 26, 27, 28, 29, 30,
805 31, 32, 33, 34, 35, 36, 37, 38,
806 39, 40, 41, 42, 43, 44, 45, 46,
807 47, 48, 49, 50, 51, 52, 53, 54,
808 55, 56, 57, 58, 59, 60, 61, 62,
809 63, 64, 65, 66, 67, 68, 69, 70,
810 71, 72, 73, 74, 75, 76, 77, 78,
811 79, 80, 81, 82, 83, 84, 85, 86,
812 87, 88, 89, 90, 91, 92, 93, 94,
813 95, 96, 97, 98, 99, 100, 101, 102,
814 104, 106, 108, 110, 112, 114, 116, 118,
815 120, 122, 124, 126, 128, 130, 132, 134,
816 136, 138, 140, 142, 144, 146, 148, 150,
817 152, 155, 158, 161, 164, 167, 170, 173,
818 176, 179, 182, 185, 188, 191, 194, 197,
819 200, 203, 207, 211, 215, 219, 223, 227,
820 231, 235, 239, 243, 247, 251, 255, 260,
821 265, 270, 275, 280, 285, 290, 295, 300,
822 305, 311, 317, 323, 329, 335, 341, 347,
823 353, 359, 366, 373, 380, 387, 394, 401,
824 408, 416, 424, 432, 440, 448, 456, 465,
825 474, 483, 492, 501, 510, 520, 530, 540,
826 550, 560, 571, 582, 593, 604, 615, 627,
827 639, 651, 663, 676, 689, 702, 715, 729,
828 743, 757, 771, 786, 801, 816, 832, 848,
829 864, 881, 898, 915, 933, 951, 969, 988,
830 1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151,
831 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343,
832 1369, 1396, 1423, 1451, 1479, 1508, 1537, 1567,
833 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828,
836 static const gint16 ac_qlookup_10[256] = {
837 4, 9, 11, 13, 16, 18, 21, 24,
838 27, 30, 33, 37, 40, 44, 48, 51,
839 55, 59, 63, 67, 71, 75, 79, 83,
840 88, 92, 96, 100, 105, 109, 114, 118,
841 122, 127, 131, 136, 140, 145, 149, 154,
842 158, 163, 168, 172, 177, 181, 186, 190,
843 195, 199, 204, 208, 213, 217, 222, 226,
844 231, 235, 240, 244, 249, 253, 258, 262,
845 267, 271, 275, 280, 284, 289, 293, 297,
846 302, 306, 311, 315, 319, 324, 328, 332,
847 337, 341, 345, 349, 354, 358, 362, 367,
848 371, 375, 379, 384, 388, 392, 396, 401,
849 409, 417, 425, 433, 441, 449, 458, 466,
850 474, 482, 490, 498, 506, 514, 523, 531,
851 539, 547, 555, 563, 571, 579, 588, 596,
852 604, 616, 628, 640, 652, 664, 676, 688,
853 700, 713, 725, 737, 749, 761, 773, 785,
854 797, 809, 825, 841, 857, 873, 889, 905,
855 922, 938, 954, 970, 986, 1002, 1018, 1038,
856 1058, 1078, 1098, 1118, 1138, 1158, 1178, 1198,
857 1218, 1242, 1266, 1290, 1314, 1338, 1362, 1386,
858 1411, 1435, 1463, 1491, 1519, 1547, 1575, 1603,
859 1631, 1663, 1695, 1727, 1759, 1791, 1823, 1859,
860 1895, 1931, 1967, 2003, 2039, 2079, 2119, 2159,
861 2199, 2239, 2283, 2327, 2371, 2415, 2459, 2507,
862 2555, 2603, 2651, 2703, 2755, 2807, 2859, 2915,
863 2971, 3027, 3083, 3143, 3203, 3263, 3327, 3391,
864 3455, 3523, 3591, 3659, 3731, 3803, 3876, 3952,
865 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604,
866 4692, 4784, 4876, 4972, 5068, 5168, 5268, 5372,
867 5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268,
868 6388, 6512, 6640, 6768, 6900, 7036, 7172, 7312,
871 static const gint16 ac_qlookup_12[256] = {
872 4, 13, 19, 27, 35, 44, 54, 64,
873 75, 87, 99, 112, 126, 139, 154, 168,
874 183, 199, 214, 230, 247, 263, 280, 297,
875 314, 331, 349, 366, 384, 402, 420, 438,
876 456, 475, 493, 511, 530, 548, 567, 586,
877 604, 623, 642, 660, 679, 698, 716, 735,
878 753, 772, 791, 809, 828, 846, 865, 884,
879 902, 920, 939, 957, 976, 994, 1012, 1030,
880 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175,
881 1193, 1211, 1229, 1246, 1264, 1282, 1299, 1317,
882 1335, 1352, 1370, 1387, 1405, 1422, 1440, 1457,
883 1474, 1491, 1509, 1526, 1543, 1560, 1577, 1595,
884 1627, 1660, 1693, 1725, 1758, 1791, 1824, 1856,
885 1889, 1922, 1954, 1987, 2020, 2052, 2085, 2118,
886 2150, 2183, 2216, 2248, 2281, 2313, 2346, 2378,
887 2411, 2459, 2508, 2556, 2605, 2653, 2701, 2750,
888 2798, 2847, 2895, 2943, 2992, 3040, 3088, 3137,
889 3185, 3234, 3298, 3362, 3426, 3491, 3555, 3619,
890 3684, 3748, 3812, 3876, 3941, 4005, 4069, 4149,
891 4230, 4310, 4390, 4470, 4550, 4631, 4711, 4791,
892 4871, 4967, 5064, 5160, 5256, 5352, 5448, 5544,
893 5641, 5737, 5849, 5961, 6073, 6185, 6297, 6410,
894 6522, 6650, 6778, 6906, 7034, 7162, 7290, 7435,
895 7579, 7723, 7867, 8011, 8155, 8315, 8475, 8635,
896 8795, 8956, 9132, 9308, 9484, 9660, 9836, 10028,
897 10220, 10412, 10604, 10812, 11020, 11228, 11437, 11661,
898 11885, 12109, 12333, 12573, 12813, 13053, 13309, 13565,
899 13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806,
900 16110, 16414, 16734, 17054, 17390, 17726, 18062, 18414,
901 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486,
902 21902, 22334, 22766, 23214, 23662, 24126, 24590, 25070,
903 25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247,
906 static GstVp9ParserResult
907 parse_frame_marker (GstBitReader * br)
911 VP9_READ_UINT8 (frame_marker, 2);
913 if (frame_marker != GST_VP9_FRAME_MARKER) {
914 GST_ERROR ("Invalid VP9 Frame Marker");
915 return GST_VP9_PARSER_ERROR;
918 return GST_VP9_PARSER_OK;
921 static GstVp9ParserResult
922 parse_frame_sync_code (GstBitReader * br)
926 VP9_READ_UINT32 (code, 24);
927 if (code != GST_VP9_SYNC_CODE) {
928 GST_ERROR ("%d is not VP9 sync code", code);
929 return GST_VP9_PARSER_ERROR;
932 return GST_VP9_PARSER_OK;
935 /* 6.2.2 Color config syntax */
936 static GstVp9ParserResult
937 parse_color_config (GstVp9StatefulParser * self, GstBitReader * br,
938 GstVp9FrameHeader * header)
942 if (header->profile >= GST_VP9_PROFILE_2) {
945 header->bit_depth = GST_VP9_BIT_DEPTH_12;
947 header->bit_depth = GST_VP9_BIT_DEPTH_10;
950 header->bit_depth = GST_VP9_BIT_DEPTH_8;
953 VP9_READ_UINT8 (header->color_space, 3);
954 if (header->color_space != GST_VP9_CS_SRGB) {
955 VP9_READ_BIT (header->color_range);
957 if (header->profile == GST_VP9_PROFILE_1
958 || header->profile == GST_VP9_PROFILE_3) {
959 VP9_READ_BIT (header->subsampling_x);
960 VP9_READ_BIT (header->subsampling_y);
962 if (header->subsampling_x == 1 && header->subsampling_y == 1) {
964 ("4:2:0 subsampling is not supported in profile_1 or profile_3");
965 return GST_VP9_PARSER_ERROR;
971 header->subsampling_y = header->subsampling_x = 1;
974 header->color_range = GST_VP9_CR_FULL;
975 if (header->profile == GST_VP9_PROFILE_1
976 || header->profile == GST_VP9_PROFILE_3) {
981 ("4:4:4 subsampling is not supported in profile_0 and profile_2");
982 return GST_VP9_PARSER_ERROR;
986 self->bit_depth = header->bit_depth;
987 self->color_space = header->color_space;
988 self->subsampling_x = header->subsampling_x;
989 self->subsampling_y = header->subsampling_y;
990 self->color_range = header->color_range;
992 return GST_VP9_PARSER_OK;
995 /* 6.2 Uncompressed header syntax */
996 static GstVp9ParserResult
997 parse_profile (GstBitReader * br, guint8 * profile)
999 guint8 profile_low_bit, profile_high_bit, ret, bit;
1001 VP9_READ_BIT (profile_low_bit);
1002 VP9_READ_BIT (profile_high_bit);
1004 ret = (profile_high_bit << 1) | profile_low_bit;
1012 return GST_VP9_PARSER_OK;
1015 /* 6.2.6 Compute image size syntax */
1017 compute_image_size (GstVp9StatefulParser * self, guint32 width, guint32 height)
1019 self->mi_cols = (width + 7) >> 3;
1020 self->mi_rows = (height + 7) >> 3;
1021 self->sb64_cols = (self->mi_cols + 7) >> 3;
1022 self->sb64_rows = (self->mi_rows + 7) >> 3;
1025 static GstVp9ParserResult
1026 parse_frame_or_render_size (GstBitReader * br,
1027 guint32 * width, guint32 * height)
1029 guint32 width_minus_1;
1030 guint32 height_minus_1;
1032 VP9_READ_UINT32 (width_minus_1, 16);
1033 VP9_READ_UINT32 (height_minus_1, 16);
1035 *width = width_minus_1 + 1;
1036 *height = height_minus_1 + 1;
1038 return GST_VP9_PARSER_OK;
1041 /* 6.2.3 Frame size syntax */
1042 static GstVp9ParserResult
1043 parse_frame_size (GstVp9StatefulParser * self, GstBitReader * br,
1044 guint32 * width, guint32 * height)
1046 GstVp9ParserResult rst;
1048 rst = parse_frame_or_render_size (br, width, height);
1049 if (rst != GST_VP9_PARSER_OK) {
1050 GST_ERROR ("Failed to parse frame size");
1054 compute_image_size (self, *width, *height);
1056 return GST_VP9_PARSER_OK;
1059 /* 6.2.4 Render size syntax */
1060 static GstVp9ParserResult
1061 parse_render_size (GstBitReader * br, GstVp9FrameHeader * header)
1063 VP9_READ_BIT (header->render_and_frame_size_different);
1064 if (header->render_and_frame_size_different) {
1065 return parse_frame_or_render_size (br,
1066 &header->render_width, &header->render_height);
1068 header->render_width = header->width;
1069 header->render_height = header->height;
1072 return GST_VP9_PARSER_OK;
1075 /* 6.2.5 Frame size with refs syntax */
1076 static GstVp9ParserResult
1077 parse_frame_size_with_refs (GstVp9StatefulParser * self, GstBitReader * br,
1078 GstVp9FrameHeader * header)
1080 guint8 found_ref = 0;
1083 for (i = 0; i < GST_VP9_REFS_PER_FRAME; i++) {
1084 VP9_READ_BIT (found_ref);
1087 guint8 idx = header->ref_frame_idx[i];
1089 header->width = self->reference[idx].width;
1090 header->height = self->reference[idx].height;
1095 if (found_ref == 0) {
1096 GstVp9ParserResult rst;
1098 rst = parse_frame_size (self, br, &header->width, &header->height);
1099 if (rst != GST_VP9_PARSER_OK) {
1100 GST_ERROR ("Failed to parse frame size without refs");
1104 compute_image_size (self, header->width, header->height);
1107 return parse_render_size (br, header);
1110 /* 6.2.7 Interpolation filter syntax */
1111 static GstVp9ParserResult
1112 read_interpolation_filter (GstBitReader * br, GstVp9FrameHeader * header)
1114 static const GstVp9InterpolationFilter filter_map[] = {
1115 GST_VP9_INTERPOLATION_FILTER_EIGHTTAP_SMOOTH,
1116 GST_VP9_INTERPOLATION_FILTER_EIGHTTAP,
1117 GST_VP9_INTERPOLATION_FILTER_EIGHTTAP_SHARP,
1118 GST_VP9_INTERPOLATION_FILTER_BILINEAR
1120 guint8 is_filter_switchable;
1122 VP9_READ_BIT (is_filter_switchable);
1123 if (is_filter_switchable) {
1124 header->interpolation_filter = GST_VP9_INTERPOLATION_FILTER_SWITCHABLE;
1128 VP9_READ_UINT8 (map_val, 2);
1129 header->interpolation_filter = filter_map[map_val];
1132 return GST_VP9_PARSER_OK;
1135 /* 6.2.8 Loop filter params syntax */
1136 static GstVp9ParserResult
1137 parse_loop_filter_params (GstBitReader * br, GstVp9LoopFilterParams * params)
1139 VP9_READ_UINT8 (params->loop_filter_level, 6);
1140 VP9_READ_UINT8 (params->loop_filter_sharpness, 3);
1141 VP9_READ_BIT (params->loop_filter_delta_enabled);
1143 if (params->loop_filter_delta_enabled) {
1144 VP9_READ_BIT (params->loop_filter_delta_update);
1145 if (params->loop_filter_delta_update) {
1148 for (i = 0; i < GST_VP9_MAX_REF_LF_DELTAS; i++) {
1149 VP9_READ_BIT (params->update_ref_delta[i]);
1150 if (params->update_ref_delta[i]) {
1151 VP9_READ_SIGNED_8 (params->loop_filter_ref_deltas[i], 6);
1155 for (i = 0; i < GST_VP9_MAX_MODE_LF_DELTAS; i++) {
1156 VP9_READ_BIT (params->update_mode_delta[i]);
1157 if (params->update_mode_delta[i])
1158 VP9_READ_SIGNED_8 (params->loop_filter_mode_deltas[i], 6);
1163 return GST_VP9_PARSER_OK;
1166 /* 6.2.10 Delta quantizer syntax */
1167 static inline GstVp9ParserResult
1168 parse_delta_q (GstBitReader * br, gint8 * value)
1173 VP9_READ_BIT (read_signed);
1176 return GST_VP9_PARSER_OK;
1179 VP9_READ_SIGNED_8 (delta_q, 4);
1182 return GST_VP9_PARSER_OK;
1185 /* 6.2.9 Quantization params syntax */
1186 static GstVp9ParserResult
1187 parse_quantization_params (GstBitReader * br, GstVp9FrameHeader * header)
1189 GstVp9QuantizationParams *params = &header->quantization_params;
1190 GstVp9ParserResult rst;
1192 VP9_READ_UINT8 (params->base_q_idx, 8);
1193 rst = parse_delta_q (br, ¶ms->delta_q_y_dc);
1194 if (rst != GST_VP9_PARSER_OK)
1197 rst = parse_delta_q (br, ¶ms->delta_q_uv_dc);
1198 if (rst != GST_VP9_PARSER_OK)
1201 rst = parse_delta_q (br, ¶ms->delta_q_uv_ac);
1202 if (rst != GST_VP9_PARSER_OK)
1205 header->lossless_flag = params->base_q_idx == 0 && params->delta_q_y_dc == 0
1206 && params->delta_q_uv_dc == 0 && params->delta_q_uv_ac == 0;
1208 return GST_VP9_PARSER_OK;
1211 /* 6.2.12 Probability syntax */
1212 static GstVp9ParserResult
1213 read_prob (GstBitReader * br, guint8 * val)
1215 guint8 prob = GST_VP9_MAX_PROB;
1218 VP9_READ_BIT (prob_coded);
1221 VP9_READ_UINT8 (prob, 8);
1225 return GST_VP9_PARSER_OK;
1228 /* 6.2.11 Segmentation params syntax */
1229 static GstVp9ParserResult
1230 parse_segmentation_params (GstBitReader * br, GstVp9SegmentationParams * params)
1233 GstVp9ParserResult rst;
1235 params->segmentation_update_map = 0;
1236 params->segmentation_update_data = 0;
1237 params->segmentation_temporal_update = 0;
1239 VP9_READ_BIT (params->segmentation_enabled);
1240 if (!params->segmentation_enabled)
1241 return GST_VP9_PARSER_OK;
1243 VP9_READ_BIT (params->segmentation_update_map);
1244 if (params->segmentation_update_map) {
1245 for (i = 0; i < GST_VP9_SEG_TREE_PROBS; i++) {
1246 rst = read_prob (br, ¶ms->segmentation_tree_probs[i]);
1247 if (rst != GST_VP9_PARSER_OK) {
1248 GST_ERROR ("Failed to read segmentation_tree_probs[%d]", i);
1253 VP9_READ_BIT (params->segmentation_temporal_update);
1254 if (params->segmentation_temporal_update) {
1255 for (i = 0; i < GST_VP9_PREDICTION_PROBS; i++) {
1256 rst = read_prob (br, ¶ms->segmentation_pred_prob[i]);
1257 if (rst != GST_VP9_PARSER_OK) {
1258 GST_ERROR ("Failed to read segmentation_pred_prob[%d]", i);
1263 for (i = 0; i < GST_VP9_PREDICTION_PROBS; i++)
1264 params->segmentation_pred_prob[i] = GST_VP9_MAX_PROB;
1268 VP9_READ_BIT (params->segmentation_update_data);
1269 if (params->segmentation_update_data) {
1270 VP9_READ_BIT (params->segmentation_abs_or_delta_update);
1272 for (i = 0; i < GST_VP9_MAX_SEGMENTS; i++) {
1273 VP9_READ_BIT (params->feature_enabled[i][GST_VP9_SEG_LVL_ALT_Q]);
1274 if (params->feature_enabled[i][GST_VP9_SEG_LVL_ALT_Q]) {
1275 VP9_READ_SIGNED_16 (params->feature_data[i][GST_VP9_SEG_LVL_ALT_Q], 8);
1277 params->feature_data[i][GST_VP9_SEG_LVL_ALT_Q] = 0;
1280 VP9_READ_BIT (params->feature_enabled[i][GST_VP9_SEG_LVL_ALT_L]);
1281 if (params->feature_enabled[i][GST_VP9_SEG_LVL_ALT_L]) {
1282 VP9_READ_SIGNED_8 (params->feature_data[i][GST_VP9_SEG_LVL_ALT_L], 6);
1284 params->feature_data[i][GST_VP9_SEG_LVL_ALT_L] = 0;
1287 VP9_READ_BIT (params->feature_enabled[i][GST_VP9_SEG_LVL_REF_FRAME]);
1288 if (params->feature_enabled[i][GST_VP9_SEG_LVL_REF_FRAME]) {
1291 VP9_READ_UINT8 (val, 2);
1292 params->feature_data[i][GST_VP9_SEG_LVL_REF_FRAME] = val;
1294 params->feature_data[i][GST_VP9_SEG_LVL_REF_FRAME] = 0;
1297 VP9_READ_BIT (params->feature_enabled[i][GST_VP9_SEG_SEG_LVL_SKIP]);
1300 return GST_VP9_PARSER_OK;
1303 /* 6.2.14 Tile size calculation */
1305 calc_min_log2_tile_cols (guint32 sb64_cols)
1308 static const guint MAX_TILE_WIDTH_B64 = 64;
1310 while ((MAX_TILE_WIDTH_B64 << minLog2) < sb64_cols)
1317 calc_max_log2_tile_cols (guint32 sb64_cols)
1320 static const guint MIN_TILE_WIDTH_B64 = 4;
1322 while ((sb64_cols >> maxLog2) >= MIN_TILE_WIDTH_B64)
1328 /* 6.2.13 Tile info syntax */
1329 static GstVp9ParserResult
1330 parse_tile_info (GstVp9StatefulParser * self, GstBitReader * br,
1331 GstVp9FrameHeader * header)
1333 guint32 minLog2TileCols = calc_min_log2_tile_cols (self->sb64_cols);
1334 guint32 maxLog2TileCols = calc_max_log2_tile_cols (self->sb64_cols);
1336 header->tile_cols_log2 = minLog2TileCols;
1338 while (header->tile_cols_log2 < maxLog2TileCols) {
1339 guint8 increment_tile_cols_log2;
1341 VP9_READ_BIT (increment_tile_cols_log2);
1342 if (increment_tile_cols_log2)
1343 header->tile_cols_log2++;
1348 if (header->tile_cols_log2 > 6) {
1349 GST_ERROR ("Invalid number of tile columns");
1350 return GST_VP9_PARSER_ERROR;
1353 VP9_READ_BIT (header->tile_rows_log2);
1354 if (header->tile_rows_log2) {
1355 guint8 increment_tile_rows_log2;
1357 VP9_READ_BIT (increment_tile_rows_log2);
1358 header->tile_rows_log2 += increment_tile_rows_log2;
1361 return GST_VP9_PARSER_OK;
1364 /* 7.2 Uncompressed header semantics */
1366 setup_past_independence (GstVp9StatefulParser * self,
1367 GstVp9FrameHeader * header)
1369 memset (self->segmentation_params.feature_enabled,
1370 0, sizeof (self->segmentation_params.feature_enabled));
1371 memset (self->segmentation_params.feature_data,
1372 0, sizeof (self->segmentation_params.feature_data));
1374 self->segmentation_params.segmentation_abs_or_delta_update = 0;
1376 self->loop_filter_params.loop_filter_delta_enabled = 1;
1377 self->loop_filter_params.loop_filter_ref_deltas[GST_VP9_REF_FRAME_INTRA] = 1;
1378 self->loop_filter_params.loop_filter_ref_deltas[GST_VP9_REF_FRAME_LAST] = 0;
1379 self->loop_filter_params.loop_filter_ref_deltas[GST_VP9_REF_FRAME_GOLDEN] =
1381 self->loop_filter_params.loop_filter_ref_deltas[GST_VP9_REF_FRAME_ALTREF] =
1384 memset (self->loop_filter_params.loop_filter_mode_deltas, 0,
1385 sizeof (self->loop_filter_params.loop_filter_mode_deltas));
1386 memset (header->ref_frame_sign_bias, 0, sizeof (header->ref_frame_sign_bias));
1390 * gst_vp9_stateful_parser_new:
1392 * Creates a new #GstVp9StatefulParser. It should be freed with
1393 * gst_vp9_stateful_parser_free() after use.
1395 * Returns: a new #GstVp9StatefulParser
1399 GstVp9StatefulParser *
1400 gst_vp9_stateful_parser_new (void)
1402 GstVp9StatefulParser *parser;
1404 parser = g_new0 (GstVp9StatefulParser, 1);
1410 * gst_vp9_stateful_parser_free:
1411 * @parser: the #GstVp9StatefulParser to free
1418 gst_vp9_stateful_parser_free (GstVp9StatefulParser * parser)
1424 * gst_vp9_stateful_parser_parse_compressed_frame_header:
1425 * @parser: The #GstVp9StatefulParser
1426 * @header: The #GstVp9FrameHeader to fill
1427 * @data: The data to parse
1428 * @size: The size of the @data to parse
1430 * Parses the compressed information in the VP9 bitstream contained in @data,
1431 * and fills in @header with the parsed values.
1432 * The @size argument represent the whole frame size.
1434 * Returns: a #GstVp9ParserResult
1440 gst_vp9_stateful_parser_parse_compressed_frame_header (GstVp9StatefulParser *
1441 parser, GstVp9FrameHeader * header, const guint8 * data, gsize size)
1443 GstVp9ParserResult rst = GST_VP9_PARSER_OK;
1444 GstBitReader bit_reader;
1445 GstBitReader *br = &bit_reader;
1447 gst_bit_reader_init (br, data, size);
1449 rst = parse_compressed_header (parser, header, br);
1450 if (rst != GST_VP9_PARSER_OK) {
1451 GST_ERROR ("Failed to parse the compressed header");
1452 return GST_VP9_PARSER_ERROR;
1459 * gst_vp9_stateful_parser_parse_uncompressed_frame_header:
1460 * @parser: The #GstVp9StatefulParser
1461 * @header: The #GstVp9FrameHeader to fill
1462 * @data: The data to parse
1463 * @size: The size of the @data to parse
1465 * Parses the VP9 bitstream contained in @data, and fills in @header
1466 * with the information. The @size argument represent the whole frame size.
1468 * Returns: a #GstVp9ParserResult
1473 gst_vp9_stateful_parser_parse_uncompressed_frame_header (GstVp9StatefulParser *
1474 parser, GstVp9FrameHeader * header, const guint8 * data, gsize size)
1476 GstBitReader bit_reader;
1477 GstBitReader *br = &bit_reader;
1478 gboolean frame_is_intra = FALSE;
1479 GstVp9ParserResult rst = GST_VP9_PARSER_OK;
1482 g_return_val_if_fail (parser, GST_VP9_PARSER_ERROR);
1483 g_return_val_if_fail (header, GST_VP9_PARSER_ERROR);
1484 g_return_val_if_fail (data, GST_VP9_PARSER_ERROR);
1485 g_return_val_if_fail (size, GST_VP9_PARSER_ERROR);
1487 gst_bit_reader_init (br, data, size);
1488 memset (header, 0, sizeof (GstVp9FrameHeader));
1490 /* Parsing Uncompressed Data Chunk */
1491 rst = parse_frame_marker (br);
1492 if (rst != GST_VP9_PARSER_OK)
1495 rst = parse_profile (br, &header->profile);
1496 if (rst != GST_VP9_PARSER_OK)
1499 CHECK_ALLOWED (header->profile, GST_VP9_PROFILE_0, GST_VP9_PROFILE_3);
1501 VP9_READ_BIT (header->show_existing_frame);
1502 if (header->show_existing_frame) {
1503 VP9_READ_UINT8 (header->frame_to_show_map_idx, 3);
1504 return GST_VP9_PARSER_OK;
1507 VP9_READ_BIT (header->frame_type);
1508 VP9_READ_BIT (header->show_frame);
1509 VP9_READ_BIT (header->error_resilient_mode);
1511 if (header->frame_type == GST_VP9_KEY_FRAME) {
1512 rst = parse_frame_sync_code (br);
1513 if (rst != GST_VP9_PARSER_OK) {
1514 GST_ERROR ("Invalid VP9 sync code in keyframe");
1518 rst = parse_color_config (parser, br, header);
1519 if (rst != GST_VP9_PARSER_OK) {
1520 GST_ERROR ("Failed to parse color config of keyframe");
1524 rst = parse_frame_size (parser, br, &header->width, &header->height);
1525 if (rst != GST_VP9_PARSER_OK) {
1526 GST_ERROR ("Failed to parse frame size of keyframe");
1530 rst = parse_render_size (br, header);
1531 if (rst != GST_VP9_PARSER_OK) {
1532 GST_ERROR ("Failed to parse render size of keyframe");
1536 header->refresh_frame_flags = 0xff;
1537 frame_is_intra = TRUE;
1539 if (header->show_frame == 0)
1540 VP9_READ_BIT (header->intra_only);
1542 frame_is_intra = header->intra_only;
1543 if (header->error_resilient_mode == 0)
1544 VP9_READ_UINT8 (header->reset_frame_context, 2);
1546 if (header->intra_only) {
1547 rst = parse_frame_sync_code (br);
1548 if (rst != GST_VP9_PARSER_OK) {
1549 GST_ERROR ("Invalid VP9 sync code in intra-only frame");
1553 if (header->profile > GST_VP9_PROFILE_0) {
1554 rst = parse_color_config (parser, br, header);
1555 if (rst != GST_VP9_PARSER_OK) {
1556 GST_ERROR ("Failed to parse color config of intra-only frame");
1560 parser->color_space = header->color_space = GST_VP9_CS_BT_601;
1561 parser->color_range = header->color_range = GST_VP9_CR_LIMITED;
1562 parser->subsampling_x = parser->subsampling_y =
1563 header->subsampling_x = header->subsampling_y = 1;
1564 parser->bit_depth = header->bit_depth = GST_VP9_BIT_DEPTH_8;
1567 VP9_READ_UINT8 (header->refresh_frame_flags, 8);
1568 rst = parse_frame_size (parser, br, &header->width, &header->height);
1569 if (rst != GST_VP9_PARSER_OK) {
1570 GST_ERROR ("Failed to pase frame size of intra-only frame");
1574 rst = parse_render_size (br, header);
1575 if (rst != GST_VP9_PARSER_OK) {
1576 GST_ERROR ("Failed to parse render size of intra-only frame");
1580 /* copy color_config from previously parsed one */
1581 header->color_space = parser->color_space;
1582 header->color_range = parser->color_range;
1583 header->subsampling_x = parser->subsampling_x;
1584 header->subsampling_y = parser->subsampling_y;
1585 header->bit_depth = parser->bit_depth;
1587 VP9_READ_UINT8 (header->refresh_frame_flags, 8);
1588 for (i = 0; i < GST_VP9_REFS_PER_FRAME; i++) {
1589 VP9_READ_UINT8 (header->ref_frame_idx[i], 3);
1590 VP9_READ_BIT (header->ref_frame_sign_bias[GST_VP9_REF_FRAME_LAST + i]);
1593 rst = parse_frame_size_with_refs (parser, br, header);
1594 if (rst != GST_VP9_PARSER_OK) {
1595 GST_ERROR ("Failed to parse frame size with refs");
1599 VP9_READ_BIT (header->allow_high_precision_mv);
1600 rst = read_interpolation_filter (br, header);
1601 if (rst != GST_VP9_PARSER_OK) {
1602 GST_ERROR ("Failed to read interpolation filter information");
1608 if (!header->error_resilient_mode) {
1609 VP9_READ_BIT (header->refresh_frame_context);
1610 VP9_READ_BIT (header->frame_parallel_decoding_mode);
1612 header->refresh_frame_context = 0;
1613 header->frame_parallel_decoding_mode = 1;
1616 VP9_READ_UINT8 (header->frame_context_idx, 2);
1618 if (frame_is_intra || header->error_resilient_mode)
1619 setup_past_independence (parser, header);
1621 /* First update our own table, and we will copy to frame header later */
1622 rst = parse_loop_filter_params (br, &parser->loop_filter_params);
1623 if (rst != GST_VP9_PARSER_OK) {
1624 GST_ERROR ("Failed to parse loop filter params");
1628 rst = parse_quantization_params (br, header);
1629 if (rst != GST_VP9_PARSER_OK) {
1630 GST_ERROR ("Failed to parse quantization params");
1634 /* Also update our own table, then it will be copied later */
1635 rst = parse_segmentation_params (br, &parser->segmentation_params);
1636 if (rst != GST_VP9_PARSER_OK) {
1637 GST_ERROR ("Failed to parse segmentation params");
1641 rst = parse_tile_info (parser, br, header);
1642 if (rst != GST_VP9_PARSER_OK) {
1643 GST_ERROR ("Failed to parse tile info");
1647 VP9_READ_UINT16 (header->header_size_in_bytes, 16);
1648 if (!header->header_size_in_bytes) {
1649 GST_ERROR ("Failed to parse header size in bytes");
1650 return GST_VP9_PARSER_ERROR;
1653 /* copy our values to header */
1654 memcpy (&header->loop_filter_params, &parser->loop_filter_params,
1655 sizeof (GstVp9LoopFilterParams));
1656 memcpy (&header->segmentation_params, &parser->segmentation_params,
1657 sizeof (GstVp9SegmentationParams));
1659 /* And update reference frames */
1660 for (i = 0; i < GST_VP9_REF_FRAMES; i++) {
1661 guint8 flag = (1 << i);
1662 if ((header->refresh_frame_flags & flag) != 0) {
1663 parser->reference[i].width = header->width;
1664 parser->reference[i].height = header->height;
1668 header->frame_header_length_in_bytes = (gst_bit_reader_get_pos (br) + 7) / 8;
1671 return GST_VP9_PARSER_OK;
1675 * gst_vp9_seg_feature_active:
1676 * @params: a #GstVp9SegmentationParams
1677 * @segment_id: a segment id
1678 * @feature: a segmentation feature
1680 * An implementation of "seg_feature_active" function specified in
1681 * "6.4.9 Segmentation feature active syntax"
1683 * Returns: %TRUE if feature is active
1688 gst_vp9_seg_feature_active (const GstVp9SegmentationParams * params,
1689 guint8 segment_id, guint8 feature)
1691 g_return_val_if_fail (params != NULL, FALSE);
1692 g_return_val_if_fail (segment_id < GST_VP9_MAX_SEGMENTS, FALSE);
1693 g_return_val_if_fail (feature < GST_VP9_SEG_LVL_MAX, FALSE);
1695 return params->segmentation_enabled &&
1696 params->feature_enabled[segment_id][feature];
1700 * gst_vp9_get_qindex:
1701 * @segmentation_params: a #GstVp9SegmentationParams
1702 * @quantization_params: a #GstVp9QuantizationParams
1703 * @segment_id: a segment id
1705 * An implementation of "get_qindex" function specfied in
1706 * "8.6.1 Dequantization functions"
1708 * Returns: the quantizer index
1713 gst_vp9_get_qindex (const GstVp9SegmentationParams * segmentation_params,
1714 const GstVp9QuantizationParams * quantization_params, guint8 segment_id)
1716 guint8 base_q_index;
1718 g_return_val_if_fail (segmentation_params != NULL, 0);
1719 g_return_val_if_fail (quantization_params != NULL, 0);
1720 g_return_val_if_fail (segment_id < GST_VP9_MAX_SEGMENTS, 0);
1722 base_q_index = quantization_params->base_q_idx;
1724 if (gst_vp9_seg_feature_active (segmentation_params, segment_id,
1725 GST_VP9_SEG_LVL_ALT_Q)) {
1727 segmentation_params->feature_data[segment_id][GST_VP9_SEG_LVL_ALT_Q];
1729 if (!segmentation_params->segmentation_abs_or_delta_update)
1730 data += base_q_index;
1732 return CLAMP (data, 0, 255);
1735 return base_q_index;
1739 * gst_vp9_get_dc_quant:
1740 * @qindex: the quantizer index
1741 * @delta_q_dc: a delta_q_dc value
1742 * @bit_depth: coded bit depth
1744 * An implementation of "dc_q" function specified in
1745 * "8.6.1 Dequantization functions"
1747 * Returns: the quantizer value for the dc coefficient
1752 gst_vp9_get_dc_quant (guint8 qindex, gint8 delta_q_dc, guint8 bit_depth)
1754 guint8 q_table_idx = CLAMP (qindex + delta_q_dc, 0, 255);
1756 switch (bit_depth) {
1758 return dc_qlookup[q_table_idx];
1760 return dc_qlookup_10[q_table_idx];
1762 return dc_qlookup_12[q_table_idx];
1764 GST_WARNING ("Unhandled bitdepth %d", bit_depth);
1772 * gst_vp9_get_ac_quant:
1773 * @qindex: the quantizer index
1774 * @delta_q_ac: a delta_q_ac value
1775 * @bit_depth: coded bit depth
1777 * An implementation of "ac_q" function specified in
1778 * "8.6.1 Dequantization functions"
1780 * Returns: the quantizer value for the ac coefficient
1785 gst_vp9_get_ac_quant (guint8 qindex, gint8 delta_q_ac, guint8 bit_depth)
1787 guint8 q_table_idx = CLAMP (qindex + delta_q_ac, 0, 255);
1789 switch (bit_depth) {
1791 return ac_qlookup[q_table_idx];
1793 return ac_qlookup_10[q_table_idx];
1795 return ac_qlookup_12[q_table_idx];
1797 GST_WARNING ("Unhandled bitdepth %d", bit_depth);