2 * Copyright (C) 2013 Xiaolei Yu <dreifachstein@gmail.com>
4 * This file is part of FFmpeg.
6 * FFmpeg 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.
11 * FFmpeg 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.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libswscale/swscale.h"
23 #include "libswscale/swscale_internal.h"
24 #include "libavutil/arm/cpu.h"
26 extern void rgbx_to_nv12_neon_32(const uint8_t *src
, uint8_t *y
, uint8_t *chroma
,
27 int width
, int height
,
28 int y_stride
, int c_stride
, int src_stride
,
29 int32_t coeff_tbl
[9]);
31 extern void rgbx_to_nv12_neon_16(const uint8_t *src
, uint8_t *y
, uint8_t *chroma
,
32 int width
, int height
,
33 int y_stride
, int c_stride
, int src_stride
,
34 int32_t coeff_tbl
[9]);
36 static int rgbx_to_nv12_neon_32_wrapper(SwsContext
*context
, const uint8_t *src
[],
37 int srcStride
[], int srcSliceY
, int srcSliceH
,
38 uint8_t *dst
[], int dstStride
[]) {
40 rgbx_to_nv12_neon_32(src
[0] + srcSliceY
* srcStride
[0],
41 dst
[0] + srcSliceY
* dstStride
[0],
42 dst
[1] + (srcSliceY
/ 2) * dstStride
[1],
43 context
->srcW
, srcSliceH
,
44 dstStride
[0], dstStride
[1], srcStride
[0],
45 context
->input_rgb2yuv_table
);
50 static int rgbx_to_nv12_neon_16_wrapper(SwsContext
*context
, const uint8_t *src
[],
51 int srcStride
[], int srcSliceY
, int srcSliceH
,
52 uint8_t *dst
[], int dstStride
[]) {
54 rgbx_to_nv12_neon_16(src
[0] + srcSliceY
* srcStride
[0],
55 dst
[0] + srcSliceY
* dstStride
[0],
56 dst
[1] + (srcSliceY
/ 2) * dstStride
[1],
57 context
->srcW
, srcSliceH
,
58 dstStride
[0], dstStride
[1], srcStride
[0],
59 context
->input_rgb2yuv_table
);
64 static void get_unscaled_swscale_neon(SwsContext
*c
) {
65 int accurate_rnd
= c
->flags
& SWS_ACCURATE_RND
;
66 if (c
->srcFormat
== AV_PIX_FMT_RGBA
67 && c
->dstFormat
== AV_PIX_FMT_NV12
69 c
->swscale
= accurate_rnd
? rgbx_to_nv12_neon_32_wrapper
70 : rgbx_to_nv12_neon_16_wrapper
;
74 void ff_get_unscaled_swscale_arm(SwsContext
*c
)
76 int cpu_flags
= av_get_cpu_flags();
77 if (have_neon(cpu_flags
))
78 get_unscaled_swscale_neon(c
);