FFmpeg
Macros | Functions
ivi_dsp.c File Reference

DSP functions (inverse transforms, motion compensation, wavelet recompositions) for Indeo Video Interactive codecs. More...

#include "avcodec.h"
#include "ivi.h"
#include "ivi_dsp.h"

Macros

#define IVI_HAAR_BFLY(s1, s2, o1, o2, t)
 butterfly operation for the inverse Haar transform More...
 
#define INV_HAAR8(s1, s5, s3, s7, s2, s4, s6, s8, d1, d2, d3, d4, d5, d6, d7, d8, t0, t1, t2, t3, t4, t5, t6, t7, t8)
 inverse 8-point Haar transform More...
 
#define INV_HAAR4(s1, s3, s5, s7, d1, d2, d3, d4, t0, t1, t2, t3, t4)
 inverse 4-point Haar transform More...
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (x)
 
#define IVI_SLANT_BFLY(s1, s2, o1, o2, t)
 butterfly operation for the inverse slant transform More...
 
#define IVI_IREFLECT(s1, s2, o1, o2, t)
 This is a reflection a,b = 1/2, 5/4 for the inverse slant transform. More...
 
#define IVI_SLANT_PART4(s1, s2, o1, o2, t)
 This is a reflection a,b = 1/2, 7/8 for the inverse slant transform. More...
 
#define IVI_INV_SLANT8(s1, s4, s8, s5, s2, s6, s3, s7, d1, d2, d3, d4, d5, d6, d7, d8, t0, t1, t2, t3, t4, t5, t6, t7, t8)
 inverse slant8 transform More...
 
#define IVI_INV_SLANT4(s1, s4, s2, s3, d1, d2, d3, d4, t0, t1, t2, t3, t4)
 inverse slant4 transform More...
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (((x) + 1)>>1)
 
#define COMPENSATE(x)   (x)
 
#define COMPENSATE(x)   (((x) + 1)>>1)
 
#define COMPENSATE(x)   (((x) + 1)>>1)
 
#define COMPENSATE(x)   (((x) + 1)>>1)
 
#define COMPENSATE(x)   (((x) + 1)>>1)
 
#define COMPENSATE(x)   (((x) + 1)>>1)
 
#define IVI_MC_TEMPLATE(size, suffix, OP)
 
#define IVI_MC_AVG_TEMPLATE(size, suffix, OP)
 
#define OP_PUT(a, b)   (a) = (b)
 
#define OP_ADD(a, b)   (a) += (b)
 

Functions

void ff_ivi_recompose53 (const IVIPlaneDesc *plane, uint8_t *dst, const ptrdiff_t dst_pitch)
 5/3 wavelet recomposition filter for Indeo5 More...
 
void ff_ivi_recompose_haar (const IVIPlaneDesc *plane, uint8_t *dst, const ptrdiff_t dst_pitch)
 Haar wavelet recomposition filter for Indeo 4. More...
 
void ff_ivi_inverse_haar_8x8 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 two-dimensional inverse Haar 8x8 transform for Indeo 4 More...
 
void ff_ivi_row_haar8 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 one-dimensional inverse 8-point Haar transform on rows for Indeo 4 More...
 
void ff_ivi_col_haar8 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 one-dimensional inverse 8-point Haar transform on columns for Indeo 4 More...
 
void ff_ivi_inverse_haar_4x4 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 two-dimensional inverse Haar 4x4 transform for Indeo 4 More...
 
void ff_ivi_row_haar4 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 one-dimensional inverse 4-point Haar transform on rows for Indeo 4 More...
 
void ff_ivi_col_haar4 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 one-dimensional inverse 4-point Haar transform on columns for Indeo 4 More...
 
void ff_ivi_dc_haar_2d (const int32_t *in, int16_t *out, ptrdiff_t pitch, int blk_size)
 DC-only two-dimensional inverse Haar transform for Indeo 4. More...
 
void ff_ivi_inverse_slant_8x8 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 two-dimensional inverse slant 8x8 transform More...
 
void ff_ivi_inverse_slant_4x4 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 two-dimensional inverse slant 4x4 transform More...
 
void ff_ivi_dc_slant_2d (const int32_t *in, int16_t *out, ptrdiff_t pitch, int blk_size)
 DC-only two-dimensional inverse slant transform. More...
 
void ff_ivi_row_slant8 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 inverse 1D row slant transform More...
 
void ff_ivi_dc_row_slant (const int32_t *in, int16_t *out, ptrdiff_t pitch, int blk_size)
 DC-only inverse row slant transform.
 
void ff_ivi_col_slant8 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 inverse 1D column slant transform More...
 
void ff_ivi_dc_col_slant (const int32_t *in, int16_t *out, ptrdiff_t pitch, int blk_size)
 DC-only inverse column slant transform.
 
void ff_ivi_row_slant4 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 inverse 1D row slant transform More...
 
void ff_ivi_col_slant4 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 inverse 1D column slant transform More...
 
void ff_ivi_put_pixels_8x8 (const int32_t *in, int16_t *out, ptrdiff_t pitch, const uint8_t *flags)
 Copy the pixels into the frame buffer.
 
void ff_ivi_put_dc_pixel_8x8 (const int32_t *in, int16_t *out, ptrdiff_t pitch, int blk_size)
 Copy the DC coefficient into the first pixel of the block and zero all others.
 

Detailed Description

DSP functions (inverse transforms, motion compensation, wavelet recompositions) for Indeo Video Interactive codecs.

Macro Definition Documentation

§ INV_HAAR4

#define INV_HAAR4 (   s1,
  s3,
  s5,
  s7,
  d1,
  d2,
  d3,
  d4,
  t0,
  t1,
  t2,
  t3,
  t4 
)
Value:
{\
IVI_HAAR_BFLY(s1, s3, t0, t1, t4);\
IVI_HAAR_BFLY(t0, s5, t2, t3, t4);\
d1 = COMPENSATE(t2);\
d2 = COMPENSATE(t3);\
IVI_HAAR_BFLY(t1, s7, t2, t3, t4);\
d3 = COMPENSATE(t2);\
d4 = COMPENSATE(t3); }

inverse 4-point Haar transform

§ INV_HAAR8

#define INV_HAAR8 (   s1,
  s5,
  s3,
  s7,
  s2,
  s4,
  s6,
  s8,
  d1,
  d2,
  d3,
  d4,
  d5,
  d6,
  d7,
  d8,
  t0,
  t1,
  t2,
  t3,
  t4,
  t5,
  t6,
  t7,
  t8 
)
Value:
{\
t1 = (s1) * 2; t5 = (s5) * 2;\
IVI_HAAR_BFLY(t1, t5, t1, t5, t0); IVI_HAAR_BFLY(t1, s3, t1, t3, t0);\
IVI_HAAR_BFLY(t5, s7, t5, t7, t0); IVI_HAAR_BFLY(t1, s2, t1, t2, t0);\
IVI_HAAR_BFLY(t3, s4, t3, t4, t0); IVI_HAAR_BFLY(t5, s6, t5, t6, t0);\
IVI_HAAR_BFLY(t7, s8, t7, t8, t0);\
d1 = COMPENSATE(t1);\
d2 = COMPENSATE(t2);\
d3 = COMPENSATE(t3);\
d4 = COMPENSATE(t4);\
d5 = COMPENSATE(t5);\
d6 = COMPENSATE(t6);\
d7 = COMPENSATE(t7);\
d8 = COMPENSATE(t8); }
#define IVI_HAAR_BFLY(s1, s2, o1, o2, t)
butterfly operation for the inverse Haar transform
Definition: ivi_dsp.c:237

inverse 8-point Haar transform

§ IVI_HAAR_BFLY

#define IVI_HAAR_BFLY (   s1,
  s2,
  o1,
  o2,
 
)
Value:
t = ((s1) - (s2)) >> 1;\
o1 = ((s1) + (s2)) >> 1;\
o2 = (t);\

butterfly operation for the inverse Haar transform

§ IVI_INV_SLANT4

#define IVI_INV_SLANT4 (   s1,
  s4,
  s2,
  s3,
  d1,
  d2,
  d3,
  d4,
  t0,
  t1,
  t2,
  t3,
  t4 
)
Value:
{\
IVI_SLANT_BFLY(s1, s2, t1, t2, t0); IVI_IREFLECT (s4, s3, t4, t3, t0);\
IVI_SLANT_BFLY(t1, t4, t1, t4, t0); IVI_SLANT_BFLY(t2, t3, t2, t3, t0);\
d1 = COMPENSATE(t1);\
d2 = COMPENSATE(t2);\
d3 = COMPENSATE(t3);\
d4 = COMPENSATE(t4);}
#define IVI_SLANT_BFLY(s1, s2, o1, o2, t)
butterfly operation for the inverse slant transform
Definition: ivi_dsp.c:487
#define IVI_IREFLECT(s1, s2, o1, o2, t)
This is a reflection a,b = 1/2, 5/4 for the inverse slant transform.
Definition: ivi_dsp.c:493

inverse slant4 transform

§ IVI_INV_SLANT8

#define IVI_INV_SLANT8 (   s1,
  s4,
  s8,
  s5,
  s2,
  s6,
  s3,
  s7,
  d1,
  d2,
  d3,
  d4,
  d5,
  d6,
  d7,
  d8,
  t0,
  t1,
  t2,
  t3,
  t4,
  t5,
  t6,
  t7,
  t8 
)
Value:
{\
IVI_SLANT_PART4(s4, s5, t4, t5, t0);\
IVI_SLANT_BFLY(s1, t5, t1, t5, t0); IVI_SLANT_BFLY(s2, s6, t2, t6, t0);\
IVI_SLANT_BFLY(s7, s3, t7, t3, t0); IVI_SLANT_BFLY(t4, s8, t4, t8, t0);\
IVI_SLANT_BFLY(t1, t2, t1, t2, t0); IVI_IREFLECT (t4, t3, t4, t3, t0);\
IVI_SLANT_BFLY(t5, t6, t5, t6, t0); IVI_IREFLECT (t8, t7, t8, t7, t0);\
IVI_SLANT_BFLY(t1, t4, t1, t4, t0); IVI_SLANT_BFLY(t2, t3, t2, t3, t0);\
IVI_SLANT_BFLY(t5, t8, t5, t8, t0); IVI_SLANT_BFLY(t6, t7, t6, t7, t0);\
d1 = COMPENSATE(t1);\
d2 = COMPENSATE(t2);\
d3 = COMPENSATE(t3);\
d4 = COMPENSATE(t4);\
d5 = COMPENSATE(t5);\
d6 = COMPENSATE(t6);\
d7 = COMPENSATE(t7);\
d8 = COMPENSATE(t8);}
#define IVI_SLANT_BFLY(s1, s2, o1, o2, t)
butterfly operation for the inverse slant transform
Definition: ivi_dsp.c:487
#define IVI_IREFLECT(s1, s2, o1, o2, t)
This is a reflection a,b = 1/2, 5/4 for the inverse slant transform.
Definition: ivi_dsp.c:493

inverse slant8 transform

§ IVI_IREFLECT

#define IVI_IREFLECT (   s1,
  s2,
  o1,
  o2,
 
)
Value:
t = (((s1) + (s2)*2 + 2) >> 2) + (s1);\
o2 = (((s1)*2 - (s2) + 2) >> 2) - (s2);\
o1 = (t);\

This is a reflection a,b = 1/2, 5/4 for the inverse slant transform.

§ IVI_MC_AVG_TEMPLATE

#define IVI_MC_AVG_TEMPLATE (   size,
  suffix,
  OP 
)
Value:
void ff_ivi_mc_avg_ ## size ##x## size ## suffix(int16_t *buf, \
const int16_t *ref_buf, \
const int16_t *ref_buf2, \
ptrdiff_t pitch, \
int mc_type, int mc_type2) \
{ \
int16_t tmp[size * size]; \
int i, j; \
\
ivi_mc_ ## size ##x## size ## _no_delta(tmp, size, ref_buf, pitch, mc_type); \
ivi_mc_ ## size ##x## size ## _delta(tmp, size, ref_buf2, pitch, mc_type2); \
for (i = 0; i < size; i++, buf += pitch) { \
for (j = 0; j < size; j++) {\
OP(buf[j], tmp[i * size + j] >> 1); \
} \
} \
} \

§ IVI_SLANT_BFLY

#define IVI_SLANT_BFLY (   s1,
  s2,
  o1,
  o2,
 
)
Value:
t = (s1) - (s2);\
o1 = (s1) + (s2);\
o2 = (t);\

butterfly operation for the inverse slant transform

§ IVI_SLANT_PART4

#define IVI_SLANT_PART4 (   s1,
  s2,
  o1,
  o2,
 
)
Value:
t = (s2) + (((s1)*4 - (s2) + 4) >> 3);\
o2 = (s1) + ((-(s1) - (s2)*4 + 4) >> 3);\
o1 = (t);\

This is a reflection a,b = 1/2, 7/8 for the inverse slant transform.

Function Documentation

§ ff_ivi_col_haar4()

void ff_ivi_col_haar4 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

one-dimensional inverse 4-point Haar transform on columns for Indeo 4

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_col_haar8()

void ff_ivi_col_haar8 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

one-dimensional inverse 8-point Haar transform on columns for Indeo 4

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_col_slant4()

void ff_ivi_col_slant4 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

inverse 1D column slant transform

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_col_slant8()

void ff_ivi_col_slant8 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

inverse 1D column slant transform

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_dc_haar_2d()

void ff_ivi_dc_haar_2d ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
int  blk_size 
)

DC-only two-dimensional inverse Haar transform for Indeo 4.

Performing the inverse transform in this case is equivalent to spreading DC_coeff >> 3 over the whole block.

Parameters
[in]inpointer to the dc coefficient
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]blk_sizetransform block size

§ ff_ivi_dc_slant_2d()

void ff_ivi_dc_slant_2d ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
int  blk_size 
)

DC-only two-dimensional inverse slant transform.

Performing the inverse slant transform in this case is equivalent to spreading (DC_coeff + 1)/2 over the whole block. It works much faster than performing the slant transform on a vector of zeroes.

Parameters
[in]inpointer to the dc coefficient
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]blk_sizetransform block size

§ ff_ivi_inverse_haar_4x4()

void ff_ivi_inverse_haar_4x4 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

two-dimensional inverse Haar 4x4 transform for Indeo 4

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_inverse_haar_8x8()

void ff_ivi_inverse_haar_8x8 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

two-dimensional inverse Haar 8x8 transform for Indeo 4

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_inverse_slant_4x4()

void ff_ivi_inverse_slant_4x4 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

two-dimensional inverse slant 4x4 transform

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_inverse_slant_8x8()

void ff_ivi_inverse_slant_8x8 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

two-dimensional inverse slant 8x8 transform

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_recompose53()

void ff_ivi_recompose53 ( const IVIPlaneDesc plane,
uint8_t *  dst,
const ptrdiff_t  dst_pitch 
)

5/3 wavelet recomposition filter for Indeo5

Parameters
[in]planepointer to the descriptor of the plane being processed
[out]dstpointer to the destination buffer
[in]dst_pitchpitch of the destination buffer

§ ff_ivi_recompose_haar()

void ff_ivi_recompose_haar ( const IVIPlaneDesc plane,
uint8_t *  dst,
const ptrdiff_t  dst_pitch 
)

Haar wavelet recomposition filter for Indeo 4.

Parameters
[in]planepointer to the descriptor of the plane being processed
[out]dstpointer to the destination buffer
[in]dst_pitchpitch of the destination buffer

§ ff_ivi_row_haar4()

void ff_ivi_row_haar4 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

one-dimensional inverse 4-point Haar transform on rows for Indeo 4

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_row_haar8()

void ff_ivi_row_haar8 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

one-dimensional inverse 8-point Haar transform on rows for Indeo 4

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags: != 0 - non_empty column, 0 - empty one (this array must be filled by caller)

§ ff_ivi_row_slant4()

void ff_ivi_row_slant4 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

inverse 1D row slant transform

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags (unused here)

§ ff_ivi_row_slant8()

void ff_ivi_row_slant8 ( const int32_t *  in,
int16_t *  out,
ptrdiff_t  pitch,
const uint8_t *  flags 
)

inverse 1D row slant transform

Parameters
[in]inpointer to the vector of transform coefficients
[out]outpointer to the output buffer (frame)
[in]pitchpitch to move to the next y line
[in]flagspointer to the array of column flags (unused here)