ffmpeg / libavcodec / cavs.h @ 3cc3581d
History | View | Annotate | Download (8.93 KB)
1 |
/*
|
---|---|
2 |
* Chinese AVS video (AVS1-P2, JiZhun profile) decoder.
|
3 |
* Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de>
|
4 |
*
|
5 |
* This file is part of FFmpeg.
|
6 |
*
|
7 |
* FFmpeg is free software; you can redistribute it and/or
|
8 |
* modify it under the terms of the GNU Lesser General Public
|
9 |
* License as published by the Free Software Foundation; either
|
10 |
* version 2.1 of the License, or (at your option) any later version.
|
11 |
*
|
12 |
* FFmpeg is distributed in the hope that it will be useful,
|
13 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 |
* Lesser General Public License for more details.
|
16 |
*
|
17 |
* You should have received a copy of the GNU Lesser General Public
|
18 |
* License along with FFmpeg; if not, write to the Free Software
|
19 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 |
*/
|
21 |
|
22 |
#ifndef AVCODEC_CAVS_H
|
23 |
#define AVCODEC_CAVS_H
|
24 |
|
25 |
#include "dsputil.h" |
26 |
#include "mpegvideo.h" |
27 |
|
28 |
#define SLICE_MAX_START_CODE 0x000001af |
29 |
#define EXT_START_CODE 0x000001b5 |
30 |
#define USER_START_CODE 0x000001b2 |
31 |
#define CAVS_START_CODE 0x000001b0 |
32 |
#define PIC_I_START_CODE 0x000001b3 |
33 |
#define PIC_PB_START_CODE 0x000001b6 |
34 |
|
35 |
#define A_AVAIL 1 |
36 |
#define B_AVAIL 2 |
37 |
#define C_AVAIL 4 |
38 |
#define D_AVAIL 8 |
39 |
#define NOT_AVAIL -1 |
40 |
#define REF_INTRA -2 |
41 |
#define REF_DIR -3 |
42 |
|
43 |
#define ESCAPE_CODE 59 |
44 |
|
45 |
#define FWD0 0x01 |
46 |
#define FWD1 0x02 |
47 |
#define BWD0 0x04 |
48 |
#define BWD1 0x08 |
49 |
#define SYM0 0x10 |
50 |
#define SYM1 0x20 |
51 |
#define SPLITH 0x40 |
52 |
#define SPLITV 0x80 |
53 |
|
54 |
#define MV_BWD_OFFS 12 |
55 |
#define MV_STRIDE 4 |
56 |
|
57 |
enum cavs_mb {
|
58 |
I_8X8 = 0,
|
59 |
P_SKIP, |
60 |
P_16X16, |
61 |
P_16X8, |
62 |
P_8X16, |
63 |
P_8X8, |
64 |
B_SKIP, |
65 |
B_DIRECT, |
66 |
B_FWD_16X16, |
67 |
B_BWD_16X16, |
68 |
B_SYM_16X16, |
69 |
B_8X8 = 29
|
70 |
}; |
71 |
|
72 |
enum cavs_sub_mb {
|
73 |
B_SUB_DIRECT, |
74 |
B_SUB_FWD, |
75 |
B_SUB_BWD, |
76 |
B_SUB_SYM |
77 |
}; |
78 |
|
79 |
enum cavs_intra_luma {
|
80 |
INTRA_L_VERT, |
81 |
INTRA_L_HORIZ, |
82 |
INTRA_L_LP, |
83 |
INTRA_L_DOWN_LEFT, |
84 |
INTRA_L_DOWN_RIGHT, |
85 |
INTRA_L_LP_LEFT, |
86 |
INTRA_L_LP_TOP, |
87 |
INTRA_L_DC_128 |
88 |
}; |
89 |
|
90 |
enum cavs_intra_chroma {
|
91 |
INTRA_C_LP, |
92 |
INTRA_C_HORIZ, |
93 |
INTRA_C_VERT, |
94 |
INTRA_C_PLANE, |
95 |
INTRA_C_LP_LEFT, |
96 |
INTRA_C_LP_TOP, |
97 |
INTRA_C_DC_128, |
98 |
}; |
99 |
|
100 |
enum cavs_mv_pred {
|
101 |
MV_PRED_MEDIAN, |
102 |
MV_PRED_LEFT, |
103 |
MV_PRED_TOP, |
104 |
MV_PRED_TOPRIGHT, |
105 |
MV_PRED_PSKIP, |
106 |
MV_PRED_BSKIP |
107 |
}; |
108 |
|
109 |
enum cavs_block {
|
110 |
BLK_16X16, |
111 |
BLK_16X8, |
112 |
BLK_8X16, |
113 |
BLK_8X8 |
114 |
}; |
115 |
|
116 |
enum cavs_mv_loc {
|
117 |
MV_FWD_D3 = 0,
|
118 |
MV_FWD_B2, |
119 |
MV_FWD_B3, |
120 |
MV_FWD_C2, |
121 |
MV_FWD_A1, |
122 |
MV_FWD_X0, |
123 |
MV_FWD_X1, |
124 |
MV_FWD_A3 = 8,
|
125 |
MV_FWD_X2, |
126 |
MV_FWD_X3, |
127 |
MV_BWD_D3 = MV_BWD_OFFS, |
128 |
MV_BWD_B2, |
129 |
MV_BWD_B3, |
130 |
MV_BWD_C2, |
131 |
MV_BWD_A1, |
132 |
MV_BWD_X0, |
133 |
MV_BWD_X1, |
134 |
MV_BWD_A3 = MV_BWD_OFFS+8,
|
135 |
MV_BWD_X2, |
136 |
MV_BWD_X3 |
137 |
}; |
138 |
|
139 |
DECLARE_ALIGNED_8(typedef, struct) { |
140 |
int16_t x; |
141 |
int16_t y; |
142 |
int16_t dist; |
143 |
int16_t ref; |
144 |
} cavs_vector; |
145 |
|
146 |
struct dec_2dvlc {
|
147 |
int8_t rltab[59][3]; |
148 |
int8_t level_add[27];
|
149 |
int8_t golomb_order; |
150 |
int inc_limit;
|
151 |
int8_t max_run; |
152 |
}; |
153 |
|
154 |
typedef struct { |
155 |
MpegEncContext s; |
156 |
Picture picture; ///< currently decoded frame
|
157 |
Picture DPB[2]; ///< reference frames |
158 |
int dist[2]; ///< temporal distances from current frame to ref frames |
159 |
int profile, level;
|
160 |
int aspect_ratio;
|
161 |
int mb_width, mb_height;
|
162 |
int pic_type;
|
163 |
int stream_revision; ///<0 for samples from 2006, 1 for rm52j encoder |
164 |
int progressive;
|
165 |
int pic_structure;
|
166 |
int skip_mode_flag; ///< select between skip_count or one skip_flag per MB |
167 |
int loop_filter_disable;
|
168 |
int alpha_offset, beta_offset;
|
169 |
int ref_flag;
|
170 |
int mbx, mby, mbidx; ///< macroblock coordinates |
171 |
int flags; ///< availability flags of neighbouring macroblocks |
172 |
int stc; ///< last start code |
173 |
uint8_t *cy, *cu, *cv; ///< current MB sample pointers
|
174 |
int left_qp;
|
175 |
uint8_t *top_qp; |
176 |
|
177 |
/** mv motion vector cache
|
178 |
0: D3 B2 B3 C2
|
179 |
4: A1 X0 X1 -
|
180 |
8: A3 X2 X3 -
|
181 |
|
182 |
X are the vectors in the current macroblock (5,6,9,10)
|
183 |
A is the macroblock to the left (4,8)
|
184 |
B is the macroblock to the top (1,2)
|
185 |
C is the macroblock to the top-right (3)
|
186 |
D is the macroblock to the top-left (0)
|
187 |
|
188 |
the same is repeated for backward motion vectors */
|
189 |
cavs_vector mv[2*4*3]; |
190 |
cavs_vector *top_mv[2];
|
191 |
cavs_vector *col_mv; |
192 |
|
193 |
/** luma pred mode cache
|
194 |
0: -- B2 B3
|
195 |
3: A1 X0 X1
|
196 |
6: A3 X2 X3 */
|
197 |
int pred_mode_Y[3*3]; |
198 |
int *top_pred_Y;
|
199 |
int l_stride, c_stride;
|
200 |
int luma_scan[4]; |
201 |
int qp;
|
202 |
int qp_fixed;
|
203 |
int cbp;
|
204 |
ScanTable scantable; |
205 |
|
206 |
/** intra prediction is done with un-deblocked samples
|
207 |
they are saved here before deblocking the MB */
|
208 |
uint8_t *top_border_y, *top_border_u, *top_border_v; |
209 |
uint8_t left_border_y[26], left_border_u[10], left_border_v[10]; |
210 |
uint8_t intern_border_y[26];
|
211 |
uint8_t topleft_border_y, topleft_border_u, topleft_border_v; |
212 |
|
213 |
void (*intra_pred_l[8])(uint8_t *d,uint8_t *top,uint8_t *left,int stride); |
214 |
void (*intra_pred_c[7])(uint8_t *d,uint8_t *top,uint8_t *left,int stride); |
215 |
uint8_t *col_type_base; |
216 |
|
217 |
/* scaling factors for MV prediction */
|
218 |
int sym_factor; ///< for scaling in symmetrical B block |
219 |
int direct_den[2]; ///< for scaling in direct B block |
220 |
int scale_den[2]; ///< for scaling neighbouring MVs |
221 |
|
222 |
int got_keyframe;
|
223 |
DCTELEM *block; |
224 |
} AVSContext; |
225 |
|
226 |
extern const uint8_t ff_cavs_dequant_shift[64]; |
227 |
extern const uint16_t ff_cavs_dequant_mul[64]; |
228 |
extern const struct dec_2dvlc ff_cavs_intra_dec[7]; |
229 |
extern const struct dec_2dvlc ff_cavs_inter_dec[7]; |
230 |
extern const struct dec_2dvlc ff_cavs_chroma_dec[5]; |
231 |
extern const uint8_t ff_cavs_chroma_qp[64]; |
232 |
extern const uint8_t ff_cavs_scan3x3[4]; |
233 |
extern const uint8_t ff_cavs_partition_flags[30]; |
234 |
extern const int_fast8_t ff_left_modifier_l[8]; |
235 |
extern const int_fast8_t ff_top_modifier_l[8]; |
236 |
extern const int_fast8_t ff_left_modifier_c[7]; |
237 |
extern const int_fast8_t ff_top_modifier_c[7]; |
238 |
extern const cavs_vector ff_cavs_intra_mv; |
239 |
extern const cavs_vector ff_cavs_un_mv; |
240 |
extern const cavs_vector ff_cavs_dir_mv; |
241 |
|
242 |
static inline void modify_pred(const int_fast8_t *mod_table, int *mode) { |
243 |
*mode = mod_table[*mode]; |
244 |
if(*mode < 0) { |
245 |
av_log(NULL, AV_LOG_ERROR, "Illegal intra prediction mode\n"); |
246 |
*mode = 0;
|
247 |
} |
248 |
} |
249 |
|
250 |
static inline void set_intra_mode_default(AVSContext *h) { |
251 |
if(h->stream_revision > 0) { |
252 |
h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL; |
253 |
h->top_pred_Y[h->mbx*2+0] = h->top_pred_Y[h->mbx*2+1] = NOT_AVAIL; |
254 |
} else {
|
255 |
h->pred_mode_Y[3] = h->pred_mode_Y[6] = INTRA_L_LP; |
256 |
h->top_pred_Y[h->mbx*2+0] = h->top_pred_Y[h->mbx*2+1] = INTRA_L_LP; |
257 |
} |
258 |
} |
259 |
|
260 |
static inline void set_mvs(cavs_vector *mv, enum cavs_block size) { |
261 |
switch(size) {
|
262 |
case BLK_16X16:
|
263 |
mv[MV_STRIDE ] = mv[0];
|
264 |
mv[MV_STRIDE+1] = mv[0]; |
265 |
case BLK_16X8:
|
266 |
mv[1] = mv[0]; |
267 |
break;
|
268 |
case BLK_8X16:
|
269 |
mv[MV_STRIDE] = mv[0];
|
270 |
break;
|
271 |
} |
272 |
} |
273 |
|
274 |
static inline void set_mv_intra(AVSContext *h) { |
275 |
h->mv[MV_FWD_X0] = ff_cavs_intra_mv; |
276 |
set_mvs(&h->mv[MV_FWD_X0], BLK_16X16); |
277 |
h->mv[MV_BWD_X0] = ff_cavs_intra_mv; |
278 |
set_mvs(&h->mv[MV_BWD_X0], BLK_16X16); |
279 |
if(h->pic_type != FF_B_TYPE)
|
280 |
h->col_type_base[h->mbidx] = I_8X8; |
281 |
} |
282 |
|
283 |
static inline int dequant(AVSContext *h, DCTELEM *level_buf, uint8_t *run_buf, |
284 |
DCTELEM *dst, int mul, int shift, int coeff_num) { |
285 |
int round = 1 << (shift - 1); |
286 |
int pos = -1; |
287 |
const uint8_t *scantab = h->scantable.permutated;
|
288 |
|
289 |
/* inverse scan and dequantization */
|
290 |
while(--coeff_num >= 0){ |
291 |
pos += run_buf[coeff_num]; |
292 |
if(pos > 63) { |
293 |
av_log(h->s.avctx, AV_LOG_ERROR, |
294 |
"position out of block bounds at pic %d MB(%d,%d)\n",
|
295 |
h->picture.poc, h->mbx, h->mby); |
296 |
return -1; |
297 |
} |
298 |
dst[scantab[pos]] = (level_buf[coeff_num]*mul + round) >> shift; |
299 |
} |
300 |
return 0; |
301 |
} |
302 |
|
303 |
void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type); |
304 |
void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left,
|
305 |
int block);
|
306 |
void ff_cavs_load_intra_pred_chroma(AVSContext *h);
|
307 |
void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv); |
308 |
void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type); |
309 |
void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC, |
310 |
enum cavs_mv_pred mode, enum cavs_block size, int ref); |
311 |
void ff_cavs_init_mb(AVSContext *h);
|
312 |
int ff_cavs_next_mb(AVSContext *h);
|
313 |
void ff_cavs_init_pic(AVSContext *h);
|
314 |
void ff_cavs_init_top_lines(AVSContext *h);
|
315 |
int ff_cavs_init(AVCodecContext *avctx);
|
316 |
int ff_cavs_end (AVCodecContext *avctx);
|
317 |
|
318 |
#endif /* AVCODEC_CAVS_H */ |