36 #include "config_components.h"
72 uint8_t
tmp[UINT16_MAX];
75 static int decode_hybrid(
const uint8_t *sptr,
const uint8_t *sptr_end, uint8_t *dptr,
int dx,
int dy,
76 int h,
int w,
int stride,
const uint32_t *pal)
79 const uint8_t *orig_src = sptr;
81 for (y = dx +
h; y > dx; y--) {
82 uint8_t *dst = dptr + (y *
stride) + dy * 3;
83 for (x = 0; x <
w; x++) {
88 unsigned c =
AV_RB16(sptr) & ~0x8000;
89 unsigned b =
c & 0x1F;
90 unsigned g = (
c >> 5) & 0x1F;
93 *dst++ = (
b << 3) | (
b >> 2);
94 *dst++ = (
g << 3) | (
g >> 2);
95 *dst++ = (
r << 3) | (
r >> 2);
99 uint32_t
c = pal[*sptr++];
100 bytestream_put_le24(&dst,
c);
104 return sptr - orig_src;
139 static const uint8_t zlib_header[] = { 0x78, 0x01 };
140 z_stream *
const zstream = &
s->zstream.zstream;
141 uint8_t *
data =
s->tmpblock;
147 zstream->next_in =
src;
148 zstream->avail_in =
size;
149 zstream->next_out =
data;
150 zstream->avail_out =
s->block_size * 3;
151 zret =
inflate(zstream, Z_SYNC_FLUSH);
152 if (zret != Z_OK && zret != Z_STREAM_END)
154 remaining =
s->block_size * 3 - zstream->avail_out;
156 if ((zret = inflateReset(zstream)) != Z_OK) {
167 zstream->next_in = zlib_header;
168 zstream->avail_in =
sizeof(zlib_header);
169 zret =
inflate(zstream, Z_SYNC_FLUSH);
172 while (remaining > 0) {
173 unsigned block_size =
FFMIN(UINT16_MAX, remaining);
181 zstream->next_in =
header;
182 zstream->avail_in =
sizeof(
header);
183 zstream->next_out =
s->tmp;
184 zstream->avail_out =
sizeof(
s->tmp);
185 zret =
inflate(zstream, Z_SYNC_FLUSH);
188 zstream->next_in =
data;
189 zstream->avail_in = block_size;
190 zret =
inflate(zstream, Z_SYNC_FLUSH);
194 remaining -= block_size;
206 z_stream *
const zstream = &
s->zstream.zstream;
207 uint8_t *
line =
s->tmpblock;
214 if (
s->zlibprime_curr ||
s->zlibprime_prev) {
216 s->blocks[blk_idx].pos,
217 s->blocks[blk_idx].size);
224 zstream->avail_out =
s->block_size * 3;
226 if (
ret == Z_DATA_ERROR) {
232 if (
ret != Z_OK &&
ret != Z_STREAM_END) {
236 if (
s->is_keyframe) {
241 y_pos +=
s->diff_start;
243 if (!
s->color_depth) {
246 for (k = 1; k <=
s->diff_height; k++) {
247 memcpy(
s->frame->data[0] + x_pos * 3 +
248 (
s->image_height - y_pos - k) *
s->frame->linesize[0],
257 s->image_height - (y_pos + 1 +
s->diff_height),
258 x_pos,
s->diff_height,
width,
259 s->frame->linesize[0],
s->pal);
272 int buf_size = avpkt->
size;
274 int h_blocks, v_blocks, h_part, v_part,
i, j,
ret;
276 int last_blockwidth =
s->block_width;
277 int last_blockheight=
s->block_height;
289 s->block_width = 16 * (
get_bits(&gb, 4) + 1);
291 s->block_height = 16 * (
get_bits(&gb, 4) + 1);
294 if ( last_blockwidth !=
s->block_width
295 || last_blockheight!=
s->block_height)
311 h_blocks =
s->image_width /
s->block_width;
312 h_part =
s->image_width %
s->block_width;
313 v_blocks =
s->image_height /
s->block_height;
314 v_part =
s->image_height %
s->block_height;
318 if (
s->block_size <
s->block_width *
s->block_height) {
319 int tmpblock_size = 3 *
s->block_width *
s->block_height, err;
321 if ((err =
av_reallocp(&
s->tmpblock, tmpblock_size)) < 0) {
324 "Cannot allocate decompression buffer.\n");
328 s->block_size =
s->block_width *
s->block_height;
339 "Frame width or height differs from first frame!\n");
347 if (
s->is_keyframe) {
351 s->keyframedata = avpkt->
data;
353 memset(
s->blocks, 0, (v_blocks + !!v_part) * (h_blocks + !!h_part) *
354 sizeof(
s->blocks[0]));
356 if(
s->ver == 2 && !
s->blocks)
357 s->blocks =
av_mallocz((v_blocks + !!v_part) * (h_blocks + !!h_part) *
358 sizeof(
s->blocks[0]));
360 ff_dlog(
avctx,
"image: %dx%d block: %dx%d num: %dx%d part: %dx%d\n",
361 s->image_width,
s->image_height,
s->block_width,
s->block_height,
362 h_blocks, v_blocks, h_part, v_part);
368 for (j = 0; j < v_blocks + (v_part ? 1 : 0); j++) {
370 int y_pos = j *
s->block_height;
371 int cur_blk_height = (j < v_blocks) ?
s->block_height : v_part;
374 for (
i = 0;
i < h_blocks + (h_part ? 1 : 0);
i++) {
375 int x_pos =
i *
s->block_width;
376 int cur_blk_width = (
i < h_blocks) ?
s->block_width : h_part;
383 s->zlibprime_curr = 0;
384 s->zlibprime_prev = 0;
386 s->diff_height = cur_blk_height;
393 if (
s->ver == 2 &&
size) {
400 if (
s->color_depth != 0 &&
s->color_depth != 2) {
402 "%dx%d invalid color depth %d\n",
403 i, j,
s->color_depth);
414 "Inter frame without keyframe\n");
419 if (
s->diff_start +
s->diff_height > cur_blk_height) {
421 "Block parameters invalid: %d + %d > %d\n",
422 s->diff_start,
s->diff_height, cur_blk_height);
426 "%dx%d diff start %d height %d\n",
427 i, j,
s->diff_start,
s->diff_height);
431 if (
s->zlibprime_prev)
434 if (
s->zlibprime_curr) {
447 if (!
s->blocks && (
s->zlibprime_curr ||
s->zlibprime_prev)) {
449 "no data available for zlib priming\n");
457 int off = (
s->image_height - y_pos - 1) *
s->frame->linesize[0];
459 for (k = 0; k < cur_blk_height; k++) {
460 int x = off - k *
s->frame->linesize[0] + x_pos * 3;
461 memcpy(
s->frame->data[0] + x,
s->keyframe + x,
469 cur_blk_width, cur_blk_height,
471 i + j * (h_blocks + !!h_part)))
473 "error in decompression of block %dx%d\n",
i, j);
477 if (
s->is_keyframe &&
s->ver == 2) {
485 memcpy(
s->keyframe,
s->frame->data[0],
502 #if CONFIG_FLASHSV_DECODER
517 #if CONFIG_FLASHSV2_DECODER
518 static const uint32_t ff_flashsv2_default_palette[128] = {
519 0x000000, 0x333333, 0x666666, 0x999999, 0xCCCCCC, 0xFFFFFF,
520 0x330000, 0x660000, 0x990000, 0xCC0000, 0xFF0000, 0x003300,
521 0x006600, 0x009900, 0x00CC00, 0x00FF00, 0x000033, 0x000066,
522 0x000099, 0x0000CC, 0x0000FF, 0x333300, 0x666600, 0x999900,
523 0xCCCC00, 0xFFFF00, 0x003333, 0x006666, 0x009999, 0x00CCCC,
524 0x00FFFF, 0x330033, 0x660066, 0x990099, 0xCC00CC, 0xFF00FF,
525 0xFFFF33, 0xFFFF66, 0xFFFF99, 0xFFFFCC, 0xFF33FF, 0xFF66FF,
526 0xFF99FF, 0xFFCCFF, 0x33FFFF, 0x66FFFF, 0x99FFFF, 0xCCFFFF,
527 0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCFF, 0xCC33CC, 0xCC66CC,
528 0xCC99CC, 0xCCFFCC, 0x33CCCC, 0x66CCCC, 0x99CCCC, 0xFFCCCC,
529 0x999933, 0x999966, 0x9999CC, 0x9999FF, 0x993399, 0x996699,
530 0x99CC99, 0x99FF99, 0x339999, 0x669999, 0xCC9999, 0xFF9999,
531 0x666633, 0x666699, 0x6666CC, 0x6666FF, 0x663366, 0x669966,
532 0x66CC66, 0x66FF66, 0x336666, 0x996666, 0xCC6666, 0xFF6666,
533 0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336633, 0x339933,
534 0x33CC33, 0x33FF33, 0x663333, 0x993333, 0xCC3333, 0xFF3333,
535 0x003366, 0x336600, 0x660033, 0x006633, 0x330066, 0x663300,
536 0x336699, 0x669933, 0x993366, 0x339966, 0x663399, 0x996633,
537 0x6699CC, 0x99CC66, 0xCC6699, 0x66CC99, 0x9966CC, 0xCC9966,
538 0x99CCFF, 0xCCFF99, 0xFF99CC, 0x99FFCC, 0xCC99FF, 0xFFCC99,
539 0x111111, 0x222222, 0x444444, 0x555555, 0xAAAAAA, 0xBBBBBB,
551 s->pal = ff_flashsv2_default_palette;
562 s->keyframedata =
NULL;
571 .
p.
name =
"flashsv2",
576 .
init = flashsv2_decode_init,
577 .close = flashsv2_decode_end,