34 #define BITSTREAM_READER_LE
39 #define EA_PREAMBLE_SIZE 8
40 #define kVGT_TAG MKTAG('k', 'V', 'G', 'T')
85 if (src_end - src < 3)
90 while (size > 0 && src < src_end) {
98 size1 = (((src[0] & 31) + 1) << 2);
102 offset = ((src[0] & 0x10) << 12) +
AV_RB16(&src[1]) + 1;
103 size2 = ((src[0] & 0xC) << 6) + src[3] + 5;
107 size1 = ((src[1] & 0xC0) >> 6);
108 offset = (
AV_RB16(&src[1]) & 0x3FFF) + 1;
109 size2 = (src[0] & 0x3F) + 4;
113 offset = ((src[0] & 0x60) << 3) + src[1] + 1;
114 size2 = ((src[0] & 0x1C) >> 2) + 3;
120 if (size1 > src_end - src)
125 run =
FFMIN(size1, dst_end - dst);
126 memcpy(dst, src, run);
132 if (dst - dst_start < offset)
135 run =
FFMIN(size2, dst_end - dst);
153 int num_blocks_packed;
160 if(buf_end - buf < 12)
164 num_blocks_raw =
AV_RL16(&buf[2]);
165 num_blocks_packed =
AV_RL16(&buf[4]);
166 vector_bits =
AV_RL16(&buf[6]);
171 "Invalid value for motion vector bits: %d\n", vector_bits);
195 mvbits = (num_mvs * 2 * 10 + 31) & ~31;
197 if (buf_end - buf < (mvbits>>3) + 16*num_blocks_raw + 8*num_blocks_packed)
201 for (i = 0; i <
num_mvs; i++) {
209 buf += num_blocks_raw * 16;
213 for (i = 0; i < num_blocks_packed; i++) {
215 for (j = 0; j < 4; j++)
217 for (j = 0; j < 16; j++)
228 unsigned int vector =
get_bits(&gb, vector_bits);
230 ptrdiff_t src_stride;
232 if (vector < num_mvs) {
246 if (offset < num_blocks_raw)
247 src = blocks_raw + 16*
offset;
248 else if (offset - num_blocks_raw < num_blocks_packed)
255 for (j = 0; j < 4; j++)
256 for (i = 0; i < 4; i++)
257 frame->
data[0][(y * 4 + j) * frame->
linesize[0] + (x * 4 + i)] =
258 src[j * src_stride + i];
265 void *
data,
int *got_frame,
269 int buf_size = avpkt->
size;
271 const uint8_t *buf_end = buf + buf_size;
283 if(buf_end - buf < 12) {
299 for(i = 0; i < pal_count && i <
AVPALETTE_COUNT && buf_end - buf >= 3; i++) {
323 for (y = 0; y < s->
height; y++)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
Memory handling functions.
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static av_cold int init(AVCodecContext *avctx)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
static int get_sbits(GetBitContext *s, int n)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
8 bits 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.
void av_memcpy_backptr(uint8_t *dst, int back, int cnt)
Overlapping memcpy() implementation.
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static av_cold int tgv_decode_end(AVCodecContext *avctx)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int num_mvs
current length of mv_codebook
const char * name
Name of the codec implementation.
static const uint8_t offset[127][2]
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
uint32_t palette[AVPALETTE_COUNT]
enum AVPictureType pict_type
Picture type of the frame.
uint8_t(* block_codebook)[16]
int width
picture width / height.
int num_blocks_packed
current length of block_codebook
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Libavcodec external API header.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24
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.
static int tgv_decode_inter(TgvContext *s, AVFrame *frame, const uint8_t *buf, const uint8_t *buf_end)
Decode inter-frame.
Rational number (pair of numerator and denominator).
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static av_cold int tgv_decode_init(AVCodecContext *avctx)
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 unpack(const uint8_t *src, const uint8_t *src_end, uint8_t *dst, int width, int height)
Unpack buffer.
common internal api header.
static const int num_mvs[RV34_MB_TYPES]
number of motion vectors in each macroblock type
int key_frame
1 -> keyframe, 0-> not
static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
static int tgv_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
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.