27 #define BITSTREAM_READER_LE
42 #define MAX_INDEX (64 - 1)
48 #define ALPHA_VLC_BITS 5
64 {0x0001, 2}, {0x0003, 3}, {0x000E, 4}, {0x0007, 5},
65 {0x0017, 5}, {0x0028, 6}, {0x0008, 6}, {0x006F, 7},
66 {0x001F, 7}, {0x00C4, 8}, {0x0044, 8}, {0x005F, 8},
67 {0x00DF, 8}, {0x007F, 8}, {0x00FF, 8}, {0x3E00, 14},
68 {0x1E00, 14}, {0x2E00, 14}, {0x0E00, 14}, {0x3600, 14},
69 {0x1600, 14}, {0x2600, 14}, {0x0600, 14}, {0x3A00, 14},
70 {0x1A00, 14}, {0x2A00, 14}, {0x0A00, 14}, {0x3200, 14},
71 {0x1200, 14}, {0x2200, 14}, {0x0200, 14}, {0x0C00, 15},
72 {0x7400, 15}, {0x3400, 15}, {0x5400, 15}, {0x1400, 15},
73 {0x6400, 15}, {0x2400, 15}, {0x4400, 15}, {0x0400, 15},
74 {0x0002, 3}, {0x000C, 5}, {0x004F, 7}, {0x00E4, 8},
75 {0x0004, 8}, {0x0D00, 13}, {0x1500, 13}, {0x7C00, 15},
76 {0x3C00, 15}, {0x5C00, 15}, {0x1C00, 15}, {0x6C00, 15},
77 {0x2C00, 15}, {0x4C00, 15}, {0xC800, 16}, {0x4800, 16},
78 {0x8800, 16}, {0x0800, 16}, {0x0300, 13}, {0x1D00, 13},
79 {0x0014, 5}, {0x0070, 7}, {0x003F, 8}, {0x00C0, 10},
80 {0x0500, 13}, {0x0180, 12}, {0x0280, 12}, {0x0C80, 12},
81 {0x0080, 12}, {0x0B00, 13}, {0x1300, 13}, {0x001C, 5},
82 {0x0064, 8}, {0x0380, 12}, {0x1900, 13}, {0x0D80, 12},
83 {0x0018, 6}, {0x00BF, 8}, {0x0480, 12}, {0x0B80, 12},
84 {0x0038, 6}, {0x0040, 9}, {0x0900, 13}, {0x0030, 7},
85 {0x0780, 12}, {0x2800, 16}, {0x0010, 7}, {0x0A80, 12},
86 {0x0050, 7}, {0x0880, 12}, {0x000F, 7}, {0x1100, 13},
87 {0x002F, 7}, {0x0100, 13}, {0x0084, 8}, {0x5800, 16},
88 {0x00A4, 8}, {0x9800, 16}, {0x0024, 8}, {0x1800, 16},
89 {0x0140, 9}, {0xE800, 16}, {0x01C0, 9}, {0x6800, 16},
90 {0x02C0, 10}, {0xA800, 16}, {0x0F80, 12}, {0x0580, 12},
91 {0x0980, 12}, {0x0E80, 12}, {0x0680, 12}, {0x1F00, 13},
92 {0x0F00, 13}, {0x1700, 13}, {0x0700, 13}, {0x1B00, 13},
93 {0xF800, 16}, {0x7800, 16}, {0xB800, 16}, {0x3800, 16},
100 1, 2, 3, 4, 5, 6, 7, 8,
101 9, 10, 11, 12, 13, 14, 15, 16,
102 17, 18, 19, 20, 21, 22, 23, 24,
103 25, 26, 27, 28, 29, 30, 31, 32,
104 33, 34, 35, 36, 37, 38, 39, 40,
105 1, 2, 3, 4, 5, 6, 7, 8,
106 9, 10, 11, 12, 13, 14, 15, 16,
107 17, 18, 19, 20, 1, 2, 3, 4,
108 5, 6, 7, 8, 9, 10, 11, 1,
109 2, 3, 4, 5, 1, 2, 3, 4,
110 1, 2, 3, 1, 2, 3, 1, 2,
111 1, 2, 1, 2, 1, 2, 1, 2,
112 1, 2, 1, 2, 1, 2, 1, 2,
113 1, 2, 1, 1, 1, 1, 1, 1,
114 1, 1, 1, 1, 1, 1, 1, 1,
119 0, 0, 0, 0, 0, 0, 0, 0,
120 0, 0, 0, 0, 0, 0, 0, 0,
121 0, 0, 0, 0, 0, 0, 0, 0,
122 0, 0, 0, 0, 0, 0, 0, 0,
123 0, 0, 0, 0, 0, 0, 0, 0,
124 1, 1, 1, 1, 1, 1, 1, 1,
125 1, 1, 1, 1, 1, 1, 1, 1,
126 1, 1, 1, 1, 2, 2, 2, 2,
127 2, 2, 2, 2, 2, 2, 2, 3,
128 3, 3, 3, 3, 4, 4, 4, 4,
129 5, 5, 5, 6, 6, 6, 7, 7,
130 8, 8, 9, 9, 10, 10, 11, 11,
131 12, 12, 13, 13, 14, 14, 15, 15,
132 16, 16, 17, 18, 19, 20, 21, 22,
133 23, 24, 25, 26, 27, 28, 29, 30,
145 #if CONFIG_SPEEDHQ_DECODER
147 static const uint8_t unscaled_quant_matrix[64] = {
148 16, 16, 19, 22, 26, 27, 29, 34,
149 16, 16, 22, 24, 27, 29, 34, 37,
150 19, 22, 26, 27, 29, 34, 34, 38,
151 22, 22, 26, 27, 29, 34, 37, 40,
152 22, 26, 27, 29, 32, 35, 40, 48,
153 26, 27, 29, 32, 35, 40, 48, 58,
154 26, 27, 29, 34, 38, 46, 56, 69,
155 27, 29, 35, 38, 46, 56, 69, 83
158 static VLC dc_lum_vlc_le;
159 static VLC dc_chroma_vlc_le;
160 static VLC dc_alpha_run_vlc_le;
161 static VLC dc_alpha_level_vlc_le;
163 static inline int decode_dc_le(
GetBitContext *gb,
int component)
167 if (component == 0 || component == 3) {
180 static inline int decode_alpha_block(
const SHQContext *
s,
GetBitContext *gb, uint8_t last_alpha[16], uint8_t *dest,
int linesize)
209 for (y = 0; y < 8; y++) {
210 for (x = 0; x < 16; x++) {
211 last_alpha[x] -=
block[y * 16 + x];
213 memcpy(dest, last_alpha, 16);
222 const int *quant_matrix =
s->quant_matrix;
223 const uint8_t *scantable =
s->intra_scantable.permutated;
227 s->bdsp.clear_block(
block);
229 dc_offset = decode_dc_le(gb, component);
230 last_dc[component] -= dc_offset;
231 block[scantable[0]] = last_dc[component];
254 #if MIN_CACHE_BITS < 6 + 6 + 12
255 #error MIN_CACHE_BITS is too small for the escape code, add UPDATE_CACHE
272 s->idsp.idct_put(dest, linesize,
block);
279 int linesize_y =
frame->linesize[0] * line_stride;
280 int linesize_cb =
frame->linesize[1] * line_stride;
281 int linesize_cr =
frame->linesize[2] * line_stride;
285 if (
s->alpha_type != SHQ_NO_ALPHA)
286 linesize_a =
frame->linesize[3] * line_stride;
288 for (
int y = 0; y <
frame->height; y += 16 * line_stride) {
289 int last_dc[4] = { 1024, 1024, 1024, 1024 };
290 uint8_t *dest_y, *dest_cb, *dest_cr, *dest_a;
291 uint8_t last_alpha[16];
292 int x =
frame->width - 8;
294 dest_y =
frame->data[0] +
frame->linesize[0] * (y + field_number) + x;
295 if (
s->subsampling == SHQ_SUBSAMPLING_420) {
296 dest_cb =
frame->data[1] +
frame->linesize[1] * (y/2 + field_number) + x / 2;
297 dest_cr =
frame->data[2] +
frame->linesize[2] * (y/2 + field_number) + x / 2;
300 dest_cb =
frame->data[1] +
frame->linesize[1] * (y + field_number) + x / 2;
301 dest_cr =
frame->data[2] +
frame->linesize[2] * (y + field_number) + x / 2;
303 if (
s->alpha_type != SHQ_NO_ALPHA) {
304 memset(last_alpha, 255,
sizeof(last_alpha));
305 dest_a =
frame->data[3] +
frame->linesize[3] * (y + field_number) + x;
321 if (
s->subsampling != SHQ_SUBSAMPLING_420) {
328 if (
s->alpha_type == SHQ_RLE_ALPHA) {
330 if ((
ret = decode_alpha_block(
s, gb, last_alpha, dest_a, linesize_a)) < 0)
332 if ((
ret = decode_alpha_block(
s, gb, last_alpha, dest_a + 8 * linesize_a, linesize_a)) < 0)
334 }
else if (
s->alpha_type == SHQ_DCT_ALPHA) {
350 static int decode_speedhq_field(
const SHQContext *
s,
const uint8_t *buf,
int buf_size,
AVFrame *
frame,
int field_number,
int start,
int end,
int line_stride)
352 int ret, slice_number, slice_offsets[5];
353 int linesize_y =
frame->linesize[0] * line_stride;
354 int linesize_cb =
frame->linesize[1] * line_stride;
355 int linesize_cr =
frame->linesize[2] * line_stride;
359 if (
s->alpha_type != SHQ_NO_ALPHA)
360 linesize_a =
frame->linesize[3] * line_stride;
362 if (end < start || end - start < 3 || end > buf_size)
365 slice_offsets[0] = start;
366 slice_offsets[4] = end;
367 for (slice_number = 1; slice_number < 4; slice_number++) {
368 uint32_t last_offset, slice_len;
370 last_offset = slice_offsets[slice_number - 1];
371 slice_len =
AV_RL24(buf + last_offset);
372 slice_offsets[slice_number] = last_offset + slice_len;
374 if (slice_len < 3 || slice_offsets[slice_number] > end - 3)
378 for (slice_number = 0; slice_number < 4; slice_number++) {
382 slice_begin = slice_offsets[slice_number];
383 slice_end = slice_offsets[slice_number + 1];
388 for (y = slice_number * 16 * line_stride; y <
frame->height; y += line_stride * 64) {
389 uint8_t *dest_y, *dest_cb, *dest_cr, *dest_a;
390 int last_dc[4] = { 1024, 1024, 1024, 1024 };
391 uint8_t last_alpha[16];
393 memset(last_alpha, 255,
sizeof(last_alpha));
395 dest_y =
frame->data[0] +
frame->linesize[0] * (y + field_number);
396 if (
s->subsampling == SHQ_SUBSAMPLING_420) {
397 dest_cb =
frame->data[1] +
frame->linesize[1] * (y/2 + field_number);
398 dest_cr =
frame->data[2] +
frame->linesize[2] * (y/2 + field_number);
400 dest_cb =
frame->data[1] +
frame->linesize[1] * (y + field_number);
401 dest_cr =
frame->data[2] +
frame->linesize[2] * (y + field_number);
403 if (
s->alpha_type != SHQ_NO_ALPHA) {
404 dest_a =
frame->data[3] +
frame->linesize[3] * (y + field_number);
407 for (x = 0; x <
frame->width - 8 * (
s->subsampling != SHQ_SUBSAMPLING_444); x += 16) {
427 if (
s->subsampling != SHQ_SUBSAMPLING_420) {
434 if (
s->subsampling == SHQ_SUBSAMPLING_444) {
440 if ((
ret =
decode_dct_block(
s, &gb, last_dc, 1, dest_cb + 8 * linesize_cb + 8, linesize_cb)) < 0)
442 if ((
ret =
decode_dct_block(
s, &gb, last_dc, 2, dest_cr + 8 * linesize_cr + 8, linesize_cr)) < 0)
453 if (
s->alpha_type == SHQ_RLE_ALPHA) {
455 if ((
ret = decode_alpha_block(
s, &gb, last_alpha, dest_a, linesize_a)) < 0)
457 if ((
ret = decode_alpha_block(
s, &gb, last_alpha, dest_a + 8 * linesize_a, linesize_a)) < 0)
460 }
else if (
s->alpha_type == SHQ_DCT_ALPHA) {
476 if (
s->subsampling != SHQ_SUBSAMPLING_444 && (
frame->width & 15))
477 return decode_speedhq_border(
s, &gb,
frame, field_number, line_stride);
489 void *
data,
int *got_frame,
493 const uint8_t *buf = avpkt->
data;
494 int buf_size = avpkt->
size;
497 uint32_t second_field_offset;
500 if (buf_size < 4 || avctx->
width < 8)
510 second_field_offset =
AV_RL24(buf + 1);
511 if (second_field_offset >= buf_size - 3) {
521 frame->key_frame = 1;
523 if (second_field_offset == 4 || second_field_offset == (buf_size-4)) {
533 if ((
ret = decode_speedhq_field(
s, buf, buf_size,
frame, 0, 4, buf_size, 1)) < 0)
536 if ((
ret = decode_speedhq_field(
s, buf, buf_size,
frame, 0, 4, second_field_offset, 2)) < 0)
538 if ((
ret = decode_speedhq_field(
s, buf, buf_size,
frame, 1, second_field_offset, buf_size, 2)) < 0)
551 static av_cold void compute_alpha_vlcs(
void)
553 uint16_t run_code[134], level_code[266];
554 uint8_t
run_bits[134], level_bits[266];
555 int16_t run_symbols[134], level_symbols[266];
564 run_symbols[entry] = 0;
568 for (
i = 0;
i < 4; ++
i) {
569 run_code[entry] = (
i << 2) | 1;
571 run_symbols[entry] =
i + 1;
576 for (
i = 0;
i < 128; ++
i) {
577 run_code[entry] = (
i << 3) | 7;
579 run_symbols[entry] =
i;
586 run_symbols[entry] = -1;
595 run_symbols, 2, 2, 160);
600 for (sign = 0; sign <= 1; ++sign) {
602 level_code[entry] = (sign << 1) | 1;
603 level_bits[entry] = 2;
604 level_symbols[entry] = sign ? -1 : 1;
608 for (
i = 0;
i < 4; ++
i) {
609 level_code[entry] = (
i << 3) | (sign << 2) | 2;
610 level_bits[entry] = 5;
611 level_symbols[entry] = sign ? -(
i + 2) : (
i + 2);
622 for (
i = 0;
i < 256; ++
i) {
623 level_code[entry] =
i << 2;
624 level_bits[entry] = 10;
625 level_symbols[entry] =
i;
635 level_symbols, 2, 2, 288);
638 static av_cold void speedhq_static_init(
void)
652 compute_alpha_vlcs();
672 case MKTAG(
'S',
'H',
'Q',
'0'):
673 s->subsampling = SHQ_SUBSAMPLING_420;
674 s->alpha_type = SHQ_NO_ALPHA;
677 case MKTAG(
'S',
'H',
'Q',
'1'):
678 s->subsampling = SHQ_SUBSAMPLING_420;
679 s->alpha_type = SHQ_RLE_ALPHA;
682 case MKTAG(
'S',
'H',
'Q',
'2'):
683 s->subsampling = SHQ_SUBSAMPLING_422;
684 s->alpha_type = SHQ_NO_ALPHA;
687 case MKTAG(
'S',
'H',
'Q',
'3'):
688 s->subsampling = SHQ_SUBSAMPLING_422;
689 s->alpha_type = SHQ_RLE_ALPHA;
692 case MKTAG(
'S',
'H',
'Q',
'4'):
693 s->subsampling = SHQ_SUBSAMPLING_444;
694 s->alpha_type = SHQ_NO_ALPHA;
697 case MKTAG(
'S',
'H',
'Q',
'5'):
698 s->subsampling = SHQ_SUBSAMPLING_444;
699 s->alpha_type = SHQ_RLE_ALPHA;
702 case MKTAG(
'S',
'H',
'Q',
'7'):
703 s->subsampling = SHQ_SUBSAMPLING_422;
704 s->alpha_type = SHQ_DCT_ALPHA;
707 case MKTAG(
'S',
'H',
'Q',
'9'):
708 s->subsampling = SHQ_SUBSAMPLING_444;
709 s->alpha_type = SHQ_DCT_ALPHA;
731 .
init = speedhq_decode_init,
732 .
decode = speedhq_decode_frame,