73 static int decode_hybrid(
const uint8_t *sptr, uint8_t *dptr,
int dx,
int dy,
74 int h,
int w,
int stride,
const uint32_t *pal)
77 const uint8_t *orig_src = sptr;
79 for (y = dx+h; y > dx; y--) {
80 uint8_t *dst = dptr + (y *
stride) + dy * 3;
81 for (x = 0; x < w; x++) {
84 unsigned c =
AV_RB16(sptr) & ~0x8000;
85 unsigned b = c & 0x1F;
86 unsigned g = (c >> 5) & 0x1F;
89 *dst++ = (b << 3) | (b >> 2);
90 *dst++ = (g << 3) | (g >> 2);
91 *dst++ = (r << 3) | (r >> 2);
95 uint32_t c = pal[*sptr++];
96 bytestream_put_le24(&dst, c);
100 return sptr - orig_src;
112 zret = inflateInit(&s->
zstream);
125 int size,
int unp_size)
137 inflate(&s->
zstream, Z_SYNC_FLUSH);
144 deflate(&zs, Z_SYNC_FLUSH);
153 inflate(&s->
zstream, Z_SYNC_FLUSH);
164 int ret = inflateReset(&s->
zstream);
176 ret = inflate(&s->
zstream, Z_FINISH);
177 if (ret == Z_DATA_ERROR) {
180 ret = inflate(&s->
zstream, Z_FINISH);
183 if (ret != Z_OK && ret != Z_STREAM_END) {
218 zstream.zalloc = Z_NULL;
219 zstream.zfree = Z_NULL;
220 zstream.opaque = Z_NULL;
221 if (deflateInit(&zstream, 0) != Z_OK)
223 size = deflateBound(&zstream, tmpblock_size);
224 deflateEnd(&zstream);
232 int buf_size = avpkt->
size;
234 int h_blocks, v_blocks, h_part, v_part, i, j;
303 "Frame width or height differs from first frame!\n");
315 (v_blocks + !!v_part) * (h_blocks + !!h_part)
319 av_dlog(avctx,
"image: %dx%d block: %dx%d num: %dx%d part: %dx%d\n",
321 h_blocks, v_blocks, h_part, v_part);
333 for (j = 0; j < v_blocks + (v_part ? 1 : 0); j++) {
336 int cur_blk_height = (j < v_blocks) ? s->
block_height : v_part;
339 for (i = 0; i < h_blocks + (h_part ? 1 : 0); i++) {
341 int cur_blk_width = (i < h_blocks) ? s->
block_width : h_part;
368 "%dx%d invalid color depth %d\n", i, j, s->
color_depth);
375 "inter frame without keyframe\n");
382 "Block parameters invalid: %d + %d > %d\n",
387 "%dx%d diff start %d height %d\n",
415 for (k = 0; k < cur_blk_height; k++)
424 cur_blk_width, cur_blk_height,
426 i + j * (h_blocks + !!h_part)))
428 "error in decompression of block %dx%d\n", i, j);
470 #if CONFIG_FLASHSV_DECODER
485 #if CONFIG_FLASHSV2_DECODER
486 static const uint32_t ff_flashsv2_default_palette[128] = {
487 0x000000, 0x333333, 0x666666, 0x999999, 0xCCCCCC, 0xFFFFFF,
488 0x330000, 0x660000, 0x990000, 0xCC0000, 0xFF0000, 0x003300,
489 0x006600, 0x009900, 0x00CC00, 0x00FF00, 0x000033, 0x000066,
490 0x000099, 0x0000CC, 0x0000FF, 0x333300, 0x666600, 0x999900,
491 0xCCCC00, 0xFFFF00, 0x003333, 0x006666, 0x009999, 0x00CCCC,
492 0x00FFFF, 0x330033, 0x660066, 0x990099, 0xCC00CC, 0xFF00FF,
493 0xFFFF33, 0xFFFF66, 0xFFFF99, 0xFFFFCC, 0xFF33FF, 0xFF66FF,
494 0xFF99FF, 0xFFCCFF, 0x33FFFF, 0x66FFFF, 0x99FFFF, 0xCCFFFF,
495 0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCFF, 0xCC33CC, 0xCC66CC,
496 0xCC99CC, 0xCCFFCC, 0x33CCCC, 0x66CCCC, 0x99CCCC, 0xFFCCCC,
497 0x999933, 0x999966, 0x9999CC, 0x9999FF, 0x993399, 0x996699,
498 0x99CC99, 0x99FF99, 0x339999, 0x669999, 0xCC9999, 0xFF9999,
499 0x666633, 0x666699, 0x6666CC, 0x6666FF, 0x663366, 0x669966,
500 0x66CC66, 0x66FF66, 0x336666, 0x996666, 0xCC6666, 0xFF6666,
501 0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336633, 0x339933,
502 0x33CC33, 0x33FF33, 0x663333, 0x993333, 0xCC3333, 0xFF3333,
503 0x003366, 0x336600, 0x660033, 0x006633, 0x330066, 0x663300,
504 0x336699, 0x669933, 0x993366, 0x339966, 0x663399, 0x996633,
505 0x6699CC, 0x99CC66, 0xCC6699, 0x66CC99, 0x9966CC, 0xCC9966,
506 0x99CCFF, 0xCCFF99, 0xFF99CC, 0x99FFCC, 0xCC99FF, 0xFFCC99,
507 0x111111, 0x222222, 0x444444, 0x555555, 0xAAAAAA, 0xBBBBBB,
515 s->
pal = ff_flashsv2_default_palette;
534 AVCodec ff_flashsv2_decoder = {
539 .
init = flashsv2_decode_init,
540 .
close = flashsv2_decode_end,
enum PixelFormat pix_fmt
Pixel format, see PIX_FMT_xxx.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
AV_WL32 AV_WL24 AV_WL16 AV_WB32 AV_WB24 AV_RB16
#define FF_BUFFER_HINTS_VALID
int buffer_hints
codec suggestion on buffer type if != 0
void(* release_buffer)(struct AVCodecContext *c, AVFrame *pic)
Called to release buffers which were allocated with get_buffer.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static void skip_bits_long(GetBitContext *s, int n)
void * av_realloc(void *ptr, size_t size)
Allocate or reallocate a block of memory.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
int(* reget_buffer)(struct AVCodecContext *c, AVFrame *pic)
Called at the beginning of a frame to get cr buffer for it.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
static av_cold int flashsv_decode_end(AVCodecContext *avctx)
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
static int get_bits_count(const GetBitContext *s)
bitstream reader API header.
static int init(AVCodecParserContext *s)
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static int decode_hybrid(const uint8_t *sptr, uint8_t *dptr, int dx, int dy, int h, int w, int stride, const uint32_t *pal)
static int get_bits_left(GetBitContext *gb)
static av_cold int flashsv_decode_init(AVCodecContext *avctx)
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
int reference
is this picture used as reference The values for this are the same as the MpegEncContext.picture_structure variable, that is 1->top field, 2->bottom field, 3->frame/both fields.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation.
int flags
A combination of AV_PKT_FLAG values.
int width
picture width / height.
struct AVFrame AVFrame
Audio Video Frame.
struct FlashSVContext FlashSVContext
static int flashsv_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
#define av_dlog(pctx,...)
av_dlog macros Useful to print debug messages that shouldn't get compiled in normally.
#define FF_BUFFER_HINTS_REUSABLE
#define AVERROR_PATCHWELCOME
Not yet implemented in Libav, patches welcome.
int linesize[AV_NUM_DATA_POINTERS]
Size, in bytes, of the data for each picture/channel plane.
main external API structure.
static void close(AVCodecParserContext *s)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static unsigned int get_bits1(GetBitContext *s)
static int calc_deflate_block_size(int tmpblock_size)
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
#define FF_BUFFER_HINTS_PRESERVE
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static void flashsv2_prime(FlashSVContext *s, uint8_t *src, int size, int unp_size)
packed RGB 8:8:8, 24bpp, BGRBGR...
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static int flashsv_decode_block(AVCodecContext *avctx, AVPacket *avpkt, GetBitContext *gb, int block_size, int width, int height, int x_pos, int y_pos, int blk_idx)
void av_log_missing_feature(void *avc, const char *feature, int want_sample)
Log a generic warning message about a missing feature.
struct BlockInfo BlockInfo