FFmpeg
Loading...
Searching...
No Matches
sw_yuv2yuv.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * FFmpeg 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
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
19#include <string.h>
20
21#include "libavutil/common.h"
24#include "libavutil/pixdesc.h"
25
26#include "libswscale/swscale.h"
28
29#include "checkasm.h"
30
31#define randomize_buffers(buf, size) \
32 do { \
33 for (int j = 0; j < size; j += 4) \
34 AV_WN32(buf + j, rnd()); \
35 } while (0)
36
37static void check_semiplanar(int dst_pix_fmt)
38{
39 static const int src_fmts[] = {
42 };
43 const AVPixFmtDescriptor *dst_desc = av_pix_fmt_desc_get(dst_pix_fmt);
44#define NUM_LINES 4
45#define MAX_LINE_SIZE 1920
46 static const int input_sizes[] = {8, 128, 1080, MAX_LINE_SIZE};
47
48 declare_func(int, SwsInternal *c, const uint8_t *const src[],
49 const int srcStride[], int srcSliceY, int srcSliceH,
50 uint8_t *const dstParam[], const int dstStride[]);
51
52 LOCAL_ALIGNED_8(uint8_t, src_y, [MAX_LINE_SIZE * NUM_LINES]);
53 LOCAL_ALIGNED_8(uint8_t, src_uv, [MAX_LINE_SIZE * NUM_LINES * 2]);
54 const uint8_t *src[4] = { src_y, src_uv };
55
56 LOCAL_ALIGNED_8(uint8_t, dst0_y, [MAX_LINE_SIZE * NUM_LINES]);
57 LOCAL_ALIGNED_8(uint8_t, dst0_u, [MAX_LINE_SIZE * NUM_LINES / 2]);
58 LOCAL_ALIGNED_8(uint8_t, dst0_v, [MAX_LINE_SIZE * NUM_LINES / 2]);
59 uint8_t *dst0[4] = { dst0_y, dst0_u, dst0_v };
60
61 LOCAL_ALIGNED_8(uint8_t, dst1_y, [MAX_LINE_SIZE * NUM_LINES]);
62 LOCAL_ALIGNED_8(uint8_t, dst1_u, [MAX_LINE_SIZE * NUM_LINES / 2]);
63 LOCAL_ALIGNED_8(uint8_t, dst1_v, [MAX_LINE_SIZE * NUM_LINES / 2]);
64 uint8_t *dst1[4] = { dst1_y, dst1_u, dst1_v };
65
68
69 for (int sfi = 0; sfi < FF_ARRAY_ELEMS(src_fmts); sfi++) {
70 int src_pix_fmt = src_fmts[sfi];
71 const AVPixFmtDescriptor *src_desc = av_pix_fmt_desc_get(src_pix_fmt);
72 for (int isi = 0; isi < FF_ARRAY_ELEMS(input_sizes); isi++) {
73 SwsContext *sws;
75 int log_level;
76 int width = input_sizes[isi];
77 int srcSliceY = 0;
78 int srcSliceH = NUM_LINES;
79 int srcStride[4] = {
81 MAX_LINE_SIZE * 2,
82 };
83 int dstStride[4] = {
85 MAX_LINE_SIZE >> dst_desc->log2_chroma_w,
86 MAX_LINE_SIZE >> dst_desc->log2_chroma_w,
87 };
88
89 // override log level to prevent spamming of the message
90 // "No accelerated colorspace conversion found from %s to %s"
91 log_level = av_log_get_level();
93 sws = sws_getContext(width, srcSliceH, src_pix_fmt,
94 width, srcSliceH, dst_pix_fmt,
95 0, NULL, NULL, NULL);
96 av_log_set_level(log_level);
97 if (!sws)
98 fail();
99
100 c = sws_internal(sws);
101 if (check_func(c->convert_unscaled, "%s_%s_%d", src_desc->name, dst_desc->name, width)) {
102 memset(dst0_y, 0xFF, MAX_LINE_SIZE * NUM_LINES);
103 memset(dst0_u, 0xFF, MAX_LINE_SIZE * NUM_LINES / 2);
104 memset(dst0_v, 0xFF, MAX_LINE_SIZE * NUM_LINES / 2);
105 memset(dst1_y, 0xFF, MAX_LINE_SIZE * NUM_LINES);
106 memset(dst1_u, 0xFF, MAX_LINE_SIZE * NUM_LINES / 2);
107 memset(dst1_v, 0xFF, MAX_LINE_SIZE * NUM_LINES / 2);
108
109 call_ref(c, src, srcStride, srcSliceY,
110 srcSliceH, dst0, dstStride);
111 call_new(c, src, srcStride, srcSliceY,
112 srcSliceH, dst1, dstStride);
113
114 if (memcmp(dst0_y, dst1_y, MAX_LINE_SIZE * NUM_LINES) ||
115 memcmp(dst0_u, dst1_u, MAX_LINE_SIZE * NUM_LINES / 2) ||
116 memcmp(dst0_v, dst1_v, MAX_LINE_SIZE * NUM_LINES / 2))
117 fail();
118
119 bench_new(c, src, srcStride, srcSliceY,
120 srcSliceH, dst0, dstStride);
121 }
122 sws_freeContext(sws);
123 }
124 }
125}
126
127#undef NUM_LINES
128#undef MAX_LINE_SIZE
129
131{
133 report("yuv420p");
134}
common internal and external API header
#define NULL
Definition coverity.c:32
#define declare_func
Definition test.h:489
#define fail
Definition test.h:479
#define bench_new
Definition test.h:487
#define check_func
Definition test.h:481
#define call_new
Definition test.h:486
#define call_ref
Definition test.h:485
#define report
Definition test.h:480
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
void av_log_set_level(int level)
Set the log level.
Definition log.c:476
int av_log_get_level(void)
Get the current log level.
Definition log.c:471
SwsContext * sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, enum AVPixelFormat dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)
Allocate and return an SwsContext.
Definition utils.c:1919
void sws_freeContext(SwsContext *swsContext)
Free the swscaler context swsContext.
Definition utils.c:2250
#define LOCAL_ALIGNED_8(t, v,...)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
@ AV_PIX_FMT_NV42
as above, but U and V bytes are swapped
Definition pixfmt.h:372
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition pixfmt.h:371
#define FF_ARRAY_ELEMS(a)
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
const char * name
Definition pixdesc.h:70
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition pixdesc.h:80
Main external API structure.
Definition swscale.h:227
static const int input_sizes[]
Definition sw_rgb.c:351
#define randomize_buffers(buf, size)
Definition sw_yuv2yuv.c:31
static void check_semiplanar(int dst_pix_fmt)
Definition sw_yuv2yuv.c:37
void checkasm_check_sw_yuv2yuv(void)
Definition sw_yuv2yuv.c:130
external API header
static SwsInternal * sws_internal(const SwsContext *sws)
#define NUM_LINES
#define src
Definition vp8dsp.c:248
#define width
Definition dsp.h:89
#define MAX_LINE_SIZE
Definition vf_lut3d.c:547
static double c[64]