diff options
-rw-r--r-- | libavcodec/intrax8.c | 21 | ||||
-rw-r--r-- | libavcodec/intrax8.h | 7 | ||||
-rw-r--r-- | libavcodec/vc1_block.c | 5 | ||||
-rw-r--r-- | libavcodec/wmv2dec.c | 3 |
4 files changed, 21 insertions, 15 deletions
diff --git a/libavcodec/intrax8.c b/libavcodec/intrax8.c index d8bcad663b..d3916992fc 100644 --- a/libavcodec/intrax8.c +++ b/libavcodec/intrax8.c @@ -332,7 +332,7 @@ static int x8_setup_spatial_predictor(IntraX8Context *const w, const int chroma) int quant; w->dsp.setup_spatial_compensation(w->dest[chroma], s->sc.edge_emu_buffer, - s->current_picture.f->linesize[chroma > 0], + w->frame->linesize[chroma > 0], &range, &sum, w->edges); if (chroma) { w->orient = w->chroma_orient; @@ -668,7 +668,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma) dsp_x8_put_solidcolor(av_clip_uint8((dc_level * dc_quant + 4) >> 3), w->dest[chroma], - s->current_picture.f->linesize[!!chroma]); + w->frame->linesize[!!chroma]); goto block_placed; } @@ -693,15 +693,15 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma) if (w->flat_dc) { dsp_x8_put_solidcolor(w->predicted_dc, w->dest[chroma], - s->current_picture.f->linesize[!!chroma]); + w->frame->linesize[!!chroma]); } else { w->dsp.spatial_compensation[w->orient](s->sc.edge_emu_buffer, w->dest[chroma], - s->current_picture.f->linesize[!!chroma]); + w->frame->linesize[!!chroma]); } if (!zeros_only) w->wdsp.idct_add(w->dest[chroma], - s->current_picture.f->linesize[!!chroma], + w->frame->linesize[!!chroma], s->block[0]); block_placed: @@ -710,7 +710,7 @@ block_placed: if (w->loopfilter) { uint8_t *ptr = w->dest[chroma]; - int linesize = s->current_picture.f->linesize[!!chroma]; + int linesize = w->frame->linesize[!!chroma]; if (!((w->edges & 2) || (zeros_only && (w->orient | 4) == 4))) w->dsp.h_loop_filter(ptr, linesize, w->quant); @@ -776,8 +776,8 @@ av_cold void ff_intrax8_common_end(IntraX8Context *w) av_freep(&w->prediction_table); } -int ff_intrax8_decode_picture(IntraX8Context *const w, int dquant, - int quant_offset, int loopfilter) +int ff_intrax8_decode_picture(IntraX8Context *const w, Picture *pict, + int dquant, int quant_offset, int loopfilter) { MpegEncContext *const s = w->s; int mb_xy; @@ -786,6 +786,7 @@ int ff_intrax8_decode_picture(IntraX8Context *const w, int dquant, w->dquant = dquant; w->quant = dquant >> 1; w->qsum = quant_offset; + w->frame = pict->f; w->loopfilter = loopfilter; w->divide_quant_dc_luma = ((1 << 16) + (w->quant >> 1)) / w->quant; @@ -799,7 +800,7 @@ int ff_intrax8_decode_picture(IntraX8Context *const w, int dquant, x8_reset_vlc_tables(w); for (s->mb_y = 0; s->mb_y < s->mb_height * 2; s->mb_y++) { - x8_init_block_index(w, s->current_picture.f, s->mb_y); + x8_init_block_index(w, w->frame, s->mb_y); mb_xy = (s->mb_y >> 1) * s->mb_stride; for (s->mb_x = 0; s->mb_x < s->mb_width * 2; s->mb_x++) { @@ -828,7 +829,7 @@ int ff_intrax8_decode_picture(IntraX8Context *const w, int dquant, /* emulate MB info in the relevant tables */ s->mbskip_table[mb_xy] = 0; s->mbintra_table[mb_xy] = 1; - s->current_picture.qscale_table[mb_xy] = w->quant; + pict->qscale_table[mb_xy] = w->quant; mb_xy++; } w->dest[0] += 8; diff --git a/libavcodec/intrax8.h b/libavcodec/intrax8.h index ac31a5f16d..0fe38d0cc1 100644 --- a/libavcodec/intrax8.h +++ b/libavcodec/intrax8.h @@ -24,6 +24,7 @@ #include "idctdsp.h" #include "intrax8dsp.h" #include "wmv2dsp.h" +#include "mpegpicture.h" typedef struct IntraX8Context { VLC *j_ac_vlc[4]; // they point to the static j_mb_vlc @@ -46,6 +47,7 @@ typedef struct IntraX8Context { int dquant; int qsum; int loopfilter; + AVFrame *frame; // calculated per frame int quant_dc_chroma; @@ -88,11 +90,12 @@ void ff_intrax8_common_end(IntraX8Context *w); * This function does not use ff_mpv_decode_mb(). * lowres decoding is theoretically impossible. * @param w pointer to IntraX8Context + * @param pict the output Picture containing an AVFrame * @param dquant doubled quantizer, it would be odd in case of VC-1 halfpq==1. * @param quant_offset offset away from zero * @param loopfilter enable filter after decoding a block */ -int ff_intrax8_decode_picture(IntraX8Context *w, int quant, int halfpq, - int loopfilter); +int ff_intrax8_decode_picture(IntraX8Context *w, Picture *pict, + int quant, int halfpq, int loopfilter); #endif /* AVCODEC_INTRAX8_H */ diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index 3853251527..50c50c2cc6 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -2931,8 +2931,9 @@ void ff_vc1_decode_blocks(VC1Context *v) v->s.esc3_level_length = 0; if (v->x8_type) { - ff_intrax8_decode_picture(&v->x8, 2 * v->pq + v->halfpq, - v->pq * !v->pquantizer, v->s.loop_filter); + ff_intrax8_decode_picture(&v->x8, &v->s.current_picture, + 2 * v->pq + v->halfpq, v->pq * !v->pquantizer, + v->s.loop_filter); ff_er_add_slice(&v->s.er, 0, 0, (v->s.mb_x >> 1) - 1, (v->s.mb_y >> 1) - 1, diff --git a/libavcodec/wmv2dec.c b/libavcodec/wmv2dec.c index f0fe708a4e..4aef773808 100644 --- a/libavcodec/wmv2dec.c +++ b/libavcodec/wmv2dec.c @@ -219,7 +219,8 @@ int ff_wmv2_decode_secondary_picture_header(MpegEncContext *s) s->picture_number++; // FIXME ? if (w->j_type) { - ff_intrax8_decode_picture(&w->x8, 2 * s->qscale, (s->qscale - 1) | 1, + ff_intrax8_decode_picture(&w->x8, &s->current_picture, + 2 * s->qscale, (s->qscale - 1) | 1, s->loop_filter); ff_er_add_slice(&w->s.er, 0, 0, |