~siretart/ubuntu/utopic/libav/libav10

« back to all changes in this revision

Viewing changes to libavcodec/x86/h264chroma_init.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2014-05-11 12:28:45 UTC
  • mfrom: (1.1.22) (2.1.38 experimental)
  • Revision ID: package-import@ubuntu.com-20140511122845-gxvpts83i958y0i5
Tags: 6:10.1-1
* New upstream release 10:
   - pcm-dvd: Fix 20bit decoding (bug/592)
   - avi: Improve non-interleaved detection (bug/666)
   - arm: hpeldsp: fix put_pixels8_y2_{,no_rnd_}armv6
   - arm: hpeldsp: prevent overreads in armv6 asm (bug/646)
   - avfilter: Add missing emms_c when needed
   - rtmpproto: Check the buffer sizes when copying app/playpath strings
   - swscale: Fix an undefined behaviour
   - vp9: Read the frame size as unsigned
   - dcadec: Use correct channel count in stereo downmix check
   - dcadec: Do not decode the XCh extension when downmixing to stereo
   - matroska: add the Opus mapping
   - matroskadec: read the CodecDelay element
   - rtmpproto: Make sure to pass on the error code if read_connect failed
   - lavr: allocate the resampling buffer with a positive size
   - mp3enc: Properly write bitrate value in XING header (Closes: #736088)
   - golomb: Fix the implementation of get_se_golomb_long
* Drop debian/libav-tools.maintscript. ffserver is no longer found in
  stable, and this seems to cause other problems today (Closes: #742676)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * This file is part of Libav.
 
3
 *
 
4
 * Libav is free software; you can redistribute it and/or
 
5
 * modify it under the terms of the GNU Lesser General Public
 
6
 * License as published by the Free Software Foundation; either
 
7
 * version 2.1 of the License, or (at your option) any later version.
 
8
 *
 
9
 * Libav is distributed in the hope that it will be useful,
 
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
12
 * Lesser General Public License for more details.
 
13
 *
 
14
 * You should have received a copy of the GNU Lesser General Public
 
15
 * License along with Libav; if not, write to the Free Software
 
16
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
17
 */
 
18
 
 
19
#include <stdint.h>
 
20
 
 
21
#include "config.h"
 
22
#include "libavutil/attributes.h"
 
23
#include "libavutil/cpu.h"
 
24
#include "libavutil/x86/cpu.h"
 
25
#include "libavcodec/h264chroma.h"
 
26
 
 
27
void ff_put_h264_chroma_mc8_rnd_mmx  (uint8_t *dst, uint8_t *src,
 
28
                                      int stride, int h, int x, int y);
 
29
void ff_avg_h264_chroma_mc8_rnd_mmxext(uint8_t *dst, uint8_t *src,
 
30
                                       int stride, int h, int x, int y);
 
31
void ff_avg_h264_chroma_mc8_rnd_3dnow(uint8_t *dst, uint8_t *src,
 
32
                                      int stride, int h, int x, int y);
 
33
 
 
34
void ff_put_h264_chroma_mc4_mmx      (uint8_t *dst, uint8_t *src,
 
35
                                      int stride, int h, int x, int y);
 
36
void ff_avg_h264_chroma_mc4_mmxext   (uint8_t *dst, uint8_t *src,
 
37
                                      int stride, int h, int x, int y);
 
38
void ff_avg_h264_chroma_mc4_3dnow    (uint8_t *dst, uint8_t *src,
 
39
                                      int stride, int h, int x, int y);
 
40
 
 
41
void ff_put_h264_chroma_mc2_mmxext   (uint8_t *dst, uint8_t *src,
 
42
                                      int stride, int h, int x, int y);
 
43
void ff_avg_h264_chroma_mc2_mmxext   (uint8_t *dst, uint8_t *src,
 
44
                                      int stride, int h, int x, int y);
 
45
 
 
46
void ff_put_h264_chroma_mc8_rnd_ssse3(uint8_t *dst, uint8_t *src,
 
47
                                      int stride, int h, int x, int y);
 
48
void ff_put_h264_chroma_mc4_ssse3    (uint8_t *dst, uint8_t *src,
 
49
                                      int stride, int h, int x, int y);
 
50
 
 
51
void ff_avg_h264_chroma_mc8_rnd_ssse3(uint8_t *dst, uint8_t *src,
 
52
                                      int stride, int h, int x, int y);
 
53
void ff_avg_h264_chroma_mc4_ssse3    (uint8_t *dst, uint8_t *src,
 
54
                                      int stride, int h, int x, int y);
 
55
 
 
56
#define CHROMA_MC(OP, NUM, DEPTH, OPT)                                  \
 
57
void ff_ ## OP ## _h264_chroma_mc ## NUM ## _ ## DEPTH ## _ ## OPT      \
 
58
                                      (uint8_t *dst, uint8_t *src,      \
 
59
                                       int stride, int h, int x, int y);
 
60
 
 
61
CHROMA_MC(put, 2, 10, mmxext)
 
62
CHROMA_MC(avg, 2, 10, mmxext)
 
63
CHROMA_MC(put, 4, 10, mmxext)
 
64
CHROMA_MC(avg, 4, 10, mmxext)
 
65
CHROMA_MC(put, 8, 10, sse2)
 
66
CHROMA_MC(avg, 8, 10, sse2)
 
67
CHROMA_MC(put, 8, 10, avx)
 
68
CHROMA_MC(avg, 8, 10, avx)
 
69
 
 
70
av_cold void ff_h264chroma_init_x86(H264ChromaContext *c, int bit_depth)
 
71
{
 
72
#if HAVE_YASM
 
73
    int high_bit_depth = bit_depth > 8;
 
74
    int cpu_flags      = av_get_cpu_flags();
 
75
 
 
76
    if (EXTERNAL_MMX(cpu_flags) && !high_bit_depth) {
 
77
        c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_rnd_mmx;
 
78
        c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_mmx;
 
79
    }
 
80
 
 
81
    if (EXTERNAL_AMD3DNOW(cpu_flags) && !high_bit_depth) {
 
82
        c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_rnd_3dnow;
 
83
        c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_3dnow;
 
84
    }
 
85
 
 
86
    if (EXTERNAL_MMXEXT(cpu_flags) && !high_bit_depth) {
 
87
        c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_rnd_mmxext;
 
88
        c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_mmxext;
 
89
        c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_mmxext;
 
90
        c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_mmxext;
 
91
    }
 
92
 
 
93
    if (EXTERNAL_MMXEXT(cpu_flags) && bit_depth > 8 && bit_depth <= 10) {
 
94
        c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_10_mmxext;
 
95
        c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_10_mmxext;
 
96
        c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_10_mmxext;
 
97
        c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_10_mmxext;
 
98
    }
 
99
 
 
100
    if (EXTERNAL_SSE2(cpu_flags) && bit_depth > 8 && bit_depth <= 10) {
 
101
        c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_10_sse2;
 
102
        c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_10_sse2;
 
103
    }
 
104
 
 
105
    if (EXTERNAL_SSSE3(cpu_flags) && !high_bit_depth) {
 
106
        c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_rnd_ssse3;
 
107
        c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_rnd_ssse3;
 
108
        c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_ssse3;
 
109
        c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_ssse3;
 
110
    }
 
111
 
 
112
    if (EXTERNAL_AVX(cpu_flags) && bit_depth > 8 && bit_depth <= 10) {
 
113
        // AVX implies !cache64.
 
114
        // TODO: Port cache(32|64) detection from x264.
 
115
        c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_10_avx;
 
116
        c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_10_avx;
 
117
    }
 
118
#endif
 
119
}