vp9: re-split the decoder/format/dsp interface header files.
[ffmpeg.git] / libavcodec / vp9.h
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_VP9_H
25 #define AVCODEC_VP9_H
26
27 #include <stddef.h>
28 #include <stdint.h>
29
30 #include "avcodec.h"
31 #include "thread.h"
32 #include "vp56.h"
33
34 enum TxfmMode {
35     TX_4X4,
36     TX_8X8,
37     TX_16X16,
38     TX_32X32,
39     N_TXFM_SIZES,
40     TX_SWITCHABLE = N_TXFM_SIZES,
41     N_TXFM_MODES
42 };
43
44 enum TxfmType {
45     DCT_DCT,
46     DCT_ADST,
47     ADST_DCT,
48     ADST_ADST,
49     N_TXFM_TYPES
50 };
51
52 enum IntraPredMode {
53     VERT_PRED,
54     HOR_PRED,
55     DC_PRED,
56     DIAG_DOWN_LEFT_PRED,
57     DIAG_DOWN_RIGHT_PRED,
58     VERT_RIGHT_PRED,
59     HOR_DOWN_PRED,
60     VERT_LEFT_PRED,
61     HOR_UP_PRED,
62     TM_VP8_PRED,
63     LEFT_DC_PRED,
64     TOP_DC_PRED,
65     DC_128_PRED,
66     DC_127_PRED,
67     DC_129_PRED,
68     N_INTRA_PRED_MODES
69 };
70
71 enum FilterMode {
72     FILTER_8TAP_SMOOTH,
73     FILTER_8TAP_REGULAR,
74     FILTER_8TAP_SHARP,
75     FILTER_BILINEAR,
76     FILTER_SWITCHABLE,
77 };
78
79 enum BlockPartition {
80     PARTITION_NONE,    // [ ] <-.
81     PARTITION_H,       // [-]   |
82     PARTITION_V,       // [|]   |
83     PARTITION_SPLIT,   // [+] --'
84 };
85
86 enum InterPredMode {
87     NEARESTMV = 10,
88     NEARMV    = 11,
89     ZEROMV    = 12,
90     NEWMV     = 13,
91 };
92
93 enum CompPredMode {
94     PRED_SINGLEREF,
95     PRED_COMPREF,
96     PRED_SWITCHABLE,
97 };
98
99 typedef struct VP9mvrefPair {
100     VP56mv mv[2];
101     int8_t ref[2];
102 } VP9mvrefPair;
103
104 typedef struct VP9Frame {
105     ThreadFrame tf;
106     AVBufferRef *extradata;
107     uint8_t *segmentation_map;
108     VP9mvrefPair *mv;
109     int uses_2pass;
110
111     AVBufferRef *hwaccel_priv_buf;
112     void *hwaccel_picture_private;
113 } VP9Frame;
114
115 enum BlockLevel {
116     BL_64X64,
117     BL_32X32,
118     BL_16X16,
119     BL_8X8,
120 };
121
122 enum BlockSize {
123     BS_64x64,
124     BS_64x32,
125     BS_32x64,
126     BS_32x32,
127     BS_32x16,
128     BS_16x32,
129     BS_16x16,
130     BS_16x8,
131     BS_8x16,
132     BS_8x8,
133     BS_8x4,
134     BS_4x8,
135     BS_4x4,
136     N_BS_SIZES,
137 };
138
139 typedef struct VP9BitstreamHeader {
140     // bitstream header
141     uint8_t profile;
142     uint8_t bpp;
143     uint8_t keyframe;
144     uint8_t invisible;
145     uint8_t errorres;
146     uint8_t intraonly;
147     uint8_t resetctx;
148     uint8_t refreshrefmask;
149     uint8_t highprecisionmvs;
150     enum FilterMode filtermode;
151     uint8_t allowcompinter;
152     uint8_t refreshctx;
153     uint8_t parallelmode;
154     uint8_t framectxid;
155     uint8_t use_last_frame_mvs;
156     uint8_t refidx[3];
157     uint8_t signbias[3];
158     uint8_t fixcompref;
159     uint8_t varcompref[2];
160     struct {
161         uint8_t level;
162         int8_t sharpness;
163     } filter;
164     struct {
165         uint8_t enabled;
166         uint8_t updated;
167         int8_t mode[2];
168         int8_t ref[4];
169     } lf_delta;
170     uint8_t yac_qi;
171     int8_t ydc_qdelta, uvdc_qdelta, uvac_qdelta;
172     uint8_t lossless;
173 #define MAX_SEGMENT 8
174     struct {
175         uint8_t enabled;
176         uint8_t temporal;
177         uint8_t absolute_vals;
178         uint8_t update_map;
179         uint8_t prob[7];
180         uint8_t pred_prob[3];
181         struct {
182             uint8_t q_enabled;
183             uint8_t lf_enabled;
184             uint8_t ref_enabled;
185             uint8_t skip_enabled;
186             uint8_t ref_val;
187             int16_t q_val;
188             int8_t lf_val;
189             int16_t qmul[2][2];
190             uint8_t lflvl[4][2];
191         } feat[MAX_SEGMENT];
192     } segmentation;
193     enum TxfmMode txfmmode;
194     enum CompPredMode comppredmode;
195     struct {
196         unsigned log2_tile_cols, log2_tile_rows;
197         unsigned tile_cols, tile_rows;
198     } tiling;
199
200     int uncompressed_header_size;
201     int compressed_header_size;
202 } VP9BitstreamHeader;
203
204 typedef struct VP9SharedContext {
205     VP9BitstreamHeader h;
206
207     ThreadFrame refs[8];
208 #define CUR_FRAME 0
209 #define REF_FRAME_MVPAIR 1
210 #define REF_FRAME_SEGMAP 2
211     VP9Frame frames[3];
212 } VP9SharedContext;
213
214 #endif /* AVCODEC_VP9_H */