45 #define VMD_HEADER_SIZE 0x330 
   46 #define PALETTE_COUNT 256 
   53     const unsigned char *
buf;
 
   63 #define QUEUE_SIZE 0x1000 
   64 #define QUEUE_MASK 0x0FFF 
   67                       unsigned char *dest, 
int dest_len)
 
   73     unsigned int dataleft;
 
   74     unsigned int chainofs;
 
   75     unsigned int chainlen;
 
   84     dataleft = bytestream2_get_le32(&gb);
 
   88     if (bytestream2_peek_le32(&gb) == 0x56781234) {
 
   98         tag = bytestream2_get_byteu(&gb);
 
   99         if ((tag == 0xFF) && (dataleft > 8)) {
 
  102             for (i = 0; i < 8; i++) {
 
  103                 queue[qpos++] = *d++ = bytestream2_get_byteu(&gb);
 
  108             for (i = 0; i < 8; i++) {
 
  114                     queue[qpos++] = *d++ = bytestream2_get_byteu(&gb);
 
  118                     chainofs = bytestream2_get_byte(&gb);
 
  119                     chainofs |= ((bytestream2_peek_byte(&gb) & 0xF0) << 4);
 
  120                     chainlen = (bytestream2_get_byte(&gb) & 0x0F) + 3;
 
  121                     if (chainlen == speclen) {
 
  122                         chainlen = bytestream2_get_byte(&gb) + 0xF + 3;
 
  124                     if (d_end - d < chainlen)
 
  126                     for (j = 0; j < chainlen; j++) {
 
  128                         queue[qpos++] = *d++;
 
  131                     dataleft -= chainlen;
 
  140                       int src_count, 
int src_size, 
int dest_len)
 
  144     unsigned char *dest_end = dest + dest_len;
 
  153         *pd++ = bytestream2_get_byteu(&gb);
 
  160         l = bytestream2_get_byteu(&gb);
 
  171             for (i = 0; i < l; i++) {
 
  178     } 
while (used < src_count);
 
  186     unsigned int *palette32;
 
  187     unsigned char r, 
g, 
b;
 
  197     int frame_x, frame_y;
 
  198     int frame_width, frame_height;
 
  202     frame_width = 
AV_RL16(&s->
buf[10]) - frame_x + 1;
 
  203     frame_height = 
AV_RL16(&s->
buf[12]) - frame_y + 1;
 
  206         (frame_x || frame_y)) {
 
  214     if (frame_x < 0 || frame_width < 0 ||
 
  219                "Invalid horizontal range %d-%d\n",
 
  220                frame_x, frame_width);
 
  223     if (frame_y < 0 || frame_height < 0 ||
 
  228                "Invalid vertical range %d-%d\n",
 
  229                frame_x, frame_width);
 
  236         (frame_x || frame_y || (frame_width != s->
avctx->
width) ||
 
  245     if (s->
buf[15] & 0x02) {
 
  247         palette32 = (
unsigned int *)s->
palette;
 
  250                 r = bytestream2_get_byteu(&gb) * 4;
 
  251                 g = bytestream2_get_byteu(&gb) * 4;
 
  252                 b = bytestream2_get_byteu(&gb) * 4;
 
  253                 palette32[i] = 0xFF
U << 24 | (r << 16) | (g << 8) | (
b);
 
  254                 palette32[i] |= palette32[i] >> 6 & 0x30303;
 
  268     meth = bytestream2_get_byteu(&gb);
 
  273                    "Trying to unpack LZ-compressed frame with no LZ buffer\n");
 
  284     dp = &frame->
data[0][frame_y * frame->
linesize[0] + frame_x];
 
  288         for (i = 0; i < frame_height; i++) {
 
  291                 len = bytestream2_get_byte(&gb);
 
  293                     len = (len & 0x7F) + 1;
 
  294                     if (ofs + len > frame_width ||
 
  303                     memcpy(&dp[ofs], &pp[ofs], len + 1);
 
  306             } 
while (ofs < frame_width);
 
  307             if (ofs > frame_width) {
 
  309                        "offset > width (%d > %d)\n",
 
  319         for (i = 0; i < frame_height; i++) {
 
  327         for (i = 0; i < frame_height; i++) {
 
  330                 len = bytestream2_get_byte(&gb);
 
  332                     len = (len & 0x7F) + 1;
 
  333                     if (bytestream2_peek_byte(&gb) == 0xFF) {
 
  335                         bytestream2_get_byte(&gb);
 
  342                         if (ofs + len > frame_width ||
 
  352                     memcpy(&dp[ofs], &pp[ofs], len + 1);
 
  355             } 
while (ofs < frame_width);
 
  356             if (ofs > frame_width) {
 
  358                        "offset > width (%d > %d)\n",
 
  385     unsigned int *palette32;
 
  386     int palette_index = 0;
 
  387     unsigned char r, 
g, 
b;
 
  388     unsigned char *vmd_header;
 
  389     unsigned char *raw_palette;
 
  400     vmd_header = (
unsigned char *)avctx->
extradata;
 
  410     raw_palette = &vmd_header[28];
 
  411     palette32 = (
unsigned int *)s->
palette;
 
  413         r = raw_palette[palette_index++] * 4;
 
  414         g = raw_palette[palette_index++] * 4;
 
  415         b = raw_palette[palette_index++] * 4;
 
  416         palette32[i] = 0xFF
U << 24 | (r << 16) | (g << 8) | (
b);
 
  417         palette32[i] |= palette32[i] >> 6 & 0x30303;
 
  430                                  void *
data, 
int *got_frame,
 
  434     int buf_size = avpkt->
size;
 
#define AVERROR_INVALIDDATA
Invalid data found when processing input. 
This structure describes decoded (raw) audio or video data. 
ptrdiff_t const GLvoid * data
static av_cold int init(AVCodecContext *avctx)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx. 
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
static av_always_inline unsigned int bytestream2_get_bufferu(GetByteContext *g, uint8_t *dst, unsigned int size)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values. 
8 bit with AV_PIX_FMT_RGB32 palette 
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame. 
uint8_t * extradata
some codecs need / can use extradata like Huffman tables. 
AVCodec ff_vmdvideo_decoder
unsigned char * unpack_buffer
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
static int vmdvideo_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
unsigned char palette[PALETTE_COUNT *4]
static av_cold int vmdvideo_decode_end(AVCodecContext *avctx)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g. 
#define bytestream2_get_ne16
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
const unsigned char * buf
const char * name
Name of the codec implementation. 
static int vmd_decode(VmdVideoContext *s, AVFrame *frame)
Libavcodec external API header. 
static av_cold int vmdvideo_decode_init(AVCodecContext *avctx)
int width
picture width / height. 
static av_always_inline int bytestream2_tell(GetByteContext *g)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line. 
main external API structure. 
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame. 
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields. 
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes. 
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
common internal api header. 
common internal and external API header 
static int rle_unpack(const unsigned char *src, unsigned char *dest, int src_count, int src_size, int dest_len)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
This structure stores compressed data. 
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later. 
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators. 
static int lz_unpack(const unsigned char *src, int src_len, unsigned char *dest, int dest_len)