51 for (
i = 0;
i < 3; ++
i)
59 for (
i = 0;
i < 3; ++
i) {
96 unsigned char *
dst,
int dst_size)
99 unsigned char huff_code_table[15];
100 unsigned char *dst_cur =
dst;
101 unsigned char *dst_end =
dst + dst_size;
102 const unsigned char *src_end =
src + src_size;
104 memcpy(huff_code_table,
src, 15);
107 while (
src < src_end) {
109 if ((huff_code >> 4) == 15) {
112 *dst_cur++ =
b | (huff_code >> 4);
114 *dst_cur++ = huff_code_table[huff_code >> 4];
115 if (dst_cur >= dst_end)
119 if (huff_code == 15) {
122 *dst_cur++ = huff_code_table[huff_code];
123 if (dst_cur >= dst_end)
127 return dst_cur -
dst;
131 unsigned char *
dst,
int dst_size)
135 unsigned char *dst_end =
dst + dst_size, *dst_start =
dst;
136 const unsigned char *src_end =
src + src_size;
138 while (
src < src_end &&
dst < dst_end) {
140 for (
i = 0;
i < 8 &&
src < src_end &&
dst < dst_end; ++
i) {
141 if (
code & (1 <<
i)) {
149 sz = (cmd & 0xF) + 2;
162 if (dst_end -
dst > dst_size - dst_size/10)
169 unsigned char *
dst,
int dst_size)
172 unsigned char *dst_end =
dst + dst_size;
173 const unsigned char *src_end =
src + src_size;
175 while (
src + 1 < src_end &&
dst < dst_end) {
192 if (dst_end -
dst > dst_size - dst_size/10)
201 const uint8_t *buf = avpkt->
data;
202 int buf_size = avpkt->
size;
204 int i, y, palette_type, palette_colors_count,
205 bitmap_frame_type, bitmap_frame_size, res = 0;
207 palette_type = buf[0];
208 palette_colors_count =
AV_RL16(buf + 1);
209 bitmap_frame_type = buf[3];
212 bitmap_frame_size = buf_size - 4;
215 if (bitmap_frame_size < palette_colors_count * (3 + (palette_type != 0)))
217 if (palette_type == 0) {
218 if (palette_colors_count > 256)
220 for (
i = 0;
i < palette_colors_count; ++
i) {
221 cin->
palette[
i] = 0xFFU << 24 | bytestream_get_le24(&buf);
222 bitmap_frame_size -= 3;
225 for (
i = 0;
i < palette_colors_count; ++
i) {
228 bitmap_frame_size -= 4;
234 switch (bitmap_frame_type) {
325 .p.name =
"dsicinvideo",
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_dsicinvideo_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.
static av_cold void destroy_buffers(CinVideoContext *cin)
static int cinvideo_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, AVPacket *avpkt)
static int cin_decode_lzss(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
static int cin_decode_huffman(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
static av_cold int allocate_buffers(CinVideoContext *cin)
static void cin_apply_delta_data(const unsigned char *src, unsigned char *dst, int size)
static av_cold int cinvideo_decode_end(AVCodecContext *avctx)
static av_cold int cinvideo_decode_init(AVCodecContext *avctx)
static int cin_decode_rle(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
int(* init)(AVBSFContext *ctx)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
@ AV_CODEC_ID_DSICINVIDEO
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
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_ERROR
Something went wrong and cannot losslessly be recovered.
#define FFSWAP(type, a, b)
Memory handling functions.
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
int discard_damaged_percentage
The percentage of damaged samples to discard a frame.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
This structure stores compressed data.
uint8_t * bitmap_table[3]