#include "avcodec.h"
#include "get_bits.h"
#include "huffman.h"
+#include "internal.h"
#include "vp56.h"
#include "vp56data.h"
if (!s->macroblocks || /* first frame */
16*cols != s->avctx->coded_width ||
16*rows != s->avctx->coded_height) {
- avcodec_set_dimensions(s->avctx, 16*cols, 16*rows);
- if (s->avctx->extradata_size == 1) {
- s->avctx->width -= s->avctx->extradata[0] >> 4;
- s->avctx->height -= s->avctx->extradata[0] & 0x0F;
+ if (s->avctx->extradata_size == 0 &&
+ FFALIGN(s->avctx->width, 16) == 16 * cols &&
+ FFALIGN(s->avctx->height, 16) == 16 * rows) {
+ // We assume this is properly signalled container cropping,
+ // in an F4V file. Just set the coded_width/height, don't
+ // touch the cropped ones.
+ s->avctx->coded_width = 16 * cols;
+ s->avctx->coded_height = 16 * rows;
+ } else {
+ int ret = ff_set_dimensions(s->avctx, 16 * cols, 16 * rows);
+ if (ret < 0)
+ return ret;
+
+ if (s->avctx->extradata_size == 1) {
+ s->avctx->width -= s->avctx->extradata[0] >> 4;
+ s->avctx->height -= s->avctx->extradata[0] & 0x0F;
+ }
}
res = VP56_SIZE_CHANGE;
}
buf_size -= coeff_offset;
if (buf_size < 0) {
if (s->frames[VP56_FRAME_CURRENT]->key_frame)
- avcodec_set_dimensions(s->avctx, 0, 0);
+ ff_set_dimensions(s->avctx, 0, 0);
return AVERROR_INVALIDDATA;
}
if (s->use_huffman) {
ff_free_vlc(vlc);
/* then build the huffman tree according to probabilities */
- return ff_huff_build_tree(s->avctx, vlc, size, nodes, vp6_huff_cmp,
+ return ff_huff_build_tree(s->avctx, vlc, size, FF_HUFFMAN_BITS,
+ nodes, vp6_huff_cmp,
FF_HUFFMAN_FLAG_HNODE_FIRST);
}
static void vp6_parse_coeff_huffman(VP56Context *s)
{
VP56Model *model = s->modelp;
- uint8_t *permute = s->scantable.permutated;
+ uint8_t *permute = s->idct_scantable;
VLC *vlc_coeff;
int coeff, sign, coeff_idx;
int b, cg, idx;
} else {
if (get_bits_left(&s->gb) <= 0)
return;
- coeff = get_vlc2(&s->gb, vlc_coeff->table, 9, 3);
+ coeff = get_vlc2(&s->gb, vlc_coeff->table, FF_HUFFMAN_BITS, 3);
if (coeff == 0) {
if (coeff_idx) {
int pt = (coeff_idx >= 6);
- run += get_vlc2(&s->gb, s->runv_vlc[pt].table, 9, 3);
+ run += get_vlc2(&s->gb, s->runv_vlc[pt].table, FF_HUFFMAN_BITS, 3);
if (run >= 9)
run += get_bits(&s->gb, 6);
} else
{
VP56RangeCoder *c = s->ccp;
VP56Model *model = s->modelp;
- uint8_t *permute = s->scantable.permutated;
+ uint8_t *permute = s->idct_scantable;
uint8_t *model1, *model2, *model3;
int coeff, sign, coeff_idx;
int b, i, cg, idx, ctx;
}
}
-static int vp6_block_variance(uint8_t *src, int stride)
+static int vp6_block_variance(uint8_t *src, ptrdiff_t stride)
{
int sum = 0, square_sum = 0;
int y, x;
return (16*square_sum - sum*sum) >> 8;
}
-static void vp6_filter_hv4(uint8_t *dst, uint8_t *src, int stride,
+static void vp6_filter_hv4(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
int delta, const int16_t *weights)
{
int x, y;
}
static void vp6_filter_diag2(VP56Context *s, uint8_t *dst, uint8_t *src,
- int stride, int h_weight, int v_weight)
+ ptrdiff_t stride, int h_weight, int v_weight)
{
uint8_t *tmp = s->edge_emu_buffer+16;
s->h264chroma.put_h264_chroma_pixels_tab[0](tmp, src, stride, 9, h_weight, 0);
}
static void vp6_filter(VP56Context *s, uint8_t *dst, uint8_t *src,
- int offset1, int offset2, int stride,
+ int offset1, int offset2, ptrdiff_t stride,
VP56mv mv, int mask, int select, int luma)
{
int filter4 = 0;
if ((ret = ff_vp56_init(avctx, avctx->codec->id == AV_CODEC_ID_VP6,
avctx->codec->id == AV_CODEC_ID_VP6A)) < 0)
return ret;
+ ff_vp6dsp_init(&s->vp56dsp);
s->vp56_coord_div = vp6_coord_div;
s->parse_vector_adjustment = vp6_parse_vector_adjustment;
AVCodec ff_vp6_decoder = {
.name = "vp6",
+ .long_name = NULL_IF_CONFIG_SMALL("On2 VP6"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_VP6,
.priv_data_size = sizeof(VP56Context),
.init = vp6_decode_init,
.close = vp6_decode_free,
.decode = ff_vp56_decode_frame,
- .capabilities = CODEC_CAP_DR1,
- .long_name = NULL_IF_CONFIG_SMALL("On2 VP6"),
+ .capabilities = AV_CODEC_CAP_DR1,
};
/* flash version, not flipped upside-down */
AVCodec ff_vp6f_decoder = {
.name = "vp6f",
+ .long_name = NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version)"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_VP6F,
.priv_data_size = sizeof(VP56Context),
.init = vp6_decode_init,
.close = vp6_decode_free,
.decode = ff_vp56_decode_frame,
- .capabilities = CODEC_CAP_DR1,
- .long_name = NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version)"),
+ .capabilities = AV_CODEC_CAP_DR1,
};
/* flash version, not flipped upside-down, with alpha channel */
AVCodec ff_vp6a_decoder = {
.name = "vp6a",
+ .long_name = NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version, with alpha channel)"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_VP6A,
.priv_data_size = sizeof(VP56Context),
.init = vp6_decode_init,
.close = vp6_decode_free,
.decode = ff_vp56_decode_frame,
- .capabilities = CODEC_CAP_DR1,
- .long_name = NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version, with alpha channel)"),
+ .capabilities = AV_CODEC_CAP_DR1,
};