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
114 #ifndef FLASHSV2_DUMB
145 for (col = 0; col <
s->cols; col++) {
146 for (row = 0; row <
s->rows; row++) {
147 b = blocks + (col + row *
s->cols);
148 b->width = (col <
s->cols - 1) ?
150 s->image_width - col *
s->block_width;
152 b->height = (row < s->rows - 1) ?
154 s->image_height - row *
s->block_height;
160 encbuf +=
b->width *
b->height * 3;
161 databuf += !databuf ? 0 :
b->width *
b->height * 6;
168 #ifndef FLASHSV2_DUMB
169 s->diff_blocks = 0.1;
173 s->raw_size =
s->comp_size =
s->uncomp_size = 10;
186 if (
s->comp < 0 ||
s->comp > 9) {
188 "Compression level should be 0-9, not %d\n",
s->comp);
193 if ((avctx->
width > 4095) || (avctx->
height > 4095)) {
195 "Input dimensions too large, input must be max 4095x4095 !\n");
200 "Input dimensions too small, input must be at least 16x16 !\n");
208 s->last_key_frame = 0;
210 s->image_width = avctx->
width;
211 s->image_height = avctx->
height;
213 s->block_width = (
s->image_width / 12) & ~15;
214 s->block_height = (
s->image_height / 12) & ~15;
221 s->rows = (
s->image_height +
s->block_height - 1) /
s->block_height;
222 s->cols = (
s->image_width +
s->block_width - 1) /
s->block_width;
224 s->frame_size =
s->image_width *
s->image_height * 3;
225 s->blocks_size =
s->rows *
s->cols *
sizeof(
Block);
234 if (!
s->encbuffer || !
s->keybuffer || !
s->databuffer
235 || !
s->current_frame || !
s->key_frame || !
s->key_blocks
236 || !
s->frame_blocks) {
242 s->blockbuffer =
NULL;
243 s->blockbuffer_size = 0;
248 #ifndef FLASHSV2_DUMB
252 s->use_custom_palette = 0;
253 s->palette_type = -1;
261 memcpy(
s->key_blocks,
s->frame_blocks,
s->blocks_size);
262 memcpy(
s->key_frame,
s->current_frame,
s->frame_size);
264 for (
i = 0;
i <
s->rows *
s->cols;
i++) {
265 s->key_blocks[
i].enc += (
s->keybuffer -
s->encbuffer);
266 s->key_blocks[
i].sl_begin = 0;
267 s->key_blocks[
i].sl_end = 0;
268 s->key_blocks[
i].data = 0;
270 memcpy(
s->keybuffer,
s->encbuffer,
s->frame_size);
291 put_bits(&pb, 4, (
s->block_width >> 4) - 1);
293 put_bits(&pb, 4, (
s->block_height >> 4) - 1);
299 buf[buf_pos++] =
s->flags;
314 unsigned block_size =
b->data_size;
322 if (buf_size < block_size + 2)
325 buf[buf_pos++] = block_size >> 8;
326 buf[buf_pos++] = block_size;
331 buf[buf_pos++] =
b->flags;
334 buf[buf_pos++] = (
b->start);
335 buf[buf_pos++] = (
b->len);
340 buf[buf_pos++] = (
b->col);
341 buf[buf_pos++] = (
b->row);
344 memcpy(buf + buf_pos,
b->data,
b->data_size);
346 buf_pos +=
b->data_size;
353 int res = compress2(buf, buf_size,
b->sl_begin,
b->sl_end -
b->sl_begin,
comp);
354 return res == Z_OK ? 0 : -1;
358 int *buf_size,
int comp)
365 res = deflateInit(&
s,
comp);
369 s.next_in = prime->
enc;
371 while (
s.avail_in > 0) {
373 s.avail_out = *buf_size;
379 s.next_in =
b->sl_begin;
380 s.avail_in =
b->sl_end -
b->sl_begin;
382 s.avail_out = *buf_size;
385 *buf_size -=
s.avail_out;
386 if (res != Z_STREAM_END)
395 for (
i = 0;
i <
b->start;
i++)
396 memcpy(ptr +
i *
b->width * 3,
src +
i *
stride,
b->width * 3);
397 b->sl_begin = ptr +
i *
b->width * 3;
398 for (;
i <
b->start +
b->len;
i++)
399 memcpy(ptr +
i *
b->width * 3,
src +
i *
stride,
b->width * 3);
400 b->sl_end = ptr +
i *
b->width * 3;
401 for (;
i <
b->height;
i++)
402 memcpy(ptr +
i *
b->width * 3,
src +
i *
stride,
b->width * 3);
403 b->enc_size = ptr +
i *
b->width * 3 -
b->enc;
409 return (
src[0] >> 3) | ((
src[1] & 0xf8) << 2) | ((
src[2] & 0xf8) << 7);
414 #define ABSDIFF(a,b) (abs((int)(a)-(int)(b)))
416 unsigned int t1 = (
c1 & 0x000000ff) + ((
c1 & 0x0000ff00) >> 8) + ((
c1 & 0x00ff0000) >> 16);
417 unsigned int t2 = (
c2 & 0x000000ff) + ((
c2 & 0x0000ff00) >> 8) + ((
c2 & 0x00ff0000) >> 16);
420 ABSDIFF((
c1 & 0x0000ff00) >> 8 , (
c2 & 0x0000ff00) >> 8) +
421 ABSDIFF((
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++)
543 for (;
i <
b->start +
b->len;
i++)
546 for (;
i <
b->height;
i++)
548 b->enc_size = ptr -
b->enc;
554 int dist,
int keyframe)
556 unsigned buf_size =
b->width *
b->height * 6;
567 b->data_size = buf_size;
577 if (buf_size < b->data_size) {
578 b->data_size = buf_size;
579 memcpy(
b->data, buf, buf_size);
592 if (memcmp(
src,
frame,
b->width * 3) != 0) {
595 #ifndef FLASHSV2_DUMB
599 if (memcmp(
src,
key,
b->width * 3) != 0) {
602 b->len = y + 1 -
b->start;
610 int sl, rsl, col,
pos, possl;
612 for (sl =
s->image_height - 1; sl >= 0; sl--) {
613 for (col = 0; col <
s->cols; col++) {
614 rsl =
s->image_height - sl - 1;
615 b =
s->frame_blocks + col + rsl /
s->block_height *
s->cols;
616 possl =
stride * sl + col *
s->block_width * 3;
617 pos =
s->image_width * rsl * 3 + col *
s->block_width * 3;
619 s->key_frame +
pos, rsl %
s->block_height, keyframe);
622 #ifndef FLASHSV2_DUMB
623 s->tot_lines +=
s->image_height *
s->cols;
633 for (row = 0; row <
s->rows; row++) {
634 for (col = 0; col <
s->cols; col++) {
635 b =
s->frame_blocks + (row *
s->cols + col);
636 prev =
s->key_blocks + (row *
s->cols + col);
641 }
else if (!
b->dirty) {
646 }
else if (
b->start != 0 ||
b->len !=
b->height) {
649 data =
s->current_frame +
s->image_width * 3 *
s->block_height * row +
s->block_width * col * 3;
651 #ifndef FLASHSV2_DUMB
654 s->comp_size +=
b->data_size;
655 s->uncomp_size +=
b->enc_size;
661 #ifndef FLASHSV2_DUMB
662 s->raw_size +=
s->image_width *
s->image_height * 3;
663 s->tot_blocks +=
s->rows *
s->cols;
671 int row, col, buf_pos = 0,
len;
673 for (row = 0; row <
s->rows; row++) {
674 for (col = 0; col <
s->cols; col++) {
675 b =
s->frame_blocks + row *
s->cols + col;
677 b->start =
b->len =
b->dirty = 0;
687 uint8_t * buf,
int buf_size,
int keyframe)
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;
719 if (
s->avctx->gop_size > 0) {
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) {
736 #ifndef FLASHSV2_DUMB
737 static const double block_size_fraction = 1.0 / 300;
738 static const double use15_7_threshold = 8192;
739 static const double color15_7_factor = 100;
743 #ifndef FLASHSV2_DUMB
744 double save = (1-pow(
s->diff_lines/
s->diff_blocks/
s->block_height, 0.5)) *
s->comp_size/
s->tot_blocks;
745 double width = block_size_fraction * sqrt(0.5 * save *
s->rows *
s->cols) *
s->image_width;
747 return FFCLIP(pwidth & ~15, 256, 16);
755 #ifndef FLASHSV2_DUMB
756 double save = (1-pow(
s->diff_lines/
s->diff_blocks/
s->block_height, 0.5)) *
s->comp_size/
s->tot_blocks;
757 double height = block_size_fraction * sqrt(0.5 * save *
s->rows *
s->cols) *
s->image_height;
759 return FFCLIP(pheight & ~15, 256, 16);
767 #ifndef FLASHSV2_DUMB
768 double ideal = ((double)(
s->avctx->bit_rate *
s->avctx->time_base.den *
s->avctx->ticks_per_frame)) /
769 ((
double)
s->avctx->time_base.num) *
s->avctx->frame_number;
770 if (ideal + use15_7_threshold < s->total_bits) {
776 return s->avctx->global_quality == 0;
782 #ifndef FLASHSV2_DUMB
784 s->avctx->bit_rate *
s->avctx->time_base.den *
785 s->avctx->ticks_per_frame;
786 int dist = pow((
s->total_bits / ideal) * color15_7_factor, 3);
798 int update_palette = 0;
803 s->rows = (
s->image_height + block_height - 1) / block_height;
804 s->cols = (
s->image_width + block_width - 1) / block_width;
806 if (block_width !=
s->block_width || block_height !=
s->block_height) {
807 s->block_width = block_width;
808 s->block_height = block_height;
809 if (
s->rows *
s->cols >
s->blocks_size /
sizeof(
Block)) {
812 if (!
s->frame_blocks || !
s->key_blocks) {
816 s->blocks_size =
s->rows *
s->cols *
sizeof(
Block);
821 av_fast_malloc(&
s->blockbuffer, &
s->blockbuffer_size, block_width * block_height * 6);
822 if (!
s->blockbuffer) {
830 if ((
s->use_custom_palette &&
s->palette_type != 1) || update_palette) {
836 }
else if (!
s->use_custom_palette &&
s->palette_type != 0) {
852 const AVFrame *p,
int *got_packet)