36#include "config_components.h"
73 uint8_t
tmp[UINT16_MAX];
76static 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;
210 int ret = inflateReset(
zstream);
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;
322 if (
s->block_size <
s->block_width *
s->block_height) {
323 int tmpblock_size = 3 *
s->block_width *
s->block_height, err;
325 if ((err =
av_reallocp(&
s->tmpblock, tmpblock_size)) < 0) {
328 "Cannot allocate decompression buffer.\n");
332 s->block_size =
s->block_width *
s->block_height;
343 "Frame width or height differs from first frame!\n");
351 if (
s->is_keyframe) {
355 s->keyframedata = avpkt->
data;
357 memset(
s->blocks, 0, (v_blocks + !!v_part) * (h_blocks + !!h_part) *
358 sizeof(
s->blocks[0]));
360 if(
s->ver == 2 && !
s->blocks)
361 s->blocks =
av_mallocz((v_blocks + !!v_part) * (h_blocks + !!h_part) *
362 sizeof(
s->blocks[0]));
364 ff_dlog(
avctx,
"image: %dx%d block: %dx%d num: %dx%d part: %dx%d\n",
365 s->image_width,
s->image_height,
s->block_width,
s->block_height,
366 h_blocks, v_blocks, h_part, v_part);
372 for (j = 0; j < v_blocks + (v_part ? 1 : 0); j++) {
374 int y_pos = j *
s->block_height;
375 int cur_blk_height = (j < v_blocks) ?
s->block_height : v_part;
378 for (
i = 0;
i < h_blocks + (h_part ? 1 : 0);
i++) {
379 int x_pos =
i *
s->block_width;
380 int cur_blk_width = (
i < h_blocks) ?
s->block_width : h_part;
387 s->zlibprime_curr = 0;
388 s->zlibprime_prev = 0;
390 s->diff_height = cur_blk_height;
397 if (
s->ver == 2 &&
size) {
404 if (
s->color_depth != 0 &&
s->color_depth != 2) {
406 "%dx%d invalid color depth %d\n",
407 i, j,
s->color_depth);
418 "Inter frame without keyframe\n");
423 if (
s->diff_start +
s->diff_height > cur_blk_height) {
425 "Block parameters invalid: %d + %d > %d\n",
426 s->diff_start,
s->diff_height, cur_blk_height);
430 "%dx%d diff start %d height %d\n",
431 i, j,
s->diff_start,
s->diff_height);
435 if (
s->zlibprime_prev)
438 if (
s->zlibprime_curr) {
451 if (!
s->blocks && (
s->zlibprime_curr ||
s->zlibprime_prev)) {
453 "no data available for zlib priming\n");
461 int off = (
s->image_height - y_pos - 1) *
s->frame->linesize[0];
463 for (k = 0; k < cur_blk_height; k++) {
464 int x = off - k *
s->frame->linesize[0] + x_pos * 3;
465 memcpy(
s->frame->data[0] + x,
s->keyframe + x,
473 cur_blk_width, cur_blk_height,
475 i + j * (h_blocks + !!h_part)))
477 "error in decompression of block %dx%d\n",
i, j);
481 if (
s->is_keyframe &&
s->ver == 2) {
489 memcpy(
s->keyframe,
s->frame->data[0],
506#if CONFIG_FLASHSV_DECODER
521#if CONFIG_FLASHSV2_DECODER
522static const uint32_t ff_flashsv2_default_palette[128] = {
523 0x000000, 0x333333, 0x666666, 0x999999, 0xCCCCCC, 0xFFFFFF,
524 0x330000, 0x660000, 0x990000, 0xCC0000, 0xFF0000, 0x003300,
525 0x006600, 0x009900, 0x00CC00, 0x00FF00, 0x000033, 0x000066,
526 0x000099, 0x0000CC, 0x0000FF, 0x333300, 0x666600, 0x999900,
527 0xCCCC00, 0xFFFF00, 0x003333, 0x006666, 0x009999, 0x00CCCC,
528 0x00FFFF, 0x330033, 0x660066, 0x990099, 0xCC00CC, 0xFF00FF,
529 0xFFFF33, 0xFFFF66, 0xFFFF99, 0xFFFFCC, 0xFF33FF, 0xFF66FF,
530 0xFF99FF, 0xFFCCFF, 0x33FFFF, 0x66FFFF, 0x99FFFF, 0xCCFFFF,
531 0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCFF, 0xCC33CC, 0xCC66CC,
532 0xCC99CC, 0xCCFFCC, 0x33CCCC, 0x66CCCC, 0x99CCCC, 0xFFCCCC,
533 0x999933, 0x999966, 0x9999CC, 0x9999FF, 0x993399, 0x996699,
534 0x99CC99, 0x99FF99, 0x339999, 0x669999, 0xCC9999, 0xFF9999,
535 0x666633, 0x666699, 0x6666CC, 0x6666FF, 0x663366, 0x669966,
536 0x66CC66, 0x66FF66, 0x336666, 0x996666, 0xCC6666, 0xFF6666,
537 0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336633, 0x339933,
538 0x33CC33, 0x33FF33, 0x663333, 0x993333, 0xCC3333, 0xFF3333,
539 0x003366, 0x336600, 0x660033, 0x006633, 0x330066, 0x663300,
540 0x336699, 0x669933, 0x993366, 0x339966, 0x663399, 0x996633,
541 0x6699CC, 0x99CC66, 0xCC6699, 0x66CC99, 0x9966CC, 0xCC9966,
542 0x99CCFF, 0xCCFF99, 0xFF99CC, 0x99FFCC, 0xCC99FF, 0xFFCC99,
543 0x111111, 0x222222, 0x444444, 0x555555, 0xAAAAAA, 0xBBBBBB,
555 s->pal = ff_flashsv2_default_palette;
566 s->keyframedata =
NULL;
575 .p.name =
"flashsv2",
580 .
init = flashsv2_decode_init,
581 .
close = flashsv2_decode_end,
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_flashsv2_decoder
const FFCodec ff_flashsv_decoder
static av_cold void close(AVCodecParserContext *s)
Libavcodec external API header.
#define i(width, name, range_min, range_max)
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
int ff_set_dimensions(AVCodecContext *s, int width, int height)
int(* init)(AVBSFContext *ctx)
static int flashsv2_prime(FlashSVContext *s, const uint8_t *src, int size)
static av_cold int flashsv_decode_end(AVCodecContext *avctx)
static av_cold int flashsv_decode_init(AVCodecContext *avctx)
static int flashsv_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, AVPacket *avpkt)
static int flashsv_decode_block(AVCodecContext *avctx, const AVPacket *avpkt, GetBitContext *gb, int block_size, int width, int height, int x_pos, int y_pos, int blk_idx)
static int decode_hybrid(const uint8_t *sptr, const uint8_t *sptr_end, uint8_t *dptr, int dx, int dy, int h, int w, int stride, const uint32_t *pal)
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static int get_bits_count(const GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Memory handling functions.
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
static const uint8_t header[24]
A reference to a data buffer.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
int flags
A combination of AV_PKT_FLAG values.
AVBufferRef * keyframedata_buf
const uint8_t * keyframedata
#define avpriv_request_sample(...)
static void inflate(uint8_t *dst, const uint8_t *p1, int width, int threshold, const uint8_t *coordinates[], int coord, int maxc)
void ff_inflate_end(FFZStream *zstream)
Wrapper around inflateEnd().
int ff_inflate_init(FFZStream *zstream, void *logctx)
Wrapper around inflateInit().