#include <string.h>
#include <unistd.h>
-#include "common.h"
#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.h"
#include "vp3data.h"
+#include "xiph.h"
#define FRAGMENT_PIXELS 8
int bounding_values_array[256];
} Vp3DecodeContext;
-static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb);
-
/************************************************************************
* VP3 specific functions
************************************************************************/
s->width = (avctx->width + 15) & 0xFFFFFFF0;
s->height = (avctx->height + 15) & 0xFFFFFFF0;
avctx->pix_fmt = PIX_FMT_YUV420P;
- avctx->has_b_frames = 0;
if(avctx->idct_algo==FF_IDCT_AUTO)
avctx->idct_algo=FF_IDCT_VP3;
dsputil_init(&s->dsp, avctx);
if (s->theora && get_bits1(&gb))
{
-#if 1
av_log(avctx, AV_LOG_ERROR, "Header packet passed to frame decoder, skipping\n");
return -1;
-#else
- int ptype = get_bits(&gb, 7);
-
- skip_bits(&gb, 6*8); /* "theora" */
-
- switch(ptype)
- {
- case 1:
- theora_decode_comments(avctx, &gb);
- break;
- case 2:
- theora_decode_tables(avctx, &gb);
- init_dequantizer(s);
- break;
- default:
- av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype);
- }
- return buf_size;
-#endif
}
s->keyframe = !get_bits1(&gb);
return 0;
}
+#ifdef CONFIG_THEORA_DECODER
static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
{
Vp3DecodeContext *s = avctx->priv_data;
+ int visible_width, visible_height;
s->theora = get_bits_long(gb, 24);
av_log(avctx, AV_LOG_INFO, "Theora bitstream version %X\n", s->theora);
skip_bits(gb, 32); /* total number of blocks in a frame */
skip_bits(gb, 4); /* total number of blocks in a frame */
skip_bits(gb, 32); /* total number of macroblocks in a frame */
-
- skip_bits(gb, 24); /* frame width */
- skip_bits(gb, 24); /* frame height */
- }
- else
- {
- skip_bits(gb, 24); /* frame width */
- skip_bits(gb, 24); /* frame height */
}
- if (s->theora >= 0x030200) {
- skip_bits(gb, 8); /* offset x */
- skip_bits(gb, 8); /* offset y */
- }
+ visible_width = get_bits_long(gb, 24);
+ visible_height = get_bits_long(gb, 24);
+
+ if (s->theora >= 0x030200) {
+ skip_bits(gb, 8); /* offset x */
+ skip_bits(gb, 8); /* offset y */
+ }
skip_bits(gb, 32); /* fps numerator */
skip_bits(gb, 32); /* fps denumerator */
// align_get_bits(gb);
- avctx->width = s->width;
- avctx->height = s->height;
+ if ( visible_width <= s->width && visible_width > s->width-16
+ && visible_height <= s->height && visible_height > s->height-16)
+ avcodec_set_dimensions(avctx, visible_width, visible_height);
+ else
+ avcodec_set_dimensions(avctx, s->width, s->height);
return 0;
}
Vp3DecodeContext *s = avctx->priv_data;
GetBitContext gb;
int ptype;
- uint8_t *p= avctx->extradata;
- int op_bytes, i;
+ uint8_t *header_start[3];
+ int header_len[3];
+ int i;
s->theora = 1;
return -1;
}
- for(i=0;i<3;i++) {
- op_bytes = *(p++)<<8;
- op_bytes += *(p++);
+ if (ff_split_xiph_headers(avctx->extradata, avctx->extradata_size,
+ 42, header_start, header_len) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Corrupt extradata\n");
+ return -1;
+ }
- init_get_bits(&gb, p, op_bytes);
- p += op_bytes;
+ for(i=0;i<3;i++) {
+ init_get_bits(&gb, header_start[i], header_len[i]);
ptype = get_bits(&gb, 8);
debug_vp3("Theora headerpacket type: %x\n", ptype);
av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype&~0x80);
break;
}
- if(8*op_bytes != get_bits_count(&gb))
- av_log(avctx, AV_LOG_ERROR, "%d bits left in packet %X\n", 8*op_bytes - get_bits_count(&gb), ptype);
+ if(8*header_len[i] != get_bits_count(&gb))
+ av_log(avctx, AV_LOG_ERROR, "%d bits left in packet %X\n", 8*header_len[i] - get_bits_count(&gb), ptype);
if (s->theora < 0x030200)
break;
}
return 0;
}
-AVCodec vp3_decoder = {
- "vp3",
+AVCodec theora_decoder = {
+ "theora",
CODEC_TYPE_VIDEO,
- CODEC_ID_VP3,
+ CODEC_ID_THEORA,
sizeof(Vp3DecodeContext),
- vp3_decode_init,
+ theora_decode_init,
NULL,
vp3_decode_end,
vp3_decode_frame,
0,
NULL
};
+#endif
-AVCodec theora_decoder = {
- "theora",
+AVCodec vp3_decoder = {
+ "vp3",
CODEC_TYPE_VIDEO,
- CODEC_ID_THEORA,
+ CODEC_ID_VP3,
sizeof(Vp3DecodeContext),
- theora_decode_init,
+ vp3_decode_init,
NULL,
vp3_decode_end,
vp3_decode_frame,