theora: support midstream reconfiguration
Fixes Ticket868 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
7cb27d216d
commit
bc15fcb8cf
@ -6,6 +6,7 @@ version <next>:
|
|||||||
- SRTP support
|
- SRTP support
|
||||||
- Error diffusion dither in Swscale
|
- Error diffusion dither in Swscale
|
||||||
- Chained Ogg support
|
- Chained Ogg support
|
||||||
|
- Theora Midstream reconfiguration support
|
||||||
|
|
||||||
|
|
||||||
version 1.1:
|
version 1.1:
|
||||||
|
@ -75,6 +75,10 @@ typedef struct Vp3Fragment {
|
|||||||
/* special internal mode */
|
/* special internal mode */
|
||||||
#define MODE_COPY 8
|
#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 */
|
/* There are 6 preset schemes, plus a free-form scheme */
|
||||||
static const int ModeAlphabet[6][CODING_MODE_COUNT] =
|
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->motion_val[1]);
|
||||||
av_freep(&s->edge_emu_buffer);
|
av_freep(&s->edge_emu_buffer);
|
||||||
|
|
||||||
|
s->theora_tables = 0;
|
||||||
|
|
||||||
if (avctx->internal->is_copy)
|
if (avctx->internal->is_copy)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1912,16 +1918,46 @@ static int vp3_decode_frame(AVCodecContext *avctx,
|
|||||||
Vp3DecodeContext *s = avctx->priv_data;
|
Vp3DecodeContext *s = avctx->priv_data;
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
init_get_bits(&gb, buf, buf_size * 8);
|
init_get_bits(&gb, buf, buf_size * 8);
|
||||||
|
|
||||||
if (s->theora && get_bits1(&gb))
|
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");
|
av_log(avctx, AV_LOG_ERROR, "Header packet passed to frame decoder, skipping\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->keyframe = !get_bits1(&gb);
|
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)
|
if (!s->theora)
|
||||||
skip_bits(&gb, 1);
|
skip_bits(&gb, 1);
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user