108
108
static const int8_t svq3_pred_1[6][6][5] = {
109
{ { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
110
{ 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
111
{ { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
112
{ 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
113
{ { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
114
{ 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
115
{ { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
116
{ 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
117
{ { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
118
{ 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
119
{ { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
120
{ 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
109
{ { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
110
{ 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
111
{ { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
112
{ 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
113
{ { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
114
{ 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
115
{ { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
116
{ 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
117
{ { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
118
{ 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
119
{ { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
120
{ 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
123
static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
123
static const struct {
126
} svq3_dct_tables[2][16] = {
124
127
{ { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
125
128
{ 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
126
129
{ { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
130
133
static const uint32_t svq3_dequant_coeff[32] = {
131
3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
132
9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
133
24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
134
61694, 68745, 77615, 89113,100253,109366,126635,141533
134
3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
135
9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
136
24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
137
61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
137
void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp){
140
void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp)
138
142
const int qmul = svq3_dequant_coeff[qp];
139
143
#define stride 16
142
static const uint8_t x_offset[4]={0, 1*stride, 4*stride, 5*stride};
145
const int z0 = 13*(input[4*i+0] + input[4*i+2]);
146
const int z1 = 13*(input[4*i+0] - input[4*i+2]);
147
const int z2 = 7* input[4*i+1] - 17*input[4*i+3];
148
const int z3 = 17* input[4*i+1] + 7*input[4*i+3];
146
static const uint8_t x_offset[4] = { 0, 1 * stride, 4 * stride, 5 * stride };
148
for (i = 0; i < 4; i++) {
149
const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
150
const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
151
const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
152
const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
154
temp[4 * i + 0] = z0 + z3;
155
temp[4 * i + 1] = z1 + z2;
156
temp[4 * i + 2] = z1 - z2;
157
temp[4 * i + 3] = z0 - z3;
157
const int offset= x_offset[i];
158
const int z0= 13*(temp[4*0+i] + temp[4*2+i]);
159
const int z1= 13*(temp[4*0+i] - temp[4*2+i]);
160
const int z2= 7* temp[4*1+i] - 17*temp[4*3+i];
161
const int z3= 17* temp[4*1+i] + 7*temp[4*3+i];
160
for (i = 0; i < 4; i++) {
161
const int offset = x_offset[i];
162
const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
163
const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
164
const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
165
const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
163
output[stride* 0+offset] = ((z0 + z3)*qmul + 0x80000) >> 20;
164
output[stride* 2+offset] = ((z1 + z2)*qmul + 0x80000) >> 20;
165
output[stride* 8+offset] = ((z1 - z2)*qmul + 0x80000) >> 20;
166
output[stride*10+offset] = ((z0 - z3)*qmul + 0x80000) >> 20;
167
output[stride * 0 + offset] = (z0 + z3) * qmul + 0x80000 >> 20;
168
output[stride * 2 + offset] = (z1 + z2) * qmul + 0x80000 >> 20;
169
output[stride * 8 + offset] = (z1 - z2) * qmul + 0x80000 >> 20;
170
output[stride * 10 + offset] = (z0 - z3) * qmul + 0x80000 >> 20;
171
void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp,
175
void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block,
176
int stride, int qp, int dc)
174
178
const int qmul = svq3_dequant_coeff[qp];
178
dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
182
dc = 13 * 13 * (dc == 1 ? 1538 * block[0]
183
: qmul * (block[0] >> 3) / 2);
182
187
for (i = 0; i < 4; i++) {
183
const int z0 = 13*(block[0 + 4*i] + block[2 + 4*i]);
184
const int z1 = 13*(block[0 + 4*i] - block[2 + 4*i]);
185
const int z2 = 7* block[1 + 4*i] - 17*block[3 + 4*i];
186
const int z3 = 17* block[1 + 4*i] + 7*block[3 + 4*i];
188
const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
189
const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
190
const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
191
const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
188
block[0 + 4*i] = z0 + z3;
189
block[1 + 4*i] = z1 + z2;
190
block[2 + 4*i] = z1 - z2;
191
block[3 + 4*i] = z0 - z3;
193
block[0 + 4 * i] = z0 + z3;
194
block[1 + 4 * i] = z1 + z2;
195
block[2 + 4 * i] = z1 - z2;
196
block[3 + 4 * i] = z0 - z3;
194
199
for (i = 0; i < 4; i++) {
195
const int z0 = 13*(block[i + 4*0] + block[i + 4*2]);
196
const int z1 = 13*(block[i + 4*0] - block[i + 4*2]);
197
const int z2 = 7* block[i + 4*1] - 17*block[i + 4*3];
198
const int z3 = 17* block[i + 4*1] + 7*block[i + 4*3];
200
const int z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
201
const int z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
202
const int z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
203
const int z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
199
204
const int rr = (dc + 0x80000);
201
dst[i + stride*0] = av_clip_uint8( dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) );
202
dst[i + stride*1] = av_clip_uint8( dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) );
203
dst[i + stride*2] = av_clip_uint8( dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) );
204
dst[i + stride*3] = av_clip_uint8( dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) );
206
dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20));
207
dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20));
208
dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20));
209
dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20));
270
274
const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture;
271
275
uint8_t *src, *dest;
273
int blocksize = 2 - (width>>3); //16->0, 8->1, 4->2
277
int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
278
if (mx < 0 || mx >= (s->h_edge_pos - width - 1) ||
279
my < 0 || my >= (s->v_edge_pos - height - 1)) {
281
if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
282
if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
283
my < 0 || my >= s->v_edge_pos - height - 1) {
284
if ((s->flags & CODEC_FLAG_EMU_EDGE))
285
mx = av_clip (mx, -16, (s->h_edge_pos - width + 15));
286
my = av_clip (my, -16, (s->v_edge_pos - height + 15));
287
mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
288
my = av_clip(my, -16, s->v_edge_pos - height + 15);
289
291
/* form component predictions */
290
dest = s->current_picture.f.data[0] + x + y*s->linesize;
291
src = pic->f.data[0] + mx + my*s->linesize;
292
dest = s->current_picture.f.data[0] + x + y * s->linesize;
293
src = pic->f.data[0] + mx + my * s->linesize;
294
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1),
295
mx, my, s->h_edge_pos, s->v_edge_pos);
296
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize,
297
width + 1, height + 1,
298
mx, my, s->h_edge_pos, s->v_edge_pos);
296
299
src = s->edge_emu_buffer;
299
(avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height);
302
(avg ? s->dsp.avg_tpel_pixels_tab
303
: s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize,
301
(avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height);
306
(avg ? s->dsp.avg_pixels_tab
307
: s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize,
303
310
if (!(s->flags & CODEC_FLAG_GRAY)) {
304
mx = (mx + (mx < (int) x)) >> 1;
305
my = (my + (my < (int) y)) >> 1;
306
width = (width >> 1);
307
height = (height >> 1);
311
mx = mx + (mx < (int) x) >> 1;
312
my = my + (my < (int) y) >> 1;
314
height = height >> 1;
310
317
for (i = 1; i < 3; i++) {
312
319
src = pic->f.data[i] + mx + my * s->uvlinesize;
315
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1),
316
mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
322
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->uvlinesize,
323
width + 1, height + 1,
324
mx, my, (s->h_edge_pos >> 1),
317
326
src = s->edge_emu_buffer;
320
(avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height);
329
(avg ? s->dsp.avg_tpel_pixels_tab
330
: s->dsp.put_tpel_pixels_tab)[dxy](dest, src,
322
(avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height);
334
(avg ? s->dsp.avg_pixels_tab
335
: s->dsp.put_pixels_tab)[blocksize][dxy](dest, src,
327
static inline int svq3_mc_dir(H264Context *h, int size, int mode, int dir,
342
static inline int svq3_mc_dir(H264Context *h, int size, int mode,
330
345
int i, j, k, mx, my, dx, dy, x, y;
331
MpegEncContext *const s = (MpegEncContext *) h;
332
const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
333
const int part_height = 16 >> ((unsigned) (size + 1) / 3);
334
const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0;
335
const int h_edge_pos = 6*(s->h_edge_pos - part_width ) - extra_width;
336
const int v_edge_pos = 6*(s->v_edge_pos - part_height) - extra_width;
346
MpegEncContext *const s = (MpegEncContext *)h;
347
const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
348
const int part_height = 16 >> ((unsigned)(size + 1) / 3);
349
const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
350
const int h_edge_pos = 6 * (s->h_edge_pos - part_width) - extra_width;
351
const int v_edge_pos = 6 * (s->v_edge_pos - part_height) - extra_width;
338
for (i = 0; i < 16; i += part_height) {
353
for (i = 0; i < 16; i += part_height)
339
354
for (j = 0; j < 16; j += part_width) {
340
const int b_xy = (4*s->mb_x + (j >> 2)) + (4*s->mb_y + (i >> 2))*h->b_stride;
355
const int b_xy = (4 * s->mb_x + (j >> 2)) +
356
(4 * s->mb_y + (i >> 2)) * h->b_stride;
344
k = ((j >> 2) & 1) + ((i >> 1) & 2) + ((j >> 1) & 4) + (i & 8);
358
x = 16 * s->mb_x + j;
359
y = 16 * s->mb_y + i;
360
k = (j >> 2 & 1) + (i >> 1 & 2) +
361
(j >> 1 & 4) + (i & 8);
346
363
if (mode != PREDICT_MODE) {
347
pred_motion(h, k, (part_width >> 2), dir, 1, &mx, &my);
364
pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my);
349
366
mx = s->next_picture.f.motion_val[0][b_xy][0] << 1;
350
367
my = s->next_picture.f.motion_val[0][b_xy][1] << 1;
353
mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
354
my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
370
mx = mx * h->frame_num_offset /
371
h->prev_frame_num_offset + 1 >> 1;
372
my = my * h->frame_num_offset /
373
h->prev_frame_num_offset + 1 >> 1;
356
mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
357
my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
375
mx = mx * (h->frame_num_offset - h->prev_frame_num_offset) /
376
h->prev_frame_num_offset + 1 >> 1;
377
my = my * (h->frame_num_offset - h->prev_frame_num_offset) /
378
h->prev_frame_num_offset + 1 >> 1;
361
382
/* clip motion vector prediction to frame border */
362
mx = av_clip(mx, extra_width - 6*x, h_edge_pos - 6*x);
363
my = av_clip(my, extra_width - 6*y, v_edge_pos - 6*y);
383
mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
384
my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
365
386
/* get (optional) motion vector differential */
366
387
if (mode == PREDICT_MODE) {
378
399
/* compute motion vector */
379
400
if (mode == THIRDPEL_MODE) {
381
mx = ((mx + 1)>>1) + dx;
382
my = ((my + 1)>>1) + dy;
383
fx = ((unsigned)(mx + 0x3000))/3 - 0x1000;
384
fy = ((unsigned)(my + 0x3000))/3 - 0x1000;
385
dxy = (mx - 3*fx) + 4*(my - 3*fy);
402
mx = (mx + 1 >> 1) + dx;
403
my = (my + 1 >> 1) + dy;
404
fx = (unsigned)(mx + 0x3000) / 3 - 0x1000;
405
fy = (unsigned)(my + 0x3000) / 3 - 0x1000;
406
dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
387
svq3_mc_dir_part(s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
408
svq3_mc_dir_part(s, x, y, part_width, part_height,
409
fx, fy, dxy, 1, dir, avg);
390
412
} else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
391
mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
392
my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
393
dxy = (mx&1) + 2*(my&1);
413
mx = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000;
414
my = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000;
415
dxy = (mx & 1) + 2 * (my & 1);
395
svq3_mc_dir_part(s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
417
svq3_mc_dir_part(s, x, y, part_width, part_height,
418
mx >> 1, my >> 1, dxy, 0, dir, avg);
399
mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
400
my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
422
mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000;
423
my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000;
402
svq3_mc_dir_part(s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
425
svq3_mc_dir_part(s, x, y, part_width, part_height,
426
mx, my, 0, 0, dir, avg);
407
431
/* update mv_cache */
408
432
if (mode != PREDICT_MODE) {
409
int32_t mv = pack16to32(mx,my);
433
int32_t mv = pack16to32(mx, my);
411
435
if (part_height == 8 && i < 8) {
412
AV_WN32A(h->mv_cache[dir][scan8[k] + 1*8], mv);
436
AV_WN32A(h->mv_cache[dir][scan8[k] + 1 * 8], mv);
414
if (part_width == 8 && j < 8) {
415
AV_WN32A(h->mv_cache[dir][scan8[k] + 1 + 1*8], mv);
438
if (part_width == 8 && j < 8)
439
AV_WN32A(h->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
418
if (part_width == 8 && j < 8) {
441
if (part_width == 8 && j < 8)
419
442
AV_WN32A(h->mv_cache[dir][scan8[k] + 1], mv);
421
if (part_width == 4 || part_height == 4) {
443
if (part_width == 4 || part_height == 4)
422
444
AV_WN32A(h->mv_cache[dir][scan8[k]], mv);
426
447
/* write back motion vectors */
467
489
mb_type = MB_TYPE_16x16;
469
491
} else if (mb_type < 8) { /* INTER */
470
if (svq3->thirdpel_flag && svq3->halfpel_flag == !get_bits1 (&s->gb)) {
492
if (svq3->thirdpel_flag && svq3->halfpel_flag == !get_bits1(&s->gb))
471
493
mode = THIRDPEL_MODE;
472
} else if (svq3->halfpel_flag && svq3->thirdpel_flag == !get_bits1 (&s->gb)) {
494
else if (svq3->halfpel_flag &&
495
svq3->thirdpel_flag == !get_bits1(&s->gb))
473
496
mode = HALFPEL_MODE;
475
498
mode = FULLPEL_MODE;
478
500
/* fill caches */
479
501
/* note ref_cache should contain here:
487
509
for (m = 0; m < 2; m++) {
488
if (s->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6] != -1) {
489
for (i = 0; i < 4; i++) {
490
AV_COPY32(h->mv_cache[m][scan8[0] - 1 + i*8], s->current_picture.f.motion_val[m][b_xy - 1 + i*h->b_stride]);
510
if (s->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6] != -1) {
511
for (i = 0; i < 4; i++)
512
AV_COPY32(h->mv_cache[m][scan8[0] - 1 + i * 8],
513
s->current_picture.f.motion_val[m][b_xy - 1 + i * h->b_stride]);
493
for (i = 0; i < 4; i++) {
494
AV_ZERO32(h->mv_cache[m][scan8[0] - 1 + i*8]);
515
for (i = 0; i < 4; i++)
516
AV_ZERO32(h->mv_cache[m][scan8[0] - 1 + i * 8]);
497
518
if (s->mb_y > 0) {
498
memcpy(h->mv_cache[m][scan8[0] - 1*8], s->current_picture.f.motion_val[m][b_xy - h->b_stride], 4*2*sizeof(int16_t));
499
memset(&h->ref_cache[m][scan8[0] - 1*8], (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
519
memcpy(h->mv_cache[m][scan8[0] - 1 * 8],
520
s->current_picture.f.motion_val[m][b_xy - h->b_stride],
521
4 * 2 * sizeof(int16_t));
522
memset(&h->ref_cache[m][scan8[0] - 1 * 8],
523
(h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
501
if (s->mb_x < (s->mb_width - 1)) {
502
AV_COPY32(h->mv_cache[m][scan8[0] + 4 - 1*8], s->current_picture.f.motion_val[m][b_xy - h->b_stride + 4]);
503
h->ref_cache[m][scan8[0] + 4 - 1*8] =
504
(h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride + 1]+6] == -1 ||
505
h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride ] ] == -1) ? PART_NOT_AVAILABLE : 1;
507
h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
525
if (s->mb_x < s->mb_width - 1) {
526
AV_COPY32(h->mv_cache[m][scan8[0] + 4 - 1 * 8],
527
s->current_picture.f.motion_val[m][b_xy - h->b_stride + 4]);
528
h->ref_cache[m][scan8[0] + 4 - 1 * 8] =
529
(h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride + 1] + 6] == -1 ||
530
h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
532
h->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
508
533
if (s->mb_x > 0) {
509
AV_COPY32(h->mv_cache[m][scan8[0] - 1 - 1*8], s->current_picture.f.motion_val[m][b_xy - h->b_stride - 1]);
510
h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] == -1) ? PART_NOT_AVAILABLE : 1;
512
h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
514
memset(&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
534
AV_COPY32(h->mv_cache[m][scan8[0] - 1 - 1 * 8],
535
s->current_picture.f.motion_val[m][b_xy - h->b_stride - 1]);
536
h->ref_cache[m][scan8[0] - 1 - 1 * 8] =
537
(h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
539
h->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
541
memset(&h->ref_cache[m][scan8[0] - 1 * 8 - 1],
542
PART_NOT_AVAILABLE, 8);
516
544
if (s->pict_type != AV_PICTURE_TYPE_B)
520
548
/* decode motion vector(s) and form prediction(s) */
521
549
if (s->pict_type == AV_PICTURE_TYPE_P) {
522
if (svq3_mc_dir(h, (mb_type - 1), mode, 0, 0) < 0)
550
if (svq3_mc_dir(h, mb_type - 1, mode, 0, 0) < 0)
524
552
} else { /* AV_PICTURE_TYPE_B */
525
553
if (mb_type != 2) {
526
554
if (svq3_mc_dir(h, 0, mode, 0, 0) < 0)
529
for (i = 0; i < 4; i++) {
530
memset(s->current_picture.f.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
557
for (i = 0; i < 4; i++)
558
memset(s->current_picture.f.motion_val[0][b_xy + i * h->b_stride],
559
0, 4 * 2 * sizeof(int16_t));
533
561
if (mb_type != 1) {
534
if (svq3_mc_dir(h, 0, mode, 1, (mb_type == 3)) < 0)
562
if (svq3_mc_dir(h, 0, mode, 1, mb_type == 3) < 0)
537
for (i = 0; i < 4; i++) {
538
memset(s->current_picture.f.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
565
for (i = 0; i < 4; i++)
566
memset(s->current_picture.f.motion_val[1][b_xy + i * h->b_stride],
567
0, 4 * 2 * sizeof(int16_t));
543
571
mb_type = MB_TYPE_16x16;
544
572
} else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
545
memset(h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
573
memset(h->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
547
575
if (mb_type == 8) {
548
576
if (s->mb_x > 0) {
549
for (i = 0; i < 4; i++) {
550
h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6-i];
552
if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
577
for (i = 0; i < 4; i++)
578
h->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6 - i];
579
if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
553
580
h->left_samples_available = 0x5F5F;
556
582
if (s->mb_y > 0) {
557
h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+0];
558
h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+1];
559
h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+2];
560
h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+3];
583
h->intra4x4_pred_mode_cache[4 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride] + 0];
584
h->intra4x4_pred_mode_cache[5 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride] + 1];
585
h->intra4x4_pred_mode_cache[6 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride] + 2];
586
h->intra4x4_pred_mode_cache[7 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride] + 3];
562
if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
588
if (h->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
563
589
h->top_samples_available = 0x33FF;
567
592
/* decode prediction codes for luma blocks */
568
for (i = 0; i < 16; i+=2) {
593
for (i = 0; i < 16; i += 2) {
569
594
vlc = svq3_get_ue_golomb(&s->gb);
572
597
av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
576
left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
577
top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
601
left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
602
top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
579
604
left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
580
605
left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
582
if (left[1] == -1 || left[2] == -1){
607
if (left[1] == -1 || left[2] == -1) {
583
608
av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n");
587
612
} else { /* mb_type == 33, DC_128_PRED block type */
588
for (i = 0; i < 4; i++) {
589
memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
613
for (i = 0; i < 4; i++)
614
memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_PRED, 4);
593
617
write_back_intra_pred_mode(h);
609
632
mb_type = MB_TYPE_INTRA4x4;
610
633
} else { /* INTRA16x16 */
611
634
dir = i_mb_type_info[mb_type - 8].pred_mode;
612
dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
635
dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
614
if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) == -1){
615
av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
637
if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) < 0) {
638
av_log(h->s.avctx, AV_LOG_ERROR, "ff_h264_check_intra_pred_mode < 0\n");
639
return h->intra16x16_pred_mode;
619
cbp = i_mb_type_info[mb_type - 8].cbp;
642
cbp = i_mb_type_info[mb_type - 8].cbp;
620
643
mb_type = MB_TYPE_INTRA16x16;
623
646
if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
624
for (i = 0; i < 4; i++) {
625
memset(s->current_picture.f.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
647
for (i = 0; i < 4; i++)
648
memset(s->current_picture.f.motion_val[0][b_xy + i * h->b_stride],
649
0, 4 * 2 * sizeof(int16_t));
627
650
if (s->pict_type == AV_PICTURE_TYPE_B) {
628
for (i = 0; i < 4; i++) {
629
memset(s->current_picture.f.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
651
for (i = 0; i < 4; i++)
652
memset(s->current_picture.f.motion_val[1][b_xy + i * h->b_stride],
653
0, 4 * 2 * sizeof(int16_t));
633
656
if (!IS_INTRA4x4(mb_type)) {
634
memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy], DC_PRED, 8);
657
memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy], DC_PRED, 8);
636
659
if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
637
memset(h->non_zero_count_cache + 8, 0, 14*8*sizeof(uint8_t));
638
s->dsp.clear_blocks(h->mb+ 0);
639
s->dsp.clear_blocks(h->mb+384);
660
memset(h->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
661
s->dsp.clear_blocks(h->mb + 0);
662
s->dsp.clear_blocks(h->mb + 384);
642
if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
643
if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48){
665
if (!IS_INTRA16x16(mb_type) &&
666
(!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
667
if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48) {
644
668
av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
648
cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
672
cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc]
673
: golomb_to_inter_cbp[vlc];
650
if (IS_INTRA16x16(mb_type) || (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
675
if (IS_INTRA16x16(mb_type) ||
676
(s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
651
677
s->qscale += svq3_get_se_golomb(&s->gb);
653
if (s->qscale > 31u){
679
if (s->qscale > 31u) {
654
680
av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
658
684
if (IS_INTRA16x16(mb_type)) {
659
AV_ZERO128(h->mb_luma_dc[0]+0);
660
AV_ZERO128(h->mb_luma_dc[0]+8);
661
if (svq3_decode_block(&s->gb, h->mb_luma_dc, 0, 1)){
662
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
685
AV_ZERO128(h->mb_luma_dc[0] + 0);
686
AV_ZERO128(h->mb_luma_dc[0] + 8);
687
if (svq3_decode_block(&s->gb, h->mb_luma_dc[0], 0, 1)) {
688
av_log(h->s.avctx, AV_LOG_ERROR,
689
"error while decoding intra luma dc\n");
668
695
const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
669
const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
696
const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
671
for (i = 0; i < 4; i++) {
698
for (i = 0; i < 4; i++)
672
699
if ((cbp & (1 << i))) {
673
700
for (j = 0; j < 4; j++) {
674
k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
675
h->non_zero_count_cache[ scan8[k] ] = 1;
701
k = index ? (1 * (j & 1) + 2 * (i & 1) +
702
2 * (j & 2) + 4 * (i & 2))
704
h->non_zero_count_cache[scan8[k]] = 1;
677
if (svq3_decode_block(&s->gb, &h->mb[16*k], index, type)){
678
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding block\n");
706
if (svq3_decode_block(&s->gb, &h->mb[16 * k], index, type)) {
707
av_log(h->s.avctx, AV_LOG_ERROR,
708
"error while decoding block\n");
685
714
if ((cbp & 0x30)) {
686
for (i = 1; i < 3; ++i) {
687
if (svq3_decode_block(&s->gb, &h->mb[16*16*i], 0, 3)){
688
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
715
for (i = 1; i < 3; ++i)
716
if (svq3_decode_block(&s->gb, &h->mb[16 * 16 * i], 0, 3)) {
717
av_log(h->s.avctx, AV_LOG_ERROR,
718
"error while decoding chroma dc block\n");
693
722
if ((cbp & 0x20)) {
694
723
for (i = 1; i < 3; i++) {
695
724
for (j = 0; j < 4; j++) {
697
h->non_zero_count_cache[ scan8[k] ] = 1;
726
h->non_zero_count_cache[scan8[k]] = 1;
699
if (svq3_decode_block(&s->gb, &h->mb[16*k], 1, 1)){
700
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
728
if (svq3_decode_block(&s->gb, &h->mb[16 * k], 1, 1)) {
729
av_log(h->s.avctx, AV_LOG_ERROR,
730
"error while decoding chroma ac block\n");
731
761
av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
734
int length = (header >> 5) & 3;
764
int length = header >> 5 & 3;
736
svq3->next_slice_index = get_bits_count(&s->gb) + 8*show_bits(&s->gb, 8*length) + 8*length;
766
svq3->next_slice_index = get_bits_count(&s->gb) +
767
8 * show_bits(&s->gb, 8 * length) +
738
770
if (svq3->next_slice_index > s->gb.size_in_bits) {
739
771
av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
743
s->gb.size_in_bits = svq3->next_slice_index - 8*(length - 1);
775
s->gb.size_in_bits = svq3->next_slice_index - 8 * (length - 1);
744
776
skip_bits(&s->gb, 8);
746
778
if (svq3->watermark_key) {
747
uint32_t header = AV_RL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1]);
748
AV_WL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1], header ^ svq3->watermark_key);
779
uint32_t header = AV_RL32(&s->gb.buffer[(get_bits_count(&s->gb) >> 3) + 1]);
780
AV_WL32(&s->gb.buffer[(get_bits_count(&s->gb) >> 3) + 1],
781
header ^ svq3->watermark_key);
750
783
if (length > 0) {
751
784
memcpy((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3],
752
&s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
785
&s->gb.buffer[s->gb.size_in_bits >> 3], length - 1);
754
787
skip_bits_long(&s->gb, 0);
757
if ((i = svq3_get_ue_golomb(&s->gb)) == INVALID_VLC || i >= 3){
758
av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
790
if ((slice_id = svq3_get_ue_golomb(&s->gb)) >= 3) {
791
av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", slice_id);
762
h->slice_type = golomb_to_pict_type[i];
795
h->slice_type = golomb_to_pict_type[slice_id];
764
797
if ((header & 0x9F) == 2) {
765
i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
766
s->mb_skip_run = get_bits(&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
798
i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1));
799
s->mb_skip_run = get_bits(&s->gb, i) -
800
(s->mb_y * s->mb_width + s->mb_x);
768
802
skip_bits1(&s->gb);
769
803
s->mb_skip_run = 0;
772
h->slice_num = get_bits(&s->gb, 8);
773
s->qscale = get_bits(&s->gb, 5);
806
h->slice_num = get_bits(&s->gb, 8);
807
s->qscale = get_bits(&s->gb, 5);
774
808
s->adaptive_quant = get_bits1(&s->gb);
776
810
/* unknown fields */
777
811
skip_bits1(&s->gb);
779
if (svq3->unknown_flag) {
813
if (svq3->unknown_flag)
780
814
skip_bits1(&s->gb);
783
816
skip_bits1(&s->gb);
784
817
skip_bits(&s->gb, 2);
786
while (get_bits1(&s->gb)) {
819
while (get_bits1(&s->gb))
787
820
skip_bits(&s->gb, 8);
790
822
/* reset intra predictors and invalidate motion vector references */
791
823
if (s->mb_x > 0) {
792
memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - 1 ]+3, -1, 4*sizeof(int8_t));
793
memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_x] , -1, 8*sizeof(int8_t)*s->mb_x);
824
memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - 1] + 3,
825
-1, 4 * sizeof(int8_t));
826
memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - s->mb_x],
827
-1, 8 * sizeof(int8_t) * s->mb_x);
795
829
if (s->mb_y > 0) {
796
memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
830
memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - s->mb_stride],
831
-1, 8 * sizeof(int8_t) * (s->mb_width - s->mb_x));
799
h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] = -1;
834
h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] = -1;
884
938
/* unknown field */
887
while (get_bits1(&gb)) {
941
while (get_bits1(&gb))
888
942
skip_bits(&gb, 8);
891
svq3->unknown_flag = get_bits1(&gb);
944
svq3->unknown_flag = get_bits1(&gb);
892
945
avctx->has_b_frames = !s->low_delay;
893
946
if (svq3->unknown_flag) {
895
948
unsigned watermark_width = svq3_get_ue_golomb(&gb);
896
949
unsigned watermark_height = svq3_get_ue_golomb(&gb);
897
int u1 = svq3_get_ue_golomb(&gb);
898
int u2 = get_bits(&gb, 8);
899
int u3 = get_bits(&gb, 2);
900
int u4 = svq3_get_ue_golomb(&gb);
901
unsigned long buf_len = watermark_width*watermark_height*4;
902
int offset = (get_bits_count(&gb)+7)>>3;
950
int u1 = svq3_get_ue_golomb(&gb);
951
int u2 = get_bits(&gb, 8);
952
int u3 = get_bits(&gb, 2);
953
int u4 = svq3_get_ue_golomb(&gb);
954
unsigned long buf_len = watermark_width *
955
watermark_height * 4;
956
int offset = get_bits_count(&gb) + 7 >> 3;
905
if ((uint64_t)watermark_width*4 > UINT_MAX/watermark_height)
959
if (watermark_height > 0 &&
960
(uint64_t)watermark_width * 4 > UINT_MAX / watermark_height)
908
963
buf = av_malloc(buf_len);
909
av_log(avctx, AV_LOG_DEBUG, "watermark size: %dx%d\n", watermark_width, watermark_height);
910
av_log(avctx, AV_LOG_DEBUG, "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n", u1, u2, u3, u4, offset);
911
if (uncompress(buf, &buf_len, extradata + 8 + offset, size - offset) != Z_OK) {
912
av_log(avctx, AV_LOG_ERROR, "could not uncompress watermark logo\n");
964
av_log(avctx, AV_LOG_DEBUG, "watermark size: %dx%d\n",
965
watermark_width, watermark_height);
966
av_log(avctx, AV_LOG_DEBUG,
967
"u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
968
u1, u2, u3, u4, offset);
969
if (uncompress(buf, &buf_len, extradata + 8 + offset,
970
size - offset) != Z_OK) {
971
av_log(avctx, AV_LOG_ERROR,
972
"could not uncompress watermark logo\n");
916
976
svq3->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
917
svq3->watermark_key = svq3->watermark_key << 16 | svq3->watermark_key;
918
av_log(avctx, AV_LOG_DEBUG, "watermark key %#x\n", svq3->watermark_key);
977
svq3->watermark_key = svq3->watermark_key << 16 |
979
av_log(avctx, AV_LOG_DEBUG,
980
"watermark key %#x\n", svq3->watermark_key);
921
av_log(avctx, AV_LOG_ERROR, "this svq3 file contains watermark which need zlib support compiled in\n");
983
av_log(avctx, AV_LOG_ERROR,
984
"this svq3 file contains watermark which need zlib support compiled in\n");
944
static int svq3_decode_frame(AVCodecContext *avctx,
945
void *data, int *data_size,
1007
static int svq3_decode_frame(AVCodecContext *avctx, void *data,
1008
int *got_frame, AVPacket *avpkt)
948
1010
const uint8_t *buf = avpkt->data;
949
SVQ3Context *svq3 = avctx->priv_data;
950
H264Context *h = &svq3->h;
951
MpegEncContext *s = &h->s;
952
int buf_size = avpkt->size;
1011
SVQ3Context *svq3 = avctx->priv_data;
1012
H264Context *h = &svq3->h;
1013
MpegEncContext *s = &h->s;
1014
int buf_size = avpkt->size;
955
1017
/* special case for last picture */
956
1018
if (buf_size == 0) {
957
1019
if (s->next_picture_ptr && !s->low_delay) {
958
*(AVFrame *) data = *(AVFrame *) &s->next_picture;
1020
*(AVFrame *) data = s->next_picture.f;
959
1021
s->next_picture_ptr = NULL;
960
*data_size = sizeof(AVFrame);
965
init_get_bits (&s->gb, buf, 8*buf_size);
1027
init_get_bits(&s->gb, buf, 8 * buf_size);
967
1029
s->mb_x = s->mb_y = h->mb_xy = 0;
969
1031
if (svq3_decode_slice_header(avctx))
972
s->pict_type = h->slice_type;
1034
s->pict_type = h->slice_type;
973
1035
s->picture_number = h->slice_num;
975
if (avctx->debug&FF_DEBUG_PICT_INFO){
976
av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
977
av_get_picture_type_char(s->pict_type), svq3->halfpel_flag, svq3->thirdpel_flag,
1037
if (avctx->debug & FF_DEBUG_PICT_INFO)
1038
av_log(h->s.avctx, AV_LOG_DEBUG,
1039
"%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1040
av_get_picture_type_char(s->pict_type),
1041
svq3->halfpel_flag, svq3->thirdpel_flag,
978
1042
s->adaptive_quant, s->qscale, h->slice_num);
981
1044
/* for skipping the frame */
982
1045
s->current_picture.f.pict_type = s->pict_type;
1003
1066
if (s->pict_type == AV_PICTURE_TYPE_B) {
1004
h->frame_num_offset = (h->slice_num - h->prev_frame_num);
1067
h->frame_num_offset = h->slice_num - h->prev_frame_num;
1006
if (h->frame_num_offset < 0) {
1069
if (h->frame_num_offset < 0)
1007
1070
h->frame_num_offset += 256;
1009
if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
1071
if (h->frame_num_offset == 0 ||
1072
h->frame_num_offset >= h->prev_frame_num_offset) {
1010
1073
av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1014
h->prev_frame_num = h->frame_num;
1015
h->frame_num = h->slice_num;
1016
h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
1077
h->prev_frame_num = h->frame_num;
1078
h->frame_num = h->slice_num;
1079
h->prev_frame_num_offset = h->frame_num - h->prev_frame_num;
1018
if (h->prev_frame_num_offset < 0) {
1081
if (h->prev_frame_num_offset < 0)
1019
1082
h->prev_frame_num_offset += 256;
1023
for (m = 0; m < 2; m++){
1085
for (m = 0; m < 2; m++) {
1025
for (i = 0; i < 4; i++){
1087
for (i = 0; i < 4; i++) {
1027
1089
for (j = -1; j < 4; j++)
1028
h->ref_cache[m][scan8[0] + 8*i + j]= 1;
1090
h->ref_cache[m][scan8[0] + 8 * i + j] = 1;
1030
h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
1092
h->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
1034
1096
for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1035
1097
for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1036
h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
1038
if ( (get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
1039
((get_bits_count(&s->gb) & 7) == 0 || show_bits(&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) {
1099
h->mb_xy = s->mb_x + s->mb_y * s->mb_stride;
1101
if ((get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
1102
((get_bits_count(&s->gb) & 7) == 0 ||
1103
show_bits(&s->gb, -get_bits_count(&s->gb) & 7) == 0)) {
1041
1104
skip_bits(&s->gb, svq3->next_slice_index - get_bits_count(&s->gb));
1042
s->gb.size_in_bits = 8*buf_size;
1105
s->gb.size_in_bits = 8 * buf_size;
1044
1107
if (svq3_decode_slice_header(avctx))