From a2df5a50ae1076b2e6225789c1f34fcaa555591c Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 17 May 2005 00:52:29 +0000 Subject: clear blocks after each idct instead of per picture dont store the all zero coefficients of skiped blocks Originally committed as revision 4253 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/vp3.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'libavcodec/vp3.c') diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index fc850bb40a..7202388f39 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -135,7 +135,7 @@ static inline void debug_idct(const char *format, ...) { } #endif typedef struct Vp3Fragment { - DCTELEM coeffs[64]; + DCTELEM *coeffs; int coding_method; int coeff_count; int last_coeff; @@ -246,6 +246,7 @@ typedef struct Vp3DecodeContext { int fragment_height; Vp3Fragment *all_fragments; + DCTELEM *coeffs; int u_fragment_start; int v_fragment_start; @@ -825,11 +826,12 @@ static void unpack_token(GetBitContext *gb, int token, int *zero_run, static void init_frame(Vp3DecodeContext *s, GetBitContext *gb) { int i; + static const DCTELEM zero_block[64]; /* zero out all of the fragment information */ s->coded_fragment_list_index = 0; for (i = 0; i < s->fragment_count; i++) { - memset(s->all_fragments[i].coeffs, 0, 64 * sizeof(DCTELEM)); + s->all_fragments[i].coeffs = zero_block; s->all_fragments[i].coeff_count = 0; s->all_fragments[i].last_coeff = 0; s->all_fragments[i].motion_x = 0xbeef; @@ -1278,6 +1280,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) * the next phase */ s->all_fragments[current_fragment].coding_method = MODE_INTER_NO_MV; + s->all_fragments[current_fragment].coeffs= s->coeffs + 64*s->coded_fragment_list_index; s->coded_fragment_list[s->coded_fragment_list_index] = current_fragment; if ((current_fragment >= s->u_fragment_start) && @@ -1307,6 +1310,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) * coding will be determined in next step */ s->all_fragments[current_fragment].coding_method = MODE_INTER_NO_MV; + s->all_fragments[current_fragment].coeffs= s->coeffs + 64*s->coded_fragment_list_index; s->coded_fragment_list[s->coded_fragment_list_index] = current_fragment; if ((current_fragment >= s->u_fragment_start) && @@ -2187,6 +2191,7 @@ av_log(s->avctx, AV_LOG_ERROR, " help! got beefy vector! (%X, %X)\n", motion_x, dequantizer, s->all_fragments[i].coeff_count, output_samples); + memset(s->all_fragments[i].coeffs, 0, 64*sizeof(DCTELEM)); if (s->all_fragments[i].coding_method == MODE_INTRA) { s->dsp.put_signed_pixels_clamped(output_samples, output_plane + s->all_fragments[i].first_pixel, @@ -2542,6 +2547,7 @@ static int vp3_decode_init(AVCodecContext *avctx) s->v_fragment_start); s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment)); + s->coeffs = av_malloc(s->fragment_count * sizeof(DCTELEM) * 64); s->coded_fragment_list = av_malloc(s->fragment_count * sizeof(int)); s->pixel_addresses_inited = 0; @@ -2809,6 +2815,7 @@ static int vp3_decode_end(AVCodecContext *avctx) Vp3DecodeContext *s = avctx->priv_data; av_free(s->all_fragments); + av_free(s->coeffs); av_free(s->coded_fragment_list); av_free(s->superblock_fragments); av_free(s->superblock_macroblocks); -- cgit v1.2.3