30
30
#include "golomb.h"
31
31
#include "mathops.h"
34
static const uint8_t alpha_tab[64] = {
35
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3,
36
4, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 20,
37
22, 24, 26, 28, 30, 33, 33, 35, 35, 36, 37, 37, 39, 39, 42, 44,
38
46, 48, 50, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
41
static const uint8_t beta_tab[64] = {
42
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
43
2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
44
6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14,
45
15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27
48
static const uint8_t tc_tab[64] = {
49
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
51
2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
52
5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9
55
/** mark block as unavailable, i.e. out of picture
57
static const cavs_vector un_mv = { 0, 0, 1, NOT_AVAIL };
59
static const int8_t left_modifier_l[8] = { 0, -1, 6, -1, -1, 7, 6, 7 };
60
static const int8_t top_modifier_l[8] = { -1, 1, 5, -1, -1, 5, 7, 7 };
61
static const int8_t left_modifier_c[7] = { 5, -1, 2, -1, 6, 5, 6 };
62
static const int8_t top_modifier_c[7] = { 4, 1, -1, -1, 4, 6, 6 };
35
64
/*****************************************************************************
75
void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type) {
105
void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type)
77
108
int qp_avg, alpha, beta, tc;
80
111
/* save un-deblocked lines */
81
h->topleft_border_y = h->top_border_y[h->mbx*16+15];
82
h->topleft_border_u = h->top_border_u[h->mbx*10+8];
83
h->topleft_border_v = h->top_border_v[h->mbx*10+8];
84
memcpy(&h->top_border_y[h->mbx*16], h->cy + 15* h->l_stride,16);
85
memcpy(&h->top_border_u[h->mbx*10+1], h->cu + 7* h->c_stride,8);
86
memcpy(&h->top_border_v[h->mbx*10+1], h->cv + 7* h->c_stride,8);
88
h->left_border_y[i*2+1] = *(h->cy + 15 + (i*2+0)*h->l_stride);
89
h->left_border_y[i*2+2] = *(h->cy + 15 + (i*2+1)*h->l_stride);
90
h->left_border_u[i+1] = *(h->cu + 7 + i*h->c_stride);
91
h->left_border_v[i+1] = *(h->cv + 7 + i*h->c_stride);
112
h->topleft_border_y = h->top_border_y[h->mbx * 16 + 15];
113
h->topleft_border_u = h->top_border_u[h->mbx * 10 + 8];
114
h->topleft_border_v = h->top_border_v[h->mbx * 10 + 8];
115
memcpy(&h->top_border_y[h->mbx * 16], h->cy + 15 * h->l_stride, 16);
116
memcpy(&h->top_border_u[h->mbx * 10 + 1], h->cu + 7 * h->c_stride, 8);
117
memcpy(&h->top_border_v[h->mbx * 10 + 1], h->cv + 7 * h->c_stride, 8);
118
for (i = 0; i < 8; i++) {
119
h->left_border_y[i * 2 + 1] = *(h->cy + 15 + (i * 2 + 0) * h->l_stride);
120
h->left_border_y[i * 2 + 2] = *(h->cy + 15 + (i * 2 + 1) * h->l_stride);
121
h->left_border_u[i + 1] = *(h->cu + 7 + i * h->c_stride);
122
h->left_border_v[i + 1] = *(h->cv + 7 + i * h->c_stride);
93
if(!h->loop_filter_disable) {
124
if (!h->loop_filter_disable) {
94
125
/* determine bs */
126
if (mb_type == I_8X8)
99
if(ff_cavs_partition_flags[mb_type] & SPLITV){
130
if (ff_cavs_partition_flags[mb_type] & SPLITV) {
100
131
bs[2] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1], mb_type > P_8X8);
101
132
bs[3] = get_bs(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3], mb_type > P_8X8);
103
if(ff_cavs_partition_flags[mb_type] & SPLITH){
134
if (ff_cavs_partition_flags[mb_type] & SPLITH) {
104
135
bs[6] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2], mb_type > P_8X8);
105
136
bs[7] = get_bs(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3], mb_type > P_8X8);
109
140
bs[4] = get_bs(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0], mb_type > P_8X8);
110
141
bs[5] = get_bs(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1], mb_type > P_8X8);
113
if(h->flags & A_AVAIL) {
144
if (h->flags & A_AVAIL) {
114
145
qp_avg = (h->qp + h->left_qp + 1) >> 1;
116
h->cdsp.cavs_filter_lv(h->cy,h->l_stride,alpha,beta,tc,bs[0],bs[1]);
117
h->cdsp.cavs_filter_cv(h->cu,h->c_stride,alpha,beta,tc,bs[0],bs[1]);
118
h->cdsp.cavs_filter_cv(h->cv,h->c_stride,alpha,beta,tc,bs[0],bs[1]);
147
h->cdsp.cavs_filter_lv(h->cy, h->l_stride, alpha, beta, tc, bs[0], bs[1]);
148
h->cdsp.cavs_filter_cv(h->cu, h->c_stride, alpha, beta, tc, bs[0], bs[1]);
149
h->cdsp.cavs_filter_cv(h->cv, h->c_stride, alpha, beta, tc, bs[0], bs[1]);
122
h->cdsp.cavs_filter_lv(h->cy + 8,h->l_stride,alpha,beta,tc,bs[2],bs[3]);
123
h->cdsp.cavs_filter_lh(h->cy + 8*h->l_stride,h->l_stride,alpha,beta,tc,
153
h->cdsp.cavs_filter_lv(h->cy + 8, h->l_stride, alpha, beta, tc, bs[2], bs[3]);
154
h->cdsp.cavs_filter_lh(h->cy + 8 * h->l_stride, h->l_stride, alpha, beta, tc, bs[6], bs[7]);
126
if(h->flags & B_AVAIL) {
156
if (h->flags & B_AVAIL) {
127
157
qp_avg = (h->qp + h->top_qp[h->mbx] + 1) >> 1;
129
h->cdsp.cavs_filter_lh(h->cy,h->l_stride,alpha,beta,tc,bs[4],bs[5]);
130
h->cdsp.cavs_filter_ch(h->cu,h->c_stride,alpha,beta,tc,bs[4],bs[5]);
131
h->cdsp.cavs_filter_ch(h->cv,h->c_stride,alpha,beta,tc,bs[4],bs[5]);
159
h->cdsp.cavs_filter_lh(h->cy, h->l_stride, alpha, beta, tc, bs[4], bs[5]);
160
h->cdsp.cavs_filter_ch(h->cu, h->c_stride, alpha, beta, tc, bs[4], bs[5]);
161
h->cdsp.cavs_filter_ch(h->cv, h->c_stride, alpha, beta, tc, bs[4], bs[5]);
136
166
h->top_qp[h->mbx] = h->qp;
145
175
****************************************************************************/
147
177
void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top,
148
uint8_t **left, int block) {
178
uint8_t **left, int block)
153
*left = h->left_border_y;
184
*left = h->left_border_y;
154
185
h->left_border_y[0] = h->left_border_y[1];
155
memset(&h->left_border_y[17],h->left_border_y[16],9);
156
memcpy(&top[1],&h->top_border_y[h->mbx*16],16);
186
memset(&h->left_border_y[17], h->left_border_y[16], 9);
187
memcpy(&top[1], &h->top_border_y[h->mbx * 16], 16);
157
188
top[17] = top[16];
159
if((h->flags & A_AVAIL) && (h->flags & B_AVAIL))
190
if ((h->flags & A_AVAIL) && (h->flags & B_AVAIL))
160
191
h->left_border_y[0] = top[0] = h->topleft_border_y;
163
194
*left = h->intern_border_y;
165
h->intern_border_y[i+1] = *(h->cy + 7 + i*h->l_stride);
166
memset(&h->intern_border_y[9],h->intern_border_y[8],9);
195
for (i = 0; i < 8; i++)
196
h->intern_border_y[i + 1] = *(h->cy + 7 + i * h->l_stride);
197
memset(&h->intern_border_y[9], h->intern_border_y[8], 9);
167
198
h->intern_border_y[0] = h->intern_border_y[1];
168
memcpy(&top[1],&h->top_border_y[h->mbx*16+8],8);
169
if(h->flags & C_AVAIL)
170
memcpy(&top[9],&h->top_border_y[(h->mbx + 1)*16],8);
199
memcpy(&top[1], &h->top_border_y[h->mbx * 16 + 8], 8);
200
if (h->flags & C_AVAIL)
201
memcpy(&top[9], &h->top_border_y[(h->mbx + 1) * 16], 8);
172
memset(&top[9],top[8],9);
203
memset(&top[9], top[8], 9);
173
204
top[17] = top[16];
175
if(h->flags & B_AVAIL)
176
h->intern_border_y[0] = top[0] = h->top_border_y[h->mbx*16+7];
206
if (h->flags & B_AVAIL)
207
h->intern_border_y[0] = top[0] = h->top_border_y[h->mbx * 16 + 7];
179
210
*left = &h->left_border_y[8];
180
memcpy(&top[1],h->cy + 7*h->l_stride,16);
211
memcpy(&top[1], h->cy + 7 * h->l_stride, 16);
181
212
top[17] = top[16];
183
if(h->flags & A_AVAIL)
214
if (h->flags & A_AVAIL)
184
215
top[0] = h->left_border_y[8];
187
218
*left = &h->intern_border_y[8];
189
h->intern_border_y[i+9] = *(h->cy + 7 + (i+8)*h->l_stride);
190
memset(&h->intern_border_y[17],h->intern_border_y[16],9);
191
memcpy(&top[0],h->cy + 7 + 7*h->l_stride,9);
192
memset(&top[9],top[8],9);
219
for (i = 0; i < 8; i++)
220
h->intern_border_y[i + 9] = *(h->cy + 7 + (i + 8) * h->l_stride);
221
memset(&h->intern_border_y[17], h->intern_border_y[16], 9);
222
memcpy(&top[0], h->cy + 7 + 7 * h->l_stride, 9);
223
memset(&top[9], top[8], 9);
197
void ff_cavs_load_intra_pred_chroma(AVSContext *h) {
228
void ff_cavs_load_intra_pred_chroma(AVSContext *h)
198
230
/* extend borders by one pixel */
199
231
h->left_border_u[9] = h->left_border_u[8];
200
232
h->left_border_v[9] = h->left_border_v[8];
201
h->top_border_u[h->mbx*10+9] = h->top_border_u[h->mbx*10+8];
202
h->top_border_v[h->mbx*10+9] = h->top_border_v[h->mbx*10+8];
203
if(h->mbx && h->mby) {
204
h->top_border_u[h->mbx*10] = h->left_border_u[0] = h->topleft_border_u;
205
h->top_border_v[h->mbx*10] = h->left_border_v[0] = h->topleft_border_v;
233
h->top_border_u[h->mbx * 10 + 9] = h->top_border_u[h->mbx * 10 + 8];
234
h->top_border_v[h->mbx * 10 + 9] = h->top_border_v[h->mbx * 10 + 8];
235
if (h->mbx && h->mby) {
236
h->top_border_u[h->mbx * 10] = h->left_border_u[0] = h->topleft_border_u;
237
h->top_border_v[h->mbx * 10] = h->left_border_v[0] = h->topleft_border_v;
207
239
h->left_border_u[0] = h->left_border_u[1];
208
240
h->left_border_v[0] = h->left_border_v[1];
209
h->top_border_u[h->mbx*10] = h->top_border_u[h->mbx*10+1];
210
h->top_border_v[h->mbx*10] = h->top_border_v[h->mbx*10+1];
241
h->top_border_u[h->mbx * 10] = h->top_border_u[h->mbx * 10 + 1];
242
h->top_border_v[h->mbx * 10] = h->top_border_v[h->mbx * 10 + 1];
214
static void intra_pred_vert(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
246
static void intra_pred_vert(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
216
249
uint64_t a = AV_RN64(&top[1]);
218
*((uint64_t *)(d+y*stride)) = a;
250
for (y = 0; y < 8; y++) {
251
*((uint64_t *)(d + y * stride)) = a;
222
static void intra_pred_horiz(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
255
static void intra_pred_horiz(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
226
a = left[y+1] * 0x0101010101010101ULL;
227
*((uint64_t *)(d+y*stride)) = a;
259
for (y = 0; y < 8; y++) {
260
a = left[y + 1] * 0x0101010101010101ULL;
261
*((uint64_t *)(d + y * stride)) = a;
231
static void intra_pred_dc_128(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
265
static void intra_pred_dc_128(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
233
268
uint64_t a = 0x8080808080808080ULL;
235
*((uint64_t *)(d+y*stride)) = a;
269
for (y = 0; y < 8; y++)
270
*((uint64_t *)(d + y * stride)) = a;
238
static void intra_pred_plane(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
273
static void intra_pred_plane(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
242
278
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
245
ih += (x+1)*(top[5+x]-top[3-x]);
246
iv += (x+1)*(left[5+x]-left[3-x]);
280
for (x = 0; x < 4; x++) {
281
ih += (x + 1) * (top [5 + x] - top [3 - x]);
282
iv += (x + 1) * (left[5 + x] - left[3 - x]);
248
ia = (top[8]+left[8])<<4;
253
d[y*stride+x] = cm[(ia+(x-3)*ih+(y-3)*iv+16)>>5];
284
ia = (top[8] + left[8]) << 4;
285
ih = (17 * ih + 16) >> 5;
286
iv = (17 * iv + 16) >> 5;
287
for (y = 0; y < 8; y++)
288
for (x = 0; x < 8; x++)
289
d[y * stride + x] = cm[(ia + (x - 3) * ih + (y - 3) * iv + 16) >> 5];
256
292
#define LOWPASS(ARRAY,INDEX) \
257
(( ARRAY[(INDEX)-1] + 2*ARRAY[(INDEX)] + ARRAY[(INDEX)+1] + 2) >> 2)
259
static void intra_pred_lp(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
263
d[y*stride+x] = (LOWPASS(top,x+1) + LOWPASS(left,y+1)) >> 1;
266
static void intra_pred_down_left(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
270
d[y*stride+x] = (LOWPASS(top,x+y+2) + LOWPASS(left,x+y+2)) >> 1;
273
static void intra_pred_down_right(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
278
d[y*stride+x] = (left[1]+2*top[0]+top[1]+2)>>2;
280
d[y*stride+x] = LOWPASS(top,x-y);
293
((ARRAY[(INDEX) - 1] + 2 * ARRAY[(INDEX)] + ARRAY[(INDEX) + 1] + 2) >> 2)
295
static void intra_pred_lp(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
298
for (y = 0; y < 8; y++)
299
for (x = 0; x < 8; x++)
300
d[y * stride + x] = (LOWPASS(top, x + 1) + LOWPASS(left, y + 1)) >> 1;
303
static void intra_pred_down_left(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
306
for (y = 0; y < 8; y++)
307
for (x = 0; x < 8; x++)
308
d[y * stride + x] = (LOWPASS(top, x + y + 2) + LOWPASS(left, x + y + 2)) >> 1;
311
static void intra_pred_down_right(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
314
for (y = 0; y < 8; y++)
315
for (x = 0; x < 8; x++)
317
d[y * stride + x] = (left[1] + 2 * top[0] + top[1] + 2) >> 2;
319
d[y * stride + x] = LOWPASS(top, x - y);
282
d[y*stride+x] = LOWPASS(left,y-x);
285
static void intra_pred_lp_left(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
289
d[y*stride+x] = LOWPASS(left,y+1);
292
static void intra_pred_lp_top(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
296
d[y*stride+x] = LOWPASS(top,x+1);
321
d[y * stride + x] = LOWPASS(left, y - x);
324
static void intra_pred_lp_left(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
327
for (y = 0; y < 8; y++)
328
for (x = 0; x < 8; x++)
329
d[y * stride + x] = LOWPASS(left, y + 1);
332
static void intra_pred_lp_top(uint8_t *d,uint8_t *top,uint8_t *left,int stride)
335
for (y = 0; y < 8; y++)
336
for (x = 0; x < 8; x++)
337
d[y * stride + x] = LOWPASS(top, x + 1);
301
void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv) {
342
static inline void modify_pred(const int8_t *mod_table, int *mode)
344
*mode = mod_table[*mode];
346
av_log(NULL, AV_LOG_ERROR, "Illegal intra prediction mode\n");
351
void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv)
302
353
/* save pred modes before they get modified */
303
354
h->pred_mode_Y[3] = h->pred_mode_Y[5];
304
355
h->pred_mode_Y[6] = h->pred_mode_Y[8];
305
h->top_pred_Y[h->mbx*2+0] = h->pred_mode_Y[7];
306
h->top_pred_Y[h->mbx*2+1] = h->pred_mode_Y[8];
356
h->top_pred_Y[h->mbx * 2 + 0] = h->pred_mode_Y[7];
357
h->top_pred_Y[h->mbx * 2 + 1] = h->pred_mode_Y[8];
308
359
/* modify pred modes according to availability of neighbour samples */
309
if(!(h->flags & A_AVAIL)) {
310
modify_pred(ff_left_modifier_l, &h->pred_mode_Y[4] );
311
modify_pred(ff_left_modifier_l, &h->pred_mode_Y[7] );
312
modify_pred(ff_left_modifier_c, pred_mode_uv );
360
if (!(h->flags & A_AVAIL)) {
361
modify_pred(left_modifier_l, &h->pred_mode_Y[4]);
362
modify_pred(left_modifier_l, &h->pred_mode_Y[7]);
363
modify_pred(left_modifier_c, pred_mode_uv);
314
if(!(h->flags & B_AVAIL)) {
315
modify_pred(ff_top_modifier_l, &h->pred_mode_Y[4] );
316
modify_pred(ff_top_modifier_l, &h->pred_mode_Y[5] );
317
modify_pred(ff_top_modifier_c, pred_mode_uv );
365
if (!(h->flags & B_AVAIL)) {
366
modify_pred(top_modifier_l, &h->pred_mode_Y[4]);
367
modify_pred(top_modifier_l, &h->pred_mode_Y[5]);
368
modify_pred(top_modifier_c, pred_mode_uv);
353
404
|| full_my < 0-extra_height
354
405
|| full_mx + 16/*FIXME*/ > pic_width + extra_width
355
406
|| full_my + 16/*FIXME*/ > pic_height + extra_height){
356
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src_y - 2 - 2*h->l_stride, h->l_stride,
407
h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_y - 2 - 2*h->l_stride, h->l_stride,
357
408
16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, pic_width, pic_height);
358
src_y= s->edge_emu_buffer + 2 + 2*h->l_stride;
409
src_y= h->edge_emu_buffer + 2 + 2*h->l_stride;
362
413
qpix_op[luma_xy](dest_y, src_y, h->l_stride); //FIXME try variable height perhaps?
364
qpix_op[luma_xy](dest_y + delta, src_y + delta, h->l_stride);
368
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src_cb, h->c_stride,
416
h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_cb, h->c_stride,
369
417
9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1);
370
src_cb= s->edge_emu_buffer;
418
src_cb= h->edge_emu_buffer;
372
420
chroma_op(dest_cb, src_cb, h->c_stride, chroma_height, mx&7, my&7);
375
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src_cr, h->c_stride,
423
h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_cr, h->c_stride,
376
424
9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1);
377
src_cr= s->edge_emu_buffer;
425
src_cr= h->edge_emu_buffer;
379
427
chroma_op(dest_cr, src_cr, h->c_stride, chroma_height, mx&7, my&7);
382
static inline void mc_part_std(AVSContext *h,int square,int chroma_height,int delta,
383
uint8_t *dest_y,uint8_t *dest_cb,uint8_t *dest_cr,
384
int x_offset, int y_offset,qpel_mc_func *qpix_put,
385
h264_chroma_mc_func chroma_put,qpel_mc_func *qpix_avg,
386
h264_chroma_mc_func chroma_avg, cavs_vector *mv){
430
static inline void mc_part_std(AVSContext *h,int chroma_height,int delta,
431
uint8_t *dest_y,uint8_t *dest_cb,uint8_t *dest_cr,
432
int x_offset, int y_offset,qpel_mc_func *qpix_put,
433
h264_chroma_mc_func chroma_put,qpel_mc_func *qpix_avg,
434
h264_chroma_mc_func chroma_avg, cavs_vector *mv)
387
436
qpel_mc_func *qpix_op= qpix_put;
388
437
h264_chroma_mc_func chroma_op= chroma_put;
414
463
void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type) {
415
464
if(ff_cavs_partition_flags[mb_type] == 0){ // 16x16
416
mc_part_std(h, 1, 8, 0, h->cy, h->cu, h->cv, 0, 0,
465
mc_part_std(h, 8, 0, h->cy, h->cu, h->cv, 0, 0,
417
466
h->cdsp.put_cavs_qpel_pixels_tab[0],
418
h->s.dsp.put_h264_chroma_pixels_tab[0],
467
h->dsp.put_h264_chroma_pixels_tab[0],
419
468
h->cdsp.avg_cavs_qpel_pixels_tab[0],
420
h->s.dsp.avg_h264_chroma_pixels_tab[0],&h->mv[MV_FWD_X0]);
469
h->dsp.avg_h264_chroma_pixels_tab[0],&h->mv[MV_FWD_X0]);
422
mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 0,
423
h->cdsp.put_cavs_qpel_pixels_tab[1],
424
h->s.dsp.put_h264_chroma_pixels_tab[1],
425
h->cdsp.avg_cavs_qpel_pixels_tab[1],
426
h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X0]);
427
mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 4, 0,
428
h->cdsp.put_cavs_qpel_pixels_tab[1],
429
h->s.dsp.put_h264_chroma_pixels_tab[1],
430
h->cdsp.avg_cavs_qpel_pixels_tab[1],
431
h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X1]);
432
mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 4,
433
h->cdsp.put_cavs_qpel_pixels_tab[1],
434
h->s.dsp.put_h264_chroma_pixels_tab[1],
435
h->cdsp.avg_cavs_qpel_pixels_tab[1],
436
h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X2]);
437
mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 4, 4,
438
h->cdsp.put_cavs_qpel_pixels_tab[1],
439
h->s.dsp.put_h264_chroma_pixels_tab[1],
440
h->cdsp.avg_cavs_qpel_pixels_tab[1],
441
h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X3]);
471
mc_part_std(h, 4, 0, h->cy, h->cu, h->cv, 0, 0,
472
h->cdsp.put_cavs_qpel_pixels_tab[1],
473
h->dsp.put_h264_chroma_pixels_tab[1],
474
h->cdsp.avg_cavs_qpel_pixels_tab[1],
475
h->dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X0]);
476
mc_part_std(h, 4, 0, h->cy, h->cu, h->cv, 4, 0,
477
h->cdsp.put_cavs_qpel_pixels_tab[1],
478
h->dsp.put_h264_chroma_pixels_tab[1],
479
h->cdsp.avg_cavs_qpel_pixels_tab[1],
480
h->dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X1]);
481
mc_part_std(h, 4, 0, h->cy, h->cu, h->cv, 0, 4,
482
h->cdsp.put_cavs_qpel_pixels_tab[1],
483
h->dsp.put_h264_chroma_pixels_tab[1],
484
h->cdsp.avg_cavs_qpel_pixels_tab[1],
485
h->dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X2]);
486
mc_part_std(h, 4, 0, h->cy, h->cu, h->cv, 4, 4,
487
h->cdsp.put_cavs_qpel_pixels_tab[1],
488
h->dsp.put_h264_chroma_pixels_tab[1],
489
h->cdsp.avg_cavs_qpel_pixels_tab[1],
490
h->dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X3]);
654
703
void ff_cavs_init_top_lines(AVSContext *h) {
655
704
/* alloc top line of predictors */
656
h->top_qp = av_malloc( h->mb_width);
657
h->top_mv[0] = av_malloc((h->mb_width*2+1)*sizeof(cavs_vector));
658
h->top_mv[1] = av_malloc((h->mb_width*2+1)*sizeof(cavs_vector));
659
h->top_pred_Y = av_malloc( h->mb_width*2*sizeof(*h->top_pred_Y));
660
h->top_border_y = av_malloc((h->mb_width+1)*16);
661
h->top_border_u = av_malloc( h->mb_width * 10);
662
h->top_border_v = av_malloc( h->mb_width * 10);
705
h->top_qp = av_mallocz( h->mb_width);
706
h->top_mv[0] = av_mallocz((h->mb_width*2+1)*sizeof(cavs_vector));
707
h->top_mv[1] = av_mallocz((h->mb_width*2+1)*sizeof(cavs_vector));
708
h->top_pred_Y = av_mallocz( h->mb_width*2*sizeof(*h->top_pred_Y));
709
h->top_border_y = av_mallocz((h->mb_width+1)*16);
710
h->top_border_u = av_mallocz( h->mb_width * 10);
711
h->top_border_v = av_mallocz( h->mb_width * 10);
664
713
/* alloc space for co-located MVs and types */
665
h->col_mv = av_malloc( h->mb_width*h->mb_height*4*sizeof(cavs_vector));
666
h->col_type_base = av_malloc(h->mb_width*h->mb_height);
714
h->col_mv = av_mallocz( h->mb_width*h->mb_height*4*sizeof(cavs_vector));
715
h->col_type_base = av_mallocz(h->mb_width*h->mb_height);
667
716
h->block = av_mallocz(64*sizeof(DCTELEM));
670
719
av_cold int ff_cavs_init(AVCodecContext *avctx) {
671
720
AVSContext *h = avctx->priv_data;
672
MpegEncContext * const s = &h->s;
674
MPV_decode_defaults(s);
722
ff_dsputil_init(&h->dsp, avctx);
723
ff_videodsp_init(&h->vdsp, 8);
675
724
ff_cavsdsp_init(&h->cdsp, avctx);
678
avctx->pix_fmt= PIX_FMT_YUV420P;
725
ff_init_scantable_permutation(h->dsp.idct_permutation,
727
ff_init_scantable(h->dsp.idct_permutation, &h->scantable, ff_zigzag_direct);
730
avctx->pix_fmt= AV_PIX_FMT_YUV420P;
732
h->cur.f = avcodec_alloc_frame();
733
h->DPB[0].f = avcodec_alloc_frame();
734
h->DPB[1].f = avcodec_alloc_frame();
735
if (!h->cur.f || !h->DPB[0].f || !h->DPB[1].f) {
737
return AVERROR(ENOMEM);
680
740
h->luma_scan[0] = 0;
681
741
h->luma_scan[1] = 8;