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_*/