~ubuntu-branches/ubuntu/utopic/ffmpeg-debian/utopic

« back to all changes in this revision

Viewing changes to libpostproc/postprocess_template.c

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2009-01-20 09:20:53 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20090120092053-izz63p40hc98qfgp
Tags: 3:0.svn20090119-1ubuntu1
* merge from debian. LP: #318501
* new version fixes CVE-2008-3230, LP: #253767

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
#undef PMINUB
32
32
#undef PMAXUB
33
33
 
34
 
#ifdef HAVE_MMX2
 
34
#if   HAVE_MMX2
35
35
#define REAL_PAVGB(a,b) "pavgb " #a ", " #b " \n\t"
36
 
#elif defined (HAVE_3DNOW)
 
36
#elif HAVE_3DNOW
37
37
#define REAL_PAVGB(a,b) "pavgusb " #a ", " #b " \n\t"
38
38
#endif
39
39
#define PAVGB(a,b)  REAL_PAVGB(a,b)
40
40
 
41
 
#ifdef HAVE_MMX2
 
41
#if   HAVE_MMX2
42
42
#define PMINUB(a,b,t) "pminub " #a ", " #b " \n\t"
43
 
#elif defined (HAVE_MMX)
 
43
#elif HAVE_MMX
44
44
#define PMINUB(b,a,t) \
45
45
    "movq " #a ", " #t " \n\t"\
46
46
    "psubusb " #b ", " #t " \n\t"\
47
47
    "psubb " #t ", " #a " \n\t"
48
48
#endif
49
49
 
50
 
#ifdef HAVE_MMX2
 
50
#if   HAVE_MMX2
51
51
#define PMAXUB(a,b) "pmaxub " #a ", " #b " \n\t"
52
 
#elif defined (HAVE_MMX)
 
52
#elif HAVE_MMX
53
53
#define PMAXUB(a,b) \
54
54
    "psubusb " #a ", " #b " \n\t"\
55
55
    "paddb " #a ", " #b " \n\t"
56
56
#endif
57
57
 
58
58
//FIXME? |255-0| = 1 (should not be a problem ...)
59
 
#ifdef HAVE_MMX
 
59
#if HAVE_MMX
60
60
/**
61
61
 * Check if the middle 8x8 Block in the given 8x16 block is flat
62
62
 */
136
136
        "psubusb %%mm3, %%mm4                   \n\t"
137
137
 
138
138
        "                                       \n\t"
139
 
#ifdef HAVE_MMX2
 
139
#if HAVE_MMX2
140
140
        "pxor %%mm7, %%mm7                      \n\t"
141
141
        "psadbw %%mm7, %%mm0                    \n\t"
142
142
#else
176
176
 * Do a vertical low pass filter on the 8x16 block (only write to the 8x8 block in the middle)
177
177
 * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16
178
178
 */
179
 
#ifndef HAVE_ALTIVEC
 
179
#if !HAVE_ALTIVEC
180
180
static inline void RENAME(doVertLowPass)(uint8_t *src, int stride, PPContext *c)
181
181
{
182
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
182
#if HAVE_MMX2 || HAVE_3DNOW
183
183
    src+= stride*3;
184
184
    __asm__ volatile(        //"movv %0 %1 %2\n\t"
185
185
        "movq %2, %%mm0                         \n\t"  // QP,..., QP
306
306
        : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb)
307
307
        : "%"REG_a, "%"REG_c
308
308
    );
309
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
309
#else //HAVE_MMX2 || HAVE_3DNOW
310
310
    const int l1= stride;
311
311
    const int l2= stride + l1;
312
312
    const int l3= stride + l2;
345
345
 
346
346
        src++;
347
347
    }
348
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
348
#endif //HAVE_MMX2 || HAVE_3DNOW
349
349
}
350
350
#endif //HAVE_ALTIVEC
351
351
 
364
364
 */
365
365
static inline void RENAME(vertRK1Filter)(uint8_t *src, int stride, int QP)
366
366
{
367
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
367
#if HAVE_MMX2 || HAVE_3DNOW
368
368
    src+= stride*3;
369
369
// FIXME rounding
370
370
    __asm__ volatile(
426
426
        : "r" (src), "r" ((x86_reg)stride)
427
427
        : "%"REG_a, "%"REG_c
428
428
    );
429
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
429
#else //HAVE_MMX2 || HAVE_3DNOW
430
430
    const int l1= stride;
431
431
    const int l2= stride + l1;
432
432
    const int l3= stride + l2;
449
449
        }
450
450
    }
451
451
 
452
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
452
#endif //HAVE_MMX2 || HAVE_3DNOW
453
453
}
454
454
#endif //0
455
455
 
462
462
 */
463
463
static inline void RENAME(vertX1Filter)(uint8_t *src, int stride, PPContext *co)
464
464
{
465
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
465
#if HAVE_MMX2 || HAVE_3DNOW
466
466
    src+= stride*3;
467
467
 
468
468
    __asm__ volatile(
548
548
        : "r" (src), "r" ((x86_reg)stride), "m" (co->pQPb)
549
549
        : "%"REG_a, "%"REG_c
550
550
    );
551
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
551
#else //HAVE_MMX2 || HAVE_3DNOW
552
552
 
553
553
    const int l1= stride;
554
554
    const int l2= stride + l1;
582
582
        }
583
583
        src++;
584
584
    }
585
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
585
#endif //HAVE_MMX2 || HAVE_3DNOW
586
586
}
587
587
 
588
 
#ifndef HAVE_ALTIVEC
 
588
#if !HAVE_ALTIVEC
589
589
static inline void RENAME(doVertDefFilter)(uint8_t src[], int stride, PPContext *c)
590
590
{
591
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
591
#if HAVE_MMX2 || HAVE_3DNOW
592
592
/*
593
593
    uint8_t tmp[16];
594
594
    const int l1= stride;
869
869
    }
870
870
}
871
871
*/
872
 
#elif defined (HAVE_MMX)
 
872
#elif HAVE_MMX
873
873
    src+= stride*4;
874
874
    __asm__ volatile(
875
875
        "pxor %%mm7, %%mm7                      \n\t"
978
978
        "movq (%%"REG_c"), %%mm2                \n\t" // 2L0 - 5L1 + 5L2 - 2L3
979
979
        "movq 8(%%"REG_c"), %%mm3               \n\t" // 2H0 - 5H1 + 5H2 - 2H3
980
980
 
981
 
#ifdef HAVE_MMX2
 
981
#if HAVE_MMX2
982
982
        "movq %%mm7, %%mm6                      \n\t" // 0
983
983
        "psubw %%mm0, %%mm6                     \n\t"
984
984
        "pmaxsw %%mm6, %%mm0                    \n\t" // |2L4 - 5L5 + 5L6 - 2L7|
1010
1010
        "psubw %%mm6, %%mm3                     \n\t" // |2H0 - 5H1 + 5H2 - 2H3|
1011
1011
#endif
1012
1012
 
1013
 
#ifdef HAVE_MMX2
 
1013
#if HAVE_MMX2
1014
1014
        "pminsw %%mm2, %%mm0                    \n\t"
1015
1015
        "pminsw %%mm3, %%mm1                    \n\t"
1016
1016
#else
1074
1074
        "pand %%mm2, %%mm4                      \n\t"
1075
1075
        "pand %%mm3, %%mm5                      \n\t"
1076
1076
 
1077
 
#ifdef HAVE_MMX2
 
1077
#if HAVE_MMX2
1078
1078
        "pminsw %%mm0, %%mm4                    \n\t"
1079
1079
        "pminsw %%mm1, %%mm5                    \n\t"
1080
1080
#else
1101
1101
        : "r" ((x86_reg)stride), "m" (c->pQPb)
1102
1102
        : "%"REG_a, "%"REG_c
1103
1103
    );
1104
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1104
#else //HAVE_MMX2 || HAVE_3DNOW
1105
1105
    const int l1= stride;
1106
1106
    const int l2= stride + l1;
1107
1107
    const int l3= stride + l2;
1139
1139
        }
1140
1140
        src++;
1141
1141
    }
1142
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1142
#endif //HAVE_MMX2 || HAVE_3DNOW
1143
1143
}
1144
1144
#endif //HAVE_ALTIVEC
1145
1145
 
1146
 
#ifndef HAVE_ALTIVEC
 
1146
#if !HAVE_ALTIVEC
1147
1147
static inline void RENAME(dering)(uint8_t src[], int stride, PPContext *c)
1148
1148
{
1149
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1149
#if HAVE_MMX2 || HAVE_3DNOW
1150
1150
    __asm__ volatile(
1151
1151
        "pxor %%mm6, %%mm6                      \n\t"
1152
1152
        "pcmpeqb %%mm7, %%mm7                   \n\t"
1164
1164
//        %0        eax        eax+%1        eax+2%1        %0+4%1        edx        edx+%1        edx+2%1        %0+8%1        edx+4%1
1165
1165
 
1166
1166
#undef FIND_MIN_MAX
1167
 
#ifdef HAVE_MMX2
 
1167
#if HAVE_MMX2
1168
1168
#define REAL_FIND_MIN_MAX(addr)\
1169
1169
        "movq " #addr ", %%mm0                  \n\t"\
1170
1170
        "pminub %%mm0, %%mm7                    \n\t"\
1191
1191
 
1192
1192
        "movq %%mm7, %%mm4                      \n\t"
1193
1193
        "psrlq $8, %%mm7                        \n\t"
1194
 
#ifdef HAVE_MMX2
 
1194
#if HAVE_MMX2
1195
1195
        "pminub %%mm4, %%mm7                    \n\t" // min of pixels
1196
1196
        "pshufw $0xF9, %%mm7, %%mm4             \n\t"
1197
1197
        "pminub %%mm4, %%mm7                    \n\t" // min of pixels
1216
1216
 
1217
1217
        "movq %%mm6, %%mm4                      \n\t"
1218
1218
        "psrlq $8, %%mm6                        \n\t"
1219
 
#ifdef HAVE_MMX2
 
1219
#if HAVE_MMX2
1220
1220
        "pmaxub %%mm4, %%mm6                    \n\t" // max of pixels
1221
1221
        "pshufw $0xF9, %%mm6, %%mm4             \n\t"
1222
1222
        "pmaxub %%mm4, %%mm6                    \n\t"
1370
1370
        : : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb), "m"(c->pQPb2)
1371
1371
        : "%"REG_a, "%"REG_d, "%"REG_c
1372
1372
    );
1373
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1373
#else //HAVE_MMX2 || HAVE_3DNOW
1374
1374
    int y;
1375
1375
    int min=255;
1376
1376
    int max=0;
1487
1487
//        src[0] = src[7]=src[stride*7]=src[stride*7 + 7]=255;
1488
1488
    }
1489
1489
#endif
1490
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1490
#endif //HAVE_MMX2 || HAVE_3DNOW
1491
1491
}
1492
1492
#endif //HAVE_ALTIVEC
1493
1493
 
1499
1499
 */
1500
1500
static inline void RENAME(deInterlaceInterpolateLinear)(uint8_t src[], int stride)
1501
1501
{
1502
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1502
#if HAVE_MMX2 || HAVE_3DNOW
1503
1503
    src+= 4*stride;
1504
1504
    __asm__ volatile(
1505
1505
        "lea (%0, %1), %%"REG_a"                \n\t"
1552
1552
 */
1553
1553
static inline void RENAME(deInterlaceInterpolateCubic)(uint8_t src[], int stride)
1554
1554
{
1555
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1555
#if HAVE_MMX2 || HAVE_3DNOW
1556
1556
    src+= stride*3;
1557
1557
    __asm__ volatile(
1558
1558
        "lea (%0, %1), %%"REG_a"                \n\t"
1594
1594
        : : "r" (src), "r" ((x86_reg)stride)
1595
1595
        : "%"REG_a, "%"REG_d, "%"REG_c
1596
1596
    );
1597
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1597
#else //HAVE_MMX2 || HAVE_3DNOW
1598
1598
    int x;
1599
1599
    src+= stride*3;
1600
1600
    for(x=0; x<8; x++){
1604
1604
        src[stride*9] = CLIP((-src[stride*6] + 9*src[stride*8] + 9*src[stride*10] - src[stride*12])>>4);
1605
1605
        src++;
1606
1606
    }
1607
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1607
#endif //HAVE_MMX2 || HAVE_3DNOW
1608
1608
}
1609
1609
 
1610
1610
/**
1616
1616
 */
1617
1617
static inline void RENAME(deInterlaceFF)(uint8_t src[], int stride, uint8_t *tmp)
1618
1618
{
1619
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1619
#if HAVE_MMX2 || HAVE_3DNOW
1620
1620
    src+= stride*4;
1621
1621
    __asm__ volatile(
1622
1622
        "lea (%0, %1), %%"REG_a"                \n\t"
1665
1665
        : : "r" (src), "r" ((x86_reg)stride), "r"(tmp)
1666
1666
        : "%"REG_a, "%"REG_d
1667
1667
    );
1668
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1668
#else //HAVE_MMX2 || HAVE_3DNOW
1669
1669
    int x;
1670
1670
    src+= stride*4;
1671
1671
    for(x=0; x<8; x++){
1683
1683
 
1684
1684
        src++;
1685
1685
    }
1686
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1686
#endif //HAVE_MMX2 || HAVE_3DNOW
1687
1687
}
1688
1688
 
1689
1689
/**
1695
1695
 */
1696
1696
static inline void RENAME(deInterlaceL5)(uint8_t src[], int stride, uint8_t *tmp, uint8_t *tmp2)
1697
1697
{
1698
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1698
#if HAVE_MMX2 || HAVE_3DNOW
1699
1699
    src+= stride*4;
1700
1700
    __asm__ volatile(
1701
1701
        "lea (%0, %1), %%"REG_a"                \n\t"
1755
1755
        : : "r" (src), "r" ((x86_reg)stride), "r"(tmp), "r"(tmp2)
1756
1756
        : "%"REG_a, "%"REG_d
1757
1757
    );
1758
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1758
#else //HAVE_MMX2 || HAVE_3DNOW
1759
1759
    int x;
1760
1760
    src+= stride*4;
1761
1761
    for(x=0; x<8; x++){
1784
1784
 
1785
1785
        src++;
1786
1786
    }
1787
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1787
#endif //HAVE_MMX2 || HAVE_3DNOW
1788
1788
}
1789
1789
 
1790
1790
/**
1796
1796
 */
1797
1797
static inline void RENAME(deInterlaceBlendLinear)(uint8_t src[], int stride, uint8_t *tmp)
1798
1798
{
1799
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1799
#if HAVE_MMX2 || HAVE_3DNOW
1800
1800
    src+= 4*stride;
1801
1801
    __asm__ volatile(
1802
1802
        "lea (%0, %1), %%"REG_a"                \n\t"
1843
1843
        : : "r" (src), "r" ((x86_reg)stride), "r" (tmp)
1844
1844
        : "%"REG_a, "%"REG_d
1845
1845
    );
1846
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1846
#else //HAVE_MMX2 || HAVE_3DNOW
1847
1847
    int a, b, c, x;
1848
1848
    src+= 4*stride;
1849
1849
 
1886
1886
        src += 4;
1887
1887
        tmp += 4;
1888
1888
    }
1889
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
1889
#endif //HAVE_MMX2 || HAVE_3DNOW
1890
1890
}
1891
1891
 
1892
1892
/**
1897
1897
 */
1898
1898
static inline void RENAME(deInterlaceMedian)(uint8_t src[], int stride)
1899
1899
{
1900
 
#ifdef HAVE_MMX
 
1900
#if HAVE_MMX
1901
1901
    src+= 4*stride;
1902
 
#ifdef HAVE_MMX2
 
1902
#if HAVE_MMX2
1903
1903
    __asm__ volatile(
1904
1904
        "lea (%0, %1), %%"REG_a"                \n\t"
1905
1905
        "lea (%%"REG_a", %1, 4), %%"REG_d"      \n\t"
2012
2012
#endif //HAVE_MMX
2013
2013
}
2014
2014
 
2015
 
#ifdef HAVE_MMX
 
2015
#if HAVE_MMX
2016
2016
/**
2017
2017
 * transposes and shift the given 8x8 Block into dst1 and dst2
2018
2018
 */
2180
2180
#endif //HAVE_MMX
2181
2181
//static long test=0;
2182
2182
 
2183
 
#ifndef HAVE_ALTIVEC
 
2183
#if !HAVE_ALTIVEC
2184
2184
static inline void RENAME(tempNoiseReducer)(uint8_t *src, int stride,
2185
2185
                                    uint8_t *tempBlurred, uint32_t *tempBlurredPast, int *maxNoise)
2186
2186
{
2191
2191
 
2192
2192
#define FAST_L2_DIFF
2193
2193
//#define L1_DIFF //u should change the thresholds too if u try that one
2194
 
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
2194
#if HAVE_MMX2 || HAVE_3DNOW
2195
2195
    __asm__ volatile(
2196
2196
        "lea (%2, %2, 2), %%"REG_a"             \n\t" // 3*stride
2197
2197
        "lea (%2, %2, 4), %%"REG_d"             \n\t" // 5*stride
2479
2479
        :: "r" (src), "r" (tempBlurred), "r"((x86_reg)stride), "m" (tempBlurredPast)
2480
2480
        : "%"REG_a, "%"REG_d, "%"REG_c, "memory"
2481
2481
    );
2482
 
#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
2482
#else //HAVE_MMX2 || HAVE_3DNOW
2483
2483
{
2484
2484
    int y;
2485
2485
    int d=0;
2562
2562
        }
2563
2563
    }
2564
2564
}
2565
 
#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)
 
2565
#endif //HAVE_MMX2 || HAVE_3DNOW
2566
2566
}
2567
2567
#endif //HAVE_ALTIVEC
2568
2568
 
2569
 
#ifdef HAVE_MMX
 
2569
#if HAVE_MMX
2570
2570
/**
2571
2571
 * accurate deblock filter
2572
2572
 */
2970
2970
            "movq (%%"REG_c"), %%mm2                \n\t" // 2L0 - 5L1 + 5L2 - 2L3
2971
2971
            "movq 8(%%"REG_c"), %%mm3               \n\t" // 2H0 - 5H1 + 5H2 - 2H3
2972
2972
 
2973
 
#ifdef HAVE_MMX2
 
2973
#if HAVE_MMX2
2974
2974
            "movq %%mm7, %%mm6                      \n\t" // 0
2975
2975
            "psubw %%mm0, %%mm6                     \n\t"
2976
2976
            "pmaxsw %%mm6, %%mm0                    \n\t" // |2L4 - 5L5 + 5L6 - 2L7|
3002
3002
            "psubw %%mm6, %%mm3                     \n\t" // |2H0 - 5H1 + 5H2 - 2H3|
3003
3003
#endif
3004
3004
 
3005
 
#ifdef HAVE_MMX2
 
3005
#if HAVE_MMX2
3006
3006
            "pminsw %%mm2, %%mm0                    \n\t"
3007
3007
            "pminsw %%mm3, %%mm1                    \n\t"
3008
3008
#else
3066
3066
            "pand %%mm2, %%mm4                      \n\t"
3067
3067
            "pand %%mm3, %%mm5                      \n\t"
3068
3068
 
3069
 
#ifdef HAVE_MMX2
 
3069
#if HAVE_MMX2
3070
3070
            "pminsw %%mm0, %%mm4                    \n\t"
3071
3071
            "pminsw %%mm1, %%mm5                    \n\t"
3072
3072
#else
3116
3116
static inline void RENAME(blockCopy)(uint8_t dst[], int dstStride, const uint8_t src[], int srcStride,
3117
3117
                                     int levelFix, int64_t *packedOffsetAndScale)
3118
3118
{
3119
 
#ifndef HAVE_MMX
 
3119
#if !HAVE_MMX
3120
3120
    int i;
3121
3121
#endif
3122
3122
    if(levelFix){
3123
 
#ifdef HAVE_MMX
 
3123
#if HAVE_MMX
3124
3124
    __asm__ volatile(
3125
3125
        "movq (%%"REG_a"), %%mm2        \n\t" // packedYOffset
3126
3126
        "movq 8(%%"REG_a"), %%mm3       \n\t" // packedYScale
3127
3127
        "lea (%2,%4), %%"REG_a"         \n\t"
3128
3128
        "lea (%3,%5), %%"REG_d"         \n\t"
3129
3129
        "pxor %%mm4, %%mm4              \n\t"
3130
 
#ifdef HAVE_MMX2
 
3130
#if HAVE_MMX2
3131
3131
#define REAL_SCALED_CPY(src1, src2, dst1, dst2)                                                \
3132
3132
        "movq " #src1 ", %%mm0          \n\t"\
3133
3133
        "movq " #src1 ", %%mm5          \n\t"\
3203
3203
                &(src[srcStride*i]), BLOCK_SIZE);
3204
3204
#endif //HAVE_MMX
3205
3205
    }else{
3206
 
#ifdef HAVE_MMX
 
3206
#if HAVE_MMX
3207
3207
    __asm__ volatile(
3208
3208
        "lea (%0,%2), %%"REG_a"                 \n\t"
3209
3209
        "lea (%1,%3), %%"REG_d"                 \n\t"
3243
3243
 */
3244
3244
static inline void RENAME(duplicate)(uint8_t src[], int stride)
3245
3245
{
3246
 
#ifdef HAVE_MMX
 
3246
#if HAVE_MMX
3247
3247
    __asm__ volatile(
3248
3248
        "movq (%0), %%mm0               \n\t"
3249
3249
        "add %1, %0                     \n\t"
3280
3280
    int QPCorrecture= 256*256;
3281
3281
 
3282
3282
    int copyAhead;
3283
 
#ifdef HAVE_MMX
 
3283
#if HAVE_MMX
3284
3284
    int i;
3285
3285
#endif
3286
3286
 
3293
3293
    uint8_t * const tempDst= dstStride > 0 ? c.tempDst : c.tempDst - 23*dstStride;
3294
3294
    //const int mbWidth= isColor ? (width+7)>>3 : (width+15)>>4;
3295
3295
 
3296
 
#ifdef HAVE_MMX
 
3296
#if HAVE_MMX
3297
3297
    for(i=0; i<57; i++){
3298
3298
        int offset= ((i*c.ppMode.baseDcDiff)>>8) + 1;
3299
3299
        int threshold= offset*2 + 1;
3351
3351
 
3352
3352
        scale= (double)(c.ppMode.maxAllowedY - c.ppMode.minAllowedY) / (double)(white-black);
3353
3353
 
3354
 
#ifdef HAVE_MMX2
 
3354
#if HAVE_MMX2
3355
3355
        c.packedYScale= (uint16_t)(scale*256.0 + 0.5);
3356
3356
        c.packedYOffset= (((black*c.packedYScale)>>8) - c.ppMode.minAllowedY) & 0xFFFF;
3357
3357
#else
3384
3384
        // with the L1 Cache of the P4 ... or only a few blocks at a time or soemthing
3385
3385
        for(x=0; x<width; x+=BLOCK_SIZE){
3386
3386
 
3387
 
#ifdef HAVE_MMX2
 
3387
#if HAVE_MMX2
3388
3388
/*
3389
3389
            prefetchnta(srcBlock + (((x>>2)&6) + 5)*srcStride + 32);
3390
3390
            prefetchnta(srcBlock + (((x>>2)&6) + 6)*srcStride + 32);
3411
3411
                : "%"REG_a, "%"REG_d
3412
3412
            );
3413
3413
 
3414
 
#elif defined(HAVE_3DNOW)
 
3414
#elif HAVE_3DNOW
3415
3415
//FIXME check if this is faster on an 3dnow chip or if it is faster without the prefetch or ...
3416
3416
/*          prefetch(srcBlock + (((x>>3)&3) + 5)*srcStride + 32);
3417
3417
            prefetch(srcBlock + (((x>>3)&3) + 9)*srcStride + 32);
3457
3457
        //1% speedup if these are here instead of the inner loop
3458
3458
        const uint8_t *srcBlock= &(src[y*srcStride]);
3459
3459
        uint8_t *dstBlock= &(dst[y*dstStride]);
3460
 
#ifdef HAVE_MMX
 
3460
#if HAVE_MMX
3461
3461
        uint8_t *tempBlock1= c.tempBlocks;
3462
3462
        uint8_t *tempBlock2= c.tempBlocks + 8;
3463
3463
#endif
3493
3493
        // with the L1 Cache of the P4 ... or only a few blocks at a time or soemthing
3494
3494
        for(x=0; x<width; x+=BLOCK_SIZE){
3495
3495
            const int stride= dstStride;
3496
 
#ifdef HAVE_MMX
 
3496
#if HAVE_MMX
3497
3497
            uint8_t *tmpXchg;
3498
3498
#endif
3499
3499
            if(isColor){
3507
3507
                yHistogram[ srcBlock[srcStride*12 + 4] ]++;
3508
3508
            }
3509
3509
            c.QP= QP;
3510
 
#ifdef HAVE_MMX
 
3510
#if HAVE_MMX
3511
3511
            __asm__ volatile(
3512
3512
                "movd %1, %%mm7         \n\t"
3513
3513
                "packuswb %%mm7, %%mm7  \n\t" // 0, 0, 0, QP, 0, 0, 0, QP
3520
3520
#endif
3521
3521
 
3522
3522
 
3523
 
#ifdef HAVE_MMX2
 
3523
#if HAVE_MMX2
3524
3524
/*
3525
3525
            prefetchnta(srcBlock + (((x>>2)&6) + 5)*srcStride + 32);
3526
3526
            prefetchnta(srcBlock + (((x>>2)&6) + 6)*srcStride + 32);
3547
3547
                : "%"REG_a, "%"REG_d
3548
3548
            );
3549
3549
 
3550
 
#elif defined(HAVE_3DNOW)
 
3550
#elif HAVE_3DNOW
3551
3551
//FIXME check if this is faster on an 3dnow chip or if it is faster without the prefetch or ...
3552
3552
/*          prefetch(srcBlock + (((x>>3)&3) + 5)*srcStride + 32);
3553
3553
            prefetch(srcBlock + (((x>>3)&3) + 9)*srcStride + 32);
3591
3591
                }
3592
3592
            }
3593
3593
 
3594
 
#ifdef HAVE_MMX
 
3594
#if HAVE_MMX
3595
3595
            RENAME(transpose1)(tempBlock1, tempBlock2, dstBlock, dstStride);
3596
3596
#endif
3597
3597
            /* check if we have a previous block to deblock it with dstBlock */
3598
3598
            if(x - 8 >= 0){
3599
 
#ifdef HAVE_MMX
 
3599
#if HAVE_MMX
3600
3600
                if(mode & H_X1_FILTER)
3601
3601
                        RENAME(vertX1Filter)(tempBlock1, 16, &c);
3602
3602
                else if(mode & H_DEBLOCK){
3617
3617
                if(mode & H_X1_FILTER)
3618
3618
                    horizX1Filter(dstBlock-4, stride, QP);
3619
3619
                else if(mode & H_DEBLOCK){
3620
 
#ifdef HAVE_ALTIVEC
 
3620
#if HAVE_ALTIVEC
3621
3621
                    DECLARE_ALIGNED(16, unsigned char, tempBlock[272]);
3622
3622
                    transpose_16x8_char_toPackedAlign_altivec(tempBlock, dstBlock - (4 + 1), stride);
3623
3623
 
3659
3659
            dstBlock+=8;
3660
3660
            srcBlock+=8;
3661
3661
 
3662
 
#ifdef HAVE_MMX
 
3662
#if HAVE_MMX
3663
3663
            tmpXchg= tempBlock1;
3664
3664
            tempBlock1= tempBlock2;
3665
3665
            tempBlock2 = tmpXchg;
3699
3699
                + dstBlock[x +14*dstStride] + dstBlock[x +15*dstStride];
3700
3700
        }*/
3701
3701
    }
3702
 
#ifdef HAVE_3DNOW
 
3702
#if   HAVE_3DNOW
3703
3703
    __asm__ volatile("femms");
3704
 
#elif defined (HAVE_MMX)
 
3704
#elif HAVE_MMX
3705
3705
    __asm__ volatile("emms");
3706
3706
#endif
3707
3707