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 "libavutil/attributes.h"
48 #include "mpegutils.h"
50 #include "h264_mvpred.h"
55 #include "rectangle.h"
69 typedef struct SVQ3Context
{
72 H264DSPContext h264dsp
;
79 H264Picture
*next_pic
;
80 H264Picture
*last_pic
;
87 uint32_t watermark_key
;
89 int next_p_frame_damaged
;
92 int last_frame_output
;
98 #define FULLPEL_MODE 1
99 #define HALFPEL_MODE 2
100 #define THIRDPEL_MODE 3
101 #define PREDICT_MODE 4
103 /* dual scan (from some older h264 draft)
112 static const uint8_t svq3_scan
[16] = {
113 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
114 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
115 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
116 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
119 static const uint8_t luma_dc_zigzag_scan
[16] = {
120 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
121 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
122 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
123 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
126 static const uint8_t svq3_pred_0
[25][2] = {
129 { 0, 2 }, { 1, 1 }, { 2, 0 },
130 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
131 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
132 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
133 { 2, 4 }, { 3, 3 }, { 4, 2 },
138 static const int8_t svq3_pred_1
[6][6][5] = {
139 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
140 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
141 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
142 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
143 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
144 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
145 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
146 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
147 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
148 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
149 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
150 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
153 static const struct {
156 } svq3_dct_tables
[2][16] = {
157 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
158 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
159 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
160 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
163 static const uint32_t svq3_dequant_coeff
[32] = {
164 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
165 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
166 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
167 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
170 static void svq3_luma_dc_dequant_idct_c(int16_t *output
, int16_t *input
, int qp
)
172 const int qmul
= svq3_dequant_coeff
[qp
];
176 static const uint8_t x_offset
[4] = { 0, 1 * stride
, 4 * stride
, 5 * stride
};
178 for (i
= 0; i
< 4; i
++) {
179 const int z0
= 13 * (input
[4 * i
+ 0] + input
[4 * i
+ 2]);
180 const int z1
= 13 * (input
[4 * i
+ 0] - input
[4 * i
+ 2]);
181 const int z2
= 7 * input
[4 * i
+ 1] - 17 * input
[4 * i
+ 3];
182 const int z3
= 17 * input
[4 * i
+ 1] + 7 * input
[4 * i
+ 3];
184 temp
[4 * i
+ 0] = z0
+ z3
;
185 temp
[4 * i
+ 1] = z1
+ z2
;
186 temp
[4 * i
+ 2] = z1
- z2
;
187 temp
[4 * i
+ 3] = z0
- z3
;
190 for (i
= 0; i
< 4; i
++) {
191 const int offset
= x_offset
[i
];
192 const int z0
= 13 * (temp
[4 * 0 + i
] + temp
[4 * 2 + i
]);
193 const int z1
= 13 * (temp
[4 * 0 + i
] - temp
[4 * 2 + i
]);
194 const int z2
= 7 * temp
[4 * 1 + i
] - 17 * temp
[4 * 3 + i
];
195 const int z3
= 17 * temp
[4 * 1 + i
] + 7 * temp
[4 * 3 + i
];
197 output
[stride
* 0 + offset
] = (z0
+ z3
) * qmul
+ 0x80000 >> 20;
198 output
[stride
* 2 + offset
] = (z1
+ z2
) * qmul
+ 0x80000 >> 20;
199 output
[stride
* 8 + offset
] = (z1
- z2
) * qmul
+ 0x80000 >> 20;
200 output
[stride
* 10 + offset
] = (z0
- z3
) * qmul
+ 0x80000 >> 20;
205 static void svq3_add_idct_c(uint8_t *dst
, int16_t *block
,
206 int stride
, int qp
, int dc
)
208 const int qmul
= svq3_dequant_coeff
[qp
];
212 dc
= 13 * 13 * (dc
== 1 ?
1538 * block
[0]
213 : qmul
* (block
[0] >> 3) / 2);
217 for (i
= 0; i
< 4; i
++) {
218 const int z0
= 13 * (block
[0 + 4 * i
] + block
[2 + 4 * i
]);
219 const int z1
= 13 * (block
[0 + 4 * i
] - block
[2 + 4 * i
]);
220 const int z2
= 7 * block
[1 + 4 * i
] - 17 * block
[3 + 4 * i
];
221 const int z3
= 17 * block
[1 + 4 * i
] + 7 * block
[3 + 4 * i
];
223 block
[0 + 4 * i
] = z0
+ z3
;
224 block
[1 + 4 * i
] = z1
+ z2
;
225 block
[2 + 4 * i
] = z1
- z2
;
226 block
[3 + 4 * i
] = z0
- z3
;
229 for (i
= 0; i
< 4; i
++) {
230 const int z0
= 13 * (block
[i
+ 4 * 0] + block
[i
+ 4 * 2]);
231 const int z1
= 13 * (block
[i
+ 4 * 0] - block
[i
+ 4 * 2]);
232 const int z2
= 7 * block
[i
+ 4 * 1] - 17 * block
[i
+ 4 * 3];
233 const int z3
= 17 * block
[i
+ 4 * 1] + 7 * block
[i
+ 4 * 3];
234 const int rr
= (dc
+ 0x80000);
236 dst
[i
+ stride
* 0] = av_clip_uint8(dst
[i
+ stride
* 0] + ((z0
+ z3
) * qmul
+ rr
>> 20));
237 dst
[i
+ stride
* 1] = av_clip_uint8(dst
[i
+ stride
* 1] + ((z1
+ z2
) * qmul
+ rr
>> 20));
238 dst
[i
+ stride
* 2] = av_clip_uint8(dst
[i
+ stride
* 2] + ((z1
- z2
) * qmul
+ rr
>> 20));
239 dst
[i
+ stride
* 3] = av_clip_uint8(dst
[i
+ stride
* 3] + ((z0
- z3
) * qmul
+ rr
>> 20));
242 memset(block
, 0, 16 * sizeof(int16_t));
245 static inline int svq3_decode_block(GetBitContext
*gb
, int16_t *block
,
246 int index
, const int type
)
248 static const uint8_t *const scan_patterns
[4] = {
249 luma_dc_zigzag_scan
, ff_zigzag_scan
, svq3_scan
, ff_h264_chroma_dc_scan
252 int run
, level
, limit
;
254 const int intra
= 3 * type
>> 2;
255 const uint8_t *const scan
= scan_patterns
[type
];
257 for (limit
= (16 >> intra
); index
< 16; index
= limit
, limit
+= 8) {
258 for (; (vlc
= svq3_get_ue_golomb(gb
)) != 0; index
++) {
259 int sign
= (vlc
& 1) ?
0 : -1;
266 } else if (vlc
< 4) {
271 level
= (vlc
+ 9 >> 2) - run
;
275 run
= svq3_dct_tables
[intra
][vlc
].run
;
276 level
= svq3_dct_tables
[intra
][vlc
].level
;
280 ((run
== 0) ?
8 : ((run
< 2) ?
2 : ((run
< 5) ?
0 : -1)));
284 ((run
== 0) ?
4 : ((run
< 3) ?
2 : ((run
< 10) ?
1 : 0)));
288 if ((index
+= run
) >= limit
)
291 block
[scan
[index
]] = (level
^ sign
) - sign
;
302 static inline void svq3_mc_dir_part(SVQ3Context
*s
,
303 int x
, int y
, int width
, int height
,
304 int mx
, int my
, int dxy
,
305 int thirdpel
, int dir
, int avg
)
307 H264Context
*h
= &s
->h
;
308 H264SliceContext
*sl
= &h
->slice_ctx
[0];
309 const H264Picture
*pic
= (dir
== 0) ? s
->last_pic
: s
->next_pic
;
312 int blocksize
= 2 - (width
>> 3); // 16->0, 8->1, 4->2
317 if (mx
< 0 || mx
>= s
->h_edge_pos
- width
- 1 ||
318 my
< 0 || my
>= s
->v_edge_pos
- height
- 1) {
320 mx
= av_clip(mx
, -16, s
->h_edge_pos
- width
+ 15);
321 my
= av_clip(my
, -16, s
->v_edge_pos
- height
+ 15);
324 /* form component predictions */
325 dest
= h
->cur_pic
.f
->data
[0] + x
+ y
* sl
->linesize
;
326 src
= pic
->f
->data
[0] + mx
+ my
* sl
->linesize
;
329 s
->vdsp
.emulated_edge_mc(sl
->edge_emu_buffer
, src
,
330 sl
->linesize
, sl
->linesize
,
331 width
+ 1, height
+ 1,
332 mx
, my
, s
->h_edge_pos
, s
->v_edge_pos
);
333 src
= sl
->edge_emu_buffer
;
336 (avg ? s
->tdsp
.avg_tpel_pixels_tab
337 : s
->tdsp
.put_tpel_pixels_tab
)[dxy
](dest
, src
, sl
->linesize
,
340 (avg ? s
->hdsp
.avg_pixels_tab
341 : s
->hdsp
.put_pixels_tab
)[blocksize
][dxy
](dest
, src
, sl
->linesize
,
344 if (!(h
->flags
& AV_CODEC_FLAG_GRAY
)) {
345 mx
= mx
+ (mx
< (int) x
) >> 1;
346 my
= my
+ (my
< (int) y
) >> 1;
348 height
= height
>> 1;
351 for (i
= 1; i
< 3; i
++) {
352 dest
= h
->cur_pic
.f
->data
[i
] + (x
>> 1) + (y
>> 1) * sl
->uvlinesize
;
353 src
= pic
->f
->data
[i
] + mx
+ my
* sl
->uvlinesize
;
356 s
->vdsp
.emulated_edge_mc(sl
->edge_emu_buffer
, src
,
357 sl
->uvlinesize
, sl
->uvlinesize
,
358 width
+ 1, height
+ 1,
359 mx
, my
, (s
->h_edge_pos
>> 1),
361 src
= sl
->edge_emu_buffer
;
364 (avg ? s
->tdsp
.avg_tpel_pixels_tab
365 : s
->tdsp
.put_tpel_pixels_tab
)[dxy
](dest
, src
,
369 (avg ? s
->hdsp
.avg_pixels_tab
370 : s
->hdsp
.put_pixels_tab
)[blocksize
][dxy
](dest
, src
,
377 static inline int svq3_mc_dir(SVQ3Context
*s
, int size
, int mode
,
380 int i
, j
, k
, mx
, my
, dx
, dy
, x
, y
;
381 H264Context
*h
= &s
->h
;
382 H264SliceContext
*sl
= &h
->slice_ctx
[0];
383 const int part_width
= ((size
& 5) == 4) ?
4 : 16 >> (size
& 1);
384 const int part_height
= 16 >> ((unsigned)(size
+ 1) / 3);
385 const int extra_width
= (mode
== PREDICT_MODE
) ?
-16 * 6 : 0;
386 const int h_edge_pos
= 6 * (s
->h_edge_pos
- part_width
) - extra_width
;
387 const int v_edge_pos
= 6 * (s
->v_edge_pos
- part_height
) - extra_width
;
389 for (i
= 0; i
< 16; i
+= part_height
)
390 for (j
= 0; j
< 16; j
+= part_width
) {
391 const int b_xy
= (4 * s
->mb_x
+ (j
>> 2)) +
392 (4 * s
->mb_y
+ (i
>> 2)) * h
->b_stride
;
394 x
= 16 * s
->mb_x
+ j
;
395 y
= 16 * s
->mb_y
+ i
;
396 k
= (j
>> 2 & 1) + (i
>> 1 & 2) +
397 (j
>> 1 & 4) + (i
& 8);
399 if (mode
!= PREDICT_MODE
) {
400 pred_motion(h
, sl
, k
, part_width
>> 2, dir
, 1, &mx
, &my
);
402 mx
= s
->next_pic
->motion_val
[0][b_xy
][0] << 1;
403 my
= s
->next_pic
->motion_val
[0][b_xy
][1] << 1;
406 mx
= mx
* h
->frame_num_offset
/
407 h
->prev_frame_num_offset
+ 1 >> 1;
408 my
= my
* h
->frame_num_offset
/
409 h
->prev_frame_num_offset
+ 1 >> 1;
411 mx
= mx
* (h
->frame_num_offset
- h
->prev_frame_num_offset
) /
412 h
->prev_frame_num_offset
+ 1 >> 1;
413 my
= my
* (h
->frame_num_offset
- h
->prev_frame_num_offset
) /
414 h
->prev_frame_num_offset
+ 1 >> 1;
418 /* clip motion vector prediction to frame border */
419 mx
= av_clip(mx
, extra_width
- 6 * x
, h_edge_pos
- 6 * x
);
420 my
= av_clip(my
, extra_width
- 6 * y
, v_edge_pos
- 6 * y
);
422 /* get (optional) motion vector differential */
423 if (mode
== PREDICT_MODE
) {
426 dy
= svq3_get_se_golomb(&h
->gb
);
427 dx
= svq3_get_se_golomb(&h
->gb
);
429 if (dx
== INVALID_VLC
|| dy
== INVALID_VLC
) {
430 av_log(h
->avctx
, AV_LOG_ERROR
, "invalid MV vlc\n");
435 /* compute motion vector */
436 if (mode
== THIRDPEL_MODE
) {
438 mx
= (mx
+ 1 >> 1) + dx
;
439 my
= (my
+ 1 >> 1) + dy
;
440 fx
= (unsigned)(mx
+ 0x3000) / 3 - 0x1000;
441 fy
= (unsigned)(my
+ 0x3000) / 3 - 0x1000;
442 dxy
= (mx
- 3 * fx
) + 4 * (my
- 3 * fy
);
444 svq3_mc_dir_part(s
, x
, y
, part_width
, part_height
,
445 fx
, fy
, dxy
, 1, dir
, avg
);
448 } else if (mode
== HALFPEL_MODE
|| mode
== PREDICT_MODE
) {
449 mx
= (unsigned)(mx
+ 1 + 0x3000) / 3 + dx
- 0x1000;
450 my
= (unsigned)(my
+ 1 + 0x3000) / 3 + dy
- 0x1000;
451 dxy
= (mx
& 1) + 2 * (my
& 1);
453 svq3_mc_dir_part(s
, x
, y
, part_width
, part_height
,
454 mx
>> 1, my
>> 1, dxy
, 0, dir
, avg
);
458 mx
= (unsigned)(mx
+ 3 + 0x6000) / 6 + dx
- 0x1000;
459 my
= (unsigned)(my
+ 3 + 0x6000) / 6 + dy
- 0x1000;
461 svq3_mc_dir_part(s
, x
, y
, part_width
, part_height
,
462 mx
, my
, 0, 0, dir
, avg
);
467 /* update mv_cache */
468 if (mode
!= PREDICT_MODE
) {
469 int32_t mv
= pack16to32(mx
, my
);
471 if (part_height
== 8 && i
< 8) {
472 AV_WN32A(sl
->mv_cache
[dir
][scan8
[k
] + 1 * 8], mv
);
474 if (part_width
== 8 && j
< 8)
475 AV_WN32A(sl
->mv_cache
[dir
][scan8
[k
] + 1 + 1 * 8], mv
);
477 if (part_width
== 8 && j
< 8)
478 AV_WN32A(sl
->mv_cache
[dir
][scan8
[k
] + 1], mv
);
479 if (part_width
== 4 || part_height
== 4)
480 AV_WN32A(sl
->mv_cache
[dir
][scan8
[k
]], mv
);
483 /* write back motion vectors */
484 fill_rectangle(h
->cur_pic
.motion_val
[dir
][b_xy
],
485 part_width
>> 2, part_height
>> 2, h
->b_stride
,
486 pack16to32(mx
, my
), 4);
492 static av_always_inline
void hl_decode_mb_idct_luma(const H264Context
*h
, H264SliceContext
*sl
,
493 int mb_type
, const int *block_offset
,
494 int linesize
, uint8_t *dest_y
)
497 if (!IS_INTRA4x4(mb_type
)) {
498 for (i
= 0; i
< 16; i
++)
499 if (sl
->non_zero_count_cache
[scan8
[i
]] || sl
->mb
[i
* 16]) {
500 uint8_t *const ptr
= dest_y
+ block_offset
[i
];
501 svq3_add_idct_c(ptr
, sl
->mb
+ i
* 16, linesize
,
502 sl
->qscale
, IS_INTRA(mb_type
) ?
1 : 0);
507 static av_always_inline
int dctcoef_get(int16_t *mb
, int index
)
509 return AV_RN16A(mb
+ index
);
512 static av_always_inline
void hl_decode_mb_predict_luma(SVQ3Context
*s
,
513 const H264Context
*h
,
514 H264SliceContext
*sl
,
516 const int *block_offset
,
521 int qscale
= sl
->qscale
;
523 if (IS_INTRA4x4(mb_type
)) {
524 for (i
= 0; i
< 16; i
++) {
525 uint8_t *const ptr
= dest_y
+ block_offset
[i
];
526 const int dir
= sl
->intra4x4_pred_mode_cache
[scan8
[i
]];
530 if (dir
== DIAG_DOWN_LEFT_PRED
|| dir
== VERT_LEFT_PRED
) {
531 const int topright_avail
= (sl
->topright_samples_available
<< i
) & 0x8000;
532 assert(s
->mb_y
|| linesize
<= block_offset
[i
]);
533 if (!topright_avail
) {
534 tr
= ptr
[3 - linesize
] * 0x01010101u
;
535 topright
= (uint8_t *)&tr
;
537 topright
= ptr
+ 4 - linesize
;
541 s
->hpc
.pred4x4
[dir
](ptr
, topright
, linesize
);
542 nnz
= sl
->non_zero_count_cache
[scan8
[i
]];
544 svq3_add_idct_c(ptr
, sl
->mb
+ i
* 16, linesize
, qscale
, 0);
548 s
->hpc
.pred16x16
[sl
->intra16x16_pred_mode
](dest_y
, linesize
);
549 svq3_luma_dc_dequant_idct_c(sl
->mb
, sl
->mb_luma_dc
[0], qscale
);
553 static void hl_decode_mb(SVQ3Context
*s
, const H264Context
*h
, H264SliceContext
*sl
)
555 const int mb_x
= s
->mb_x
;
556 const int mb_y
= s
->mb_y
;
557 const int mb_xy
= s
->mb_xy
;
558 const int mb_type
= h
->cur_pic
.mb_type
[mb_xy
];
559 uint8_t *dest_y
, *dest_cb
, *dest_cr
;
560 int linesize
, uvlinesize
;
562 const int *block_offset
= &h
->block_offset
[0];
563 const int block_h
= 16 >> h
->chroma_y_shift
;
565 dest_y
= h
->cur_pic
.f
->data
[0] + (mb_x
+ mb_y
* sl
->linesize
) * 16;
566 dest_cb
= h
->cur_pic
.f
->data
[1] + mb_x
* 8 + mb_y
* sl
->uvlinesize
* block_h
;
567 dest_cr
= h
->cur_pic
.f
->data
[2] + mb_x
* 8 + mb_y
* sl
->uvlinesize
* block_h
;
569 s
->vdsp
.prefetch(dest_y
+ (s
->mb_x
& 3) * 4 * sl
->linesize
+ 64, sl
->linesize
, 4);
570 s
->vdsp
.prefetch(dest_cb
+ (s
->mb_x
& 7) * sl
->uvlinesize
+ 64, dest_cr
- dest_cb
, 2);
572 h
->list_counts
[mb_xy
] = sl
->list_count
;
574 linesize
= sl
->mb_linesize
= sl
->linesize
;
575 uvlinesize
= sl
->mb_uvlinesize
= sl
->uvlinesize
;
577 if (IS_INTRA(mb_type
)) {
578 s
->hpc
.pred8x8
[sl
->chroma_pred_mode
](dest_cb
, uvlinesize
);
579 s
->hpc
.pred8x8
[sl
->chroma_pred_mode
](dest_cr
, uvlinesize
);
581 hl_decode_mb_predict_luma(s
, h
, sl
, mb_type
, block_offset
, linesize
, dest_y
);
584 hl_decode_mb_idct_luma(h
, sl
, mb_type
, block_offset
, linesize
, dest_y
);
586 if (sl
->cbp
& 0x30) {
587 uint8_t *dest
[2] = { dest_cb
, dest_cr
};
588 s
->h264dsp
.h264_chroma_dc_dequant_idct(sl
->mb
+ 16 * 16 * 1,
589 h
->dequant4_coeff
[IS_INTRA(mb_type
) ?
1 : 4][sl
->chroma_qp
[0]][0]);
590 s
->h264dsp
.h264_chroma_dc_dequant_idct(sl
->mb
+ 16 * 16 * 2,
591 h
->dequant4_coeff
[IS_INTRA(mb_type
) ?
2 : 5][sl
->chroma_qp
[1]][0]);
592 for (j
= 1; j
< 3; j
++) {
593 for (i
= j
* 16; i
< j
* 16 + 4; i
++)
594 if (sl
->non_zero_count_cache
[scan8
[i
]] || sl
->mb
[i
* 16]) {
595 uint8_t *const ptr
= dest
[j
- 1] + block_offset
[i
];
596 svq3_add_idct_c(ptr
, sl
->mb
+ i
* 16,
597 uvlinesize
, ff_h264_chroma_qp
[0][sl
->qscale
+ 12] - 12, 2);
603 static int svq3_decode_mb(SVQ3Context
*s
, unsigned int mb_type
)
605 H264Context
*h
= &s
->h
;
606 H264SliceContext
*sl
= &h
->slice_ctx
[0];
607 int i
, j
, k
, m
, dir
, mode
;
611 const int mb_xy
= s
->mb_xy
;
612 const int b_xy
= 4 * s
->mb_x
+ 4 * s
->mb_y
* h
->b_stride
;
614 sl
->top_samples_available
= (s
->mb_y
== 0) ?
0x33FF : 0xFFFF;
615 sl
->left_samples_available
= (s
->mb_x
== 0) ?
0x5F5F : 0xFFFF;
616 sl
->topright_samples_available
= 0xFFFF;
618 if (mb_type
== 0) { /* SKIP */
619 if (h
->pict_type
== AV_PICTURE_TYPE_P
||
620 s
->next_pic
->mb_type
[mb_xy
] == -1) {
621 svq3_mc_dir_part(s
, 16 * s
->mb_x
, 16 * s
->mb_y
, 16, 16,
624 if (h
->pict_type
== AV_PICTURE_TYPE_B
)
625 svq3_mc_dir_part(s
, 16 * s
->mb_x
, 16 * s
->mb_y
, 16, 16,
628 mb_type
= MB_TYPE_SKIP
;
630 mb_type
= FFMIN(s
->next_pic
->mb_type
[mb_xy
], 6);
631 if (svq3_mc_dir(s
, mb_type
, PREDICT_MODE
, 0, 0) < 0)
633 if (svq3_mc_dir(s
, mb_type
, PREDICT_MODE
, 1, 1) < 0)
636 mb_type
= MB_TYPE_16x16
;
638 } else if (mb_type
< 8) { /* INTER */
639 if (s
->thirdpel_flag
&& s
->halfpel_flag
== !get_bits1(&h
->gb
))
640 mode
= THIRDPEL_MODE
;
641 else if (s
->halfpel_flag
&&
642 s
->thirdpel_flag
== !get_bits1(&h
->gb
))
648 /* note ref_cache should contain here:
656 for (m
= 0; m
< 2; m
++) {
657 if (s
->mb_x
> 0 && sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- 1] + 6] != -1) {
658 for (i
= 0; i
< 4; i
++)
659 AV_COPY32(sl
->mv_cache
[m
][scan8
[0] - 1 + i
* 8],
660 h
->cur_pic
.motion_val
[m
][b_xy
- 1 + i
* h
->b_stride
]);
662 for (i
= 0; i
< 4; i
++)
663 AV_ZERO32(sl
->mv_cache
[m
][scan8
[0] - 1 + i
* 8]);
666 memcpy(sl
->mv_cache
[m
][scan8
[0] - 1 * 8],
667 h
->cur_pic
.motion_val
[m
][b_xy
- h
->b_stride
],
668 4 * 2 * sizeof(int16_t));
669 memset(&sl
->ref_cache
[m
][scan8
[0] - 1 * 8],
670 (sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
]] == -1) ? PART_NOT_AVAILABLE
: 1, 4);
672 if (s
->mb_x
< h
->mb_width
- 1) {
673 AV_COPY32(sl
->mv_cache
[m
][scan8
[0] + 4 - 1 * 8],
674 h
->cur_pic
.motion_val
[m
][b_xy
- h
->b_stride
+ 4]);
675 sl
->ref_cache
[m
][scan8
[0] + 4 - 1 * 8] =
676 (sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
+ 1] + 6] == -1 ||
677 sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
]] == -1) ? PART_NOT_AVAILABLE
: 1;
679 sl
->ref_cache
[m
][scan8
[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE
;
681 AV_COPY32(sl
->mv_cache
[m
][scan8
[0] - 1 - 1 * 8],
682 h
->cur_pic
.motion_val
[m
][b_xy
- h
->b_stride
- 1]);
683 sl
->ref_cache
[m
][scan8
[0] - 1 - 1 * 8] =
684 (sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
- 1] + 3] == -1) ? PART_NOT_AVAILABLE
: 1;
686 sl
->ref_cache
[m
][scan8
[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE
;
688 memset(&sl
->ref_cache
[m
][scan8
[0] - 1 * 8 - 1],
689 PART_NOT_AVAILABLE
, 8);
691 if (h
->pict_type
!= AV_PICTURE_TYPE_B
)
695 /* decode motion vector(s) and form prediction(s) */
696 if (h
->pict_type
== AV_PICTURE_TYPE_P
) {
697 if (svq3_mc_dir(s
, mb_type
- 1, mode
, 0, 0) < 0)
699 } else { /* AV_PICTURE_TYPE_B */
701 if (svq3_mc_dir(s
, 0, mode
, 0, 0) < 0)
704 for (i
= 0; i
< 4; i
++)
705 memset(h
->cur_pic
.motion_val
[0][b_xy
+ i
* h
->b_stride
],
706 0, 4 * 2 * sizeof(int16_t));
709 if (svq3_mc_dir(s
, 0, mode
, 1, mb_type
== 3) < 0)
712 for (i
= 0; i
< 4; i
++)
713 memset(h
->cur_pic
.motion_val
[1][b_xy
+ i
* h
->b_stride
],
714 0, 4 * 2 * sizeof(int16_t));
718 mb_type
= MB_TYPE_16x16
;
719 } else if (mb_type
== 8 || mb_type
== 33) { /* INTRA4x4 */
720 int8_t *i4x4
= sl
->intra4x4_pred_mode
+ h
->mb2br_xy
[s
->mb_xy
];
721 int8_t *i4x4_cache
= sl
->intra4x4_pred_mode_cache
;
723 memset(sl
->intra4x4_pred_mode_cache
, -1, 8 * 5 * sizeof(int8_t));
727 for (i
= 0; i
< 4; i
++)
728 sl
->intra4x4_pred_mode_cache
[scan8
[0] - 1 + i
* 8] = sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- 1] + 6 - i
];
729 if (sl
->intra4x4_pred_mode_cache
[scan8
[0] - 1] == -1)
730 sl
->left_samples_available
= 0x5F5F;
733 sl
->intra4x4_pred_mode_cache
[4 + 8 * 0] = sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
] + 0];
734 sl
->intra4x4_pred_mode_cache
[5 + 8 * 0] = sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
] + 1];
735 sl
->intra4x4_pred_mode_cache
[6 + 8 * 0] = sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
] + 2];
736 sl
->intra4x4_pred_mode_cache
[7 + 8 * 0] = sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
] + 3];
738 if (sl
->intra4x4_pred_mode_cache
[4 + 8 * 0] == -1)
739 sl
->top_samples_available
= 0x33FF;
742 /* decode prediction codes for luma blocks */
743 for (i
= 0; i
< 16; i
+= 2) {
744 vlc
= svq3_get_ue_golomb(&h
->gb
);
747 av_log(h
->avctx
, AV_LOG_ERROR
,
748 "luma prediction:%"PRIu32
"\n", vlc
);
752 left
= &sl
->intra4x4_pred_mode_cache
[scan8
[i
] - 1];
753 top
= &sl
->intra4x4_pred_mode_cache
[scan8
[i
] - 8];
755 left
[1] = svq3_pred_1
[top
[0] + 1][left
[0] + 1][svq3_pred_0
[vlc
][0]];
756 left
[2] = svq3_pred_1
[top
[1] + 1][left
[1] + 1][svq3_pred_0
[vlc
][1]];
758 if (left
[1] == -1 || left
[2] == -1) {
759 av_log(h
->avctx
, AV_LOG_ERROR
, "weird prediction\n");
763 } else { /* mb_type == 33, DC_128_PRED block type */
764 for (i
= 0; i
< 4; i
++)
765 memset(&sl
->intra4x4_pred_mode_cache
[scan8
[0] + 8 * i
], DC_PRED
, 4);
768 AV_COPY32(i4x4
, i4x4_cache
+ 4 + 8 * 4);
769 i4x4
[4] = i4x4_cache
[7 + 8 * 3];
770 i4x4
[5] = i4x4_cache
[7 + 8 * 2];
771 i4x4
[6] = i4x4_cache
[7 + 8 * 1];
774 ff_h264_check_intra4x4_pred_mode(h
, sl
);
776 sl
->top_samples_available
= (s
->mb_y
== 0) ?
0x33FF : 0xFFFF;
777 sl
->left_samples_available
= (s
->mb_x
== 0) ?
0x5F5F : 0xFFFF;
779 for (i
= 0; i
< 4; i
++)
780 memset(&sl
->intra4x4_pred_mode_cache
[scan8
[0] + 8 * i
], DC_128_PRED
, 4);
782 sl
->top_samples_available
= 0x33FF;
783 sl
->left_samples_available
= 0x5F5F;
786 mb_type
= MB_TYPE_INTRA4x4
;
787 } else { /* INTRA16x16 */
788 dir
= ff_h264_i_mb_type_info
[mb_type
- 8].pred_mode
;
789 dir
= (dir
>> 1) ^ 3 * (dir
& 1) ^ 1;
791 if ((sl
->intra16x16_pred_mode
= ff_h264_check_intra_pred_mode(h
, sl
, dir
, 0)) < 0) {
792 av_log(h
->avctx
, AV_LOG_ERROR
, "ff_h264_check_intra_pred_mode < 0\n");
793 return sl
->intra16x16_pred_mode
;
796 cbp
= ff_h264_i_mb_type_info
[mb_type
- 8].cbp
;
797 mb_type
= MB_TYPE_INTRA16x16
;
800 if (!IS_INTER(mb_type
) && h
->pict_type
!= AV_PICTURE_TYPE_I
) {
801 for (i
= 0; i
< 4; i
++)
802 memset(h
->cur_pic
.motion_val
[0][b_xy
+ i
* h
->b_stride
],
803 0, 4 * 2 * sizeof(int16_t));
804 if (h
->pict_type
== AV_PICTURE_TYPE_B
) {
805 for (i
= 0; i
< 4; i
++)
806 memset(h
->cur_pic
.motion_val
[1][b_xy
+ i
* h
->b_stride
],
807 0, 4 * 2 * sizeof(int16_t));
810 if (!IS_INTRA4x4(mb_type
)) {
811 memset(sl
->intra4x4_pred_mode
+ h
->mb2br_xy
[mb_xy
], DC_PRED
, 8);
813 if (!IS_SKIP(mb_type
) || h
->pict_type
== AV_PICTURE_TYPE_B
) {
814 memset(sl
->non_zero_count_cache
+ 8, 0, 14 * 8 * sizeof(uint8_t));
817 if (!IS_INTRA16x16(mb_type
) &&
818 (!IS_SKIP(mb_type
) || h
->pict_type
== AV_PICTURE_TYPE_B
)) {
819 if ((vlc
= svq3_get_ue_golomb(&h
->gb
)) >= 48) {
820 av_log(h
->avctx
, AV_LOG_ERROR
, "cbp_vlc=%"PRIu32
"\n", vlc
);
824 cbp
= IS_INTRA(mb_type
) ? ff_h264_golomb_to_intra4x4_cbp
[vlc
]
825 : ff_h264_golomb_to_inter_cbp
[vlc
];
827 if (IS_INTRA16x16(mb_type
) ||
828 (h
->pict_type
!= AV_PICTURE_TYPE_I
&& s
->adaptive_quant
&& cbp
)) {
829 sl
->qscale
+= svq3_get_se_golomb(&h
->gb
);
831 if (sl
->qscale
> 31u) {
832 av_log(h
->avctx
, AV_LOG_ERROR
, "qscale:%d\n", sl
->qscale
);
836 if (IS_INTRA16x16(mb_type
)) {
837 AV_ZERO128(sl
->mb_luma_dc
[0] + 0);
838 AV_ZERO128(sl
->mb_luma_dc
[0] + 8);
839 if (svq3_decode_block(&h
->gb
, sl
->mb_luma_dc
[0], 0, 1)) {
840 av_log(h
->avctx
, AV_LOG_ERROR
,
841 "error while decoding intra luma dc\n");
847 const int index
= IS_INTRA16x16(mb_type
) ?
1 : 0;
848 const int type
= ((sl
->qscale
< 24 && IS_INTRA4x4(mb_type
)) ?
2 : 1);
850 for (i
= 0; i
< 4; i
++)
851 if ((cbp
& (1 << i
))) {
852 for (j
= 0; j
< 4; j
++) {
853 k
= index ?
(1 * (j
& 1) + 2 * (i
& 1) +
854 2 * (j
& 2) + 4 * (i
& 2))
856 sl
->non_zero_count_cache
[scan8
[k
]] = 1;
858 if (svq3_decode_block(&h
->gb
, &sl
->mb
[16 * k
], index
, type
)) {
859 av_log(h
->avctx
, AV_LOG_ERROR
,
860 "error while decoding block\n");
867 for (i
= 1; i
< 3; ++i
)
868 if (svq3_decode_block(&h
->gb
, &sl
->mb
[16 * 16 * i
], 0, 3)) {
869 av_log(h
->avctx
, AV_LOG_ERROR
,
870 "error while decoding chroma dc block\n");
875 for (i
= 1; i
< 3; i
++) {
876 for (j
= 0; j
< 4; j
++) {
878 sl
->non_zero_count_cache
[scan8
[k
]] = 1;
880 if (svq3_decode_block(&h
->gb
, &sl
->mb
[16 * k
], 1, 1)) {
881 av_log(h
->avctx
, AV_LOG_ERROR
,
882 "error while decoding chroma ac block\n");
892 h
->cur_pic
.mb_type
[mb_xy
] = mb_type
;
894 if (IS_INTRA(mb_type
))
895 sl
->chroma_pred_mode
= ff_h264_check_intra_pred_mode(h
, sl
, DC_PRED8x8
, 1);
900 static int svq3_decode_slice_header(AVCodecContext
*avctx
)
902 SVQ3Context
*s
= avctx
->priv_data
;
903 H264Context
*h
= &s
->h
;
904 H264SliceContext
*sl
= &h
->slice_ctx
[0];
905 const int mb_xy
= s
->mb_xy
;
909 header
= get_bits(&s
->gb
, 8);
911 if (((header
& 0x9F) != 1 && (header
& 0x9F) != 2) || (header
& 0x60) == 0) {
913 av_log(avctx
, AV_LOG_ERROR
, "unsupported slice header (%02X)\n", header
);
916 int slice_bits
, slice_bytes
, slice_length
;
917 int length
= header
>> 5 & 3;
919 slice_length
= show_bits(&s
->gb
, 8 * length
);
920 slice_bits
= slice_length
* 8;
921 slice_bytes
= slice_length
+ length
- 1;
923 if (slice_bytes
> get_bits_left(&s
->gb
)) {
924 av_log(avctx
, AV_LOG_ERROR
, "slice after bitstream end\n");
928 skip_bits(&s
->gb
, 8);
930 av_fast_malloc(&s
->slice_buf
, &s
->slice_size
, slice_bytes
+ AV_INPUT_BUFFER_PADDING_SIZE
);
932 return AVERROR(ENOMEM
);
934 memcpy(s
->slice_buf
, s
->gb
.buffer
+ s
->gb
.index
/ 8, slice_bytes
);
936 init_get_bits(&h
->gb
, s
->slice_buf
, slice_bits
);
938 if (s
->watermark_key
) {
939 uint32_t header
= AV_RL32(&h
->gb
.buffer
[1]);
940 AV_WL32(&h
->gb
.buffer
[1], header
^ s
->watermark_key
);
943 memcpy(s
->slice_buf
, &s
->slice_buf
[slice_length
], length
- 1);
945 skip_bits_long(&s
->gb
, slice_bytes
* 8);
948 if ((slice_id
= svq3_get_ue_golomb(&h
->gb
)) >= 3) {
949 av_log(h
->avctx
, AV_LOG_ERROR
, "illegal slice type %u \n", slice_id
);
953 sl
->slice_type
= ff_h264_golomb_to_pict_type
[slice_id
];
955 if ((header
& 0x9F) == 2) {
956 i
= (h
->mb_num
< 64) ?
6 : (1 + av_log2(h
->mb_num
- 1));
957 sl
->mb_skip_run
= get_bits(&h
->gb
, i
) -
958 (s
->mb_y
* h
->mb_width
+ s
->mb_x
);
964 sl
->slice_num
= get_bits(&h
->gb
, 8);
965 sl
->qscale
= get_bits(&h
->gb
, 5);
966 s
->adaptive_quant
= get_bits1(&h
->gb
);
975 skip_bits(&h
->gb
, 2);
977 while (get_bits1(&h
->gb
))
978 skip_bits(&h
->gb
, 8);
980 /* reset intra predictors and invalidate motion vector references */
982 memset(sl
->intra4x4_pred_mode
+ h
->mb2br_xy
[mb_xy
- 1] + 3,
983 -1, 4 * sizeof(int8_t));
984 memset(sl
->intra4x4_pred_mode
+ h
->mb2br_xy
[mb_xy
- s
->mb_x
],
985 -1, 8 * sizeof(int8_t) * s
->mb_x
);
988 memset(sl
->intra4x4_pred_mode
+ h
->mb2br_xy
[mb_xy
- h
->mb_stride
],
989 -1, 8 * sizeof(int8_t) * (h
->mb_width
- s
->mb_x
));
992 sl
->intra4x4_pred_mode
[h
->mb2br_xy
[mb_xy
- h
->mb_stride
- 1] + 3] = -1;
998 static av_cold
int svq3_decode_init(AVCodecContext
*avctx
)
1000 SVQ3Context
*s
= avctx
->priv_data
;
1001 H264Context
*h
= &s
->h
;
1002 H264SliceContext
*sl
;
1004 unsigned char *extradata
;
1005 unsigned char *extradata_end
;
1007 int marker_found
= 0;
1009 s
->cur_pic
= av_mallocz(sizeof(*s
->cur_pic
));
1010 s
->last_pic
= av_mallocz(sizeof(*s
->last_pic
));
1011 s
->next_pic
= av_mallocz(sizeof(*s
->next_pic
));
1012 if (!s
->next_pic
|| !s
->last_pic
|| !s
->cur_pic
) {
1013 av_freep(&s
->cur_pic
);
1014 av_freep(&s
->last_pic
);
1015 av_freep(&s
->next_pic
);
1016 return AVERROR(ENOMEM
);
1019 s
->cur_pic
->f
= av_frame_alloc();
1020 s
->last_pic
->f
= av_frame_alloc();
1021 s
->next_pic
->f
= av_frame_alloc();
1022 if (!s
->cur_pic
->f
|| !s
->last_pic
->f
|| !s
->next_pic
->f
)
1023 return AVERROR(ENOMEM
);
1025 if (ff_h264_decode_init(avctx
) < 0)
1028 // we will overwrite it later during decoding
1029 av_frame_free(&h
->cur_pic
.f
);
1031 ff_h264dsp_init(&s
->h264dsp
, 8, 1);
1032 ff_h264_pred_init(&s
->hpc
, AV_CODEC_ID_SVQ3
, 8, 1);
1033 ff_videodsp_init(&s
->vdsp
, 8);
1035 memset(h
->pps
.scaling_matrix4
, 16, 6 * 16 * sizeof(uint8_t));
1036 memset(h
->pps
.scaling_matrix8
, 16, 2 * 64 * sizeof(uint8_t));
1038 h
->sps
.bit_depth_luma
= 8;
1039 h
->chroma_format_idc
= 1;
1041 ff_hpeldsp_init(&s
->hdsp
, avctx
->flags
);
1042 ff_tpeldsp_init(&s
->tdsp
);
1046 h
->flags
= avctx
->flags
;
1048 h
->picture_structure
= PICT_FRAME
;
1049 avctx
->pix_fmt
= AV_PIX_FMT_YUVJ420P
;
1050 avctx
->color_range
= AVCOL_RANGE_JPEG
;
1052 h
->slice_ctx
[0].chroma_qp
[0] = h
->slice_ctx
[0].chroma_qp
[1] = 4;
1053 h
->chroma_x_shift
= h
->chroma_y_shift
= 1;
1055 s
->halfpel_flag
= 1;
1056 s
->thirdpel_flag
= 1;
1057 s
->unknown_flag
= 0;
1059 /* prowl for the "SEQH" marker in the extradata */
1060 extradata
= (unsigned char *)avctx
->extradata
;
1061 extradata_end
= avctx
->extradata
+ avctx
->extradata_size
;
1063 for (m
= 0; m
+ 8 < avctx
->extradata_size
; m
++) {
1064 if (!memcmp(extradata
, "SEQH", 4)) {
1072 /* if a match was found, parse the extra data */
1075 int frame_size_code
;
1077 size
= AV_RB32(&extradata
[4]);
1078 if (size
> extradata_end
- extradata
- 8)
1079 return AVERROR_INVALIDDATA
;
1080 init_get_bits(&gb
, extradata
+ 8, size
* 8);
1082 /* 'frame size code' and optional 'width, height' */
1083 frame_size_code
= get_bits(&gb
, 3);
1084 switch (frame_size_code
) {
1087 avctx
->height
= 120;
1095 avctx
->height
= 144;
1099 avctx
->height
= 288;
1103 avctx
->height
= 576;
1107 avctx
->height
= 180;
1111 avctx
->height
= 240;
1114 avctx
->width
= get_bits(&gb
, 12);
1115 avctx
->height
= get_bits(&gb
, 12);
1119 s
->halfpel_flag
= get_bits1(&gb
);
1120 s
->thirdpel_flag
= get_bits1(&gb
);
1122 /* unknown fields */
1128 h
->low_delay
= get_bits1(&gb
);
1133 while (get_bits1(&gb
))
1136 s
->unknown_flag
= get_bits1(&gb
);
1137 avctx
->has_b_frames
= !h
->low_delay
;
1138 if (s
->unknown_flag
) {
1140 unsigned watermark_width
= svq3_get_ue_golomb(&gb
);
1141 unsigned watermark_height
= svq3_get_ue_golomb(&gb
);
1142 int u1
= svq3_get_ue_golomb(&gb
);
1143 int u2
= get_bits(&gb
, 8);
1144 int u3
= get_bits(&gb
, 2);
1145 int u4
= svq3_get_ue_golomb(&gb
);
1146 unsigned long buf_len
= watermark_width
*
1147 watermark_height
* 4;
1148 int offset
= get_bits_count(&gb
) + 7 >> 3;
1151 if (watermark_height
> 0 &&
1152 (uint64_t)watermark_width
* 4 > UINT_MAX
/ watermark_height
)
1155 buf
= av_malloc(buf_len
);
1156 av_log(avctx
, AV_LOG_DEBUG
, "watermark size: %ux%u\n",
1157 watermark_width
, watermark_height
);
1158 av_log(avctx
, AV_LOG_DEBUG
,
1159 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1160 u1
, u2
, u3
, u4
, offset
);
1161 if (uncompress(buf
, &buf_len
, extradata
+ 8 + offset
,
1162 size
- offset
) != Z_OK
) {
1163 av_log(avctx
, AV_LOG_ERROR
,
1164 "could not uncompress watermark logo\n");
1168 s
->watermark_key
= ff_svq1_packet_checksum(buf
, buf_len
, 0);
1169 s
->watermark_key
= s
->watermark_key
<< 16 | s
->watermark_key
;
1170 av_log(avctx
, AV_LOG_DEBUG
,
1171 "watermark key %#"PRIx32
"\n", s
->watermark_key
);
1174 av_log(avctx
, AV_LOG_ERROR
,
1175 "this svq3 file contains watermark which need zlib support compiled in\n");
1181 h
->width
= avctx
->width
;
1182 h
->height
= avctx
->height
;
1183 h
->mb_width
= (h
->width
+ 15) / 16;
1184 h
->mb_height
= (h
->height
+ 15) / 16;
1185 h
->mb_stride
= h
->mb_width
+ 1;
1186 h
->mb_num
= h
->mb_width
* h
->mb_height
;
1187 h
->b_stride
= 4 * h
->mb_width
;
1188 s
->h_edge_pos
= h
->mb_width
* 16;
1189 s
->v_edge_pos
= h
->mb_height
* 16;
1191 if (ff_h264_alloc_tables(h
) < 0) {
1192 av_log(avctx
, AV_LOG_ERROR
, "svq3 memory allocation failed\n");
1193 return AVERROR(ENOMEM
);
1199 static void free_picture(AVCodecContext
*avctx
, H264Picture
*pic
)
1202 for (i
= 0; i
< 2; i
++) {
1203 av_buffer_unref(&pic
->motion_val_buf
[i
]);
1204 av_buffer_unref(&pic
->ref_index_buf
[i
]);
1206 av_buffer_unref(&pic
->mb_type_buf
);
1208 av_frame_unref(pic
->f
);
1211 static int get_buffer(AVCodecContext
*avctx
, H264Picture
*pic
)
1213 SVQ3Context
*s
= avctx
->priv_data
;
1214 H264Context
*h
= &s
->h
;
1215 H264SliceContext
*sl
= &h
->slice_ctx
[0];
1216 const int big_mb_num
= h
->mb_stride
* (h
->mb_height
+ 1) + 1;
1217 const int mb_array_size
= h
->mb_stride
* h
->mb_height
;
1218 const int b4_stride
= h
->mb_width
* 4 + 1;
1219 const int b4_array_size
= b4_stride
* h
->mb_height
* 4;
1222 if (!pic
->motion_val_buf
[0]) {
1225 pic
->mb_type_buf
= av_buffer_allocz((big_mb_num
+ h
->mb_stride
) * sizeof(uint32_t));
1226 if (!pic
->mb_type_buf
)
1227 return AVERROR(ENOMEM
);
1228 pic
->mb_type
= (uint32_t*)pic
->mb_type_buf
->data
+ 2 * h
->mb_stride
+ 1;
1230 for (i
= 0; i
< 2; i
++) {
1231 pic
->motion_val_buf
[i
] = av_buffer_allocz(2 * (b4_array_size
+ 4) * sizeof(int16_t));
1232 pic
->ref_index_buf
[i
] = av_buffer_allocz(4 * mb_array_size
);
1233 if (!pic
->motion_val_buf
[i
] || !pic
->ref_index_buf
[i
]) {
1234 ret
= AVERROR(ENOMEM
);
1238 pic
->motion_val
[i
] = (int16_t (*)[2])pic
->motion_val_buf
[i
]->data
+ 4;
1239 pic
->ref_index
[i
] = pic
->ref_index_buf
[i
]->data
;
1242 pic
->reference
= !(h
->pict_type
== AV_PICTURE_TYPE_B
);
1244 ret
= ff_get_buffer(avctx
, pic
->f
,
1245 pic
->reference ? AV_GET_BUFFER_FLAG_REF
: 0);
1249 if (!sl
->edge_emu_buffer
) {
1250 sl
->edge_emu_buffer
= av_mallocz(pic
->f
->linesize
[0] * 17);
1251 if (!sl
->edge_emu_buffer
)
1252 return AVERROR(ENOMEM
);
1255 sl
->linesize
= pic
->f
->linesize
[0];
1256 sl
->uvlinesize
= pic
->f
->linesize
[1];
1260 free_picture(avctx
, pic
);
1264 static int svq3_decode_frame(AVCodecContext
*avctx
, void *data
,
1265 int *got_frame
, AVPacket
*avpkt
)
1267 const uint8_t *buf
= avpkt
->data
;
1268 SVQ3Context
*s
= avctx
->priv_data
;
1269 H264Context
*h
= &s
->h
;
1270 H264SliceContext
*sl
= &h
->slice_ctx
[0];
1271 int buf_size
= avpkt
->size
;
1274 /* special case for last picture */
1275 if (buf_size
== 0) {
1276 if (s
->next_pic
->f
->data
[0] && !h
->low_delay
&& !s
->last_frame_output
) {
1277 ret
= av_frame_ref(data
, s
->next_pic
->f
);
1280 s
->last_frame_output
= 1;
1286 ret
= init_get_bits(&s
->gb
, buf
, 8 * buf_size
);
1290 s
->mb_x
= s
->mb_y
= s
->mb_xy
= 0;
1292 if (svq3_decode_slice_header(avctx
))
1295 h
->pict_type
= sl
->slice_type
;
1297 if (h
->pict_type
!= AV_PICTURE_TYPE_B
)
1298 FFSWAP(H264Picture
*, s
->next_pic
, s
->last_pic
);
1300 av_frame_unref(s
->cur_pic
->f
);
1302 /* for skipping the frame */
1303 s
->cur_pic
->f
->pict_type
= h
->pict_type
;
1304 s
->cur_pic
->f
->key_frame
= (h
->pict_type
== AV_PICTURE_TYPE_I
);
1306 ret
= get_buffer(avctx
, s
->cur_pic
);
1310 h
->cur_pic_ptr
= s
->cur_pic
;
1311 h
->cur_pic
= *s
->cur_pic
;
1313 for (i
= 0; i
< 16; i
++) {
1314 h
->block_offset
[i
] = (4 * ((scan8
[i
] - scan8
[0]) & 7)) + 4 * sl
->linesize
* ((scan8
[i
] - scan8
[0]) >> 3);
1315 h
->block_offset
[48 + i
] = (4 * ((scan8
[i
] - scan8
[0]) & 7)) + 8 * sl
->linesize
* ((scan8
[i
] - scan8
[0]) >> 3);
1317 for (i
= 0; i
< 16; i
++) {
1318 h
->block_offset
[16 + i
] =
1319 h
->block_offset
[32 + i
] = (4 * ((scan8
[i
] - scan8
[0]) & 7)) + 4 * sl
->uvlinesize
* ((scan8
[i
] - scan8
[0]) >> 3);
1320 h
->block_offset
[48 + 16 + i
] =
1321 h
->block_offset
[48 + 32 + i
] = (4 * ((scan8
[i
] - scan8
[0]) & 7)) + 8 * sl
->uvlinesize
* ((scan8
[i
] - scan8
[0]) >> 3);
1324 if (h
->pict_type
!= AV_PICTURE_TYPE_I
) {
1325 if (!s
->last_pic
->f
->data
[0]) {
1326 av_log(avctx
, AV_LOG_ERROR
, "Missing reference frame.\n");
1327 ret
= get_buffer(avctx
, s
->last_pic
);
1330 memset(s
->last_pic
->f
->data
[0], 0, avctx
->height
* s
->last_pic
->f
->linesize
[0]);
1331 memset(s
->last_pic
->f
->data
[1], 0x80, (avctx
->height
/ 2) *
1332 s
->last_pic
->f
->linesize
[1]);
1333 memset(s
->last_pic
->f
->data
[2], 0x80, (avctx
->height
/ 2) *
1334 s
->last_pic
->f
->linesize
[2]);
1337 if (h
->pict_type
== AV_PICTURE_TYPE_B
&& !s
->next_pic
->f
->data
[0]) {
1338 av_log(avctx
, AV_LOG_ERROR
, "Missing reference frame.\n");
1339 ret
= get_buffer(avctx
, s
->next_pic
);
1342 memset(s
->next_pic
->f
->data
[0], 0, avctx
->height
* s
->next_pic
->f
->linesize
[0]);
1343 memset(s
->next_pic
->f
->data
[1], 0x80, (avctx
->height
/ 2) *
1344 s
->next_pic
->f
->linesize
[1]);
1345 memset(s
->next_pic
->f
->data
[2], 0x80, (avctx
->height
/ 2) *
1346 s
->next_pic
->f
->linesize
[2]);
1350 if (avctx
->debug
& FF_DEBUG_PICT_INFO
)
1351 av_log(h
->avctx
, AV_LOG_DEBUG
,
1352 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1353 av_get_picture_type_char(h
->pict_type
),
1354 s
->halfpel_flag
, s
->thirdpel_flag
,
1355 s
->adaptive_quant
, h
->slice_ctx
[0].qscale
, sl
->slice_num
);
1357 if (avctx
->skip_frame
>= AVDISCARD_NONREF
&& h
->pict_type
== AV_PICTURE_TYPE_B
||
1358 avctx
->skip_frame
>= AVDISCARD_NONKEY
&& h
->pict_type
!= AV_PICTURE_TYPE_I
||
1359 avctx
->skip_frame
>= AVDISCARD_ALL
)
1362 if (s
->next_p_frame_damaged
) {
1363 if (h
->pict_type
== AV_PICTURE_TYPE_B
)
1366 s
->next_p_frame_damaged
= 0;
1369 if (h
->pict_type
== AV_PICTURE_TYPE_B
) {
1370 h
->frame_num_offset
= sl
->slice_num
- h
->prev_frame_num
;
1372 if (h
->frame_num_offset
< 0)
1373 h
->frame_num_offset
+= 256;
1374 if (h
->frame_num_offset
== 0 ||
1375 h
->frame_num_offset
>= h
->prev_frame_num_offset
) {
1376 av_log(h
->avctx
, AV_LOG_ERROR
, "error in B-frame picture id\n");
1380 h
->prev_frame_num
= h
->frame_num
;
1381 h
->frame_num
= sl
->slice_num
;
1382 h
->prev_frame_num_offset
= h
->frame_num
- h
->prev_frame_num
;
1384 if (h
->prev_frame_num_offset
< 0)
1385 h
->prev_frame_num_offset
+= 256;
1388 for (m
= 0; m
< 2; m
++) {
1390 for (i
= 0; i
< 4; i
++) {
1392 for (j
= -1; j
< 4; j
++)
1393 sl
->ref_cache
[m
][scan8
[0] + 8 * i
+ j
] = 1;
1395 sl
->ref_cache
[m
][scan8
[0] + 8 * i
+ j
] = PART_NOT_AVAILABLE
;
1399 for (s
->mb_y
= 0; s
->mb_y
< h
->mb_height
; s
->mb_y
++) {
1400 for (s
->mb_x
= 0; s
->mb_x
< h
->mb_width
; s
->mb_x
++) {
1402 s
->mb_xy
= s
->mb_x
+ s
->mb_y
* h
->mb_stride
;
1404 if ((get_bits_left(&h
->gb
)) <= 7) {
1405 if (((get_bits_count(&h
->gb
) & 7) == 0 ||
1406 show_bits(&h
->gb
, get_bits_left(&h
->gb
) & 7) == 0)) {
1408 if (svq3_decode_slice_header(avctx
))
1411 /* TODO: support s->mb_skip_run */
1414 mb_type
= svq3_get_ue_golomb(&h
->gb
);
1416 if (h
->pict_type
== AV_PICTURE_TYPE_I
)
1418 else if (h
->pict_type
== AV_PICTURE_TYPE_B
&& mb_type
>= 4)
1420 if (mb_type
> 33 || svq3_decode_mb(s
, mb_type
)) {
1421 av_log(h
->avctx
, AV_LOG_ERROR
,
1422 "error while decoding MB %d %d\n", s
->mb_x
, s
->mb_y
);
1427 hl_decode_mb(s
, h
, &h
->slice_ctx
[0]);
1429 if (h
->pict_type
!= AV_PICTURE_TYPE_B
&& !h
->low_delay
)
1430 h
->cur_pic
.mb_type
[s
->mb_x
+ s
->mb_y
* h
->mb_stride
] =
1431 (h
->pict_type
== AV_PICTURE_TYPE_P
&& mb_type
< 8) ?
(mb_type
- 1) : -1;
1434 ff_draw_horiz_band(avctx
, s
->cur_pic
->f
,
1435 s
->last_pic
->f
->data
[0] ? s
->last_pic
->f
: NULL
,
1436 16 * s
->mb_y
, 16, h
->picture_structure
, 0,
1440 if (h
->pict_type
== AV_PICTURE_TYPE_B
|| h
->low_delay
)
1441 ret
= av_frame_ref(data
, s
->cur_pic
->f
);
1442 else if (s
->last_pic
->f
->data
[0])
1443 ret
= av_frame_ref(data
, s
->last_pic
->f
);
1447 /* Do not output the last pic after seeking. */
1448 if (s
->last_pic
->f
->data
[0] || h
->low_delay
)
1451 if (h
->pict_type
!= AV_PICTURE_TYPE_B
) {
1452 FFSWAP(H264Picture
*, s
->cur_pic
, s
->next_pic
);
1454 av_frame_unref(s
->cur_pic
->f
);
1460 static av_cold
int svq3_decode_end(AVCodecContext
*avctx
)
1462 SVQ3Context
*s
= avctx
->priv_data
;
1463 H264Context
*h
= &s
->h
;
1465 free_picture(avctx
, s
->cur_pic
);
1466 free_picture(avctx
, s
->next_pic
);
1467 free_picture(avctx
, s
->last_pic
);
1468 av_frame_free(&s
->cur_pic
->f
);
1469 av_frame_free(&s
->next_pic
->f
);
1470 av_frame_free(&s
->last_pic
->f
);
1471 av_freep(&s
->cur_pic
);
1472 av_freep(&s
->next_pic
);
1473 av_freep(&s
->last_pic
);
1474 av_freep(&s
->slice_buf
);
1476 memset(&h
->cur_pic
, 0, sizeof(h
->cur_pic
));
1478 ff_h264_free_context(h
);
1483 AVCodec ff_svq3_decoder
= {
1485 .long_name
= NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1486 .type
= AVMEDIA_TYPE_VIDEO
,
1487 .id
= AV_CODEC_ID_SVQ3
,
1488 .priv_data_size
= sizeof(SVQ3Context
),
1489 .init
= svq3_decode_init
,
1490 .close
= svq3_decode_end
,
1491 .decode
= svq3_decode_frame
,
1492 .capabilities
= AV_CODEC_CAP_DRAW_HORIZ_BAND
|
1495 .pix_fmts
= (const enum AVPixelFormat
[]) { AV_PIX_FMT_YUVJ420P
,