blob: 637bc5c87b17b81d886ac4202afab41a38e4b53f [file] [log] [blame]
jackychen98d8cf52015-05-21 11:12:02 -07001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_UTILITY_VP8_HEADER_PARSER_H_
12#define MODULES_VIDEO_CODING_UTILITY_VP8_HEADER_PARSER_H_
jackychen98d8cf52015-05-21 11:12:02 -070013
pbos854e84c2015-11-16 16:39:06 -080014#include <stdint.h>
15#include <stdio.h>
16
jackychen98d8cf52015-05-21 11:12:02 -070017namespace webrtc {
18
19namespace vp8 {
20
21enum {
22 MB_FEATURE_TREE_PROBS = 3,
23 NUM_MB_SEGMENTS = 4,
24 NUM_REF_LF_DELTAS = 4,
25 NUM_MODE_LF_DELTAS = 4,
26};
27
28typedef struct VP8BitReader VP8BitReader;
29struct VP8BitReader {
30 // Boolean decoder.
philipel5908c712015-12-21 08:23:20 -080031 uint32_t value_; // Current value.
32 uint32_t range_; // Current range minus 1. In [127, 254] interval.
33 int bits_; // Number of valid bits left.
jackychen98d8cf52015-05-21 11:12:02 -070034 // Read buffer.
philipel5908c712015-12-21 08:23:20 -080035 const uint8_t* buf_; // Next byte to be read.
36 const uint8_t* buf_end_; // End of read buffer.
37 int eof_; // True if input is exhausted.
jackychen98d8cf52015-05-21 11:12:02 -070038};
39
40const uint8_t kVP8Log2Range[128] = {
philipel5908c712015-12-21 08:23:20 -080041 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3,
42 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
43 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0};
jackychen98d8cf52015-05-21 11:12:02 -070047
48// range = ((range - 1) << kVP8Log2Range[range]) + 1
49const uint8_t kVP8NewRange[128] = {
philipel5908c712015-12-21 08:23:20 -080050 127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239,
51 127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239,
52 247, 127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179,
53 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239,
54 243, 247, 251, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149,
55 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179,
56 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209,
57 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239,
58 241, 243, 245, 247, 249, 251, 253, 127};
jackychen98d8cf52015-05-21 11:12:02 -070059
asapersson86b01602015-10-20 23:55:26 -070060// Gets the QP, QP range: [0, 127].
61// Returns true on success, false otherwise.
62bool GetQp(const uint8_t* buf, size_t length, int* qp);
jackychen98d8cf52015-05-21 11:12:02 -070063
64} // namespace vp8
65
66} // namespace webrtc
67
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020068#endif // MODULES_VIDEO_CODING_UTILITY_VP8_HEADER_PARSER_H_