73                          int h, 
int w, 
int stride, 
const uint32_t *pal)
 
   78     for (y = dx + 
h; y > dx; y--) {
 
   80         for (x = 0; x < 
w; x++) {
 
   85                 unsigned c = 
AV_RB16(sptr) & ~0x8000;
 
   86                 unsigned b =  
c        & 0x1F;
 
   87                 unsigned g = (
c >>  5) & 0x1F;
 
   90                 *dst++ = (
b << 3) | (
b >> 2);
 
   91                 *dst++ = (
g << 3) | (
g >> 2);
 
   92                 *dst++ = (
r << 3) | (
r >> 2);
 
   96                 uint32_t 
c = pal[*sptr++];
 
   97                 bytestream_put_le24(&dst, 
c);
 
  101     return sptr - orig_src;
 
  107     inflateEnd(&
s->zstream);
 
  123     s->zstream.zalloc = Z_NULL;
 
  124     s->zstream.zfree  = Z_NULL;
 
  125     s->zstream.opaque = Z_NULL;
 
  126     zret = inflateInit(&
s->zstream);
 
  153     s->zstream.next_in   = 
src;
 
  154     s->zstream.avail_in  = 
size;
 
  155     s->zstream.next_out  = 
s->tmpblock;
 
  156     s->zstream.avail_out = 
s->block_size * 3;
 
  159     if (deflateInit(&zs, 0) != Z_OK)
 
  161     zs.next_in   = 
s->tmpblock;
 
  162     zs.avail_in  = 
s->block_size * 3 - 
s->zstream.avail_out;
 
  163     zs.next_out  = 
s->deflate_block;
 
  164     zs.avail_out = 
s->deflate_block_size;
 
  168     if ((zret = inflateReset(&
s->zstream)) != Z_OK) {
 
  173     s->zstream.next_in   = 
s->deflate_block;
 
  174     s->zstream.avail_in  = 
s->deflate_block_size - zs.avail_out;
 
  175     s->zstream.next_out  = 
s->tmpblock;
 
  176     s->zstream.avail_out = 
s->block_size * 3;
 
  190     int ret = inflateReset(&
s->zstream);
 
  195     if (
s->zlibprime_curr || 
s->zlibprime_prev) {
 
  197                              s->blocks[blk_idx].pos,
 
  198                              s->blocks[blk_idx].size);
 
  204     s->zstream.next_out  = 
s->tmpblock;
 
  205     s->zstream.avail_out = 
s->block_size * 3;
 
  207     if (
ret == Z_DATA_ERROR) {
 
  209         inflateSync(&
s->zstream);
 
  213     if (
ret != Z_OK && 
ret != Z_STREAM_END) {
 
  217     if (
s->is_keyframe) {
 
  222     y_pos += 
s->diff_start;
 
  224     if (!
s->color_depth) {
 
  227         for (k = 1; k <= 
s->diff_height; k++) {
 
  228             memcpy(
s->frame->data[0] + x_pos * 3 +
 
  229                    (
s->image_height - y_pos - k) * 
s->frame->linesize[0],
 
  238                       s->image_height - (y_pos + 1 + 
s->diff_height),
 
  239                       x_pos, 
s->diff_height, 
width,
 
  240                       s->frame->linesize[0], 
s->pal);
 
  258     if (deflateInit(&
zstream, 0) != Z_OK)
 
  269     int buf_size = avpkt->
size;
 
  271     int h_blocks, v_blocks, h_part, v_part, 
i, j, 
ret;
 
  273     int last_blockwidth = 
s->block_width;
 
  274     int last_blockheight= 
s->block_height;
 
  286     s->block_width  = 16 * (
get_bits(&gb, 4) + 1);
 
  288     s->block_height = 16 * (
get_bits(&gb, 4) + 1);
 
  291     if (   last_blockwidth != 
s->block_width
 
  292         || last_blockheight!= 
s->block_height)
 
  308     h_blocks = 
s->image_width  / 
s->block_width;
 
  309     h_part   = 
s->image_width  % 
s->block_width;
 
  310     v_blocks = 
s->image_height / 
s->block_height;
 
  311     v_part   = 
s->image_height % 
s->block_height;
 
  315     if (
s->block_size < 
s->block_width * 
s->block_height) {
 
  316         int tmpblock_size = 3 * 
s->block_width * 
s->block_height, err;
 
  318         if ((err = 
av_reallocp(&
s->tmpblock, tmpblock_size)) < 0) {
 
  321                    "Cannot allocate decompression buffer.\n");
 
  326             if (
s->deflate_block_size <= 0) {
 
  328                        "Cannot determine deflate buffer size.\n");
 
  331             if ((err = 
av_reallocp(&
s->deflate_block, 
s->deflate_block_size)) < 0) {
 
  338     s->block_size = 
s->block_width * 
s->block_height;
 
  349                "Frame width or height differs from first frame!\n");
 
  357     if (
s->is_keyframe) {
 
  361         memcpy(
s->keyframedata, avpkt->
data, avpkt->
size);
 
  363     if(
s->ver == 2 && !
s->blocks)
 
  364         s->blocks = 
av_mallocz((v_blocks + !!v_part) * (h_blocks + !!h_part) *
 
  365                                sizeof(
s->blocks[0]));
 
  367     ff_dlog(
avctx, 
"image: %dx%d block: %dx%d num: %dx%d part: %dx%d\n",
 
  368             s->image_width, 
s->image_height, 
s->block_width, 
s->block_height,
 
  369             h_blocks, v_blocks, h_part, v_part);
 
  375     for (j = 0; j < v_blocks + (v_part ? 1 : 0); j++) {
 
  377         int y_pos  = j * 
s->block_height; 
 
  378         int cur_blk_height = (j < v_blocks) ? 
s->block_height : v_part;
 
  381         for (
i = 0; 
i < h_blocks + (h_part ? 1 : 0); 
i++) {
 
  382             int x_pos = 
i * 
s->block_width; 
 
  383             int cur_blk_width = (
i < h_blocks) ? 
s->block_width : h_part;
 
  390             s->zlibprime_curr = 0;
 
  391             s->zlibprime_prev = 0;
 
  393             s->diff_height    = cur_blk_height;
 
  400             if (
s->ver == 2 && 
size) {
 
  407                 if (
s->color_depth != 0 && 
s->color_depth != 2) {
 
  409                            "%dx%d invalid color depth %d\n",
 
  410                            i, j, 
s->color_depth);
 
  421                                "Inter frame without keyframe\n");
 
  426                     if (
s->diff_start + 
s->diff_height > cur_blk_height) {
 
  428                                "Block parameters invalid: %d + %d > %d\n",
 
  429                                s->diff_start, 
s->diff_height, cur_blk_height);
 
  433                            "%dx%d diff start %d height %d\n",
 
  434                            i, j, 
s->diff_start, 
s->diff_height);
 
  438                 if (
s->zlibprime_prev)
 
  441                 if (
s->zlibprime_curr) {
 
  454                 if (!
s->blocks && (
s->zlibprime_curr || 
s->zlibprime_prev)) {
 
  456                            "no data available for zlib priming\n");
 
  464                 int off = (
s->image_height - y_pos - 1) * 
s->frame->linesize[0];
 
  466                 for (k = 0; k < cur_blk_height; k++) {
 
  467                     int x = off - k * 
s->frame->linesize[0] + x_pos * 3;
 
  468                     memcpy(
s->frame->data[0] + x, 
s->keyframe + x,
 
  476                                          cur_blk_width, cur_blk_height,
 
  478                                          i + j * (h_blocks + !!h_part)))
 
  480                            "error in decompression of block %dx%d\n", 
i, j);
 
  484     if (
s->is_keyframe && 
s->ver == 2) {
 
  492         memcpy(
s->keyframe, 
s->frame->data[0],
 
  509 #if CONFIG_FLASHSV_DECODER 
  525 #if CONFIG_FLASHSV2_DECODER 
  526 static const uint32_t ff_flashsv2_default_palette[128] = {
 
  527     0x000000, 0x333333, 0x666666, 0x999999, 0xCCCCCC, 0xFFFFFF,
 
  528     0x330000, 0x660000, 0x990000, 0xCC0000, 0xFF0000, 0x003300,
 
  529     0x006600, 0x009900, 0x00CC00, 0x00FF00, 0x000033, 0x000066,
 
  530     0x000099, 0x0000CC, 0x0000FF, 0x333300, 0x666600, 0x999900,
 
  531     0xCCCC00, 0xFFFF00, 0x003333, 0x006666, 0x009999, 0x00CCCC,
 
  532     0x00FFFF, 0x330033, 0x660066, 0x990099, 0xCC00CC, 0xFF00FF,
 
  533     0xFFFF33, 0xFFFF66, 0xFFFF99, 0xFFFFCC, 0xFF33FF, 0xFF66FF,
 
  534     0xFF99FF, 0xFFCCFF, 0x33FFFF, 0x66FFFF, 0x99FFFF, 0xCCFFFF,
 
  535     0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCFF, 0xCC33CC, 0xCC66CC,
 
  536     0xCC99CC, 0xCCFFCC, 0x33CCCC, 0x66CCCC, 0x99CCCC, 0xFFCCCC,
 
  537     0x999933, 0x999966, 0x9999CC, 0x9999FF, 0x993399, 0x996699,
 
  538     0x99CC99, 0x99FF99, 0x339999, 0x669999, 0xCC9999, 0xFF9999,
 
  539     0x666633, 0x666699, 0x6666CC, 0x6666FF, 0x663366, 0x669966,
 
  540     0x66CC66, 0x66FF66, 0x336666, 0x996666, 0xCC6666, 0xFF6666,
 
  541     0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336633, 0x339933,
 
  542     0x33CC33, 0x33FF33, 0x663333, 0x993333, 0xCC3333, 0xFF3333,
 
  543     0x003366, 0x336600, 0x660033, 0x006633, 0x330066, 0x663300,
 
  544     0x336699, 0x669933, 0x993366, 0x339966, 0x663399, 0x996633,
 
  545     0x6699CC, 0x99CC66, 0xCC6699, 0x66CC99, 0x9966CC, 0xCC9966,
 
  546     0x99CCFF, 0xCCFF99, 0xFF99CC, 0x99FFCC, 0xCC99FF, 0xFFCC99,
 
  547     0x111111, 0x222222, 0x444444, 0x555555, 0xAAAAAA, 0xBBBBBB,
 
  559     s->pal = ff_flashsv2_default_palette;
 
  584     .
init           = flashsv2_decode_init,
 
  585     .close          = flashsv2_decode_end,