Commit 68127e1b authored by Vittorio Giovara's avatar Vittorio Giovara

intrax8: Keep a reference to the context idctdsp

Use it instead of the embedded mpegvideo one. Update init function
signature to load it directly from the callers.
parent 65127450
...@@ -1863,6 +1863,7 @@ error_resilience_select="me_cmp" ...@@ -1863,6 +1863,7 @@ error_resilience_select="me_cmp"
faandct_deps="faan fdctdsp" faandct_deps="faan fdctdsp"
faanidct_deps="faan idctdsp" faanidct_deps="faan idctdsp"
h264dsp_select="startcode" h264dsp_select="startcode"
intrax8_select="idctdsp"
mdct_select="fft" mdct_select="fft"
rdft_select="fft" rdft_select="fft"
me_cmp_select="fdctdsp idctdsp pixblockdsp" me_cmp_select="fdctdsp idctdsp pixblockdsp"
......
...@@ -492,7 +492,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction, ...@@ -492,7 +492,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction,
{ {
MpegEncContext *const s = w->s; MpegEncContext *const s = w->s;
int t; int t;
#define B(x, y) s->block[0][s->idsp.idct_permutation[(x) + (y) * 8]] #define B(x, y) s->block[0][w->idsp.idct_permutation[(x) + (y) * 8]]
#define T(x) ((x) * dc_level + 0x8000) >> 16; #define T(x) ((x) * dc_level + 0x8000) >> 16;
switch (direction) { switch (direction) {
case 0: case 0:
...@@ -704,7 +704,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma) ...@@ -704,7 +704,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
s->current_picture.f->linesize[!!chroma]); s->current_picture.f->linesize[!!chroma]);
} }
if (!zeros_only) if (!zeros_only)
s->idsp.idct_add(w->dest[chroma], w->idsp.idct_add(w->dest[chroma],
s->current_picture.f->linesize[!!chroma], s->current_picture.f->linesize[!!chroma],
s->block[0]); s->block[0]);
...@@ -743,12 +743,14 @@ static void x8_init_block_index(IntraX8Context *w, AVFrame *frame, int mb_y) ...@@ -743,12 +743,14 @@ static void x8_init_block_index(IntraX8Context *w, AVFrame *frame, int mb_y)
w->dest[2] += (mb_y & (~1)) * uvlinesize << 2; w->dest[2] += (mb_y & (~1)) * uvlinesize << 2;
} }
av_cold int ff_intrax8_common_init(IntraX8Context *w, MpegEncContext *const s) av_cold int ff_intrax8_common_init(IntraX8Context *w, IDCTDSPContext *idsp,
MpegEncContext *const s)
{ {
int ret = x8_vlc_init(); int ret = x8_vlc_init();
if (ret < 0) if (ret < 0)
return ret; return ret;
w->idsp = *idsp;
w->s = s; w->s = s;
// two rows, 2 blocks per cannon mb // two rows, 2 blocks per cannon mb
...@@ -756,11 +758,11 @@ av_cold int ff_intrax8_common_init(IntraX8Context *w, MpegEncContext *const s) ...@@ -756,11 +758,11 @@ av_cold int ff_intrax8_common_init(IntraX8Context *w, MpegEncContext *const s)
if (!w->prediction_table) if (!w->prediction_table)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
ff_init_scantable(s->idsp.idct_permutation, &w->scantable[0], ff_init_scantable(w->idsp.idct_permutation, &w->scantable[0],
ff_wmv1_scantable[0]); ff_wmv1_scantable[0]);
ff_init_scantable(s->idsp.idct_permutation, &w->scantable[1], ff_init_scantable(w->idsp.idct_permutation, &w->scantable[1],
ff_wmv1_scantable[2]); ff_wmv1_scantable[2]);
ff_init_scantable(s->idsp.idct_permutation, &w->scantable[2], ff_init_scantable(w->idsp.idct_permutation, &w->scantable[2],
ff_wmv1_scantable[3]); ff_wmv1_scantable[3]);
ff_intrax8dsp_init(&w->dsp); ff_intrax8dsp_init(&w->dsp);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "get_bits.h" #include "get_bits.h"
#include "mpegvideo.h" #include "mpegvideo.h"
#include "idctdsp.h"
#include "intrax8dsp.h" #include "intrax8dsp.h"
typedef struct IntraX8Context { typedef struct IntraX8Context {
...@@ -37,6 +38,7 @@ typedef struct IntraX8Context { ...@@ -37,6 +38,7 @@ typedef struct IntraX8Context {
// set by the caller codec // set by the caller codec
MpegEncContext *s; MpegEncContext *s;
IntraX8DSPContext dsp; IntraX8DSPContext dsp;
IDCTDSPContext idsp;
int quant; int quant;
int dquant; int dquant;
int qsum; int qsum;
...@@ -61,10 +63,12 @@ typedef struct IntraX8Context { ...@@ -61,10 +63,12 @@ typedef struct IntraX8Context {
* Initialize IntraX8 frame decoder. * Initialize IntraX8 frame decoder.
* Requires valid MpegEncContext with valid s->mb_width before calling. * Requires valid MpegEncContext with valid s->mb_width before calling.
* @param w pointer to IntraX8Context * @param w pointer to IntraX8Context
* @param idsp pointer to IDCTDSPContext
* @param s pointer to MpegEncContext of the parent codec * @param s pointer to MpegEncContext of the parent codec
* @return 0 on success, a negative AVERROR value on error * @return 0 on success, a negative AVERROR value on error
*/ */
int ff_intrax8_common_init(IntraX8Context *w, MpegEncContext *const s); int ff_intrax8_common_init(IntraX8Context *w, IDCTDSPContext *idsp,
MpegEncContext *const s);
/** /**
* Destroy IntraX8 frame structure. * Destroy IntraX8 frame structure.
......
...@@ -379,7 +379,7 @@ av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v) ...@@ -379,7 +379,7 @@ av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
} }
} }
ret = ff_intrax8_common_init(&v->x8, s); ret = ff_intrax8_common_init(&v->x8, &s->idsp, s);
if (ret < 0) if (ret < 0)
goto error; goto error;
......
...@@ -471,7 +471,7 @@ static av_cold int wmv2_decode_init(AVCodecContext *avctx) ...@@ -471,7 +471,7 @@ static av_cold int wmv2_decode_init(AVCodecContext *avctx)
ff_wmv2_common_init(w); ff_wmv2_common_init(w);
return ff_intrax8_common_init(&w->x8, &w->s); return ff_intrax8_common_init(&w->x8, &w->s.idsp, &w->s);
} }
static av_cold int wmv2_decode_end(AVCodecContext *avctx) static av_cold int wmv2_decode_end(AVCodecContext *avctx)
......
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