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;
319 if (
s->block_size <
s->block_width *
s->block_height) {
320 int tmpblock_size = 3 *
s->block_width *
s->block_height, err;
322 if ((err =
av_reallocp(&
s->tmpblock, tmpblock_size)) < 0) {
325 "Cannot allocate decompression buffer.\n");
329 s->block_size =
s->block_width *
s->block_height;
340 "Frame width or height differs from first frame!\n");
348 if (
s->is_keyframe) {
352 s->keyframedata = avpkt->
data;
354 memset(
s->blocks, 0, (v_blocks + !!v_part) * (h_blocks + !!h_part) *
355 sizeof(
s->blocks[0]));
357 if(
s->ver == 2 && !
s->blocks)
358 s->blocks =
av_mallocz((v_blocks + !!v_part) * (h_blocks + !!h_part) *
359 sizeof(
s->blocks[0]));
361 ff_dlog(
avctx,
"image: %dx%d block: %dx%d num: %dx%d part: %dx%d\n",
362 s->image_width,
s->image_height,
s->block_width,
s->block_height,
363 h_blocks, v_blocks, h_part, v_part);
369 for (j = 0; j < v_blocks + (v_part ? 1 : 0); j++) {
371 int y_pos = j *
s->block_height;
372 int cur_blk_height = (j < v_blocks) ?
s->block_height : v_part;
375 for (
i = 0;
i < h_blocks + (h_part ? 1 : 0);
i++) {
376 int x_pos =
i *
s->block_width;
377 int cur_blk_width = (
i < h_blocks) ?
s->block_width : h_part;
384 s->zlibprime_curr = 0;
385 s->zlibprime_prev = 0;
387 s->diff_height = cur_blk_height;
394 if (
s->ver == 2 &&
size) {
401 if (
s->color_depth != 0 &&
s->color_depth != 2) {
403 "%dx%d invalid color depth %d\n",
404 i, j,
s->color_depth);
415 "Inter frame without keyframe\n");
420 if (
s->diff_start +
s->diff_height > cur_blk_height) {
422 "Block parameters invalid: %d + %d > %d\n",
423 s->diff_start,
s->diff_height, cur_blk_height);
427 "%dx%d diff start %d height %d\n",
428 i, j,
s->diff_start,
s->diff_height);
432 if (
s->zlibprime_prev)
435 if (
s->zlibprime_curr) {
448 if (!
s->blocks && (
s->zlibprime_curr ||
s->zlibprime_prev)) {
450 "no data available for zlib priming\n");
458 int off = (
s->image_height - y_pos - 1) *
s->frame->linesize[0];
460 for (k = 0; k < cur_blk_height; k++) {
461 int x = off - k *
s->frame->linesize[0] + x_pos * 3;
462 memcpy(
s->frame->data[0] + x,
s->keyframe + x,
470 cur_blk_width, cur_blk_height,
472 i + j * (h_blocks + !!h_part)))
474 "error in decompression of block %dx%d\n",
i, j);
478 if (
s->is_keyframe &&
s->ver == 2) {
486 memcpy(
s->keyframe,
s->frame->data[0],
503 #if CONFIG_FLASHSV_DECODER
518 #if CONFIG_FLASHSV2_DECODER
519 static const uint32_t ff_flashsv2_default_palette[128] = {
520 0x000000, 0x333333, 0x666666, 0x999999, 0xCCCCCC, 0xFFFFFF,
521 0x330000, 0x660000, 0x990000, 0xCC0000, 0xFF0000, 0x003300,
522 0x006600, 0x009900, 0x00CC00, 0x00FF00, 0x000033, 0x000066,
523 0x000099, 0x0000CC, 0x0000FF, 0x333300, 0x666600, 0x999900,
524 0xCCCC00, 0xFFFF00, 0x003333, 0x006666, 0x009999, 0x00CCCC,
525 0x00FFFF, 0x330033, 0x660066, 0x990099, 0xCC00CC, 0xFF00FF,
526 0xFFFF33, 0xFFFF66, 0xFFFF99, 0xFFFFCC, 0xFF33FF, 0xFF66FF,
527 0xFF99FF, 0xFFCCFF, 0x33FFFF, 0x66FFFF, 0x99FFFF, 0xCCFFFF,
528 0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCFF, 0xCC33CC, 0xCC66CC,
529 0xCC99CC, 0xCCFFCC, 0x33CCCC, 0x66CCCC, 0x99CCCC, 0xFFCCCC,
530 0x999933, 0x999966, 0x9999CC, 0x9999FF, 0x993399, 0x996699,
531 0x99CC99, 0x99FF99, 0x339999, 0x669999, 0xCC9999, 0xFF9999,
532 0x666633, 0x666699, 0x6666CC, 0x6666FF, 0x663366, 0x669966,
533 0x66CC66, 0x66FF66, 0x336666, 0x996666, 0xCC6666, 0xFF6666,
534 0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336633, 0x339933,
535 0x33CC33, 0x33FF33, 0x663333, 0x993333, 0xCC3333, 0xFF3333,
536 0x003366, 0x336600, 0x660033, 0x006633, 0x330066, 0x663300,
537 0x336699, 0x669933, 0x993366, 0x339966, 0x663399, 0x996633,
538 0x6699CC, 0x99CC66, 0xCC6699, 0x66CC99, 0x9966CC, 0xCC9966,
539 0x99CCFF, 0xCCFF99, 0xFF99CC, 0x99FFCC, 0xCC99FF, 0xFFCC99,
540 0x111111, 0x222222, 0x444444, 0x555555, 0xAAAAAA, 0xBBBBBB,
552 s->pal = ff_flashsv2_default_palette;
563 s->keyframedata =
NULL;
572 .
p.
name =
"flashsv2",
577 .
init = flashsv2_decode_init,
578 .close = flashsv2_decode_end,