#include <string.h>
#include "libavutil/imgutils.h"
+#include "libavutil/mem_internal.h"
#include "avcodec.h"
#include "get_bits.h"
return 0;
}
-static av_cold int theora_init_huffman_tables(VLC *vlc, const HuffTable *huff)
-{
- uint32_t code = 0, codes[32];
-
- for (unsigned i = 0; i < huff->nb_entries; i++) {
- codes[i] = code >> (31 - huff->entries[i].len);
- code += 0x80000000U >> huff->entries[i].len;
- }
- return ff_init_vlc_sparse(vlc, 11, huff->nb_entries,
- &huff->entries[0].len, sizeof(huff->entries[0]), 1,
- codes, 4, 4,
- &huff->entries[0].sym, sizeof(huff->entries[0]), 1, 0);
-}
-
static av_cold int vp3_decode_init(AVCodecContext *avctx)
{
Vp3DecodeContext *s = avctx->priv_data;
}
} else {
for (i = 0; i < FF_ARRAY_ELEMS(s->coeff_vlc); i++) {
- ret = theora_init_huffman_tables(&s->coeff_vlc[i], &s->huffman_table[i]);
+ const HuffTable *tab = &s->huffman_table[i];
+
+ ret = ff_init_vlc_from_lengths(&s->coeff_vlc[i], 11, tab->nb_entries,
+ &tab->entries[0].len, sizeof(*tab->entries),
+ &tab->entries[0].sym, sizeof(*tab->entries), 1,
+ 0, 0, avctx);
if (ret < 0)
return ret;
}
int ret;
AVRational fps, aspect;
+ if (get_bits_left(gb) < 206)
+ return AVERROR_INVALIDDATA;
+
s->theora_header = 0;
s->theora = get_bits(gb, 24);
av_log(avctx, AV_LOG_DEBUG, "Theora bitstream version %X\n", s->theora);
return vp3_decode_init(avctx);
}
-AVCodec ff_theora_decoder = {
+const AVCodec ff_theora_decoder = {
.name = "theora",
.long_name = NULL_IF_CONFIG_SMALL("Theora"),
.type = AVMEDIA_TYPE_VIDEO,
};
#endif
-AVCodec ff_vp3_decoder = {
+const AVCodec ff_vp3_decoder = {
.name = "vp3",
.long_name = NULL_IF_CONFIG_SMALL("On2 VP3"),
.type = AVMEDIA_TYPE_VIDEO,
};
#if CONFIG_VP4_DECODER
-AVCodec ff_vp4_decoder = {
+const AVCodec ff_vp4_decoder = {
.name = "vp4",
.long_name = NULL_IF_CONFIG_SMALL("On2 VP4"),
.type = AVMEDIA_TYPE_VIDEO,