55 #define HAS_IFRAME_IMAGE 0x02
56 #define HAS_PALLET_INFO 0x01
58 #define COLORSPACE_BGR 0x00
59 #define COLORSPACE_15_7 0x10
60 #define HAS_DIFF_BLOCKS 0x04
61 #define ZLIB_PRIME_COMPRESS_CURRENT 0x02
62 #define ZLIB_PRIME_COMPRESS_PREVIOUS 0x01
115 #ifndef FLASHSV2_DUMB
146 for (col = 0; col < s->
cols; col++) {
147 for (row = 0; row < s->
rows; row++) {
148 b = blocks + (col + row * s->
cols);
153 b->
height = (row < s->rows - 1) ?
162 databuf += !databuf ? 0 : b->
width * b->
height * 6;
169 #ifndef FLASHSV2_DUMB
170 s->diff_blocks = 0.1;
174 s->raw_size = s->comp_size = s->uncomp_size = 10;
189 "Compression level should be 0-9, not %d\n", s->
comp);
194 if ((avctx->
width > 4095) || (avctx->
height > 4095)) {
196 "Input dimensions too large, input must be max 4096x4096 !\n");
201 "Input dimensions too small, input must be at least 16x16 !\n");
242 #ifndef FLASHSV2_DUMB
266 for (i = 0; i < s->
rows * s->
cols; i++) {
301 buf[buf_pos++] = s->
flags;
324 if (buf_size < block_size + 2)
327 buf[buf_pos++] = block_size >> 8;
328 buf[buf_pos++] = block_size;
333 buf[buf_pos++] = b->
flags;
336 buf[buf_pos++] = (b->
start);
337 buf[buf_pos++] = (b->
len);
342 buf[buf_pos++] = (b->
col);
343 buf[buf_pos++] = (b->
row);
356 return res == Z_OK ? 0 : -1;
360 int *buf_size,
int comp)
367 res = deflateInit(&s, comp);
371 s.next_in = prime->
enc;
373 while (s.avail_in > 0) {
375 s.avail_out = *buf_size;
376 res = deflate(&s, Z_SYNC_FLUSH);
384 s.avail_out = *buf_size;
385 res = deflate(&s, Z_FINISH);
387 *buf_size -= s.avail_out;
388 if (res != Z_STREAM_END)
397 for (i = 0; i < b->
start; i++)
398 memcpy(ptr + i * b->
width * 3, src + i * stride, b->
width * 3);
401 memcpy(ptr + i * b->
width * 3, src + i * stride, b->
width * 3);
403 for (; i < b->
height; i++)
404 memcpy(ptr + i * b->
width * 3, src + i * stride, b->
width * 3);
411 return (src[0] >> 3) | ((src[1] & 0xf8) << 2) | ((src[2] & 0xf8) << 7);
416 unsigned int t1 = (c1 & 0x000000ff) + ((c1 & 0x0000ff00) >> 8) + ((c1 & 0x00ff0000) >> 16);
417 unsigned int t2 = (c2 & 0x000000ff) + ((c2 & 0x0000ff00) >> 8) + ((c2 & 0x00ff0000) >> 16);
419 return abs(t1 - t2) + abs((c1 & 0x000000ff) - (c2 & 0x000000ff)) +
420 abs(((c1 & 0x0000ff00) >> 8) - ((c2 & 0x0000ff00) >> 8)) +
421 abs(((c1 & 0x00ff0000) >> 16) - ((c2 & 0x00ff0000) >> 16));
426 return palette->
index[c15];
431 int i,
min = 0x7fffffff;
433 for (i = 0; i < 128; i++) {
446 return (src[0]) | (src[1] << 8) | (src[2] << 16);
457 if (dist + d15 >= d7) {
461 dest[0] = 0x80 | (c15 >> 8);
462 dest[1] = c15 & 0xff;
470 unsigned int bgr, c15,
index;
471 for (r = 4; r < 256; r += 8) {
472 for (g = 4; g < 256; g += 8) {
473 for (b = 4; b < 256; b += 8) {
474 bgr = b | (g << 8) | (r << 16);
475 c15 = (b >> 3) | ((g & 0xf8) << 2) | ((r & 0xf8) << 7);
486 0x00000000, 0x00333333, 0x00666666, 0x00999999, 0x00CCCCCC, 0x00FFFFFF,
487 0x00330000, 0x00660000, 0x00990000, 0x00CC0000, 0x00FF0000, 0x00003300,
488 0x00006600, 0x00009900, 0x0000CC00, 0x0000FF00, 0x00000033, 0x00000066,
489 0x00000099, 0x000000CC, 0x000000FF, 0x00333300, 0x00666600, 0x00999900,
490 0x00CCCC00, 0x00FFFF00, 0x00003333, 0x00006666, 0x00009999, 0x0000CCCC,
491 0x0000FFFF, 0x00330033, 0x00660066, 0x00990099, 0x00CC00CC, 0x00FF00FF,
492 0x00FFFF33, 0x00FFFF66, 0x00FFFF99, 0x00FFFFCC, 0x00FF33FF, 0x00FF66FF,
493 0x00FF99FF, 0x00FFCCFF, 0x0033FFFF, 0x0066FFFF, 0x0099FFFF, 0x00CCFFFF,
494 0x00CCCC33, 0x00CCCC66, 0x00CCCC99, 0x00CCCCFF, 0x00CC33CC, 0x00CC66CC,
495 0x00CC99CC, 0x00CCFFCC, 0x0033CCCC, 0x0066CCCC, 0x0099CCCC, 0x00FFCCCC,
496 0x00999933, 0x00999966, 0x009999CC, 0x009999FF, 0x00993399, 0x00996699,
497 0x0099CC99, 0x0099FF99, 0x00339999, 0x00669999, 0x00CC9999, 0x00FF9999,
498 0x00666633, 0x00666699, 0x006666CC, 0x006666FF, 0x00663366, 0x00669966,
499 0x0066CC66, 0x0066FF66, 0x00336666, 0x00996666, 0x00CC6666, 0x00FF6666,
500 0x00333366, 0x00333399, 0x003333CC, 0x003333FF, 0x00336633, 0x00339933,
501 0x0033CC33, 0x0033FF33, 0x00663333, 0x00993333, 0x00CC3333, 0x00FF3333,
502 0x00003366, 0x00336600, 0x00660033, 0x00006633, 0x00330066, 0x00663300,
503 0x00336699, 0x00669933, 0x00993366, 0x00339966, 0x00663399, 0x00996633,
504 0x006699CC, 0x0099CC66, 0x00CC6699, 0x0066CC99, 0x009966CC, 0x00CC9966,
505 0x0099CCFF, 0x00CCFF99, 0x00FF99CC, 0x0099FFCC, 0x00CC99FF, 0x00FFCC99,
506 0x00111111, 0x00222222, 0x00444444, 0x00555555, 0x00AAAAAA, 0x00BBBBBB,
507 0x00DDDDDD, 0x00EEEEEE
529 for (x = 0; x <
width; x++) {
540 for (i = 0; i < b->
start; i++)
546 for (; i < b->
height; i++)
554 int dist,
int keyframe)
577 if (buf_size < b->data_size) {
579 memcpy(b->
data, buf, buf_size);
592 if (memcmp(src, frame, b->
width * 3) != 0) {
594 memcpy(frame, src, b->
width * 3);
595 #ifndef FLASHSV2_DUMB
599 if (memcmp(src, key, b->
width * 3) != 0) {
610 int sl, rsl, col, pos, possl;
613 for (col = 0; col < s->
cols; col++) {
622 #ifndef FLASHSV2_DUMB
633 for (row = 0; row < s->
rows; row++) {
634 for (col = 0; col < s->
cols; col++) {
641 }
else if (!b->
dirty) {
651 #ifndef FLASHSV2_DUMB
661 #ifndef FLASHSV2_DUMB
671 int row, col, buf_pos = 0,
len;
673 for (row = 0; row < s->
rows; row++) {
674 for (col = 0; col < s->
cols; col++) {
708 #ifndef FLASHSV2_DUMB
709 s->total_bits += ((double) buf_pos) * 8.0;
717 #ifndef FLASHSV2_DUMB
718 double block_ratio, line_ratio, enc_ratio, comp_ratio, data_ratio;
720 block_ratio = s->diff_blocks / s->tot_blocks;
721 line_ratio = s->diff_lines / s->tot_lines;
722 enc_ratio = s->uncomp_size / s->raw_size;
723 comp_ratio = s->comp_size / s->uncomp_size;
724 data_ratio = s->comp_size / s->raw_size;
726 if ((block_ratio >= 0.5 && line_ratio / block_ratio <= 0.5) || line_ratio >= 0.95) {
739 #ifndef FLASHSV2_DUMB
740 double save = (1-pow(s->diff_lines/s->diff_blocks/s->
block_height, 0.5)) * s->comp_size/s->tot_blocks;
742 int pwidth = ((int)
width);
743 return FFCLIP(pwidth & ~15, 256, 16);
751 #ifndef FLASHSV2_DUMB
752 double save = (1-pow(s->diff_lines/s->diff_blocks/s->
block_height, 0.5)) * s->comp_size/s->tot_blocks;
754 int pheight = ((int)
height);
755 return FFCLIP(pheight & ~15, 256, 16);
765 #ifndef FLASHSV2_DUMB
768 if (ideal + use15_7_threshold < s->total_bits) {
782 #ifndef FLASHSV2_DUMB
798 int update_palette = 0;
852 const AVFrame *pict,
int *got_packet)