[FFmpeg-devel] [PATCH 5/6] vp3: Move table allocation code into a new function
Alexander Strange
astrange
Mon Nov 15 14:37:05 CET 2010
---
libavcodec/vp3.c | 56 +++++++++++++++++++++++++++++++----------------------
1 files changed, 33 insertions(+), 23 deletions(-)
diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index ead4dd9..8bf5cc5 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -1511,6 +1511,38 @@ static void render_slice(Vp3DecodeContext *s, int slice)
vp3_draw_horiz_band(s, FFMIN((32 << s->chroma_y_shift) * (slice + 1) -16, s->height-16));
}
+/// Allocate tables for per-frame data in Vp3DecodeContext
+static av_cold int allocate_tables(AVCodecContext *avctx)
+{
+ Vp3DecodeContext *s = avctx->priv_data;
+ int y_fragment_count, c_fragment_count;
+
+ y_fragment_count = s->fragment_width[0] * s->fragment_height[0];
+ c_fragment_count = s->fragment_width[1] * s->fragment_height[1];
+
+ s->superblock_coding = av_malloc(s->superblock_count);
+ s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment));
+ s->coded_fragment_list[0] = av_malloc(s->fragment_count * sizeof(int));
+ s->dct_tokens_base = av_malloc(64*s->fragment_count * sizeof(*s->dct_tokens_base));
+ s->motion_val[0] = av_malloc(y_fragment_count * sizeof(*s->motion_val[0]));
+ s->motion_val[1] = av_malloc(c_fragment_count * sizeof(*s->motion_val[1]));
+
+ /* work out the block mapping tables */
+ s->superblock_fragments = av_malloc(s->superblock_count * 16 * sizeof(int));
+ s->macroblock_coding = av_malloc(s->macroblock_count + 1);
+
+ if (!s->superblock_coding || !s->all_fragments || !s->dct_tokens_base ||
+ !s->coded_fragment_list[0] || !s->superblock_fragments || !s->macroblock_coding ||
+ !s->motion_val[0] || !s->motion_val[1]) {
+ vp3_decode_end(avctx);
+ return -1;
+ }
+
+ init_block_mapping(s);
+
+ return 0;
+}
+
/*
* This is the ffmpeg/libavcodec API init function.
*/
@@ -1560,7 +1592,6 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
s->superblock_count = s->y_superblock_count + (s->c_superblock_count * 2);
s->u_superblock_start = s->y_superblock_count;
s->v_superblock_start = s->u_superblock_start + s->c_superblock_count;
- s->superblock_coding = av_malloc(s->superblock_count);
s->macroblock_width = (s->width + 15) / 16;
s->macroblock_height = (s->height + 15) / 16;
@@ -1578,18 +1609,6 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
s->fragment_start[1] = y_fragment_count;
s->fragment_start[2] = y_fragment_count + c_fragment_count;
- s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment));
- s->coded_fragment_list[0] = av_malloc(s->fragment_count * sizeof(int));
- s->dct_tokens_base = av_malloc(64*s->fragment_count * sizeof(*s->dct_tokens_base));
- s->motion_val[0] = av_malloc(y_fragment_count * sizeof(*s->motion_val[0]));
- s->motion_val[1] = av_malloc(c_fragment_count * sizeof(*s->motion_val[1]));
-
- if (!s->superblock_coding || !s->all_fragments || !s->dct_tokens_base ||
- !s->coded_fragment_list[0] || !s->motion_val[0] || !s->motion_val[1]) {
- vp3_decode_end(avctx);
- return -1;
- }
-
if (!s->theora_tables)
{
for (i = 0; i < 64; i++) {
@@ -1689,22 +1708,13 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
&motion_vector_vlc_table[0][1], 2, 1,
&motion_vector_vlc_table[0][0], 2, 1, 0);
- /* work out the block mapping tables */
- s->superblock_fragments = av_malloc(s->superblock_count * 16 * sizeof(int));
- s->macroblock_coding = av_malloc(s->macroblock_count + 1);
- if (!s->superblock_fragments || !s->macroblock_coding) {
- vp3_decode_end(avctx);
- return -1;
- }
- init_block_mapping(s);
-
for (i = 0; i < 3; i++) {
s->current_frame.data[i] = NULL;
s->last_frame.data[i] = NULL;
s->golden_frame.data[i] = NULL;
}
- return 0;
+ return allocate_tables(avctx);
vlc_fail:
av_log(avctx, AV_LOG_FATAL, "Invalid huffman table\n");
--
1.7.3.1
More information about the ffmpeg-devel
mailing list