int num_blocks_packed; ///< current length of block_codebook
} TgvContext;
- static av_cold int tgv_decode_init(AVCodecContext *avctx){
+ static av_cold int tgv_decode_init(AVCodecContext *avctx)
+ {
TgvContext *s = avctx->priv_data;
- s->avctx = avctx;
+ s->avctx = avctx;
avctx->time_base = (AVRational){1, 15};
- avctx->pix_fmt = AV_PIX_FMT_PAL8;
+ avctx->pix_fmt = AV_PIX_FMT_PAL8;
+ avcodec_get_frame_defaults(&s->frame);
+ avcodec_get_frame_defaults(&s->last_frame);
return 0;
}
}
/* read motion vectors */
- mvbits = (num_mvs*2*10+31) & ~31;
+ mvbits = (num_mvs * 2 * 10 + 31) & ~31;
- if (buf_end - buf < (mvbits>>3)+16*num_blocks_raw+8*num_blocks_packed)
- if (buf + (mvbits >> 3) + 16 * num_blocks_raw + 8 * num_blocks_packed > buf_end)
++ if (buf_end - buf < (mvbits>>3) + 16*num_blocks_raw + 8*num_blocks_packed)
return AVERROR_INVALIDDATA;
init_get_bits(&gb, buf, mvbits);
return AVERROR_INVALIDDATA;
/* read vectors and build frame */
- for(y=0; y<s->avctx->height/4; y++)
- for(x=0; x<s->avctx->width/4; x++) {
- unsigned int vector = get_bits(&gb, vector_bits);
- const unsigned char *src;
- int src_stride;
-
- if (vector < num_mvs) {
- int mx = x * 4 + s->mv_codebook[vector][0];
- int my = y * 4 + s->mv_codebook[vector][1];
-
- if ( mx < 0 || mx + 4 > s->avctx->width
- || my < 0 || my + 4 > s->avctx->height) {
- av_log(s->avctx, AV_LOG_ERROR, "MV %d %d out of picture\n", mx, my);
- continue;
- }
+ for (y = 0; y < s->avctx->height / 4; y++)
+ for (x = 0; x < s->avctx->width / 4; x++) {
+ unsigned int vector = get_bits(&gb, vector_bits);
+ const unsigned char *src;
+ int src_stride;
+
+ if (vector < num_mvs) {
+ int mx = x * 4 + s->mv_codebook[vector][0];
+ int my = y * 4 + s->mv_codebook[vector][1];
+
+ if (mx < 0 || mx + 4 > s->avctx->width ||
- my < 0 || my + 4 > s->avctx->height)
++ my < 0 || my + 4 > s->avctx->height) {
++ av_log(s->avctx, AV_LOG_ERROR, "MV %d %d out of picture\n", mx, my);
+ continue;
++ }
- src = s->last_frame.data[0] + mx + my * s->last_frame.linesize[0];
- src_stride = s->last_frame.linesize[0];
- }else{
- int offset = vector - num_mvs;
- if (offset<num_blocks_raw)
- src = blocks_raw + 16*offset;
- else if (offset-num_blocks_raw<num_blocks_packed)
- src = s->block_codebook[offset-num_blocks_raw];
- else
- continue;
- src_stride = 4;
- }
+ src = s->last_frame.data[0] + mx + my * s->last_frame.linesize[0];
+ src_stride = s->last_frame.linesize[0];
+ } else {
+ int offset = vector - num_mvs;
+ if (offset < num_blocks_raw)
+ src = blocks_raw + 16*offset;
+ else if (offset - num_blocks_raw < num_blocks_packed)
+ src = s->block_codebook[offset - num_blocks_raw];
+ else
+ continue;
+ src_stride = 4;
+ }
- for(j=0; j<4; j++)
- for(i=0; i<4; i++)
- s->frame.data[0][ (y*4+j)*s->frame.linesize[0] + (x*4+i) ] =
- src[j*src_stride + i];
+ for (j = 0; j < 4; j++)
+ for (i = 0; i < 4; i++)
+ s->frame.data[0][(y * 4 + j) * s->frame.linesize[0] + (x * 4 + i)] =
+ src[j * src_stride + i];
}
return 0;
const uint8_t *buf_end = buf + buf_size;
int chunk_type, ret;
+ if (buf_end - buf < EA_PREAMBLE_SIZE)
+ return AVERROR_INVALIDDATA;
+
chunk_type = AV_RL32(&buf[0]);
- buf += EA_PREAMBLE_SIZE;
+ buf += EA_PREAMBLE_SIZE;
- if (chunk_type==kVGT_TAG) {
+ if (chunk_type == kVGT_TAG) {
int pal_count, i;
- if (buf + 12 > buf_end) {
+ if(buf_end - buf < 12) {
av_log(avctx, AV_LOG_WARNING, "truncated header\n");
return AVERROR_INVALIDDATA;
}
pal_count = AV_RL16(&buf[6]);
buf += 12;
- for(i=0; i<pal_count && i<AVPALETTE_COUNT && buf_end - buf >= 3; i++) {
- for (i = 0; i < pal_count && i < AVPALETTE_COUNT && buf + 2 < buf_end; i++) {
- s->palette[i] = AV_RB24(buf);
++ for(i = 0; i < pal_count && i < AVPALETTE_COUNT && buf_end - buf >= 3; i++) {
+ s->palette[i] = 0xFFU << 24 | AV_RB24(buf);
buf += 3;
}
}