summaryrefslogtreecommitdiff
path: root/ffmpeg/libavcodec/vp6.c
diff options
context:
space:
mode:
authorTim Redfern <tim@eclectronics.org>2013-12-29 12:19:38 +0000
committerTim Redfern <tim@eclectronics.org>2013-12-29 12:19:38 +0000
commitf7813a5324be39d13ab536c245d15dfc602a7849 (patch)
treefad99148b88823d34a5df2f0a25881a002eb291b /ffmpeg/libavcodec/vp6.c
parentb7a5a477b8ff4d4e3028b9dfb9a9df0a41463f92 (diff)
basic type mechanism working
Diffstat (limited to 'ffmpeg/libavcodec/vp6.c')
-rw-r--r--ffmpeg/libavcodec/vp6.c37
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)"),
};