~ubuntu-branches/ubuntu/jaunty/xvidcap/jaunty-proposed

« back to all changes in this revision

Viewing changes to ffmpeg/libswscale/swscale_altivec_template.c

  • Committer: Bazaar Package Importer
  • Author(s): Lionel Le Folgoc
  • Date: 2008-12-26 00:10:06 UTC
  • mto: This revision was merged to the branch mainline in revision 8.
  • Revision ID: james.westby@ubuntu.com-20081226001006-wd8cuqn8d81smkdp
Tags: upstream-1.1.7
ImportĀ upstreamĀ versionĀ 1.1.7

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
 * AltiVec-enhanced yuv2yuvX
3
3
 *
4
4
 * Copyright (C) 2004 Romain Dolbeau <romain@dolbeau.org>
5
 
 * based on the equivalent C code in "postproc/swscale.c"
 
5
 * based on the equivalent C code in swscale.c
6
6
 *
7
7
 * This file is part of FFmpeg.
8
8
 *
18
18
 *
19
19
 * You should have received a copy of the GNU General Public License
20
20
 * along with FFmpeg; if not, write to the Free Software
21
 
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
22
 */
23
23
 
24
 
#ifdef CONFIG_DARWIN
25
 
#define AVV(x...) (x)
26
 
#else
27
 
#define AVV(x...) {x}
28
 
#endif
29
 
 
30
24
#define vzero vec_splat_s32(0)
31
25
 
32
26
static inline void
33
27
altivec_packIntArrayToCharArray(int *val, uint8_t* dest, int dstW) {
34
28
    register int i;
35
29
    vector unsigned int altivec_vectorShiftInt19 =
36
 
        vec_add(vec_splat_u32(10),vec_splat_u32(9));
 
30
        vec_add(vec_splat_u32(10), vec_splat_u32(9));
37
31
    if ((unsigned long)dest % 16) {
38
 
        /* badly aligned store, we force store alignement */
39
 
        /* and will handle load misalignement on val w/ vec_perm */
 
32
        /* badly aligned store, we force store alignment */
 
33
        /* and will handle load misalignment on val w/ vec_perm */
40
34
        vector unsigned char perm1;
41
35
        vector signed int v1;
42
36
        for (i = 0 ; (i < dstW) &&
52
46
            vector signed int v3 = vec_ld(offset + 32, val);
53
47
            vector signed int v4 = vec_ld(offset + 48, val);
54
48
            vector signed int v5 = vec_ld(offset + 64, val);
55
 
            vector signed int v12 = vec_perm(v1,v2,perm1);
56
 
            vector signed int v23 = vec_perm(v2,v3,perm1);
57
 
            vector signed int v34 = vec_perm(v3,v4,perm1);
58
 
            vector signed int v45 = vec_perm(v4,v5,perm1);
 
49
            vector signed int v12 = vec_perm(v1, v2, perm1);
 
50
            vector signed int v23 = vec_perm(v2, v3, perm1);
 
51
            vector signed int v34 = vec_perm(v3, v4, perm1);
 
52
            vector signed int v45 = vec_perm(v4, v5, perm1);
59
53
 
60
54
            vector signed int vA = vec_sra(v12, altivec_vectorShiftInt19);
61
55
            vector signed int vB = vec_sra(v23, altivec_vectorShiftInt19);
143
137
                val[i] += lumSrc[j][i] * lumFilter[j];
144
138
            }
145
139
        }
146
 
        altivec_packIntArrayToCharArray(val,dest,dstW);
 
140
        altivec_packIntArrayToCharArray(val, dest, dstW);
147
141
    }
148
142
    if (uDest != 0) {
149
143
        int  __attribute__ ((aligned (16))) u[chrDstW];
209
203
                v[i] += chrSrc[j][i + 2048] * chrFilter[j];
210
204
            }
211
205
        }
212
 
        altivec_packIntArrayToCharArray(u,uDest,chrDstW);
213
 
        altivec_packIntArrayToCharArray(v,vDest,chrDstW);
 
206
        altivec_packIntArrayToCharArray(u, uDest, chrDstW);
 
207
        altivec_packIntArrayToCharArray(v, vDest, chrDstW);
214
208
    }
215
209
}
216
210
 
258
252
        // and we're going to use vec_mule, so we chose
259
253
        // carefully how to "unpack" the elements into the even slots
260
254
        if ((i << 3) % 16)
261
 
            filter_v = vec_mergel(filter_v,(vector signed short)vzero);
 
255
            filter_v = vec_mergel(filter_v, (vector signed short)vzero);
262
256
        else
263
 
            filter_v = vec_mergeh(filter_v,(vector signed short)vzero);
 
257
            filter_v = vec_mergeh(filter_v, (vector signed short)vzero);
264
258
 
265
259
        val_vEven = vec_mule(src_v, filter_v);
266
260
        val_s = vec_sums(val_vEven, vzero);
360
354
            src_v0 = src_v1;
361
355
        }
362
356
 
363
 
        if (j < (filterSize-7)) {
 
357
        if (j < filterSize-7) {
364
358
            // loading src_v0 is useless, it's already done above
365
359
            //vector unsigned char src_v0 = vec_ld(srcPos + j, src);
366
360
            vector unsigned char src_v1, src_vF;
393
387
static inline int yv12toyuy2_unscaled_altivec(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
394
388
                                              int srcSliceH, uint8_t* dstParam[], int dstStride_a[]) {
395
389
    uint8_t *dst=dstParam[0] + dstStride_a[0]*srcSliceY;
396
 
    // yv12toyuy2( src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] );
 
390
    // yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], srcStride[1], dstStride[0]);
397
391
    uint8_t *ysrc = src[0];
398
392
    uint8_t *usrc = src[1];
399
393
    uint8_t *vsrc = src[2];
407
401
    register unsigned int y;
408
402
 
409
403
    if (width&15) {
410
 
        yv12toyuy2( ysrc, usrc, vsrc, dst,c->srcW,srcSliceH, lumStride, chromStride, dstStride);
 
404
        yv12toyuy2(ysrc, usrc, vsrc, dst, c->srcW, srcSliceH, lumStride, chromStride, dstStride);
411
405
        return srcSliceH;
412
406
    }
413
407
 
456
450
            vec_st(v_yuy2_0, (i << 1), dst);
457
451
            vec_st(v_yuy2_1, (i << 1) + 16, dst);
458
452
        }
459
 
        if ( (y&(vertLumPerChroma-1))==(vertLumPerChroma-1) ) {
 
453
        if ((y&(vertLumPerChroma-1)) == vertLumPerChroma-1) {
460
454
            usrc += chromStride;
461
455
            vsrc += chromStride;
462
456
        }
470
464
static inline int yv12touyvy_unscaled_altivec(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
471
465
                                              int srcSliceH, uint8_t* dstParam[], int dstStride_a[]) {
472
466
    uint8_t *dst=dstParam[0] + dstStride_a[0]*srcSliceY;
473
 
    // yv12toyuy2( src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] );
 
467
    // yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], srcStride[1], dstStride[0]);
474
468
    uint8_t *ysrc = src[0];
475
469
    uint8_t *usrc = src[1];
476
470
    uint8_t *vsrc = src[2];
484
478
    register unsigned int y;
485
479
 
486
480
    if (width&15) {
487
 
        yv12touyvy( ysrc, usrc, vsrc, dst,c->srcW,srcSliceH, lumStride, chromStride, dstStride);
 
481
        yv12touyvy(ysrc, usrc, vsrc, dst, c->srcW, srcSliceH, lumStride, chromStride, dstStride);
488
482
        return srcSliceH;
489
483
    }
490
484
 
533
527
            vec_st(v_uyvy_0, (i << 1), dst);
534
528
            vec_st(v_uyvy_1, (i << 1) + 16, dst);
535
529
        }
536
 
        if ( (y&(vertLumPerChroma-1))==(vertLumPerChroma-1) ) {
 
530
        if ((y&(vertLumPerChroma-1)) == vertLumPerChroma-1) {
537
531
            usrc += chromStride;
538
532
            vsrc += chromStride;
539
533
        }