Commit a2df5a50 authored by Michael Niedermayer's avatar Michael Niedermayer

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
parent 1cf9f514
...@@ -135,7 +135,7 @@ static inline void debug_idct(const char *format, ...) { } ...@@ -135,7 +135,7 @@ static inline void debug_idct(const char *format, ...) { }
#endif #endif
typedef struct Vp3Fragment { typedef struct Vp3Fragment {
DCTELEM coeffs[64]; DCTELEM *coeffs;
int coding_method; int coding_method;
int coeff_count; int coeff_count;
int last_coeff; int last_coeff;
...@@ -246,6 +246,7 @@ typedef struct Vp3DecodeContext { ...@@ -246,6 +246,7 @@ typedef struct Vp3DecodeContext {
int fragment_height; int fragment_height;
Vp3Fragment *all_fragments; Vp3Fragment *all_fragments;
DCTELEM *coeffs;
int u_fragment_start; int u_fragment_start;
int v_fragment_start; int v_fragment_start;
...@@ -825,11 +826,12 @@ static void unpack_token(GetBitContext *gb, int token, int *zero_run, ...@@ -825,11 +826,12 @@ static void unpack_token(GetBitContext *gb, int token, int *zero_run,
static void init_frame(Vp3DecodeContext *s, GetBitContext *gb) static void init_frame(Vp3DecodeContext *s, GetBitContext *gb)
{ {
int i; int i;
static const DCTELEM zero_block[64];
/* zero out all of the fragment information */ /* zero out all of the fragment information */
s->coded_fragment_list_index = 0; s->coded_fragment_list_index = 0;
for (i = 0; i < s->fragment_count; i++) { 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].coeff_count = 0;
s->all_fragments[i].last_coeff = 0; s->all_fragments[i].last_coeff = 0;
s->all_fragments[i].motion_x = 0xbeef; s->all_fragments[i].motion_x = 0xbeef;
...@@ -1278,6 +1280,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -1278,6 +1280,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
* the next phase */ * the next phase */
s->all_fragments[current_fragment].coding_method = s->all_fragments[current_fragment].coding_method =
MODE_INTER_NO_MV; 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] = s->coded_fragment_list[s->coded_fragment_list_index] =
current_fragment; current_fragment;
if ((current_fragment >= s->u_fragment_start) && if ((current_fragment >= s->u_fragment_start) &&
...@@ -1307,6 +1310,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -1307,6 +1310,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
* coding will be determined in next step */ * coding will be determined in next step */
s->all_fragments[current_fragment].coding_method = s->all_fragments[current_fragment].coding_method =
MODE_INTER_NO_MV; 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] = s->coded_fragment_list[s->coded_fragment_list_index] =
current_fragment; current_fragment;
if ((current_fragment >= s->u_fragment_start) && 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, ...@@ -2187,6 +2191,7 @@ av_log(s->avctx, AV_LOG_ERROR, " help! got beefy vector! (%X, %X)\n", motion_x,
dequantizer, dequantizer,
s->all_fragments[i].coeff_count, s->all_fragments[i].coeff_count,
output_samples); output_samples);
memset(s->all_fragments[i].coeffs, 0, 64*sizeof(DCTELEM));
if (s->all_fragments[i].coding_method == MODE_INTRA) { if (s->all_fragments[i].coding_method == MODE_INTRA) {
s->dsp.put_signed_pixels_clamped(output_samples, s->dsp.put_signed_pixels_clamped(output_samples,
output_plane + s->all_fragments[i].first_pixel, output_plane + s->all_fragments[i].first_pixel,
...@@ -2542,6 +2547,7 @@ static int vp3_decode_init(AVCodecContext *avctx) ...@@ -2542,6 +2547,7 @@ static int vp3_decode_init(AVCodecContext *avctx)
s->v_fragment_start); s->v_fragment_start);
s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment)); 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->coded_fragment_list = av_malloc(s->fragment_count * sizeof(int));
s->pixel_addresses_inited = 0; s->pixel_addresses_inited = 0;
...@@ -2809,6 +2815,7 @@ static int vp3_decode_end(AVCodecContext *avctx) ...@@ -2809,6 +2815,7 @@ static int vp3_decode_end(AVCodecContext *avctx)
Vp3DecodeContext *s = avctx->priv_data; Vp3DecodeContext *s = avctx->priv_data;
av_free(s->all_fragments); av_free(s->all_fragments);
av_free(s->coeffs);
av_free(s->coded_fragment_list); av_free(s->coded_fragment_list);
av_free(s->superblock_fragments); av_free(s->superblock_fragments);
av_free(s->superblock_macroblocks); av_free(s->superblock_macroblocks);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment