2014-10-25 13:19 GMT+02:00 Christophe Gisquet <christophe.gisq...@gmail.com>:
> Patch #3 uses mathematically more correct values, which happens to match
> another dv implementation (cedocida). It does not seem to affect that
> much the decoded output, as there is PSNR variations on the 3rd decimal
> at most. The best I got was, using a resized version of lena.ppm, a PSNR
> going from 49.35dB to 49.36dB. It would be ok not to integrate it, as
> one may argue they were devised with the simple_idct implementation in
> mind (I haven't checked).
>
> Patch #4 fixes the actual issue. As I don't want to bother determining
> how the table was incorrectly mangled, I've preferred regenerating it.

And here's a program to regenerate it (hopefully I haven't mangled too
much when testing other stuff).

-- 
Christophe
#include <stdio.h>
#include <stdint.h>
#include <math.h>

#define CS(n) cos(n*M_PI/16.0)

#define SCAN_8x8      1
#define USE_ZZ_SCAN   1

int main(void)
{
    //double w[8] = { 1.0, CS(4)/(4*CS(7)*CS(2)), CS(4)/(2*CS(6)), 1.0/(2*CS(5)), 7.0/8, CS(4)/CS(3), CS(4)/CS(2), CS(4)/CS(1) };
    double w[8] = { 1.00000000, 0.98078528, 0.92387953, 0.89997622, 0.87500000, 0.85043009, 0.76536686, 0.72095982 };
    int i, j, order;
# if USE_ZZ_SCAN
    const uint8_t dv_zz[64] = {
# if SCAN_8x8
         0,  1,  8, 16,  9,  2,  3, 10,
        17, 24, 32, 25, 18, 11,  4,  5,
        12, 19, 26, 33, 40, 48, 41, 34,
        27, 20, 13,  6,  7, 14, 21, 28,
        35, 42, 49, 56, 57, 50, 43, 36,
        29, 22, 15, 23, 30, 37, 44, 51,
        58, 59, 52, 45, 38, 31, 39, 46,
        53, 60, 61, 54, 47, 55, 62, 63
# else
         0,  8,  1,  9, 16, 24,  2, 10,
        17, 25, 32, 40, 48, 56, 33, 41,
        18, 26,  3, 11,  4, 12, 19, 27,
        34, 42, 49, 57, 50, 58, 35, 43,
        20, 28,  5, 13,  6, 14, 21, 29,
        36, 44, 51, 59, 52, 60, 37, 45,
        22, 30,  7, 15, 23, 31, 38, 46,
        53, 61, 54, 62, 39, 47, 55, 63,
# endif
    };
#endif

#if 0
    const uint16_t ff_dv_iweight_88[64] = {
        32768, 16705, 16705, 17734, 17032, 17734, 18205, 18081,
        18081, 18205, 18725, 18562, 19195, 18562, 18725, 19266,
        19091, 19705, 19705, 19091, 19266, 21407, 19643, 20267,
        20228, 20267, 19643, 21407, 22725, 21826, 20853, 20806,
        20806, 20853, 21826, 22725, 23170, 23170, 21407, 21400,
        21407, 23170, 23170, 24598, 23786, 22018, 22018, 23786,
        24598, 25251, 24465, 22654, 24465, 25251, 25972, 25172,
        25172, 25972, 26722, 27969, 26722, 29692, 29692, 31521,
    };
    static const int dv_weight_88[64] = {
        131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
        237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
        224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
        212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
        206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
        200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
        174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
        170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
    };
    double sum = 0;
    double sqsum = 0;
    for(i=0; i<64; i++)
    {
        double val = ff_dv_iweight_88[i]*dv_weight_88[i]/(double)(0xFFFFFFFFU);
        sum += val;
        sqsum += val*val;
    }
    printf("std dev: %e\n", sum, sqsum, sqrt(sqsum-sum*sum/64.0));
#else
    //for(j=0; j<8; j++) { printf(" %1.8f", w[j]); } printf("\n");

    for(order = 0, j=0; j<8; j++)
    {
        for(i=0; i<8; i++, order++)
        {
# if USE_ZZ_SCAN
            int zz = dv_zz[order];
            int v = zz/8, h = zz%8;
# else
            int v = j, h = i;
# endif
            double coeff;

#if SCAN_8x8 // 8x8
            if(!v && !h) coeff=1.0/4.0;
            else
            {
                coeff = w[v];
#else // 2x4x8
            if(!v && !h) coeff=1.0/2.0;
            else
            {
                if(v<4) coeff=w[2*v];
                else    coeff=w[2*v-8];
#endif
                coeff *= w[h]/2.0;
            }
            printf(" %5d,", (int)(8192/coeff+0.5));
        }
        printf("\n");
    }
#endif

    return 0;
}
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to