2 * Copyright (c) 2003 The FFmpeg Project.
4 * This file is part of FFmpeg.
6 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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 * ftp://ftp.mplayerhq.hu/MPlayer/samples/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
48 #define FULLPEL_MODE 1
49 #define HALFPEL_MODE 2
50 #define THIRDPEL_MODE 3
51 #define PREDICT_MODE 4
53 /* dual scan (from some older h264 draft)
62 static const uint8_t svq3_scan
[16]={
63 0+0*4, 1+0*4, 2+0*4, 2+1*4,
64 2+2*4, 3+0*4, 3+1*4, 3+2*4,
65 0+1*4, 0+2*4, 1+1*4, 1+2*4,
66 0+3*4, 1+3*4, 2+3*4, 3+3*4,
69 static const uint8_t svq3_pred_0
[25][2] = {
72 { 0, 2 }, { 1, 1 }, { 2, 0 },
73 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
74 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
75 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
76 { 2, 4 }, { 3, 3 }, { 4, 2 },
81 static const int8_t svq3_pred_1
[6][6][5] = {
82 { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
83 { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
84 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
85 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
86 { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
87 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
88 { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
89 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
90 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
91 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
92 { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
93 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
96 static const struct { uint8_t run
; uint8_t level
; } svq3_dct_tables
[2][16] = {
97 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
98 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
99 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
100 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
103 static const uint32_t svq3_dequant_coeff
[32] = {
104 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
105 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
106 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
107 61694, 68745, 77615, 89113,100253,109366,126635,141533
111 static void svq3_luma_dc_dequant_idct_c(DCTELEM
*block
, int qp
){
112 const int qmul
= svq3_dequant_coeff
[qp
];
116 static const int x_offset
[4]={0, 1*stride
, 4* stride
, 5*stride
};
117 static const int y_offset
[4]={0, 2*stride
, 8* stride
, 10*stride
};
120 const int offset
= y_offset
[i
];
121 const int z0
= 13*(block
[offset
+stride
*0] + block
[offset
+stride
*4]);
122 const int z1
= 13*(block
[offset
+stride
*0] - block
[offset
+stride
*4]);
123 const int z2
= 7* block
[offset
+stride
*1] - 17*block
[offset
+stride
*5];
124 const int z3
= 17* block
[offset
+stride
*1] + 7*block
[offset
+stride
*5];
133 const int offset
= x_offset
[i
];
134 const int z0
= 13*(temp
[4*0+i
] + temp
[4*2+i
]);
135 const int z1
= 13*(temp
[4*0+i
] - temp
[4*2+i
]);
136 const int z2
= 7* temp
[4*1+i
] - 17*temp
[4*3+i
];
137 const int z3
= 17* temp
[4*1+i
] + 7*temp
[4*3+i
];
139 block
[stride
*0 +offset
]= ((z0
+ z3
)*qmul
+ 0x80000)>>20;
140 block
[stride
*2 +offset
]= ((z1
+ z2
)*qmul
+ 0x80000)>>20;
141 block
[stride
*8 +offset
]= ((z1
- z2
)*qmul
+ 0x80000)>>20;
142 block
[stride
*10+offset
]= ((z0
- z3
)*qmul
+ 0x80000)>>20;
147 static void svq3_add_idct_c (uint8_t *dst
, DCTELEM
*block
, int stride
, int qp
, int dc
){
148 const int qmul
= svq3_dequant_coeff
[qp
];
150 uint8_t *cm
= ff_cropTbl
+ MAX_NEG_CROP
;
153 dc
= 13*13*((dc
== 1) ? 1538*block
[0] : ((qmul
*(block
[0] >> 3)) / 2));
157 for (i
=0; i
< 4; i
++) {
158 const int z0
= 13*(block
[0 + 4*i
] + block
[2 + 4*i
]);
159 const int z1
= 13*(block
[0 + 4*i
] - block
[2 + 4*i
]);
160 const int z2
= 7* block
[1 + 4*i
] - 17*block
[3 + 4*i
];
161 const int z3
= 17* block
[1 + 4*i
] + 7*block
[3 + 4*i
];
163 block
[0 + 4*i
]= z0
+ z3
;
164 block
[1 + 4*i
]= z1
+ z2
;
165 block
[2 + 4*i
]= z1
- z2
;
166 block
[3 + 4*i
]= z0
- z3
;
169 for (i
=0; i
< 4; i
++) {
170 const int z0
= 13*(block
[i
+ 4*0] + block
[i
+ 4*2]);
171 const int z1
= 13*(block
[i
+ 4*0] - block
[i
+ 4*2]);
172 const int z2
= 7* block
[i
+ 4*1] - 17*block
[i
+ 4*3];
173 const int z3
= 17* block
[i
+ 4*1] + 7*block
[i
+ 4*3];
174 const int rr
= (dc
+ 0x80000);
176 dst
[i
+ stride
*0]= cm
[ dst
[i
+ stride
*0] + (((z0
+ z3
)*qmul
+ rr
) >> 20) ];
177 dst
[i
+ stride
*1]= cm
[ dst
[i
+ stride
*1] + (((z1
+ z2
)*qmul
+ rr
) >> 20) ];
178 dst
[i
+ stride
*2]= cm
[ dst
[i
+ stride
*2] + (((z1
- z2
)*qmul
+ rr
) >> 20) ];
179 dst
[i
+ stride
*3]= cm
[ dst
[i
+ stride
*3] + (((z0
- z3
)*qmul
+ rr
) >> 20) ];
183 static inline int svq3_decode_block (GetBitContext
*gb
, DCTELEM
*block
,
184 int index
, const int type
) {
186 static const uint8_t *const scan_patterns
[4] =
187 { luma_dc_zigzag_scan
, zigzag_scan
, svq3_scan
, chroma_dc_scan
};
189 int run
, level
, sign
, vlc
, limit
;
190 const int intra
= (3 * type
) >> 2;
191 const uint8_t *const scan
= scan_patterns
[type
];
193 for (limit
=(16 >> intra
); index
< 16; index
=limit
, limit
+=8) {
194 for (; (vlc
= svq3_get_ue_golomb (gb
)) != 0; index
++) {
196 if (vlc
== INVALID_VLC
)
199 sign
= (vlc
& 0x1) - 1;
200 vlc
= (vlc
+ 1) >> 1;
206 } else if (vlc
< 4) {
211 level
= ((vlc
+ 9) >> 2) - run
;
215 run
= svq3_dct_tables
[intra
][vlc
].run
;
216 level
= svq3_dct_tables
[intra
][vlc
].level
;
219 level
= (vlc
>> 3) + ((run
== 0) ? 8 : ((run
< 2) ? 2 : ((run
< 5) ? 0 : -1)));
222 level
= (vlc
>> 4) + ((run
== 0) ? 4 : ((run
< 3) ? 2 : ((run
< 10) ? 1 : 0)));
226 if ((index
+= run
) >= limit
)
229 block
[scan
[index
]] = (level
^ sign
) - sign
;
240 static inline void svq3_mc_dir_part (MpegEncContext
*s
,
241 int x
, int y
, int width
, int height
,
242 int mx
, int my
, int dxy
,
243 int thirdpel
, int dir
, int avg
) {
245 const Picture
*pic
= (dir
== 0) ? &s
->last_picture
: &s
->next_picture
;
248 int blocksize
= 2 - (width
>>3); //16->0, 8->1, 4->2
253 if (mx
< 0 || mx
>= (s
->h_edge_pos
- width
- 1) ||
254 my
< 0 || my
>= (s
->v_edge_pos
- height
- 1)) {
256 if ((s
->flags
& CODEC_FLAG_EMU_EDGE
)) {
260 mx
= av_clip (mx
, -16, (s
->h_edge_pos
- width
+ 15));
261 my
= av_clip (my
, -16, (s
->v_edge_pos
- height
+ 15));
264 /* form component predictions */
265 dest
= s
->current_picture
.data
[0] + x
+ y
*s
->linesize
;
266 src
= pic
->data
[0] + mx
+ my
*s
->linesize
;
269 ff_emulated_edge_mc (s
->edge_emu_buffer
, src
, s
->linesize
, (width
+ 1), (height
+ 1),
270 mx
, my
, s
->h_edge_pos
, s
->v_edge_pos
);
271 src
= s
->edge_emu_buffer
;
274 (avg
? s
->dsp
.avg_tpel_pixels_tab
: s
->dsp
.put_tpel_pixels_tab
)[dxy
](dest
, src
, s
->linesize
, width
, height
);
276 (avg
? s
->dsp
.avg_pixels_tab
: s
->dsp
.put_pixels_tab
)[blocksize
][dxy
](dest
, src
, s
->linesize
, height
);
278 if (!(s
->flags
& CODEC_FLAG_GRAY
)) {
279 mx
= (mx
+ (mx
< (int) x
)) >> 1;
280 my
= (my
+ (my
< (int) y
)) >> 1;
281 width
= (width
>> 1);
282 height
= (height
>> 1);
285 for (i
=1; i
< 3; i
++) {
286 dest
= s
->current_picture
.data
[i
] + (x
>> 1) + (y
>> 1)*s
->uvlinesize
;
287 src
= pic
->data
[i
] + mx
+ my
*s
->uvlinesize
;
290 ff_emulated_edge_mc (s
->edge_emu_buffer
, src
, s
->uvlinesize
, (width
+ 1), (height
+ 1),
291 mx
, my
, (s
->h_edge_pos
>> 1), (s
->v_edge_pos
>> 1));
292 src
= s
->edge_emu_buffer
;
295 (avg
? s
->dsp
.avg_tpel_pixels_tab
: s
->dsp
.put_tpel_pixels_tab
)[dxy
](dest
, src
, s
->uvlinesize
, width
, height
);
297 (avg
? s
->dsp
.avg_pixels_tab
: s
->dsp
.put_pixels_tab
)[blocksize
][dxy
](dest
, src
, s
->uvlinesize
, height
);
302 static inline int svq3_mc_dir (H264Context
*h
, int size
, int mode
, int dir
, int avg
) {
304 int i
, j
, k
, mx
, my
, dx
, dy
, x
, y
;
305 MpegEncContext
*const s
= (MpegEncContext
*) h
;
306 const int part_width
= ((size
& 5) == 4) ? 4 : 16 >> (size
& 1);
307 const int part_height
= 16 >> ((unsigned) (size
+ 1) / 3);
308 const int extra_width
= (mode
== PREDICT_MODE
) ? -16*6 : 0;
309 const int h_edge_pos
= 6*(s
->h_edge_pos
- part_width
) - extra_width
;
310 const int v_edge_pos
= 6*(s
->v_edge_pos
- part_height
) - extra_width
;
312 for (i
=0; i
< 16; i
+=part_height
) {
313 for (j
=0; j
< 16; j
+=part_width
) {
314 const int b_xy
= (4*s
->mb_x
+(j
>>2)) + (4*s
->mb_y
+(i
>>2))*h
->b_stride
;
318 k
= ((j
>>2)&1) + ((i
>>1)&2) + ((j
>>1)&4) + (i
&8);
320 if (mode
!= PREDICT_MODE
) {
321 pred_motion (h
, k
, (part_width
>> 2), dir
, 1, &mx
, &my
);
323 mx
= s
->next_picture
.motion_val
[0][b_xy
][0]<<1;
324 my
= s
->next_picture
.motion_val
[0][b_xy
][1]<<1;
327 mx
= ((mx
* h
->frame_num_offset
) / h
->prev_frame_num_offset
+ 1)>>1;
328 my
= ((my
* h
->frame_num_offset
) / h
->prev_frame_num_offset
+ 1)>>1;
330 mx
= ((mx
* (h
->frame_num_offset
- h
->prev_frame_num_offset
)) / h
->prev_frame_num_offset
+ 1)>>1;
331 my
= ((my
* (h
->frame_num_offset
- h
->prev_frame_num_offset
)) / h
->prev_frame_num_offset
+ 1)>>1;
335 /* clip motion vector prediction to frame border */
336 mx
= av_clip (mx
, extra_width
- 6*x
, h_edge_pos
- 6*x
);
337 my
= av_clip (my
, extra_width
- 6*y
, v_edge_pos
- 6*y
);
339 /* get (optional) motion vector differential */
340 if (mode
== PREDICT_MODE
) {
343 dy
= svq3_get_se_golomb (&s
->gb
);
344 dx
= svq3_get_se_golomb (&s
->gb
);
346 if (dx
== INVALID_VLC
|| dy
== INVALID_VLC
) {
347 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "invalid MV vlc\n");
352 /* compute motion vector */
353 if (mode
== THIRDPEL_MODE
) {
355 mx
= ((mx
+ 1)>>1) + dx
;
356 my
= ((my
+ 1)>>1) + dy
;
357 fx
= ((unsigned)(mx
+ 0x3000))/3 - 0x1000;
358 fy
= ((unsigned)(my
+ 0x3000))/3 - 0x1000;
359 dxy
= (mx
- 3*fx
) + 4*(my
- 3*fy
);
361 svq3_mc_dir_part (s
, x
, y
, part_width
, part_height
, fx
, fy
, dxy
, 1, dir
, avg
);
364 } else if (mode
== HALFPEL_MODE
|| mode
== PREDICT_MODE
) {
365 mx
= ((unsigned)(mx
+ 1 + 0x3000))/3 + dx
- 0x1000;
366 my
= ((unsigned)(my
+ 1 + 0x3000))/3 + dy
- 0x1000;
367 dxy
= (mx
&1) + 2*(my
&1);
369 svq3_mc_dir_part (s
, x
, y
, part_width
, part_height
, mx
>>1, my
>>1, dxy
, 0, dir
, avg
);
373 mx
= ((unsigned)(mx
+ 3 + 0x6000))/6 + dx
- 0x1000;
374 my
= ((unsigned)(my
+ 3 + 0x6000))/6 + dy
- 0x1000;
376 svq3_mc_dir_part (s
, x
, y
, part_width
, part_height
, mx
, my
, 0, 0, dir
, avg
);
381 /* update mv_cache */
382 if (mode
!= PREDICT_MODE
) {
383 int32_t mv
= pack16to32(mx
,my
);
385 if (part_height
== 8 && i
< 8) {
386 *(int32_t *) h
->mv_cache
[dir
][scan8
[k
] + 1*8] = mv
;
388 if (part_width
== 8 && j
< 8) {
389 *(int32_t *) h
->mv_cache
[dir
][scan8
[k
] + 1 + 1*8] = mv
;
392 if (part_width
== 8 && j
< 8) {
393 *(int32_t *) h
->mv_cache
[dir
][scan8
[k
] + 1] = mv
;
395 if (part_width
== 4 || part_height
== 4) {
396 *(int32_t *) h
->mv_cache
[dir
][scan8
[k
]] = mv
;
400 /* write back motion vectors */
401 fill_rectangle(s
->current_picture
.motion_val
[dir
][b_xy
], part_width
>>2, part_height
>>2, h
->b_stride
, pack16to32(mx
,my
), 4);
408 static int svq3_decode_mb (H264Context
*h
, unsigned int mb_type
) {
409 int i
, j
, k
, m
, dir
, mode
;
413 MpegEncContext
*const s
= (MpegEncContext
*) h
;
414 const int mb_xy
= h
->mb_xy
;
415 const int b_xy
= 4*s
->mb_x
+ 4*s
->mb_y
*h
->b_stride
;
417 h
->top_samples_available
= (s
->mb_y
== 0) ? 0x33FF : 0xFFFF;
418 h
->left_samples_available
= (s
->mb_x
== 0) ? 0x5F5F : 0xFFFF;
419 h
->topright_samples_available
= 0xFFFF;
421 if (mb_type
== 0) { /* SKIP */
422 if (s
->pict_type
== FF_P_TYPE
|| s
->next_picture
.mb_type
[mb_xy
] == -1) {
423 svq3_mc_dir_part (s
, 16*s
->mb_x
, 16*s
->mb_y
, 16, 16, 0, 0, 0, 0, 0, 0);
425 if (s
->pict_type
== FF_B_TYPE
) {
426 svq3_mc_dir_part (s
, 16*s
->mb_x
, 16*s
->mb_y
, 16, 16, 0, 0, 0, 0, 1, 1);
429 mb_type
= MB_TYPE_SKIP
;
431 mb_type
= FFMIN(s
->next_picture
.mb_type
[mb_xy
], 6);
432 if(svq3_mc_dir (h
, mb_type
, PREDICT_MODE
, 0, 0) < 0)
434 if(svq3_mc_dir (h
, mb_type
, PREDICT_MODE
, 1, 1) < 0)
437 mb_type
= MB_TYPE_16x16
;
439 } else if (mb_type
< 8) { /* INTER */
440 if (h
->thirdpel_flag
&& h
->halfpel_flag
== !get_bits1 (&s
->gb
)) {
441 mode
= THIRDPEL_MODE
;
442 } else if (h
->halfpel_flag
&& h
->thirdpel_flag
== !get_bits1 (&s
->gb
)) {
449 /* note ref_cache should contain here:
457 for (m
=0; m
< 2; m
++) {
458 if (s
->mb_x
> 0 && h
->intra4x4_pred_mode
[mb_xy
- 1][0] != -1) {
459 for (i
=0; i
< 4; i
++) {
460 *(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
];
463 for (i
=0; i
< 4; i
++) {
464 *(uint32_t *) h
->mv_cache
[m
][scan8
[0] - 1 + i
*8] = 0;
468 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));
469 memset (&h
->ref_cache
[m
][scan8
[0] - 1*8], (h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
][4] == -1) ? PART_NOT_AVAILABLE
: 1, 4);
471 if (s
->mb_x
< (s
->mb_width
- 1)) {
472 *(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];
473 h
->ref_cache
[m
][scan8
[0] + 4 - 1*8] =
474 (h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
+ 1][0] == -1 ||
475 h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
][4] == -1) ? PART_NOT_AVAILABLE
: 1;
477 h
->ref_cache
[m
][scan8
[0] + 4 - 1*8] = PART_NOT_AVAILABLE
;
479 *(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];
480 h
->ref_cache
[m
][scan8
[0] - 1 - 1*8] = (h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
- 1][3] == -1) ? PART_NOT_AVAILABLE
: 1;
482 h
->ref_cache
[m
][scan8
[0] - 1 - 1*8] = PART_NOT_AVAILABLE
;
484 memset (&h
->ref_cache
[m
][scan8
[0] - 1*8 - 1], PART_NOT_AVAILABLE
, 8);
486 if (s
->pict_type
!= FF_B_TYPE
)
490 /* decode motion vector(s) and form prediction(s) */
491 if (s
->pict_type
== FF_P_TYPE
) {
492 if(svq3_mc_dir (h
, (mb_type
- 1), mode
, 0, 0) < 0)
494 } else { /* FF_B_TYPE */
496 if(svq3_mc_dir (h
, 0, mode
, 0, 0) < 0)
499 for (i
=0; i
< 4; i
++) {
500 memset (s
->current_picture
.motion_val
[0][b_xy
+ i
*h
->b_stride
], 0, 4*2*sizeof(int16_t));
504 if(svq3_mc_dir (h
, 0, mode
, 1, (mb_type
== 3)) < 0)
507 for (i
=0; i
< 4; i
++) {
508 memset (s
->current_picture
.motion_val
[1][b_xy
+ i
*h
->b_stride
], 0, 4*2*sizeof(int16_t));
513 mb_type
= MB_TYPE_16x16
;
514 } else if (mb_type
== 8 || mb_type
== 33) { /* INTRA4x4 */
515 memset (h
->intra4x4_pred_mode_cache
, -1, 8*5*sizeof(int8_t));
519 for (i
=0; i
< 4; i
++) {
520 h
->intra4x4_pred_mode_cache
[scan8
[0] - 1 + i
*8] = h
->intra4x4_pred_mode
[mb_xy
- 1][i
];
522 if (h
->intra4x4_pred_mode_cache
[scan8
[0] - 1] == -1) {
523 h
->left_samples_available
= 0x5F5F;
527 h
->intra4x4_pred_mode_cache
[4+8*0] = h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
][4];
528 h
->intra4x4_pred_mode_cache
[5+8*0] = h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
][5];
529 h
->intra4x4_pred_mode_cache
[6+8*0] = h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
][6];
530 h
->intra4x4_pred_mode_cache
[7+8*0] = h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
][3];
532 if (h
->intra4x4_pred_mode_cache
[4+8*0] == -1) {
533 h
->top_samples_available
= 0x33FF;
537 /* decode prediction codes for luma blocks */
538 for (i
=0; i
< 16; i
+=2) {
539 vlc
= svq3_get_ue_golomb (&s
->gb
);
542 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "luma prediction:%d\n", vlc
);
546 left
= &h
->intra4x4_pred_mode_cache
[scan8
[i
] - 1];
547 top
= &h
->intra4x4_pred_mode_cache
[scan8
[i
] - 8];
549 left
[1] = svq3_pred_1
[top
[0] + 1][left
[0] + 1][svq3_pred_0
[vlc
][0]];
550 left
[2] = svq3_pred_1
[top
[1] + 1][left
[1] + 1][svq3_pred_0
[vlc
][1]];
552 if (left
[1] == -1 || left
[2] == -1){
553 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "weird prediction\n");
557 } else { /* mb_type == 33, DC_128_PRED block type */
558 for (i
=0; i
< 4; i
++) {
559 memset (&h
->intra4x4_pred_mode_cache
[scan8
[0] + 8*i
], DC_PRED
, 4);
563 write_back_intra_pred_mode (h
);
566 check_intra4x4_pred_mode (h
);
568 h
->top_samples_available
= (s
->mb_y
== 0) ? 0x33FF : 0xFFFF;
569 h
->left_samples_available
= (s
->mb_x
== 0) ? 0x5F5F : 0xFFFF;
571 for (i
=0; i
< 4; i
++) {
572 memset (&h
->intra4x4_pred_mode_cache
[scan8
[0] + 8*i
], DC_128_PRED
, 4);
575 h
->top_samples_available
= 0x33FF;
576 h
->left_samples_available
= 0x5F5F;
579 mb_type
= MB_TYPE_INTRA4x4
;
580 } else { /* INTRA16x16 */
581 dir
= i_mb_type_info
[mb_type
- 8].pred_mode
;
582 dir
= (dir
>> 1) ^ 3*(dir
& 1) ^ 1;
584 if ((h
->intra16x16_pred_mode
= check_intra_pred_mode (h
, dir
)) == -1){
585 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "check_intra_pred_mode = -1\n");
589 cbp
= i_mb_type_info
[mb_type
- 8].cbp
;
590 mb_type
= MB_TYPE_INTRA16x16
;
593 if (!IS_INTER(mb_type
) && s
->pict_type
!= FF_I_TYPE
) {
594 for (i
=0; i
< 4; i
++) {
595 memset (s
->current_picture
.motion_val
[0][b_xy
+ i
*h
->b_stride
], 0, 4*2*sizeof(int16_t));
597 if (s
->pict_type
== FF_B_TYPE
) {
598 for (i
=0; i
< 4; i
++) {
599 memset (s
->current_picture
.motion_val
[1][b_xy
+ i
*h
->b_stride
], 0, 4*2*sizeof(int16_t));
603 if (!IS_INTRA4x4(mb_type
)) {
604 memset (h
->intra4x4_pred_mode
[mb_xy
], DC_PRED
, 8);
606 if (!IS_SKIP(mb_type
) || s
->pict_type
== FF_B_TYPE
) {
607 memset (h
->non_zero_count_cache
+ 8, 0, 4*9*sizeof(uint8_t));
608 s
->dsp
.clear_blocks(h
->mb
);
611 if (!IS_INTRA16x16(mb_type
) && (!IS_SKIP(mb_type
) || s
->pict_type
== FF_B_TYPE
)) {
612 if ((vlc
= svq3_get_ue_golomb (&s
->gb
)) >= 48){
613 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "cbp_vlc=%d\n", vlc
);
617 cbp
= IS_INTRA(mb_type
) ? golomb_to_intra4x4_cbp
[vlc
] : golomb_to_inter_cbp
[vlc
];
619 if (IS_INTRA16x16(mb_type
) || (s
->pict_type
!= FF_I_TYPE
&& s
->adaptive_quant
&& cbp
)) {
620 s
->qscale
+= svq3_get_se_golomb (&s
->gb
);
623 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "qscale:%d\n", s
->qscale
);
627 if (IS_INTRA16x16(mb_type
)) {
628 if (svq3_decode_block (&s
->gb
, h
->mb
, 0, 0)){
629 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error while decoding intra luma dc\n");
635 const int index
= IS_INTRA16x16(mb_type
) ? 1 : 0;
636 const int type
= ((s
->qscale
< 24 && IS_INTRA4x4(mb_type
)) ? 2 : 1);
638 for (i
=0; i
< 4; i
++) {
639 if ((cbp
& (1 << i
))) {
640 for (j
=0; j
< 4; j
++) {
641 k
= index
? ((j
&1) + 2*(i
&1) + 2*(j
&2) + 4*(i
&2)) : (4*i
+ j
);
642 h
->non_zero_count_cache
[ scan8
[k
] ] = 1;
644 if (svq3_decode_block (&s
->gb
, &h
->mb
[16*k
], index
, type
)){
645 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error while decoding block\n");
653 for (i
=0; i
< 2; ++i
) {
654 if (svq3_decode_block (&s
->gb
, &h
->mb
[16*(16 + 4*i
)], 0, 3)){
655 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error while decoding chroma dc block\n");
661 for (i
=0; i
< 8; i
++) {
662 h
->non_zero_count_cache
[ scan8
[16+i
] ] = 1;
664 if (svq3_decode_block (&s
->gb
, &h
->mb
[16*(16 + i
)], 1, 1)){
665 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error while decoding chroma ac block\n");
673 s
->current_picture
.mb_type
[mb_xy
] = mb_type
;
675 if (IS_INTRA(mb_type
)) {
676 h
->chroma_pred_mode
= check_intra_pred_mode (h
, DC_PRED8x8
);
682 static int svq3_decode_slice_header (H264Context
*h
) {
683 MpegEncContext
*const s
= (MpegEncContext
*) h
;
684 const int mb_xy
= h
->mb_xy
;
687 header
= get_bits (&s
->gb
, 8);
689 if (((header
& 0x9F) != 1 && (header
& 0x9F) != 2) || (header
& 0x60) == 0) {
691 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "unsupported slice header (%02X)\n", header
);
694 int length
= (header
>> 5) & 3;
696 h
->next_slice_index
= get_bits_count(&s
->gb
) + 8*show_bits (&s
->gb
, 8*length
) + 8*length
;
698 if (h
->next_slice_index
> s
->gb
.size_in_bits
){
699 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "slice after bitstream end\n");
703 s
->gb
.size_in_bits
= h
->next_slice_index
- 8*(length
- 1);
704 skip_bits(&s
->gb
, 8);
707 memcpy ((uint8_t *) &s
->gb
.buffer
[get_bits_count(&s
->gb
) >> 3],
708 &s
->gb
.buffer
[s
->gb
.size_in_bits
>> 3], (length
- 1));
712 if ((i
= svq3_get_ue_golomb (&s
->gb
)) == INVALID_VLC
|| i
>= 3){
713 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "illegal slice type %d \n", i
);
717 h
->slice_type
= golomb_to_pict_type
[i
];
719 if ((header
& 0x9F) == 2) {
720 i
= (s
->mb_num
< 64) ? 6 : (1 + av_log2 (s
->mb_num
- 1));
721 s
->mb_skip_run
= get_bits (&s
->gb
, i
) - (s
->mb_x
+ (s
->mb_y
* s
->mb_width
));
727 h
->slice_num
= get_bits (&s
->gb
, 8);
728 s
->qscale
= get_bits (&s
->gb
, 5);
729 s
->adaptive_quant
= get_bits1 (&s
->gb
);
734 if (h
->unknown_svq3_flag
) {
739 skip_bits (&s
->gb
, 2);
741 while (get_bits1 (&s
->gb
)) {
742 skip_bits (&s
->gb
, 8);
745 /* reset intra predictors and invalidate motion vector references */
747 memset (h
->intra4x4_pred_mode
[mb_xy
- 1], -1, 4*sizeof(int8_t));
748 memset (h
->intra4x4_pred_mode
[mb_xy
- s
->mb_x
], -1, 8*sizeof(int8_t)*s
->mb_x
);
751 memset (h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
], -1, 8*sizeof(int8_t)*(s
->mb_width
- s
->mb_x
));
754 h
->intra4x4_pred_mode
[mb_xy
- s
->mb_stride
- 1][3] = -1;
761 static int svq3_decode_frame (AVCodecContext
*avctx
,
762 void *data
, int *data_size
,
763 const uint8_t *buf
, int buf_size
) {
764 MpegEncContext
*const s
= avctx
->priv_data
;
765 H264Context
*const h
= avctx
->priv_data
;
767 unsigned char *extradata
;
770 s
->flags
= avctx
->flags
;
771 s
->flags2
= avctx
->flags2
;
772 s
->unrestricted_mv
= 1;
774 if (!s
->context_initialized
) {
775 s
->width
= avctx
->width
;
776 s
->height
= avctx
->height
;
778 h
->thirdpel_flag
= 1;
779 h
->unknown_svq3_flag
= 0;
780 h
->chroma_qp
[0] = h
->chroma_qp
[1] = 4;
782 if (MPV_common_init (s
) < 0)
785 h
->b_stride
= 4*s
->mb_width
;
789 /* prowl for the "SEQH" marker in the extradata */
790 extradata
= (unsigned char *)avctx
->extradata
;
791 for (m
= 0; m
< avctx
->extradata_size
; m
++) {
792 if (!memcmp (extradata
, "SEQH", 4))
797 /* if a match was found, parse the extra data */
798 if (extradata
&& !memcmp (extradata
, "SEQH", 4)) {
802 size
= AV_RB32(&extradata
[4]);
803 init_get_bits (&gb
, extradata
+ 8, size
*8);
805 /* 'frame size code' and optional 'width, height' */
806 if (get_bits (&gb
, 3) == 7) {
811 h
->halfpel_flag
= get_bits1 (&gb
);
812 h
->thirdpel_flag
= get_bits1 (&gb
);
820 s
->low_delay
= get_bits1 (&gb
);
825 while (get_bits1 (&gb
)) {
829 h
->unknown_svq3_flag
= get_bits1 (&gb
);
830 avctx
->has_b_frames
= !s
->low_delay
;
834 /* special case for last picture */
836 if (s
->next_picture_ptr
&& !s
->low_delay
) {
837 *(AVFrame
*) data
= *(AVFrame
*) &s
->next_picture
;
838 *data_size
= sizeof(AVFrame
);
843 init_get_bits (&s
->gb
, buf
, 8*buf_size
);
845 s
->mb_x
= s
->mb_y
= h
->mb_xy
= 0;
847 if (svq3_decode_slice_header (h
))
850 s
->pict_type
= h
->slice_type
;
851 s
->picture_number
= h
->slice_num
;
853 if(avctx
->debug
&FF_DEBUG_PICT_INFO
){
854 av_log(h
->s
.avctx
, AV_LOG_DEBUG
, "%c hpel:%d, tpel:%d aqp:%d qp:%d\n",
855 av_get_pict_type_char(s
->pict_type
), h
->halfpel_flag
, h
->thirdpel_flag
,
856 s
->adaptive_quant
, s
->qscale
860 /* for hurry_up==5 */
861 s
->current_picture
.pict_type
= s
->pict_type
;
862 s
->current_picture
.key_frame
= (s
->pict_type
== FF_I_TYPE
);
864 /* Skip B-frames if we do not have reference frames. */
865 if (s
->last_picture_ptr
== NULL
&& s
->pict_type
== FF_B_TYPE
) return 0;
866 /* Skip B-frames if we are in a hurry. */
867 if (avctx
->hurry_up
&& s
->pict_type
== FF_B_TYPE
) return 0;
868 /* Skip everything if we are in a hurry >= 5. */
869 if (avctx
->hurry_up
>= 5) return 0;
870 if( (avctx
->skip_frame
>= AVDISCARD_NONREF
&& s
->pict_type
==FF_B_TYPE
)
871 ||(avctx
->skip_frame
>= AVDISCARD_NONKEY
&& s
->pict_type
!=FF_I_TYPE
)
872 || avctx
->skip_frame
>= AVDISCARD_ALL
)
875 if (s
->next_p_frame_damaged
) {
876 if (s
->pict_type
== FF_B_TYPE
)
879 s
->next_p_frame_damaged
= 0;
882 if (frame_start (h
) < 0)
885 if (s
->pict_type
== FF_B_TYPE
) {
886 h
->frame_num_offset
= (h
->slice_num
- h
->prev_frame_num
);
888 if (h
->frame_num_offset
< 0) {
889 h
->frame_num_offset
+= 256;
891 if (h
->frame_num_offset
== 0 || h
->frame_num_offset
>= h
->prev_frame_num_offset
) {
892 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error in B-frame picture id\n");
896 h
->prev_frame_num
= h
->frame_num
;
897 h
->frame_num
= h
->slice_num
;
898 h
->prev_frame_num_offset
= (h
->frame_num
- h
->prev_frame_num
);
900 if (h
->prev_frame_num_offset
< 0) {
901 h
->prev_frame_num_offset
+= 256;
910 h
->ref_cache
[m
][scan8
[0] + 8*i
+ j
]= 1;
912 h
->ref_cache
[m
][scan8
[0] + 8*i
+ j
]= PART_NOT_AVAILABLE
;
916 for (s
->mb_y
=0; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
917 for (s
->mb_x
=0; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
918 h
->mb_xy
= s
->mb_x
+ s
->mb_y
*s
->mb_stride
;
920 if ( (get_bits_count(&s
->gb
) + 7) >= s
->gb
.size_in_bits
&&
921 ((get_bits_count(&s
->gb
) & 7) == 0 || show_bits (&s
->gb
, (-get_bits_count(&s
->gb
) & 7)) == 0)) {
923 skip_bits(&s
->gb
, h
->next_slice_index
- get_bits_count(&s
->gb
));
924 s
->gb
.size_in_bits
= 8*buf_size
;
926 if (svq3_decode_slice_header (h
))
929 /* TODO: support s->mb_skip_run */
932 mb_type
= svq3_get_ue_golomb (&s
->gb
);
934 if (s
->pict_type
== FF_I_TYPE
) {
936 } else if (s
->pict_type
== FF_B_TYPE
&& mb_type
>= 4) {
939 if (mb_type
> 33 || svq3_decode_mb (h
, mb_type
)) {
940 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error while decoding MB %d %d\n", s
->mb_x
, s
->mb_y
);
948 if (s
->pict_type
!= FF_B_TYPE
&& !s
->low_delay
) {
949 s
->current_picture
.mb_type
[s
->mb_x
+ s
->mb_y
*s
->mb_stride
] =
950 (s
->pict_type
== FF_P_TYPE
&& mb_type
< 8) ? (mb_type
- 1) : -1;
954 ff_draw_horiz_band(s
, 16*s
->mb_y
, 16);
959 if (s
->pict_type
== FF_B_TYPE
|| s
->low_delay
) {
960 *(AVFrame
*) data
= *(AVFrame
*) &s
->current_picture
;
962 *(AVFrame
*) data
= *(AVFrame
*) &s
->last_picture
;
965 avctx
->frame_number
= s
->picture_number
- 1;
967 /* Do not output the last pic after seeking. */
968 if (s
->last_picture_ptr
|| s
->low_delay
) {
969 *data_size
= sizeof(AVFrame
);
976 AVCodec svq3_decoder
= {
985 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_DELAY
,
986 .long_name
= NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3"),