Browse Source

theora: support midstream reconfiguration

Fixes Ticket868

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
tags/n1.2
Michael Niedermayer 13 years ago
parent
commit
bc15fcb8cf
2 changed files with 37 additions and 0 deletions
  1. +1
    -0
      Changelog
  2. +36
    -0
      libavcodec/vp3.c

+ 1
- 0
Changelog View File

@@ -6,6 +6,7 @@ version <next>:
- SRTP support
- Error diffusion dither in Swscale
- Chained Ogg support
- Theora Midstream reconfiguration support


version 1.1:


+ 36
- 0
libavcodec/vp3.c View File

@@ -75,6 +75,10 @@ typedef struct Vp3Fragment {
/* special internal mode */
#define MODE_COPY 8

static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb);
static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb);


/* There are 6 preset schemes, plus a free-form scheme */
static const int ModeAlphabet[6][CODING_MODE_COUNT] =
{
@@ -292,6 +296,8 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx)
av_freep(&s->motion_val[1]);
av_freep(&s->edge_emu_buffer);

s->theora_tables = 0;

if (avctx->internal->is_copy)
return 0;

@@ -1912,16 +1918,46 @@ static int vp3_decode_frame(AVCodecContext *avctx,
Vp3DecodeContext *s = avctx->priv_data;
GetBitContext gb;
int i;
int ret;

init_get_bits(&gb, buf, buf_size * 8);

if (s->theora && get_bits1(&gb))
{
int type = get_bits(&gb, 7);
skip_bits_long(&gb, 6*8); /* "theora" */

if (type == 0) {
if (s->avctx->active_thread_type&FF_THREAD_FRAME) {
av_log(avctx, AV_LOG_ERROR, "midstream reconfiguration with multithreading is unsupported, try -threads 1\n");
return AVERROR_PATCHWELCOME;
}
vp3_decode_end(avctx);
ret = theora_decode_header(avctx, &gb);

if (ret < 0) {
vp3_decode_end(avctx);
} else
ret = vp3_decode_init(avctx);
return ret;
} else if (type == 2) {
ret = theora_decode_tables(avctx, &gb);
if (ret < 0) {
vp3_decode_end(avctx);
} else
ret = vp3_decode_init(avctx);
return ret;
}

av_log(avctx, AV_LOG_ERROR, "Header packet passed to frame decoder, skipping\n");
return -1;
}

s->keyframe = !get_bits1(&gb);
if (!s->all_fragments) {
av_log(avctx, AV_LOG_ERROR, "Data packet without prior valid headers\n");
return -1;
}
if (!s->theora)
skip_bits(&gb, 1);
for (i = 0; i < 3; i++)


Loading…
Cancel
Save