36 #include "config_components.h"
73 uint8_t
tmp[UINT16_MAX];
76 static int decode_hybrid(
const uint8_t *sptr,
const uint8_t *sptr_end, uint8_t *dptr,
int dx,
int dy,
77 int h,
int w,
int stride,
const uint32_t *pal)
80 const uint8_t *orig_src = sptr;
82 for (y = dx +
h; y > dx; y--) {
83 uint8_t *
dst = dptr + (y *
stride) + dy * 3;
84 for (x = 0; x <
w; x++) {
89 unsigned c =
AV_RB16(sptr) & ~0x8000;
90 unsigned b =
c & 0x1F;
91 unsigned g = (
c >> 5) & 0x1F;
94 *
dst++ = (
b << 3) | (
b >> 2);
95 *
dst++ = (
g << 3) | (
g >> 2);
96 *
dst++ = (
r << 3) | (
r >> 2);
100 uint32_t
c = pal[*sptr++];
101 bytestream_put_le24(&
dst,
c);
105 return sptr - orig_src;
140 static const uint8_t zlib_header[] = { 0x78, 0x01 };
141 z_stream *
const zstream = &
s->zstream.zstream;
142 uint8_t *
data =
s->tmpblock;
148 zstream->next_in =
src;
149 zstream->avail_in =
size;
150 zstream->next_out =
data;
151 zstream->avail_out =
s->block_size * 3;
152 zret =
inflate(zstream, Z_SYNC_FLUSH);
153 if (zret != Z_OK && zret != Z_STREAM_END)
155 remaining =
s->block_size * 3 - zstream->avail_out;
157 if ((zret = inflateReset(zstream)) != Z_OK) {
168 zstream->next_in = zlib_header;
169 zstream->avail_in =
sizeof(zlib_header);
170 zret =
inflate(zstream, Z_SYNC_FLUSH);
173 while (remaining > 0) {
174 unsigned block_size =
FFMIN(UINT16_MAX, remaining);
182 zstream->next_in =
header;
183 zstream->avail_in =
sizeof(
header);
184 zstream->next_out =
s->tmp;
185 zstream->avail_out =
sizeof(
s->tmp);
186 zret =
inflate(zstream, Z_SYNC_FLUSH);
189 zstream->next_in =
data;
190 zstream->avail_in = block_size;
191 zret =
inflate(zstream, Z_SYNC_FLUSH);
195 remaining -= block_size;
207 z_stream *
const zstream = &
s->zstream.zstream;
208 uint8_t *
line =
s->tmpblock;
215 if (
s->zlibprime_curr ||
s->zlibprime_prev) {
217 s->blocks[blk_idx].pos,
218 s->blocks[blk_idx].size);
225 zstream->avail_out =
s->block_size * 3;
227 if (
ret == Z_DATA_ERROR) {
233 if (
ret != Z_OK &&
ret != Z_STREAM_END) {
237 if (
s->is_keyframe) {
242 y_pos +=
s->diff_start;
244 if (!
s->color_depth) {
247 for (k = 1; k <=
s->diff_height; k++) {
248 memcpy(
s->frame->data[0] + x_pos * 3 +
249 (
s->image_height - y_pos - k) *
s->frame->linesize[0],
258 s->image_height - (y_pos + 1 +
s->diff_height),
259 x_pos,
s->diff_height,
width,
260 s->frame->linesize[0],
s->pal);
273 int buf_size = avpkt->
size;
275 int h_blocks, v_blocks, h_part, v_part,
i, j,
ret;
277 int last_blockwidth =
s->block_width;
278 int last_blockheight=
s->block_height;
290 s->block_width = 16 * (
get_bits(&gb, 4) + 1);
292 s->block_height = 16 * (
get_bits(&gb, 4) + 1);
295 if ( last_blockwidth !=
s->block_width
296 || last_blockheight!=
s->block_height)
312 h_blocks =
s->image_width /
s->block_width;
313 h_part =
s->image_width %
s->block_width;
314 v_blocks =
s->image_height /
s->block_height;
315 v_part =
s->image_height %
s->block_height;
322 if (
s->block_size <
s->block_width *
s->block_height) {
323 int tmpblock_size = 3 *
s->block_width *
s->block_height, err;
325 if ((err =
av_reallocp(&
s->tmpblock, tmpblock_size)) < 0) {
328 "Cannot allocate decompression buffer.\n");
332 s->block_size =
s->block_width *
s->block_height;
343 "Frame width or height differs from first frame!\n");
351 if (
s->is_keyframe) {
355 s->keyframedata = avpkt->
data;
357 memset(
s->blocks, 0, (v_blocks + !!v_part) * (h_blocks + !!h_part) *
358 sizeof(
s->blocks[0]));
360 if(
s->ver == 2 && !
s->blocks)
361 s->blocks =
av_mallocz((v_blocks + !!v_part) * (h_blocks + !!h_part) *
362 sizeof(
s->blocks[0]));
364 ff_dlog(
avctx,
"image: %dx%d block: %dx%d num: %dx%d part: %dx%d\n",
365 s->image_width,
s->image_height,
s->block_width,
s->block_height,
366 h_blocks, v_blocks, h_part, v_part);
372 for (j = 0; j < v_blocks + (v_part ? 1 : 0); j++) {
374 int y_pos = j *
s->block_height;
375 int cur_blk_height = (j < v_blocks) ?
s->block_height : v_part;
378 for (
i = 0;
i < h_blocks + (h_part ? 1 : 0);
i++) {
379 int x_pos =
i *
s->block_width;
380 int cur_blk_width = (
i < h_blocks) ?
s->block_width : h_part;
387 s->zlibprime_curr = 0;
388 s->zlibprime_prev = 0;
390 s->diff_height = cur_blk_height;
397 if (
s->ver == 2 &&
size) {
404 if (
s->color_depth != 0 &&
s->color_depth != 2) {
406 "%dx%d invalid color depth %d\n",
407 i, j,
s->color_depth);
418 "Inter frame without keyframe\n");
423 if (
s->diff_start +
s->diff_height > cur_blk_height) {
425 "Block parameters invalid: %d + %d > %d\n",
426 s->diff_start,
s->diff_height, cur_blk_height);
430 "%dx%d diff start %d height %d\n",
431 i, j,
s->diff_start,
s->diff_height);
435 if (
s->zlibprime_prev)
438 if (
s->zlibprime_curr) {
451 if (!
s->blocks && (
s->zlibprime_curr ||
s->zlibprime_prev)) {
453 "no data available for zlib priming\n");
461 int off = (
s->image_height - y_pos - 1) *
s->frame->linesize[0];
463 for (k = 0; k < cur_blk_height; k++) {
464 int x = off - k *
s->frame->linesize[0] + x_pos * 3;
465 memcpy(
s->frame->data[0] + x,
s->keyframe + x,
473 cur_blk_width, cur_blk_height,
475 i + j * (h_blocks + !!h_part)))
477 "error in decompression of block %dx%d\n",
i, j);
481 if (
s->is_keyframe &&
s->ver == 2) {
489 memcpy(
s->keyframe,
s->frame->data[0],
506 #if CONFIG_FLASHSV_DECODER
521 #if CONFIG_FLASHSV2_DECODER
522 static const uint32_t ff_flashsv2_default_palette[128] = {
523 0x000000, 0x333333, 0x666666, 0x999999, 0xCCCCCC, 0xFFFFFF,
524 0x330000, 0x660000, 0x990000, 0xCC0000, 0xFF0000, 0x003300,
525 0x006600, 0x009900, 0x00CC00, 0x00FF00, 0x000033, 0x000066,
526 0x000099, 0x0000CC, 0x0000FF, 0x333300, 0x666600, 0x999900,
527 0xCCCC00, 0xFFFF00, 0x003333, 0x006666, 0x009999, 0x00CCCC,
528 0x00FFFF, 0x330033, 0x660066, 0x990099, 0xCC00CC, 0xFF00FF,
529 0xFFFF33, 0xFFFF66, 0xFFFF99, 0xFFFFCC, 0xFF33FF, 0xFF66FF,
530 0xFF99FF, 0xFFCCFF, 0x33FFFF, 0x66FFFF, 0x99FFFF, 0xCCFFFF,
531 0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCFF, 0xCC33CC, 0xCC66CC,
532 0xCC99CC, 0xCCFFCC, 0x33CCCC, 0x66CCCC, 0x99CCCC, 0xFFCCCC,
533 0x999933, 0x999966, 0x9999CC, 0x9999FF, 0x993399, 0x996699,
534 0x99CC99, 0x99FF99, 0x339999, 0x669999, 0xCC9999, 0xFF9999,
535 0x666633, 0x666699, 0x6666CC, 0x6666FF, 0x663366, 0x669966,
536 0x66CC66, 0x66FF66, 0x336666, 0x996666, 0xCC6666, 0xFF6666,
537 0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336633, 0x339933,
538 0x33CC33, 0x33FF33, 0x663333, 0x993333, 0xCC3333, 0xFF3333,
539 0x003366, 0x336600, 0x660033, 0x006633, 0x330066, 0x663300,
540 0x336699, 0x669933, 0x993366, 0x339966, 0x663399, 0x996633,
541 0x6699CC, 0x99CC66, 0xCC6699, 0x66CC99, 0x9966CC, 0xCC9966,
542 0x99CCFF, 0xCCFF99, 0xFF99CC, 0x99FFCC, 0xCC99FF, 0xFFCC99,
543 0x111111, 0x222222, 0x444444, 0x555555, 0xAAAAAA, 0xBBBBBB,
555 s->pal = ff_flashsv2_default_palette;
566 s->keyframedata =
NULL;
575 .
p.
name =
"flashsv2",
580 .
init = flashsv2_decode_init,
581 .
close = flashsv2_decode_end,