diff options
| author | Tim Redfern <tim@eclectronics.org> | 2013-12-29 12:19:38 +0000 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2013-12-29 12:19:38 +0000 |
| commit | f7813a5324be39d13ab536c245d15dfc602a7849 (patch) | |
| tree | fad99148b88823d34a5df2f0a25881a002eb291b /ffmpeg/libavcodec/vp6.c | |
| parent | b7a5a477b8ff4d4e3028b9dfb9a9df0a41463f92 (diff) | |
basic type mechanism working
Diffstat (limited to 'ffmpeg/libavcodec/vp6.c')
| -rw-r--r-- | ffmpeg/libavcodec/vp6.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/ffmpeg/libavcodec/vp6.c b/ffmpeg/libavcodec/vp6.c index 6e385ce..f552524 100644 --- a/ffmpeg/libavcodec/vp6.c +++ b/ffmpeg/libavcodec/vp6.c @@ -32,6 +32,7 @@ #include "avcodec.h" #include "get_bits.h" #include "huffman.h" +#include "internal.h" #include "vp56.h" #include "vp56data.h" @@ -83,10 +84,23 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) 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; } @@ -144,7 +158,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) 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) { @@ -238,7 +252,8 @@ static int vp6_build_huff_tree(VP56Context *s, uint8_t coeff_model[], 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); } @@ -388,11 +403,11 @@ static void vp6_parse_coeff_huffman(VP56Context *s) } 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 @@ -657,6 +672,7 @@ static av_cold void vp6_decode_free_context(VP56Context *s) 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), @@ -664,12 +680,12 @@ AVCodec ff_vp6_decoder = { .close = vp6_decode_free, .decode = ff_vp56_decode_frame, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("On2 VP6"), }; /* 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), @@ -677,12 +693,12 @@ AVCodec ff_vp6f_decoder = { .close = vp6_decode_free, .decode = ff_vp56_decode_frame, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version)"), }; /* 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), @@ -690,5 +706,4 @@ AVCodec ff_vp6a_decoder = { .close = vp6_decode_free, .decode = ff_vp56_decode_frame, .capabilities = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS, - .long_name = NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version, with alpha channel)"), }; |
