blob: 54726df742f90c12d10ae810067dd1896d7a0c2f
1 | /* |
2 | * VP9 compatible video decoder |
3 | * |
4 | * Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com> |
5 | * Copyright (C) 2013 Clément Bœsch <u pkh me> |
6 | * |
7 | * This file is part of FFmpeg. |
8 | * |
9 | * FFmpeg 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. |
13 | * |
14 | * FFmpeg 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. |
18 | * |
19 | * You should have received a copy of the GNU Lesser General Public |
20 | * License along with FFmpeg; if not, write to the Free Software |
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
22 | */ |
23 | |
24 | #ifndef AVCODEC_VP9SHARED_H |
25 | #define AVCODEC_VP9SHARED_H |
26 | |
27 | #include <stddef.h> |
28 | #include <stdint.h> |
29 | |
30 | #include "vp9.h" |
31 | #include "thread.h" |
32 | #include "vp56.h" |
33 | |
34 | enum BlockPartition { |
35 | PARTITION_NONE, // [ ] <-. |
36 | PARTITION_H, // [-] | |
37 | PARTITION_V, // [|] | |
38 | PARTITION_SPLIT, // [+] --' |
39 | }; |
40 | |
41 | enum InterPredMode { |
42 | NEARESTMV = 10, |
43 | NEARMV = 11, |
44 | ZEROMV = 12, |
45 | NEWMV = 13, |
46 | }; |
47 | |
48 | enum CompPredMode { |
49 | PRED_SINGLEREF, |
50 | PRED_COMPREF, |
51 | PRED_SWITCHABLE, |
52 | }; |
53 | |
54 | typedef struct VP9mvrefPair { |
55 | VP56mv mv[2]; |
56 | int8_t ref[2]; |
57 | } VP9mvrefPair; |
58 | |
59 | typedef struct VP9Frame { |
60 | ThreadFrame tf; |
61 | AVBufferRef *extradata; |
62 | uint8_t *segmentation_map; |
63 | VP9mvrefPair *mv; |
64 | int uses_2pass; |
65 | |
66 | AVBufferRef *hwaccel_priv_buf; |
67 | void *hwaccel_picture_private; |
68 | } VP9Frame; |
69 | |
70 | enum BlockLevel { |
71 | BL_64X64, |
72 | BL_32X32, |
73 | BL_16X16, |
74 | BL_8X8, |
75 | }; |
76 | |
77 | enum BlockSize { |
78 | BS_64x64, |
79 | BS_64x32, |
80 | BS_32x64, |
81 | BS_32x32, |
82 | BS_32x16, |
83 | BS_16x32, |
84 | BS_16x16, |
85 | BS_16x8, |
86 | BS_8x16, |
87 | BS_8x8, |
88 | BS_8x4, |
89 | BS_4x8, |
90 | BS_4x4, |
91 | N_BS_SIZES, |
92 | }; |
93 | |
94 | typedef struct VP9BitstreamHeader { |
95 | // bitstream header |
96 | uint8_t profile; |
97 | uint8_t bpp; |
98 | uint8_t keyframe; |
99 | uint8_t invisible; |
100 | uint8_t errorres; |
101 | uint8_t intraonly; |
102 | uint8_t resetctx; |
103 | uint8_t refreshrefmask; |
104 | uint8_t highprecisionmvs; |
105 | enum FilterMode filtermode; |
106 | uint8_t allowcompinter; |
107 | uint8_t refreshctx; |
108 | uint8_t parallelmode; |
109 | uint8_t framectxid; |
110 | uint8_t use_last_frame_mvs; |
111 | uint8_t refidx[3]; |
112 | uint8_t signbias[3]; |
113 | uint8_t fixcompref; |
114 | uint8_t varcompref[2]; |
115 | struct { |
116 | uint8_t level; |
117 | int8_t sharpness; |
118 | } filter; |
119 | struct { |
120 | uint8_t enabled; |
121 | uint8_t updated; |
122 | int8_t mode[2]; |
123 | int8_t ref[4]; |
124 | } lf_delta; |
125 | uint8_t yac_qi; |
126 | int8_t ydc_qdelta, uvdc_qdelta, uvac_qdelta; |
127 | uint8_t lossless; |
128 | #define MAX_SEGMENT 8 |
129 | struct { |
130 | uint8_t enabled; |
131 | uint8_t temporal; |
132 | uint8_t absolute_vals; |
133 | uint8_t update_map; |
134 | uint8_t prob[7]; |
135 | uint8_t pred_prob[3]; |
136 | struct { |
137 | uint8_t q_enabled; |
138 | uint8_t lf_enabled; |
139 | uint8_t ref_enabled; |
140 | uint8_t skip_enabled; |
141 | uint8_t ref_val; |
142 | int16_t q_val; |
143 | int8_t lf_val; |
144 | int16_t qmul[2][2]; |
145 | uint8_t lflvl[4][2]; |
146 | } feat[MAX_SEGMENT]; |
147 | } segmentation; |
148 | enum TxfmMode txfmmode; |
149 | enum CompPredMode comppredmode; |
150 | struct { |
151 | unsigned log2_tile_cols, log2_tile_rows; |
152 | unsigned tile_cols, tile_rows; |
153 | } tiling; |
154 | |
155 | int uncompressed_header_size; |
156 | int compressed_header_size; |
157 | } VP9BitstreamHeader; |
158 | |
159 | typedef struct VP9SharedContext { |
160 | VP9BitstreamHeader h; |
161 | |
162 | ThreadFrame refs[8]; |
163 | #define CUR_FRAME 0 |
164 | #define REF_FRAME_MVPAIR 1 |
165 | #define REF_FRAME_SEGMAP 2 |
166 | VP9Frame frames[3]; |
167 | } VP9SharedContext; |
168 | |
169 | #endif /* AVCODEC_VP9SHARED_H */ |
170 |