2 * Copyright (c) 2003 The Libav Project
4 * This file is part of Libav.
6 * Libav is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * Libav is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Libav; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 * How to use this decoder:
23 * SVQ3 data is transported within Apple Quicktime files. Quicktime files
24 * have stsd atoms to describe media trak properties. A stsd atom for a
25 * video trak contains 1 or more ImageDescription atoms. These atoms begin
26 * with the 4-byte length of the atom followed by the codec fourcc. Some
27 * decoders need information in this atom to operate correctly. Such
28 * is the case with SVQ3. In order to get the best use out of this decoder,
29 * the calling app must make the SVQ3 ImageDescription atom available
30 * via the AVCodecContext's extradata[_size] field:
32 * AVCodecContext.extradata = pointer to ImageDescription, first characters
33 * are expected to be 'S', 'V', 'Q', and '3', NOT the 4-byte atom length
34 * AVCodecContext.extradata_size = size of ImageDescription atom memory
35 * buffer (which will be the same as the ImageDescription atom size field
36 * from the QT file, minus 4 bytes since the length is missing)
38 * You will know you have these parameters passed correctly when the decoder
39 * correctly decodes this file:
40 * http://samples.libav.org/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
45 #include "mpegvideo.h"
48 #include "h264data.h" //FIXME FIXME FIXME
50 #include "h264_mvpred.h"
52 #include "rectangle.h"
53 #include "vdpau_internal.h"
72 uint32_t watermark_key;
75 #define FULLPEL_MODE 1
76 #define HALFPEL_MODE 2
77 #define THIRDPEL_MODE 3
78 #define PREDICT_MODE 4
80 /* dual scan (from some older h264 draft)
89 static const uint8_t svq3_scan[16] = {
90 0+0*4, 1+0*4, 2+0*4, 2+1*4,
91 2+2*4, 3+0*4, 3+1*4, 3+2*4,
92 0+1*4, 0+2*4, 1+1*4, 1+2*4,
93 0+3*4, 1+3*4, 2+3*4, 3+3*4,
96 static const uint8_t svq3_pred_0[25][2] = {
99 { 0, 2 }, { 1, 1 }, { 2, 0 },
100 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
101 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
102 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
103 { 2, 4 }, { 3, 3 }, { 4, 2 },
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 } },
123 static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
124 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
125 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
126 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
127 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
130 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
137 void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp){
138 const int qmul = svq3_dequant_coeff[qp];
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];
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];
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;
171 void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp,
174 const int qmul = svq3_dequant_coeff[qp];
176 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
179 dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
183 for (i = 0; i < 4; i++) {
184 const int z0 = 13*(block[0 + 4*i] + block[2 + 4*i]);
185 const int z1 = 13*(block[0 + 4*i] - block[2 + 4*i]);
186 const int z2 = 7* block[1 + 4*i] - 17*block[3 + 4*i];
187 const int z3 = 17* block[1 + 4*i] + 7*block[3 + 4*i];
189 block[0 + 4*i] = z0 + z3;
190 block[1 + 4*i] = z1 + z2;
191 block[2 + 4*i] = z1 - z2;
192 block[3 + 4*i] = z0 - z3;
195 for (i = 0; i < 4; i++) {
196 const int z0 = 13*(block[i + 4*0] + block[i + 4*2]);
197 const int z1 = 13*(block[i + 4*0] - block[i + 4*2]);
198 const int z2 = 7* block[i + 4*1] - 17*block[i + 4*3];
199 const int z3 = 17* block[i + 4*1] + 7*block[i + 4*3];
200 const int rr = (dc + 0x80000);
202 dst[i + stride*0] = cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
203 dst[i + stride*1] = cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
204 dst[i + stride*2] = cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
205 dst[i + stride*3] = cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
209 static inline int svq3_decode_block(GetBitContext *gb, DCTELEM *block,
210 int index, const int type)
212 static const uint8_t *const scan_patterns[4] =
213 { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
215 int run, level, sign, vlc, limit;
216 const int intra = (3 * type) >> 2;
217 const uint8_t *const scan = scan_patterns[type];
219 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
220 for (; (vlc = svq3_get_ue_golomb(gb)) != 0; index++) {
222 if (vlc == INVALID_VLC)
225 sign = (vlc & 0x1) - 1;
226 vlc = (vlc + 1) >> 1;
232 } else if (vlc < 4) {
237 level = ((vlc + 9) >> 2) - run;
241 run = svq3_dct_tables[intra][vlc].run;
242 level = svq3_dct_tables[intra][vlc].level;
245 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
248 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
252 if ((index += run) >= limit)
255 block[scan[index]] = (level ^ sign) - sign;
266 static inline void svq3_mc_dir_part(MpegEncContext *s,
267 int x, int y, int width, int height,
268 int mx, int my, int dxy,
269 int thirdpel, int dir, int avg)
271 const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture;
274 int blocksize = 2 - (width>>3); //16->0, 8->1, 4->2
279 if (mx < 0 || mx >= (s->h_edge_pos - width - 1) ||
280 my < 0 || my >= (s->v_edge_pos - height - 1)) {
282 if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
286 mx = av_clip (mx, -16, (s->h_edge_pos - width + 15));
287 my = av_clip (my, -16, (s->v_edge_pos - height + 15));
290 /* form component predictions */
291 dest = s->current_picture.data[0] + x + y*s->linesize;
292 src = pic->data[0] + mx + my*s->linesize;
295 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1),
296 mx, my, s->h_edge_pos, s->v_edge_pos);
297 src = s->edge_emu_buffer;
300 (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_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height);
304 if (!(s->flags & CODEC_FLAG_GRAY)) {
305 mx = (mx + (mx < (int) x)) >> 1;
306 my = (my + (my < (int) y)) >> 1;
307 width = (width >> 1);
308 height = (height >> 1);
311 for (i = 1; i < 3; i++) {
312 dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize;
313 src = pic->data[i] + mx + my*s->uvlinesize;
316 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1),
317 mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
318 src = s->edge_emu_buffer;
321 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height);
323 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height);
328 static inline int svq3_mc_dir(H264Context *h, int size, int mode, int dir,
331 int i, j, k, mx, my, dx, dy, x, y;
332 MpegEncContext *const s = (MpegEncContext *) h;
333 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
334 const int part_height = 16 >> ((unsigned) (size + 1) / 3);
335 const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0;
336 const int h_edge_pos = 6*(s->h_edge_pos - part_width ) - extra_width;
337 const int v_edge_pos = 6*(s->v_edge_pos - part_height) - extra_width;
339 for (i = 0; i < 16; i += part_height) {
340 for (j = 0; j < 16; j += part_width) {
341 const int b_xy = (4*s->mb_x + (j >> 2)) + (4*s->mb_y + (i >> 2))*h->b_stride;
345 k = ((j >> 2) & 1) + ((i >> 1) & 2) + ((j >> 1) & 4) + (i & 8);
347 if (mode != PREDICT_MODE) {
348 pred_motion(h, k, (part_width >> 2), dir, 1, &mx, &my);
350 mx = s->next_picture.motion_val[0][b_xy][0]<<1;
351 my = s->next_picture.motion_val[0][b_xy][1]<<1;
354 mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
355 my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
357 mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
358 my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
362 /* clip motion vector prediction to frame border */
363 mx = av_clip(mx, extra_width - 6*x, h_edge_pos - 6*x);
364 my = av_clip(my, extra_width - 6*y, v_edge_pos - 6*y);
366 /* get (optional) motion vector differential */
367 if (mode == PREDICT_MODE) {
370 dy = svq3_get_se_golomb(&s->gb);
371 dx = svq3_get_se_golomb(&s->gb);
373 if (dx == INVALID_VLC || dy == INVALID_VLC) {
374 av_log(h->s.avctx, AV_LOG_ERROR, "invalid MV vlc\n");
379 /* compute motion vector */
380 if (mode == THIRDPEL_MODE) {
382 mx = ((mx + 1)>>1) + dx;
383 my = ((my + 1)>>1) + dy;
384 fx = ((unsigned)(mx + 0x3000))/3 - 0x1000;
385 fy = ((unsigned)(my + 0x3000))/3 - 0x1000;
386 dxy = (mx - 3*fx) + 4*(my - 3*fy);
388 svq3_mc_dir_part(s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
391 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
392 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
393 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
394 dxy = (mx&1) + 2*(my&1);
396 svq3_mc_dir_part(s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
400 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
401 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
403 svq3_mc_dir_part(s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
408 /* update mv_cache */
409 if (mode != PREDICT_MODE) {
410 int32_t mv = pack16to32(mx,my);
412 if (part_height == 8 && i < 8) {
413 *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv;
415 if (part_width == 8 && j < 8) {
416 *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv;
419 if (part_width == 8 && j < 8) {
420 *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv;
422 if (part_width == 4 || part_height == 4) {
423 *(int32_t *) h->mv_cache[dir][scan8[k]] = mv;
427 /* write back motion vectors */
428 fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4);
435 static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
437 H264Context *h = &svq3->h;
438 int i, j, k, m, dir, mode;
442 MpegEncContext *const s = (MpegEncContext *) h;
443 const int mb_xy = h->mb_xy;
444 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
446 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
447 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
448 h->topright_samples_available = 0xFFFF;
450 if (mb_type == 0) { /* SKIP */
451 if (s->pict_type == AV_PICTURE_TYPE_P || s->next_picture.mb_type[mb_xy] == -1) {
452 svq3_mc_dir_part(s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0);
454 if (s->pict_type == AV_PICTURE_TYPE_B) {
455 svq3_mc_dir_part(s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1);
458 mb_type = MB_TYPE_SKIP;
460 mb_type = FFMIN(s->next_picture.mb_type[mb_xy], 6);
461 if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 0, 0) < 0)
463 if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 1, 1) < 0)
466 mb_type = MB_TYPE_16x16;
468 } else if (mb_type < 8) { /* INTER */
469 if (svq3->thirdpel_flag && svq3->halfpel_flag == !get_bits1 (&s->gb)) {
470 mode = THIRDPEL_MODE;
471 } else if (svq3->halfpel_flag && svq3->thirdpel_flag == !get_bits1 (&s->gb)) {
478 /* note ref_cache should contain here:
486 for (m = 0; m < 2; m++) {
487 if (s->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6] != -1) {
488 for (i = 0; i < 4; i++) {
489 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - 1 + i*h->b_stride];
492 for (i = 0; i < 4; i++) {
493 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0;
497 memcpy(h->mv_cache[m][scan8[0] - 1*8], s->current_picture.motion_val[m][b_xy - h->b_stride], 4*2*sizeof(int16_t));
498 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);
500 if (s->mb_x < (s->mb_width - 1)) {
501 *(uint32_t *) h->mv_cache[m][scan8[0] + 4 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride + 4];
502 h->ref_cache[m][scan8[0] + 4 - 1*8] =
503 (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride + 1]+6] == -1 ||
504 h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride ] ] == -1) ? PART_NOT_AVAILABLE : 1;
506 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
508 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1];
509 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;
511 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
513 memset(&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
515 if (s->pict_type != AV_PICTURE_TYPE_B)
519 /* decode motion vector(s) and form prediction(s) */
520 if (s->pict_type == AV_PICTURE_TYPE_P) {
521 if (svq3_mc_dir(h, (mb_type - 1), mode, 0, 0) < 0)
523 } else { /* AV_PICTURE_TYPE_B */
525 if (svq3_mc_dir(h, 0, mode, 0, 0) < 0)
528 for (i = 0; i < 4; i++) {
529 memset(s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
533 if (svq3_mc_dir(h, 0, mode, 1, (mb_type == 3)) < 0)
536 for (i = 0; i < 4; i++) {
537 memset(s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
542 mb_type = MB_TYPE_16x16;
543 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
544 memset(h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
548 for (i = 0; i < 4; i++) {
549 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6-i];
551 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
552 h->left_samples_available = 0x5F5F;
556 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+0];
557 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+1];
558 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+2];
559 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+3];
561 if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
562 h->top_samples_available = 0x33FF;
566 /* decode prediction codes for luma blocks */
567 for (i = 0; i < 16; i+=2) {
568 vlc = svq3_get_ue_golomb(&s->gb);
571 av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
575 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
576 top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
578 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
579 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
581 if (left[1] == -1 || left[2] == -1){
582 av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n");
586 } else { /* mb_type == 33, DC_128_PRED block type */
587 for (i = 0; i < 4; i++) {
588 memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
592 ff_h264_write_back_intra_pred_mode(h);
595 ff_h264_check_intra4x4_pred_mode(h);
597 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
598 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
600 for (i = 0; i < 4; i++) {
601 memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4);
604 h->top_samples_available = 0x33FF;
605 h->left_samples_available = 0x5F5F;
608 mb_type = MB_TYPE_INTRA4x4;
609 } else { /* INTRA16x16 */
610 dir = i_mb_type_info[mb_type - 8].pred_mode;
611 dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
613 if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir)) == -1){
614 av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
618 cbp = i_mb_type_info[mb_type - 8].cbp;
619 mb_type = MB_TYPE_INTRA16x16;
622 if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
623 for (i = 0; i < 4; i++) {
624 memset(s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
626 if (s->pict_type == AV_PICTURE_TYPE_B) {
627 for (i = 0; i < 4; i++) {
628 memset(s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
632 if (!IS_INTRA4x4(mb_type)) {
633 memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy], DC_PRED, 8);
635 if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
636 memset(h->non_zero_count_cache + 8, 0, 14*8*sizeof(uint8_t));
637 s->dsp.clear_blocks(h->mb+ 0);
638 s->dsp.clear_blocks(h->mb+384);
641 if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
642 if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48){
643 av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
647 cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
649 if (IS_INTRA16x16(mb_type) || (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
650 s->qscale += svq3_get_se_golomb(&s->gb);
653 av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
657 if (IS_INTRA16x16(mb_type)) {
658 AV_ZERO128(h->mb_luma_dc[0]+0);
659 AV_ZERO128(h->mb_luma_dc[0]+8);
660 if (svq3_decode_block(&s->gb, h->mb_luma_dc, 0, 1)){
661 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
667 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
668 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
670 for (i = 0; i < 4; i++) {
671 if ((cbp & (1 << i))) {
672 for (j = 0; j < 4; j++) {
673 k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
674 h->non_zero_count_cache[ scan8[k] ] = 1;
676 if (svq3_decode_block(&s->gb, &h->mb[16*k], index, type)){
677 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding block\n");
685 for (i = 1; i < 3; ++i) {
686 if (svq3_decode_block(&s->gb, &h->mb[16*16*i], 0, 3)){
687 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
693 for (i = 1; i < 3; i++) {
694 for (j = 0; j < 4; j++) {
696 h->non_zero_count_cache[ scan8[k] ] = 1;
698 if (svq3_decode_block(&s->gb, &h->mb[16*k], 1, 1)){
699 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
709 s->current_picture.mb_type[mb_xy] = mb_type;
711 if (IS_INTRA(mb_type)) {
712 h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8);
718 static int svq3_decode_slice_header(AVCodecContext *avctx)
720 SVQ3Context *svq3 = avctx->priv_data;
721 H264Context *h = &svq3->h;
722 MpegEncContext *s = &h->s;
723 const int mb_xy = h->mb_xy;
726 header = get_bits(&s->gb, 8);
728 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
730 av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
733 int length = (header >> 5) & 3;
735 svq3->next_slice_index = get_bits_count(&s->gb) + 8*show_bits(&s->gb, 8*length) + 8*length;
737 if (svq3->next_slice_index > s->gb.size_in_bits) {
738 av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
742 s->gb.size_in_bits = svq3->next_slice_index - 8*(length - 1);
743 skip_bits(&s->gb, 8);
745 if (svq3->watermark_key) {
746 uint32_t header = AV_RL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1]);
747 AV_WL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1], header ^ svq3->watermark_key);
750 memcpy((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3],
751 &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
753 skip_bits_long(&s->gb, 0);
756 if ((i = svq3_get_ue_golomb(&s->gb)) == INVALID_VLC || i >= 3){
757 av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
761 h->slice_type = golomb_to_pict_type[i];
763 if ((header & 0x9F) == 2) {
764 i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
765 s->mb_skip_run = get_bits(&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
771 h->slice_num = get_bits(&s->gb, 8);
772 s->qscale = get_bits(&s->gb, 5);
773 s->adaptive_quant = get_bits1(&s->gb);
778 if (svq3->unknown_flag) {
783 skip_bits(&s->gb, 2);
785 while (get_bits1(&s->gb)) {
786 skip_bits(&s->gb, 8);
789 /* reset intra predictors and invalidate motion vector references */
791 memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - 1 ]+3, -1, 4*sizeof(int8_t));
792 memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_x] , -1, 8*sizeof(int8_t)*s->mb_x);
795 memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
798 h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] = -1;
805 static av_cold int svq3_decode_init(AVCodecContext *avctx)
807 SVQ3Context *svq3 = avctx->priv_data;
808 H264Context *h = &svq3->h;
809 MpegEncContext *s = &h->s;
811 unsigned char *extradata;
814 if (ff_h264_decode_init(avctx) < 0)
817 s->flags = avctx->flags;
818 s->flags2 = avctx->flags2;
819 s->unrestricted_mv = 1;
821 avctx->pix_fmt = avctx->codec->pix_fmts[0];
823 if (!s->context_initialized) {
824 h->chroma_qp[0] = h->chroma_qp[1] = 4;
826 svq3->halfpel_flag = 1;
827 svq3->thirdpel_flag = 1;
828 svq3->unknown_flag = 0;
830 /* prowl for the "SEQH" marker in the extradata */
831 extradata = (unsigned char *)avctx->extradata;
832 for (m = 0; m < avctx->extradata_size; m++) {
833 if (!memcmp(extradata, "SEQH", 4))
838 /* if a match was found, parse the extra data */
839 if (extradata && !memcmp(extradata, "SEQH", 4)) {
844 size = AV_RB32(&extradata[4]);
845 init_get_bits(&gb, extradata + 8, size*8);
847 /* 'frame size code' and optional 'width, height' */
848 frame_size_code = get_bits(&gb, 3);
849 switch (frame_size_code) {
850 case 0: avctx->width = 160; avctx->height = 120; break;
851 case 1: avctx->width = 128; avctx->height = 96; break;
852 case 2: avctx->width = 176; avctx->height = 144; break;
853 case 3: avctx->width = 352; avctx->height = 288; break;
854 case 4: avctx->width = 704; avctx->height = 576; break;
855 case 5: avctx->width = 240; avctx->height = 180; break;
856 case 6: avctx->width = 320; avctx->height = 240; break;
858 avctx->width = get_bits(&gb, 12);
859 avctx->height = get_bits(&gb, 12);
863 svq3->halfpel_flag = get_bits1(&gb);
864 svq3->thirdpel_flag = get_bits1(&gb);
872 s->low_delay = get_bits1(&gb);
877 while (get_bits1(&gb)) {
881 svq3->unknown_flag = get_bits1(&gb);
882 avctx->has_b_frames = !s->low_delay;
883 if (svq3->unknown_flag) {
885 unsigned watermark_width = svq3_get_ue_golomb(&gb);
886 unsigned watermark_height = svq3_get_ue_golomb(&gb);
887 int u1 = svq3_get_ue_golomb(&gb);
888 int u2 = get_bits(&gb, 8);
889 int u3 = get_bits(&gb, 2);
890 int u4 = svq3_get_ue_golomb(&gb);
891 unsigned long buf_len = watermark_width*watermark_height*4;
892 int offset = (get_bits_count(&gb)+7)>>3;
895 if ((uint64_t)watermark_width*4 > UINT_MAX/watermark_height)
898 buf = av_malloc(buf_len);
899 av_log(avctx, AV_LOG_DEBUG, "watermark size: %dx%d\n", watermark_width, watermark_height);
900 av_log(avctx, AV_LOG_DEBUG, "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n", u1, u2, u3, u4, offset);
901 if (uncompress(buf, &buf_len, extradata + 8 + offset, size - offset) != Z_OK) {
902 av_log(avctx, AV_LOG_ERROR, "could not uncompress watermark logo\n");
906 svq3->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
907 svq3->watermark_key = svq3->watermark_key << 16 | svq3->watermark_key;
908 av_log(avctx, AV_LOG_DEBUG, "watermark key %#x\n", svq3->watermark_key);
911 av_log(avctx, AV_LOG_ERROR, "this svq3 file contains watermark which need zlib support compiled in\n");
917 s->width = avctx->width;
918 s->height = avctx->height;
920 if (MPV_common_init(s) < 0)
923 h->b_stride = 4*s->mb_width;
925 ff_h264_alloc_tables(h);
931 static int svq3_decode_frame(AVCodecContext *avctx,
932 void *data, int *data_size,
935 const uint8_t *buf = avpkt->data;
936 SVQ3Context *svq3 = avctx->priv_data;
937 H264Context *h = &svq3->h;
938 MpegEncContext *s = &h->s;
939 int buf_size = avpkt->size;
942 /* special case for last picture */
944 if (s->next_picture_ptr && !s->low_delay) {
945 *(AVFrame *) data = *(AVFrame *) &s->next_picture;
946 s->next_picture_ptr = NULL;
947 *data_size = sizeof(AVFrame);
952 init_get_bits (&s->gb, buf, 8*buf_size);
954 s->mb_x = s->mb_y = h->mb_xy = 0;
956 if (svq3_decode_slice_header(avctx))
959 s->pict_type = h->slice_type;
960 s->picture_number = h->slice_num;
962 if (avctx->debug&FF_DEBUG_PICT_INFO){
963 av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
964 av_get_picture_type_char(s->pict_type), svq3->halfpel_flag, svq3->thirdpel_flag,
965 s->adaptive_quant, s->qscale, h->slice_num);
968 /* for skipping the frame */
969 s->current_picture.pict_type = s->pict_type;
970 s->current_picture.key_frame = (s->pict_type == AV_PICTURE_TYPE_I);
972 /* Skip B-frames if we do not have reference frames. */
973 if (s->last_picture_ptr == NULL && s->pict_type == AV_PICTURE_TYPE_B)
975 if ( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
976 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
977 || avctx->skip_frame >= AVDISCARD_ALL)
980 if (s->next_p_frame_damaged) {
981 if (s->pict_type == AV_PICTURE_TYPE_B)
984 s->next_p_frame_damaged = 0;
987 if (ff_h264_frame_start(h) < 0)
990 if (s->pict_type == AV_PICTURE_TYPE_B) {
991 h->frame_num_offset = (h->slice_num - h->prev_frame_num);
993 if (h->frame_num_offset < 0) {
994 h->frame_num_offset += 256;
996 if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
997 av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1001 h->prev_frame_num = h->frame_num;
1002 h->frame_num = h->slice_num;
1003 h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
1005 if (h->prev_frame_num_offset < 0) {
1006 h->prev_frame_num_offset += 256;
1010 for (m = 0; m < 2; m++){
1012 for (i = 0; i < 4; i++){
1014 for (j = -1; j < 4; j++)
1015 h->ref_cache[m][scan8[0] + 8*i + j]= 1;
1017 h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
1021 for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1022 for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1023 h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
1025 if ( (get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
1026 ((get_bits_count(&s->gb) & 7) == 0 || show_bits(&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) {
1028 skip_bits(&s->gb, svq3->next_slice_index - get_bits_count(&s->gb));
1029 s->gb.size_in_bits = 8*buf_size;
1031 if (svq3_decode_slice_header(avctx))
1034 /* TODO: support s->mb_skip_run */
1037 mb_type = svq3_get_ue_golomb(&s->gb);
1039 if (s->pict_type == AV_PICTURE_TYPE_I) {
1041 } else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4) {
1044 if ((unsigned)mb_type > 33 || svq3_decode_mb(svq3, mb_type)) {
1045 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
1050 ff_h264_hl_decode_mb (h);
1053 if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay) {
1054 s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] =
1055 (s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1059 ff_draw_horiz_band(s, 16*s->mb_y, 16);
1064 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
1065 *(AVFrame *) data = *(AVFrame *) &s->current_picture;
1067 *(AVFrame *) data = *(AVFrame *) &s->last_picture;
1070 /* Do not output the last pic after seeking. */
1071 if (s->last_picture_ptr || s->low_delay) {
1072 *data_size = sizeof(AVFrame);
1078 static int svq3_decode_end(AVCodecContext *avctx)
1080 SVQ3Context *svq3 = avctx->priv_data;
1081 H264Context *h = &svq3->h;
1082 MpegEncContext *s = &h->s;
1084 ff_h264_free_context(h);
1091 AVCodec ff_svq3_decoder = {
1095 sizeof(SVQ3Context),
1100 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY,
1101 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1102 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_NONE},