* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "libavutil/attributes.h"
#include "libavutil/imgutils.h"
#include "libavutil/internal.h"
#include "avcodec.h"
-#include "dsputil.h"
#include "binkdata.h"
#include "binkdsp.h"
+#include "blockdsp.h"
+#include "hpeldsp.h"
#include "internal.h"
#include "mathops.h"
*/
typedef struct BinkContext {
AVCodecContext *avctx;
- DSPContext dsp;
- BinkDSPContext bdsp;
+ BlockDSPContext bdsp;
+ HpelDSPContext hdsp;
+ BinkDSPContext binkdsp;
AVFrame *last;
int version; ///< internal Bink file version
int has_alpha;
return ret;
}
-static void binkb_init_bundle(BinkContext *c, int bundle_num)
+static av_cold void binkb_init_bundle(BinkContext *c, int bundle_num)
{
c->bundle[bundle_num].cur_dec =
c->bundle[bundle_num].cur_ptr = c->bundle[bundle_num].data;
c->bundle[bundle_num].len = 13;
}
-static void binkb_init_bundles(BinkContext *c)
+static av_cold void binkb_init_bundles(BinkContext *c)
{
int i;
for (i = 0; i < BINKB_NB_SRC; i++)
quant_idx = q;
}
+ if (quant_idx >= 16)
+ return AVERROR_INVALIDDATA;
+
quant = quant_matrices[quant_idx];
block[0] = (block[0] * quant[0]) >> 11;
dctblock[0] = binkb_get_value(c, BINKB_SRC_INTRA_DC);
qp = binkb_get_value(c, BINKB_SRC_INTRA_Q);
read_dct_coeffs(gb, dctblock, bink_scan, binkb_intra_quant, qp);
- c->bdsp.idct_put(dst, stride, dctblock);
+ c->binkdsp.idct_put(dst, stride, dctblock);
break;
case 3:
xoff = binkb_get_value(c, BINKB_SRC_X_OFF);
if (ref < ref_start || ref + 8*stride > ref_end) {
av_log(c->avctx, AV_LOG_WARNING, "Reference block is out of bounds\n");
} else if (ref + 8*stride < dst || ref >= dst + 8*stride) {
- c->dsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+ c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
} else {
put_pixels8x8_overlapped(dst, ref, stride);
}
- c->dsp.clear_block(block);
+ c->bdsp.clear_block(block);
v = binkb_get_value(c, BINKB_SRC_INTER_COEFS);
read_residue(gb, block, v);
- c->dsp.add_pixels8(dst, block, stride);
+ c->binkdsp.add_pixels8(dst, block, stride);
break;
case 4:
xoff = binkb_get_value(c, BINKB_SRC_X_OFF);
if (ref < ref_start || ref + 8 * stride > ref_end) {
av_log(c->avctx, AV_LOG_WARNING, "Reference block is out of bounds\n");
} else if (ref + 8*stride < dst || ref >= dst + 8*stride) {
- c->dsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+ c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
} else {
put_pixels8x8_overlapped(dst, ref, stride);
}
dctblock[0] = binkb_get_value(c, BINKB_SRC_INTER_DC);
qp = binkb_get_value(c, BINKB_SRC_INTER_Q);
read_dct_coeffs(gb, dctblock, bink_scan, binkb_inter_quant, qp);
- c->bdsp.idct_add(dst, stride, dctblock);
+ c->binkdsp.idct_add(dst, stride, dctblock);
break;
case 5:
v = binkb_get_value(c, BINKB_SRC_COLORS);
- c->dsp.fill_block_tab[1](dst, v, stride, 8);
+ c->bdsp.fill_block_tab[1](dst, v, stride, 8);
break;
case 6:
for (i = 0; i < 2; i++)
if (ref < ref_start || ref + 8 * stride > ref_end) {
av_log(c->avctx, AV_LOG_WARNING, "Reference block is out of bounds\n");
} else if (ref + 8*stride < dst || ref >= dst + 8*stride) {
- c->dsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+ c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
} else {
put_pixels8x8_overlapped(dst, ref, stride);
}
}
switch (blk) {
case SKIP_BLOCK:
- c->dsp.put_pixels_tab[1][0](dst, prev, stride, 8);
+ c->hdsp.put_pixels_tab[1][0](dst, prev, stride, 8);
break;
case SCALED_BLOCK:
blk = get_value(c, BINK_SRC_SUB_BLOCK_TYPES);
memset(dctblock, 0, sizeof(*dctblock) * 64);
dctblock[0] = get_value(c, BINK_SRC_INTRA_DC);
read_dct_coeffs(gb, dctblock, bink_scan, bink_intra_quant, -1);
- c->bdsp.idct_put(ublock, 8, dctblock);
+ c->binkdsp.idct_put(ublock, 8, dctblock);
break;
case FILL_BLOCK:
v = get_value(c, BINK_SRC_COLORS);
- c->dsp.fill_block_tab[0](dst, v, stride, 16);
+ c->bdsp.fill_block_tab[0](dst, v, stride, 16);
break;
case PATTERN_BLOCK:
for (i = 0; i < 2; i++)
return AVERROR_INVALIDDATA;
}
if (blk != FILL_BLOCK)
- c->bdsp.scale_block(ublock, dst, stride);
+ c->binkdsp.scale_block(ublock, dst, stride);
bx++;
dst += 8;
prev += 8;
bx*8 + xoff, by*8 + yoff);
return AVERROR_INVALIDDATA;
}
- c->dsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+ c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
break;
case RUN_BLOCK:
scan = bink_patterns[get_bits(gb, 4)];
bx*8 + xoff, by*8 + yoff);
return AVERROR_INVALIDDATA;
}
- c->dsp.put_pixels_tab[1][0](dst, ref, stride, 8);
- c->dsp.clear_block(block);
+ c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+ c->bdsp.clear_block(block);
v = get_bits(gb, 7);
read_residue(gb, block, v);
- c->dsp.add_pixels8(dst, block, stride);
+ c->binkdsp.add_pixels8(dst, block, stride);
break;
case INTRA_BLOCK:
memset(dctblock, 0, sizeof(*dctblock) * 64);
dctblock[0] = get_value(c, BINK_SRC_INTRA_DC);
read_dct_coeffs(gb, dctblock, bink_scan, bink_intra_quant, -1);
- c->bdsp.idct_put(dst, stride, dctblock);
+ c->binkdsp.idct_put(dst, stride, dctblock);
break;
case FILL_BLOCK:
v = get_value(c, BINK_SRC_COLORS);
- c->dsp.fill_block_tab[1](dst, v, stride, 8);
+ c->bdsp.fill_block_tab[1](dst, v, stride, 8);
break;
case INTER_BLOCK:
xoff = get_value(c, BINK_SRC_X_OFF);
yoff = get_value(c, BINK_SRC_Y_OFF);
ref = prev + xoff + yoff * stride;
- c->dsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+ c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
memset(dctblock, 0, sizeof(*dctblock) * 64);
dctblock[0] = get_value(c, BINK_SRC_INTER_DC);
read_dct_coeffs(gb, dctblock, bink_scan, bink_inter_quant, -1);
- c->bdsp.idct_add(dst, stride, dctblock);
+ c->binkdsp.idct_add(dst, stride, dctblock);
break;
case PATTERN_BLOCK:
for (i = 0; i < 2; i++)
avctx->pix_fmt = c->has_alpha ? AV_PIX_FMT_YUVA420P : AV_PIX_FMT_YUV420P;
- ff_dsputil_init(&c->dsp, avctx);
- ff_binkdsp_init(&c->bdsp);
+ ff_blockdsp_init(&c->bdsp, avctx);
+ ff_hpeldsp_init(&c->hdsp, avctx->flags);
+ ff_binkdsp_init(&c->binkdsp);
init_bundles(c);
AVCodec ff_bink_decoder = {
.name = "binkvideo",
+ .long_name = NULL_IF_CONFIG_SMALL("Bink video"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_BINKVIDEO,
.priv_data_size = sizeof(BinkContext),
.init = decode_init,
.close = decode_end,
.decode = decode_frame,
- .long_name = NULL_IF_CONFIG_SMALL("Bink video"),
.capabilities = CODEC_CAP_DR1,
};