intrax8: Pass the output frame to the decoding function
authorVittorio Giovara <vittorio.giovara@gmail.com>
Sat, 20 Feb 2016 01:33:12 +0000 (20:33 -0500)
committerVittorio Giovara <vittorio.giovara@gmail.com>
Fri, 25 Mar 2016 19:53:02 +0000 (15:53 -0400)
Helps in decoupling this code from mpegvideo.

libavcodec/intrax8.c
libavcodec/intrax8.h
libavcodec/vc1_block.c
libavcodec/wmv2dec.c

index a3e21a3..a05c533 100644 (file)
@@ -336,7 +336,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;
@@ -672,7 +672,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;
         }
@@ -697,15 +697,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->idsp.idct_add(w->dest[chroma],
-                         s->current_picture.f->linesize[!!chroma],
+                         w->frame->linesize[!!chroma],
                          s->block[0]);
 
 block_placed:
@@ -714,7 +714,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);
@@ -775,8 +775,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;
index f73cfcd..f087b9f 100644 (file)
@@ -23,6 +23,7 @@
 #include "mpegvideo.h"
 #include "idctdsp.h"
 #include "intrax8dsp.h"
+#include "mpegpicture.h"
 
 typedef struct IntraX8Context {
     VLC *j_ac_vlc[4]; // they point to the static j_mb_vlc
@@ -43,6 +44,7 @@ typedef struct IntraX8Context {
     int dquant;
     int qsum;
     int loopfilter;
+    AVFrame *frame;
 
     // calculated per frame
     int quant_dc_chroma;
@@ -84,11 +86,12 @@ void ff_intrax8_common_end(IntraX8Context *w);
  * The parent codec must call ff_mpv_frame_end() after calling this function.
  * This function does not use ff_mpv_decode_mb().
  * @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 */
index 4dab0ef..0a4531a 100644 (file)
@@ -3022,8 +3022,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,
index 738d33d..9cd7017 100644 (file)
@@ -228,7 +228,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,