|
|
@ -24,9 +24,9 @@ |
|
|
|
#include "libavutil/common.h" |
|
|
|
#include "libavutil/common.h" |
|
|
|
|
|
|
|
|
|
|
|
#include "avcodec.h" |
|
|
|
#include "avcodec.h" |
|
|
|
#include "golomb_legacy.h" |
|
|
|
#include "bitstream.h" |
|
|
|
|
|
|
|
#include "golomb.h" |
|
|
|
#include "internal.h" |
|
|
|
#include "internal.h" |
|
|
|
#include "get_bits.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct FICThreadContext { |
|
|
|
typedef struct FICThreadContext { |
|
|
|
DECLARE_ALIGNED(16, int16_t, block)[64]; |
|
|
|
DECLARE_ALIGNED(16, int16_t, block)[64]; |
|
|
@ -129,13 +129,13 @@ static void fic_idct_put(uint8_t *dst, int stride, int16_t *block) |
|
|
|
ptr += 8; |
|
|
|
ptr += 8; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
static int fic_decode_block(FICContext *ctx, GetBitContext *gb, |
|
|
|
static int fic_decode_block(FICContext *ctx, BitstreamContext *bc, |
|
|
|
uint8_t *dst, int stride, int16_t *block) |
|
|
|
uint8_t *dst, int stride, int16_t *block) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int i, num_coeff; |
|
|
|
int i, num_coeff; |
|
|
|
|
|
|
|
|
|
|
|
/* Is it a skip block? */ |
|
|
|
/* Is it a skip block? */ |
|
|
|
if (get_bits1(gb)) { |
|
|
|
if (bitstream_read_bit(bc)) { |
|
|
|
/* This is a P-frame. */ |
|
|
|
/* This is a P-frame. */ |
|
|
|
ctx->frame->key_frame = 0; |
|
|
|
ctx->frame->key_frame = 0; |
|
|
|
ctx->frame->pict_type = AV_PICTURE_TYPE_P; |
|
|
|
ctx->frame->pict_type = AV_PICTURE_TYPE_P; |
|
|
@ -145,12 +145,12 @@ static int fic_decode_block(FICContext *ctx, GetBitContext *gb, |
|
|
|
|
|
|
|
|
|
|
|
memset(block, 0, sizeof(*block) * 64); |
|
|
|
memset(block, 0, sizeof(*block) * 64); |
|
|
|
|
|
|
|
|
|
|
|
num_coeff = get_bits(gb, 7); |
|
|
|
num_coeff = bitstream_read(bc, 7); |
|
|
|
if (num_coeff > 64) |
|
|
|
if (num_coeff > 64) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < num_coeff; i++) |
|
|
|
for (i = 0; i < num_coeff; i++) |
|
|
|
block[ff_zigzag_direct[i]] = get_se_golomb(gb) * |
|
|
|
block[ff_zigzag_direct[i]] = get_se_golomb(bc) * |
|
|
|
ctx->qmat[ff_zigzag_direct[i]]; |
|
|
|
ctx->qmat[ff_zigzag_direct[i]]; |
|
|
|
|
|
|
|
|
|
|
|
fic_idct_put(dst, stride, block); |
|
|
|
fic_idct_put(dst, stride, block); |
|
|
@ -162,14 +162,14 @@ static int fic_decode_slice(AVCodecContext *avctx, void *tdata) |
|
|
|
{ |
|
|
|
{ |
|
|
|
FICContext *ctx = avctx->priv_data; |
|
|
|
FICContext *ctx = avctx->priv_data; |
|
|
|
FICThreadContext *tctx = tdata; |
|
|
|
FICThreadContext *tctx = tdata; |
|
|
|
GetBitContext gb; |
|
|
|
BitstreamContext bc; |
|
|
|
uint8_t *src = tctx->src; |
|
|
|
uint8_t *src = tctx->src; |
|
|
|
int slice_h = tctx->slice_h; |
|
|
|
int slice_h = tctx->slice_h; |
|
|
|
int src_size = tctx->src_size; |
|
|
|
int src_size = tctx->src_size; |
|
|
|
int y_off = tctx->y_off; |
|
|
|
int y_off = tctx->y_off; |
|
|
|
int x, y, p; |
|
|
|
int x, y, p; |
|
|
|
|
|
|
|
|
|
|
|
init_get_bits(&gb, src, src_size * 8); |
|
|
|
bitstream_init8(&bc, src, src_size); |
|
|
|
|
|
|
|
|
|
|
|
for (p = 0; p < 3; p++) { |
|
|
|
for (p = 0; p < 3; p++) { |
|
|
|
int stride = ctx->frame->linesize[p]; |
|
|
|
int stride = ctx->frame->linesize[p]; |
|
|
@ -179,7 +179,7 @@ static int fic_decode_slice(AVCodecContext *avctx, void *tdata) |
|
|
|
for (x = 0; x < (ctx->aligned_width >> !!p); x += 8) { |
|
|
|
for (x = 0; x < (ctx->aligned_width >> !!p); x += 8) { |
|
|
|
int ret; |
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
|
|
if ((ret = fic_decode_block(ctx, &gb, dst + x, stride, tctx->block)) != 0) |
|
|
|
if ((ret = fic_decode_block(ctx, &bc, dst + x, stride, tctx->block)) != 0) |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|