#include "libavutil/frame.h"
#include "libavutil/imgutils.h"
#include "libavutil/intreadwrite.h"
+
#include "avcodec.h"
+#include "bitstream.h"
+#include "blockdsp.h"
+#include "bswapdsp.h"
#include "bytestream.h"
-#include "dsputil.h"
-#include "get_bits.h"
#include "internal.h"
#define BLOCK_TYPE_VLC_BITS 5
typedef struct FourXContext {
AVCodecContext *avctx;
- DSPContext dsp;
+ BlockDSPContext bdsp;
+ BswapDSPContext bbdsp;
uint16_t *frame_buffer;
uint16_t *last_frame_buffer;
- GetBitContext pre_gb; ///< ac/dc prefix
- GetBitContext gb;
+ BitstreamContext pre_bc; // ac/dc prefix
+ BitstreamContext bc;
GetByteContext g;
GetByteContext g2;
int mv[256];
static int decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src,
int log2w, int log2h, int stride)
{
- const int index = size2index[log2h][log2w];
- const int h = 1 << log2h;
- int code = get_vlc2(&f->gb,
- block_type_vlc[1 - (f->version > 1)][index].table,
- BLOCK_TYPE_VLC_BITS, 1);
- uint16_t *start = f->last_frame_buffer;
- uint16_t *end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
- int ret;
- int scale = 1;
+ int index, h, code, ret, scale = 1;
+ uint16_t *start, *end;
unsigned dc = 0;
- if (code < 0 || code > 6 || log2w < 0)
+ if (log2h < 0 || log2w < 0)
+ return AVERROR_INVALIDDATA;
+
+ index = size2index[log2h][log2w];
+ if (index < 0)
+ return AVERROR_INVALIDDATA;
+
+ h = 1 << log2h;
+ code = bitstream_read_vlc(&f->bc, block_type_vlc[1 - (f->version > 1)][index].table,
+ BLOCK_TYPE_VLC_BITS, 1);
+ if (code < 0 || code > 6)
return AVERROR_INVALIDDATA;
+ start = f->last_frame_buffer;
+ end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
+
if (code == 1) {
- log2h--;
+ if (--log2h < 0)
+ return AVERROR_INVALIDDATA;
if ((ret = decode_p_block(f, dst, src, log2w, log2h, stride)) < 0)
return ret;
return decode_p_block(f, dst + (stride << log2h),
}
av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
- bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ bitstream_size + AV_INPUT_BUFFER_PADDING_SIZE);
if (!f->bitstream_buffer)
return AVERROR(ENOMEM);
- f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra),
- bitstream_size / 4);
+ f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) (buf + extra),
+ bitstream_size / 4);
memset((uint8_t*)f->bitstream_buffer + bitstream_size,
- 0, FF_INPUT_BUFFER_PADDING_SIZE);
- init_get_bits(&f->gb, f->bitstream_buffer, 8 * bitstream_size);
+ 0, AV_INPUT_BUFFER_PADDING_SIZE);
+ bitstream_init8(&f->bc, f->bitstream_buffer, bitstream_size);
wordstream_offset = extra + bitstream_size;
bytestream_offset = extra + bitstream_size + wordstream_size;
int code, i, j, level, val;
/* DC coef */
- val = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
+ val = bitstream_read_vlc(&f->pre_bc, f->pre_vlc.table, ACDC_VLC_BITS, 3);
if (val >> 4)
av_log(f->avctx, AV_LOG_ERROR, "error dc run != 0\n");
if (val)
- val = get_xbits(&f->gb, val);
+ val = bitstream_read_xbits(&f->bc, val);
val = val * dequant_table[0] + f->last_dc;
f->last_dc = block[0] = val;
/* AC coefs */
i = 1;
for (;;) {
- code = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
+ code = bitstream_read_vlc(&f->pre_bc, f->pre_vlc.table, ACDC_VLC_BITS, 3);
/* EOB */
if (code == 0)
if (code == 0xf0) {
i += 16;
} else {
- level = get_xbits(&f->gb, code & 0xf);
+ level = bitstream_read_xbits(&f->bc, code & 0xf);
i += code >> 4;
if (i >= 64) {
av_log(f->avctx, AV_LOG_ERROR, "run %d oveflow\n", i);
idct(block[i]);
}
- if (!(f->avctx->flags & CODEC_FLAG_GRAY)) {
+ if (!(f->avctx->flags & AV_CODEC_FLAG_GRAY)) {
for (i = 4; i < 6; i++)
idct(block[i]);
}
int ret;
int i;
- f->dsp.clear_blocks(f->block[0]);
+ f->bdsp.clear_blocks(f->block[0]);
for (i = 0; i < 6; i++)
if ((ret = decode_i_block(f, f->block[i])) < 0)
return AVERROR_INVALIDDATA;
}
- init_get_bits(&f->gb, buf + 4, 8 * bitstream_size);
+ bitstream_init8(&f->bc, buf + 4, bitstream_size);
prestream_size = length + buf - prestream;
av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
- prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ prestream_size + AV_INPUT_BUFFER_PADDING_SIZE);
if (!f->bitstream_buffer)
return AVERROR(ENOMEM);
- f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream,
- prestream_size / 4);
+ f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) prestream,
+ prestream_size / 4);
memset((uint8_t*)f->bitstream_buffer + prestream_size,
- 0, FF_INPUT_BUFFER_PADDING_SIZE);
- init_get_bits(&f->pre_gb, f->bitstream_buffer, 8 * prestream_size);
+ 0, AV_INPUT_BUFFER_PADDING_SIZE);
+ bitstream_init8(&f->pre_bc, f->bitstream_buffer, prestream_size);
f->last_dc = 0 * 128 * 8 * 8;
}
}
- if (get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256)
+ if (bitstream_read_vlc(&f->pre_bc, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256)
av_log(f->avctx, AV_LOG_ERROR, "end mismatch\n");
return 0;
const int data_size = buf_size - 20;
CFrameBuffer *cfrm;
- if (data_size < 0)
- return AVERROR_INVALIDDATA;
-
id = AV_RL32(buf + 12);
whole_size = AV_RL32(buf + 16);
cfrm = &f->cfrm[i];
cfrm->data = av_fast_realloc(cfrm->data, &cfrm->allocated_size,
- cfrm->size + data_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ cfrm->size + data_size + AV_INPUT_BUFFER_PADDING_SIZE);
// explicit check needed as memcpy below might not catch a NULL
if (!cfrm->data) {
av_log(f->avctx, AV_LOG_ERROR, "realloc failure");
}
f->version = AV_RL32(avctx->extradata) >> 16;
- ff_dsputil_init(&f->dsp, avctx);
+ ff_blockdsp_init(&f->bdsp);
+ ff_bswapdsp_init(&f->bbdsp);
f->avctx = avctx;
init_vlcs(f);
.init = decode_init,
.close = decode_end,
.decode = decode_frame,
- .capabilities = CODEC_CAP_DR1,
+ .capabilities = AV_CODEC_CAP_DR1,
};