FFmpeg
Loading...
Searching...
No Matches
vf_colordetect_init.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2025 Niklas Haas
3 *
4 * This file is part of FFmpeg.
5 *
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.
10 *
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.
15 *
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
19 */
20
22#include "libavutil/x86/cpu.h"
24
25#define DETECT_RANGE_FUNC(FUNC_NAME, ASM_FUNC_NAME, C_FUNC_NAME, SHIFT, MMSIZE) \
26int ASM_FUNC_NAME(const uint8_t *src, ptrdiff_t stride, \
27 ptrdiff_t width, ptrdiff_t height, int min, int max); \
28 \
29static int FUNC_NAME(const uint8_t *src, ptrdiff_t stride, \
30 ptrdiff_t width, ptrdiff_t height, int min, int max) \
31{ \
32 ptrdiff_t total = width << SHIFT; \
33 ptrdiff_t bytes = total & ~(MMSIZE - 1); \
34 int ret; \
35 if (!bytes) \
36 return C_FUNC_NAME(src, stride, width, height, min, max); \
37 \
38 ret = ASM_FUNC_NAME(src, stride, bytes, height, min, max); \
39 if (ret || bytes == total) \
40 return ret; \
41 \
42 return ret | ASM_FUNC_NAME(src + total - MMSIZE, stride, MMSIZE, \
43 height, min, max); \
44}
45
46#define DETECT_ALPHA_FUNC(FUNC_NAME, ASM_FUNC_NAME, C_FUNC_NAME, SHIFT, MMSIZE) \
47int ASM_FUNC_NAME(const uint8_t *color, ptrdiff_t color_stride, \
48 const uint8_t *alpha, ptrdiff_t alpha_stride, \
49 ptrdiff_t width, ptrdiff_t height, int p, int q, int k); \
50 \
51static int FUNC_NAME(const uint8_t *color, ptrdiff_t color_stride, \
52 const uint8_t *alpha, ptrdiff_t alpha_stride, \
53 ptrdiff_t width, ptrdiff_t height, int p, int q, int k) \
54{ \
55 ptrdiff_t total = width << SHIFT; \
56 ptrdiff_t bytes = total & ~(MMSIZE - 1); \
57 int ret; \
58 if (!bytes) \
59 return C_FUNC_NAME(color, color_stride, alpha, alpha_stride, \
60 width, height, p, q, k); \
61 \
62 ret = ASM_FUNC_NAME(color, color_stride, alpha, alpha_stride, \
63 bytes, height, p, q, k); \
64 if (ret == FF_ALPHA_STRAIGHT || bytes == total) \
65 return ret; \
66 \
67 return ret | ASM_FUNC_NAME(color + total - MMSIZE, color_stride, \
68 alpha + total - MMSIZE, alpha_stride, \
69 MMSIZE, height, p, q, k); \
70}
71
72#if HAVE_AVX512ICL_EXTERNAL
73DETECT_RANGE_FUNC(detect_range_avx512icl, ff_detect_rangeb_avx512icl, ff_detect_range_c, 0, 64)
74DETECT_RANGE_FUNC(detect_range16_avx512icl, ff_detect_rangew_avx512icl, ff_detect_range16_c, 1, 64)
75DETECT_ALPHA_FUNC(detect_alpha_full_avx512icl, ff_detect_alphab_full_avx512icl, ff_detect_alpha_full_c, 0, 64)
76DETECT_ALPHA_FUNC(detect_alpha16_full_avx512icl, ff_detect_alphaw_full_avx512icl, ff_detect_alpha16_full_c, 1, 64)
77DETECT_ALPHA_FUNC(detect_alpha_full_off_avx512icl, ff_detect_alphab_full_off_avx512icl, ff_detect_alpha_full_c, 0, 64)
78DETECT_ALPHA_FUNC(detect_alpha16_full_off_avx512icl, ff_detect_alphaw_full_off_avx512icl, ff_detect_alpha16_full_c, 1, 64)
79DETECT_ALPHA_FUNC(detect_alpha_limited_avx512icl, ff_detect_alphab_limited_avx512icl, ff_detect_alpha_limited_c, 0, 64)
80DETECT_ALPHA_FUNC(detect_alpha16_limited_avx512icl, ff_detect_alphaw_limited_avx512icl, ff_detect_alpha16_limited_c, 1, 64)
81#endif
82#if HAVE_AVX2_EXTERNAL
83DETECT_RANGE_FUNC(detect_range_avx2, ff_detect_rangeb_avx2, ff_detect_range_c, 0, 32)
84DETECT_RANGE_FUNC(detect_range16_avx2, ff_detect_rangew_avx2, ff_detect_range16_c, 1, 32)
85DETECT_ALPHA_FUNC(detect_alpha_full_avx2, ff_detect_alphab_full_avx2, ff_detect_alpha_full_c, 0, 32)
86DETECT_ALPHA_FUNC(detect_alpha16_full_avx2, ff_detect_alphaw_full_avx2, ff_detect_alpha16_full_c, 1, 32)
87DETECT_ALPHA_FUNC(detect_alpha_full_off_avx2, ff_detect_alphab_full_off_avx2, ff_detect_alpha_full_c, 0, 32)
88DETECT_ALPHA_FUNC(detect_alpha16_full_off_avx2, ff_detect_alphaw_full_off_avx2, ff_detect_alpha16_full_c, 1, 32)
89DETECT_ALPHA_FUNC(detect_alpha_limited_avx2, ff_detect_alphab_limited_avx2, ff_detect_alpha_limited_c, 0, 32)
90DETECT_ALPHA_FUNC(detect_alpha16_limited_avx2, ff_detect_alphaw_limited_avx2, ff_detect_alpha16_limited_c, 1, 32)
91#endif
92
95{
97#if HAVE_AVX2_EXTERNAL
99 dsp->detect_range = depth > 8 ? detect_range16_avx2 : detect_range_avx2;
101 dsp->detect_alpha = depth > 8 ? detect_alpha16_limited_avx2 : detect_alpha_limited_avx2;
102 } else if (offset) {
103 dsp->detect_alpha = depth > 8 ? detect_alpha16_full_off_avx2 : detect_alpha_full_off_avx2;
104 } else {
105 dsp->detect_alpha = depth > 8 ? detect_alpha16_full_avx2 : detect_alpha_full_avx2;
106 }
107 }
108#endif
109#if HAVE_AVX512ICL_EXTERNAL
111 dsp->detect_range = depth > 8 ? detect_range16_avx512icl : detect_range_avx512icl;
113 dsp->detect_alpha = depth > 8 ? detect_alpha16_limited_avx512icl : detect_alpha_limited_avx512icl;
114 } else if (offset) {
115 dsp->detect_alpha = depth > 8 ? detect_alpha16_full_off_avx512icl : detect_alpha_full_off_avx512icl;
116 } else {
117 dsp->detect_alpha = depth > 8 ? detect_alpha16_full_avx512icl : detect_alpha_full_avx512icl;
118 }
119 }
120#endif
121}
unsigned offset
Definition libaomenc.c:763
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
static atomic_int cpu_flags
Definition cpu.c:56
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition cpu.c:109
#define EXTERNAL_AVX2_FAST(flags)
Definition cpu.h:73
#define EXTERNAL_AVX512ICL(flags)
Definition cpu.h:78
AVColorRange
Visual content value range.
Definition pixfmt.h:748
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
int(* detect_range)(const uint8_t *data, ptrdiff_t stride, ptrdiff_t width, ptrdiff_t height, int mpeg_min, int mpeg_max)
int(* detect_alpha)(const uint8_t *color, ptrdiff_t color_stride, const uint8_t *alpha, ptrdiff_t alpha_stride, ptrdiff_t width, ptrdiff_t height, int alpha_max, int mpeg_range, int offset)
static int ff_detect_alpha16_full_c(const uint8_t *color, ptrdiff_t color_stride, const uint8_t *alpha, ptrdiff_t alpha_stride, ptrdiff_t width, ptrdiff_t height, int alpha_max, int mpeg_range, int offset)
static int ff_detect_range_c(const uint8_t *data, ptrdiff_t stride, ptrdiff_t width, ptrdiff_t height, int mpeg_min, int mpeg_max)
static int ff_detect_alpha16_limited_c(const uint8_t *color, ptrdiff_t color_stride, const uint8_t *alpha, ptrdiff_t alpha_stride, ptrdiff_t width, ptrdiff_t height, int alpha_max, int mpeg_range, int offset)
static int ff_detect_alpha_full_c(const uint8_t *color, ptrdiff_t color_stride, const uint8_t *alpha, ptrdiff_t alpha_stride, ptrdiff_t width, ptrdiff_t height, int alpha_max, int mpeg_range, int offset)
static int ff_detect_alpha_limited_c(const uint8_t *color, ptrdiff_t color_stride, const uint8_t *alpha, ptrdiff_t alpha_stride, ptrdiff_t width, ptrdiff_t height, int alpha_max, int mpeg_range, int offset)
static int ff_detect_range16_c(const uint8_t *data, ptrdiff_t stride, ptrdiff_t width, ptrdiff_t height, int mpeg_min, int mpeg_max)
color_range
#define DETECT_RANGE_FUNC(FUNC_NAME, ASM_FUNC_NAME, C_FUNC_NAME, SHIFT, MMSIZE)
av_cold void ff_color_detect_dsp_init_x86(FFColorDetectDSPContext *dsp, int depth, int offset, enum AVColorRange color_range)
#define DETECT_ALPHA_FUNC(FUNC_NAME, ASM_FUNC_NAME, C_FUNC_NAME, SHIFT, MMSIZE)