VideoCodec/Modules/Transform/AANDCT.h
#ifndef AANDCT_H_
#define AANDCT_H_
#include <math.h>
#include "../Module.h"
#include "../../Data/PictureInfo.h"
#include "../../Configuration/ConfigurationElement.h"
#include "../../Logger.h"
// Arai, Agui and Nakajima DCT and IDCT implementation.
#define AANDCT4 0.707107
#define AANDCT6 0.382683
#define AANDCT2PLUS6 1.306563
#define AANDCT2MINUS6NEGATED -0.541196
#define AANDCTSCALE0 0.353553
#define AANDCTSCALE1 0.254898
#define AANDCTSCALE2 0.270598
#define AANDCTSCALE3 0.300672
#define AANDCTSCALE4 0.353553
#define AANDCTSCALE5 0.449988
#define AANDCTSCALE6 0.653281
#define AANDCTSCALE7 1.281458
// One-dimensional AAN DCT, including post-scaling.
#define AAN_DCT_1D {\ const float s07 = SOURCE(0) + SOURCE(7);\ const float s16 = SOURCE(1) + SOURCE(6);\ const float s25 = SOURCE(2) + SOURCE(5);\ const float s34 = SOURCE(3) + SOURCE(4);\ const float d07 = SOURCE(0) - SOURCE(7);\ const float d16 = SOURCE(1) - SOURCE(6);\ const float d25 = SOURCE(2) - SOURCE(5);\ const float d34 = SOURCE(3) - SOURCE(4);\ const float tmp0 = s07 + s34;\ const float tmp1 = s16 + s25;\ const float tmp2 = s07 - s34;\ const float tmp3 = s16 - s25;\ const float tmp4 = d16 + d25;\ const float tmp6 = d07 + d16;\ const float tmp7 = -d25 - d34;\ const float m5 = AANDCT4 * (tmp3 + tmp2);\ const float m6 = AANDCT4 * tmp4;\ const float m7 = AANDCT6 * (tmp6 + tmp7);\ const float p5 = d07 + m6;\ const float p6 = d07 - m6;\ const float p7 = (AANDCT2PLUS6 * tmp6) - m7;\ const float p8 = (AANDCT2MINUS6NEGATED * tmp7) - m7;\ DESTINATION(0, AANDCTSCALE0 * (tmp0 + tmp1));\ DESTINATION(1, AANDCTSCALE1 * (p5 + p7));\ DESTINATION(2, AANDCTSCALE2 * (tmp2 + m5));\ DESTINATION(3, AANDCTSCALE3 * (p6 - p8));\ DESTINATION(4, AANDCTSCALE4 * (tmp0 - tmp1));\ DESTINATION(5, AANDCTSCALE5 * (p6 + p8));\ DESTINATION(6, AANDCTSCALE6 * (tmp2 - m5));\ DESTINATION(7, AANDCTSCALE7 * (p5 - p7));\};
#define AANIDCTSCALE0 5.656854
#define AANIDCTSCALE1 4.078365
#define AANIDCTSCALE2 4.329569
#define AANIDCTSCALE3 4.810759
#define AANIDCTSCALE4 5.656854
#define AANIDCTSCALE5 7.199810
#define AANIDCTSCALE6 10.452504
#define AANIDCTSCALE7 20.503324
// One-dimensional AAN IDCT, including pre-scaling.
#define AAN_IDCT_1D {\ const float F0 = SOURCE(0) * AANIDCTSCALE0;\ const float F1 = SOURCE(1) * AANIDCTSCALE1;\ const float F2 = SOURCE(2) * AANIDCTSCALE2;\ const float F3 = SOURCE(3) * AANIDCTSCALE3;\ const float F4 = SOURCE(4) * AANIDCTSCALE4;\ const float F5 = SOURCE(5) * AANIDCTSCALE5;\ const float F6 = SOURCE(6) * AANIDCTSCALE6;\ const float F7 = SOURCE(7) * AANIDCTSCALE7;\ const float tmp0 = F0 + F4;\ const float tmp1 = F0 - F4;\ const float tmp3 = AANDCT4 * (F2 - F6);\ const float tmp2 = F6 + F2 + tmp3;\ const float s07 = tmp2 + tmp0;\ const float s16 = tmp1 + tmp3;\ const float s25 = tmp1 - tmp3;\ const float s34 = tmp0 - tmp2;\ const float p6 = F5 + F3;\ const float p8 = F5 - F3;\ const float p5 = F1 + F7;\ const float p7 = F1 - F7;\ const float m6 = p5 - p6;\ const float m7 = (-p7 - p8) * AANDCT6;\ const float tmp7 = p8 * AANDCT2MINUS6NEGATED + m7;\ const float tmp4 = m6 * AANDCT4;\ const float tmp6 = p7 * AANDCT2PLUS6 + m7;\ const float d07 = tmp6 + p6 + p5;\ const float d16 = tmp6 + tmp4;\ const float d25 = tmp4 - tmp7;\ const float d34 = tmp7;\ DESTINATION(0, (s07 + d07));\ DESTINATION(1, (s16 + d16));\ DESTINATION(2, (s25 + d25));\ DESTINATION(3, (s34 - d34));\ DESTINATION(4, (s34 + d34));\ DESTINATION(5, (s25 - d25));\ DESTINATION(6, (s16 - d16));\ DESTINATION(7, (s07 - d07));\};
namespace VideoCodec
{
class AANDCT : public VideoCodec::Module
{
public:
AANDCT();
virtual ~AANDCT();
ConfigurationStatus Configure(ConfigurationElement* configuration);
void PictureDCT(PictureInfo* picture);
void PictureIDCT(PictureInfo* picture);
private:
void debugOutputMB(SignedShort* mb, const char* label);
void debugOutputMB(UnsignedByte* mb, const char* label);
};
}
#endif /*AANDCT_H_*/