mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-10-10 19:09:55 +02:00
vp3: Reorder some functions to fix VP3 build with Theora disabled.
This commit is contained in:
parent
19277d9335
commit
bc4d156140
151
libavcodec/vp3.c
151
libavcodec/vp3.c
@ -45,9 +45,6 @@
|
|||||||
|
|
||||||
#define FRAGMENT_PIXELS 8
|
#define FRAGMENT_PIXELS 8
|
||||||
|
|
||||||
static av_cold int vp3_decode_end(AVCodecContext *avctx);
|
|
||||||
static void vp3_decode_flush(AVCodecContext *avctx);
|
|
||||||
|
|
||||||
//FIXME split things out into their own arrays
|
//FIXME split things out into their own arrays
|
||||||
typedef struct Vp3Fragment {
|
typedef struct Vp3Fragment {
|
||||||
int16_t dc;
|
int16_t dc;
|
||||||
@ -256,6 +253,63 @@ typedef struct Vp3DecodeContext {
|
|||||||
* VP3 specific functions
|
* VP3 specific functions
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
static void vp3_decode_flush(AVCodecContext *avctx)
|
||||||
|
{
|
||||||
|
Vp3DecodeContext *s = avctx->priv_data;
|
||||||
|
|
||||||
|
if (s->golden_frame.data[0]) {
|
||||||
|
if (s->golden_frame.data[0] == s->last_frame.data[0])
|
||||||
|
memset(&s->last_frame, 0, sizeof(AVFrame));
|
||||||
|
if (s->current_frame.data[0] == s->golden_frame.data[0])
|
||||||
|
memset(&s->current_frame, 0, sizeof(AVFrame));
|
||||||
|
ff_thread_release_buffer(avctx, &s->golden_frame);
|
||||||
|
}
|
||||||
|
if (s->last_frame.data[0]) {
|
||||||
|
if (s->current_frame.data[0] == s->last_frame.data[0])
|
||||||
|
memset(&s->current_frame, 0, sizeof(AVFrame));
|
||||||
|
ff_thread_release_buffer(avctx, &s->last_frame);
|
||||||
|
}
|
||||||
|
if (s->current_frame.data[0])
|
||||||
|
ff_thread_release_buffer(avctx, &s->current_frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
static av_cold int vp3_decode_end(AVCodecContext *avctx)
|
||||||
|
{
|
||||||
|
Vp3DecodeContext *s = avctx->priv_data;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
av_free(s->superblock_coding);
|
||||||
|
av_free(s->all_fragments);
|
||||||
|
av_free(s->coded_fragment_list[0]);
|
||||||
|
av_free(s->dct_tokens_base);
|
||||||
|
av_free(s->superblock_fragments);
|
||||||
|
av_free(s->macroblock_coding);
|
||||||
|
av_free(s->motion_val[0]);
|
||||||
|
av_free(s->motion_val[1]);
|
||||||
|
av_free(s->edge_emu_buffer);
|
||||||
|
|
||||||
|
if (avctx->internal->is_copy)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
free_vlc(&s->dc_vlc[i]);
|
||||||
|
free_vlc(&s->ac_vlc_1[i]);
|
||||||
|
free_vlc(&s->ac_vlc_2[i]);
|
||||||
|
free_vlc(&s->ac_vlc_3[i]);
|
||||||
|
free_vlc(&s->ac_vlc_4[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free_vlc(&s->superblock_run_length_vlc);
|
||||||
|
free_vlc(&s->fragment_run_length_vlc);
|
||||||
|
free_vlc(&s->mode_code_vlc);
|
||||||
|
free_vlc(&s->motion_vector_vlc);
|
||||||
|
|
||||||
|
/* release all frames */
|
||||||
|
vp3_decode_flush(avctx);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function sets up all of the various blocks mappings:
|
* This function sets up all of the various blocks mappings:
|
||||||
* superblocks <-> fragments, macroblocks <-> fragments,
|
* superblocks <-> fragments, macroblocks <-> fragments,
|
||||||
@ -1995,43 +2049,6 @@ error:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_cold int vp3_decode_end(AVCodecContext *avctx)
|
|
||||||
{
|
|
||||||
Vp3DecodeContext *s = avctx->priv_data;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
av_free(s->superblock_coding);
|
|
||||||
av_free(s->all_fragments);
|
|
||||||
av_free(s->coded_fragment_list[0]);
|
|
||||||
av_free(s->dct_tokens_base);
|
|
||||||
av_free(s->superblock_fragments);
|
|
||||||
av_free(s->macroblock_coding);
|
|
||||||
av_free(s->motion_val[0]);
|
|
||||||
av_free(s->motion_val[1]);
|
|
||||||
av_free(s->edge_emu_buffer);
|
|
||||||
|
|
||||||
if (avctx->internal->is_copy)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++) {
|
|
||||||
free_vlc(&s->dc_vlc[i]);
|
|
||||||
free_vlc(&s->ac_vlc_1[i]);
|
|
||||||
free_vlc(&s->ac_vlc_2[i]);
|
|
||||||
free_vlc(&s->ac_vlc_3[i]);
|
|
||||||
free_vlc(&s->ac_vlc_4[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
free_vlc(&s->superblock_run_length_vlc);
|
|
||||||
free_vlc(&s->fragment_run_length_vlc);
|
|
||||||
free_vlc(&s->mode_code_vlc);
|
|
||||||
free_vlc(&s->motion_vector_vlc);
|
|
||||||
|
|
||||||
/* release all frames */
|
|
||||||
vp3_decode_flush(avctx);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb)
|
static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb)
|
||||||
{
|
{
|
||||||
Vp3DecodeContext *s = avctx->priv_data;
|
Vp3DecodeContext *s = avctx->priv_data;
|
||||||
@ -2066,6 +2083,23 @@ static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vp3_init_thread_copy(AVCodecContext *avctx)
|
||||||
|
{
|
||||||
|
Vp3DecodeContext *s = avctx->priv_data;
|
||||||
|
|
||||||
|
s->superblock_coding = NULL;
|
||||||
|
s->all_fragments = NULL;
|
||||||
|
s->coded_fragment_list[0] = NULL;
|
||||||
|
s->dct_tokens_base = NULL;
|
||||||
|
s->superblock_fragments = NULL;
|
||||||
|
s->macroblock_coding = NULL;
|
||||||
|
s->motion_val[0] = NULL;
|
||||||
|
s->motion_val[1] = NULL;
|
||||||
|
s->edge_emu_buffer = NULL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#if CONFIG_THEORA_DECODER
|
#if CONFIG_THEORA_DECODER
|
||||||
static const enum PixelFormat theora_pix_fmts[4] = {
|
static const enum PixelFormat theora_pix_fmts[4] = {
|
||||||
PIX_FMT_YUV420P, PIX_FMT_NONE, PIX_FMT_YUV422P, PIX_FMT_YUV444P
|
PIX_FMT_YUV420P, PIX_FMT_NONE, PIX_FMT_YUV422P, PIX_FMT_YUV444P
|
||||||
@ -2327,43 +2361,6 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
|
|||||||
return vp3_decode_init(avctx);
|
return vp3_decode_init(avctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vp3_decode_flush(AVCodecContext *avctx)
|
|
||||||
{
|
|
||||||
Vp3DecodeContext *s = avctx->priv_data;
|
|
||||||
|
|
||||||
if (s->golden_frame.data[0]) {
|
|
||||||
if (s->golden_frame.data[0] == s->last_frame.data[0])
|
|
||||||
memset(&s->last_frame, 0, sizeof(AVFrame));
|
|
||||||
if (s->current_frame.data[0] == s->golden_frame.data[0])
|
|
||||||
memset(&s->current_frame, 0, sizeof(AVFrame));
|
|
||||||
ff_thread_release_buffer(avctx, &s->golden_frame);
|
|
||||||
}
|
|
||||||
if (s->last_frame.data[0]) {
|
|
||||||
if (s->current_frame.data[0] == s->last_frame.data[0])
|
|
||||||
memset(&s->current_frame, 0, sizeof(AVFrame));
|
|
||||||
ff_thread_release_buffer(avctx, &s->last_frame);
|
|
||||||
}
|
|
||||||
if (s->current_frame.data[0])
|
|
||||||
ff_thread_release_buffer(avctx, &s->current_frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vp3_init_thread_copy(AVCodecContext *avctx)
|
|
||||||
{
|
|
||||||
Vp3DecodeContext *s = avctx->priv_data;
|
|
||||||
|
|
||||||
s->superblock_coding = NULL;
|
|
||||||
s->all_fragments = NULL;
|
|
||||||
s->coded_fragment_list[0] = NULL;
|
|
||||||
s->dct_tokens_base = NULL;
|
|
||||||
s->superblock_fragments = NULL;
|
|
||||||
s->macroblock_coding = NULL;
|
|
||||||
s->motion_val[0] = NULL;
|
|
||||||
s->motion_val[1] = NULL;
|
|
||||||
s->edge_emu_buffer = NULL;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
AVCodec ff_theora_decoder = {
|
AVCodec ff_theora_decoder = {
|
||||||
.name = "theora",
|
.name = "theora",
|
||||||
.type = AVMEDIA_TYPE_VIDEO,
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
|
Loading…
Reference in New Issue
Block a user