~ubuntu-branches/ubuntu/utopic/libav/utopic-proposed

« back to all changes in this revision

Viewing changes to libavcodec/ppc/svq1enc_altivec.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler, Reinhard Tartler, Rico Tzschichholz
  • Date: 2014-08-30 11:02:45 UTC
  • mfrom: (1.3.47 sid)
  • Revision ID: package-import@ubuntu.com-20140830110245-io3dg7q85wfr7125
Tags: 6:11~beta1-2
[ Reinhard Tartler ]
* Make libavcodec-dev depend on libavresample-dev

[ Rico Tzschichholz ]
* Some fixes and leftovers from soname bumps

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2007 Luca Barbato <lu_zero@gentoo.org>
 
3
 *
 
4
 * This file is part of Libav.
 
5
 *
 
6
 * Libav is free software; you can redistribute it and/or
 
7
 * modify it under the terms of the GNU Lesser General Public
 
8
 * License as published by the Free Software Foundation; either
 
9
 * version 2.1 of the License, or (at your option) any later version.
 
10
 *
 
11
 * Libav is distributed in the hope that it will be useful,
 
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
 * Lesser General Public License for more details.
 
15
 *
 
16
 * You should have received a copy of the GNU Lesser General Public
 
17
 * License along with Libav; if not, write to the Free Software
 
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
19
 */
 
20
 
 
21
#include <stdint.h>
 
22
 
 
23
#include "config.h"
 
24
#if HAVE_ALTIVEC_H
 
25
#include <altivec.h>
 
26
#endif
 
27
 
 
28
#include "libavutil/attributes.h"
 
29
#include "libavutil/cpu.h"
 
30
#include "libavutil/ppc/cpu.h"
 
31
#include "libavutil/ppc/types_altivec.h"
 
32
#include "libavutil/ppc/util_altivec.h"
 
33
#include "libavcodec/svq1enc.h"
 
34
 
 
35
#if HAVE_ALTIVEC
 
36
static int ssd_int8_vs_int16_altivec(const int8_t *pix1, const int16_t *pix2,
 
37
                                     int size)
 
38
{
 
39
    int i, size16 = size >> 4;
 
40
    vector signed char vpix1;
 
41
    vector signed short vpix2, vdiff, vpix1l, vpix1h;
 
42
    union {
 
43
        vector signed int vscore;
 
44
        int32_t score[4];
 
45
    } u = { .vscore = vec_splat_s32(0) };
 
46
 
 
47
    while (size16) {
 
48
        // score += (pix1[i] - pix2[i]) * (pix1[i] - pix2[i]);
 
49
        // load pix1 and the first batch of pix2
 
50
 
 
51
        vpix1 = vec_unaligned_load(pix1);
 
52
        vpix2 = vec_unaligned_load(pix2);
 
53
        pix2 += 8;
 
54
        // unpack
 
55
        vpix1h = vec_unpackh(vpix1);
 
56
        vdiff  = vec_sub(vpix1h, vpix2);
 
57
        vpix1l = vec_unpackl(vpix1);
 
58
        // load another batch from pix2
 
59
        vpix2    = vec_unaligned_load(pix2);
 
60
        u.vscore = vec_msum(vdiff, vdiff, u.vscore);
 
61
        vdiff    = vec_sub(vpix1l, vpix2);
 
62
        u.vscore = vec_msum(vdiff, vdiff, u.vscore);
 
63
        pix1    += 16;
 
64
        pix2    += 8;
 
65
        size16--;
 
66
    }
 
67
    u.vscore = vec_sums(u.vscore, vec_splat_s32(0));
 
68
 
 
69
    size %= 16;
 
70
    for (i = 0; i < size; i++)
 
71
        u.score[3] += (pix1[i] - pix2[i]) * (pix1[i] - pix2[i]);
 
72
 
 
73
    return u.score[3];
 
74
}
 
75
#endif /* HAVE_ALTIVEC */
 
76
 
 
77
av_cold void ff_svq1enc_init_ppc(SVQ1EncContext *c)
 
78
{
 
79
#if HAVE_ALTIVEC
 
80
    if (!PPC_ALTIVEC(av_get_cpu_flags()))
 
81
        return;
 
82
 
 
83
    c->ssd_int8_vs_int16 = ssd_int8_vs_int16_altivec;
 
84
#endif /* HAVE_ALTIVEC */
 
85
}