29#undef HAVE_AV_CONFIG_H
113 return ratio > 10.00 ?
"\033[1;94m" :
114 ratio > 2.00 ?
"\033[1;32m" :
115 ratio > 1.02 ?
"\033[32m" :
117 ratio > 0.90 ?
"\033[33m" :
118 ratio > 0.75 ?
"\033[31m" :
126 fprintf(stderr,
"Overall speedup=%.3fx %s%s\033[0m, min=%.3fx max=%.3fx\n", ratio,
138 float variance = 1.0 / 12;
139 if (
desc->comp[0].depth < 8) {
141 variance *= (8 -
desc->comp[0].depth);
147 const float r = 0.299 / (1 <<
desc->comp[0].depth);
148 const float g = 0.587 / (1 <<
desc->comp[1].depth);
149 const float b = 0.114 / (1 <<
desc->comp[2].depth);
150 return (
r *
r +
g *
g +
b *
b) * variance;
152 const float y = 1.0 / (1 <<
desc->comp[0].depth);
153 return y * y * variance;
160 int comps =
desc->nb_components >= 3 ? 0x7 : 0x1;
172 for (
int p = 0; p < 4; p++) {
173 const int stride_a =
out->linesize[p];
174 const int stride_b =
ref->linesize[p];
175 const int w =
out->width;
176 const int h =
out->height;
178 const int is_chroma = p == 1 || p == 2;
179 const uint8_t def = is_chroma ? 128 : 0xFF;
180 const int has_ref = comps & (1 << p);
185 for (
int y = 0; y < (
h & ~3); y += 4) {
186 for (
int x = 0; x < (
w & ~3); x += 4) {
187 const float c1 = .01 * .01 * 255 * 255 * 64;
188 const float c2 = .03 * .03 * 255 * 255 * 64 * 63;
189 int s1 = 0, s2 = 0,
ss = 0, s12 = 0, var, covar;
191 for (
int yy = 0; yy < 4; yy++) {
192 for (
int xx = 0; xx < 4; xx++) {
193 int a =
out->data[p][(y + yy) * stride_a + x + xx];
194 int b = has_ref ?
ref->data[p][(y + yy) * stride_b + x + xx] : def;
202 var =
ss * 64 - s1 * s1 - s2 * s2;
203 covar = s12 * 64 - s1 * s2;
204 sum += (2 * s1 * s2 +
c1) * (2 * covar +
c2) /
205 ((s1 * s1 + s2 * s2 +
c1) * (var +
c2));
210 ssim[p] = count ? sum / count : 0.0;
216 const float weights[3] = { 0.8, 0.1, 0.1 };
219 for (
int i = 0;
i < 3;
i++)
235 memset(
frame->linesize, 0,
sizeof(
frame->linesize));
267 for (
int i = 0; ret >= 0 &&
i <
opts->iters;
i++) {
269 if (
opts->align_dst) {
318 for (
int i = 0; ret >= 0 &&
i <
opts->iters;
i++)
340 if (
src->format ==
dst->format)
425 for (
int i = 0; ret >= 0 &&
i <
opts->iters;
i++) {
458 "%-*s %*dx%*d -> %-*s %*dx%*d, flags=0x%0*x dither=%u scaler=%d/%d",
460 opts->pretty ? 4 : 0,
src->width,
461 opts->pretty ? 4 : 0,
src->height,
463 opts->pretty ? 4 : 0,
dst->width,
464 opts->pretty ? 4 : 0,
dst->height,
472 int dst_w,
int dst_h,
484 if (!
opts->bench || !ref_r) {
485 printf(
", SSIM={Y=%f U=%f V=%f A=%f} loss=%e",
486 r->ssim[0],
r->ssim[1],
r->ssim[2],
r->ssim[3],
493 printf(
", time=%*"PRId64
"/%u us",
494 opts->pretty ? 7 : 0,
r->time,
opts->iters);
497 / ((
double)
r->time /
opts->iters);
505 printf(
" (ref=%*"PRId64
"/%u us), speedup=%*.3fx %s%s\033[0m",
507 opts->pretty ? 6 : 0, ratio,
516 if (
r->loss - expected_loss > 1e-4 && dst_w >=
ref->width && dst_h >=
ref->height) {
517 const int bad =
r->loss - expected_loss > 1e-2;
519 const char *worse_str =
bad ?
"WORSE" :
"worse";
525 " loss %e is %s by %e, expected loss %e\n",
526 r->loss, worse_str,
r->loss - expected_loss, expected_loss);
529 if (ref_r &&
r->loss - ref_r->
loss > 1e-4) {
539 const int bad =
r->loss - ref_r->
loss > 1e-2 && dst_bits > 1;
541 const char *worse_str =
bad ?
"WORSE" :
"worse";
547 " loss %e is %s by %e, ref loss %e SSIM={Y=%f U=%f V=%f A=%f}\n",
548 r->loss, worse_str,
r->loss - ref_r->
loss, ref_r->
loss,
569 int dst_w,
int dst_h,
580 const float c1 = 0.01 * 0.01;
581 const float ref_var = 1.0 / 12.0;
585 const float total_var = src_var + dst_var + out_var;
586 const float ssim_luma = (2 * ref_var +
c1) / (2 * ref_var + total_var +
c1);
587 const float ssim_expected[4] = { ssim_luma, 1, 1, 1 };
588 const float expected_loss =
get_loss(ssim_expected);
592 if (!
src ||
src->format != src_fmt) {
597 if (
opts->align_src) {
639 if (src_var > dst_var) {
640 const float src_loss = (2 * ref_var +
c1) / (2 * ref_var + src_var +
c1);
641 r.ssim[0] =
FFMIN(
r.ssim[0], src_loss);
646 if ((
opts->api !=
IMPL_LEGACY) &&
r.loss - expected_loss > 1e-2 && dst_w >=
ref->width && dst_h >=
ref->height) {
651 if (ref_r &&
r.loss - ref_r->
loss > 1e-2) {
694 const int scaler_sub =
opts->scaler_sub ?
opts->scaler_sub :
opts->scaler;
731 src_fmt_min = src_fmt_max =
opts->src_fmt;
733 dst_fmt_min = dst_fmt_max =
opts->dst_fmt;
735 for (src_fmt = src_fmt_min; src_fmt <= src_fmt_max; src_fmt++) {
738 for (dst_fmt = dst_fmt_min; dst_fmt <= dst_fmt_max; dst_fmt++) {
752 int dst_w = (
opts->dst_w >= 0) ?
opts->dst_w : dst_w_values[
w];
753 int dst_h = (
opts->dst_h >= 0) ?
opts->dst_h : dst_h_values[
h];
755 if (
opts->scaler >= 0 &&
opts->w == dst_w &&
opts->h == dst_h)
759 ret =
run_test(src_fmt, dst_fmt, dst_w, dst_h,
768 if (
opts->dst_w >= 0 ||
opts->dst_h >= 0)
770 if (
opts->scaler < 0)
773 if (
opts->dst_w >= 0 ||
opts->dst_h >= 0)
775 if (
opts->scaler < 0)
795 for (
int line = 1; fgets(buf,
sizeof(buf), fp);
line++) {
796 char src_fmt_str[21], dst_fmt_str[21];
805 "%20s %dx%d -> %20s %dx%d, flags=0x%x dither=%u scaler=%u/%u, "
806 "SSIM={Y=%f U=%f V=%f A=%f} loss=%e%n",
807 src_fmt_str, &sw, &sh, dst_fmt_str, &dw, &dh,
810 &
r.ssim[0], &
r.ssim[1], &
r.ssim[2], &
r.ssim[3],
814 "Malformed reference file in line %d\n",
line);
818 ret = sscanf(buf + n,
819 ", time=%"PRId64
"/%u us",
823 "Missing benchmarks from reference file in line %d\n",
833 "Unknown pixel formats (%s and/or %s) in line %d\n",
834 src_fmt_str, dst_fmt_str,
line);
838 if (sw !=
ref->width || sh !=
ref->height) {
840 "Mismatching dimensions %dx%d (ref is %dx%d) in line %d\n",
879 for (
int y = 0; y <
rgb->height; y++) {
880 for (
int x = 0; x <
rgb->width; x++) {
881 for (
int c = 0;
c < 4;
c++)
898 if (ret < 0 && strchr(str,
':')) {
904 char *saveptr =
NULL;
921 if (!strcmp(str,
"legacy"))
923 if (!strcmp(str,
"new"))
934 for (
int i = 1;
i < argc;
i += 2) {
935 if (!strcmp(argv[
i],
"-help") || !strcmp(argv[
i],
"--help")) {
937 "swscale [options...]\n"
941 " Uses file as reference to compare tests against. Tests that have become worse will contain the string worse or WORSE\n"
942 " -p <number between 0.0 and 1.0>\n"
943 " The proportion of tests or comparisons to perform.\n"
944 " It is often convenient to perform a random subset\n"
946 " Only test the specified destination pixel format\n"
948 " Only test the specified source pixel format\n"
949 " -s <size>[:<size>]\n"
950 " Set frame size (WxH or abbreviation)\n"
951 " Optionally set destination frame size (after a ':' separator character).\n"
953 " Run benchmarks with the specified number of iterations. This mode also sets the frame size to 1920x1080 (unless -s is specified)\n"
955 " Test with a specific combination of flags\n"
957 " Test with a specific dither mode\n"
958 " -backends <backends>\n"
959 " Restrict to the given set of allowed swscale backends\n"
960 " -scaler <algorithm>\n"
961 " Test with a specified scaler algorithm\n"
962 " If 'none', test only conversions that do not involve scaling\n"
963 " -scaler_sub <algorithm>\n"
964 " Test with a specified scaler algorithm for chroma planes\n"
965 " -align_src <alignment>\n"
966 " If nonzero, allocate source buffers with a custom stride alignment\n"
967 " -align_dst <alignment>\n"
968 " If nonzero, allocate destination buffers with a custom stride alignment\n"
969 " -api <new or legacy>\n"
970 " Use selected swscale API for the main conversion (default: new)\n"
972 " Use Vulkan hardware acceleration on the specified device for the main conversion\n"
973 " -threads <threads>\n"
974 " Use the specified number of threads\n"
975 " -cpuflags <cpuflags>\n"
976 " Uses the specified cpuflags in the tests\n"
977 " -pretty <1 or 0>\n"
978 " Align fields while printing results\n"
980 " Enable log verbosity at given level\n"
984 if (argv[
i][0] !=
'-' ||
i + 1 == argc)
986 if (!strcmp(argv[
i],
"-ref")) {
987 *fp = fopen(argv[
i + 1],
"r");
989 fprintf(stderr,
"could not open '%s'\n", argv[
i + 1]);
993 }
else if (!strcmp(argv[
i],
"-cpuflags")) {
997 fprintf(stderr,
"invalid cpu flags %s\n", argv[
i + 1]);
1001 }
else if (!strcmp(argv[
i],
"-src")) {
1004 fprintf(stderr,
"invalid pixel format %s\n", argv[
i + 1]);
1008 }
else if (!strcmp(argv[
i],
"-dst")) {
1011 fprintf(stderr,
"invalid pixel format %s\n", argv[
i + 1]);
1015 }
else if (!strcmp(argv[
i],
"-s")) {
1018 fprintf(stderr,
"invalid frame size %s\n", argv[
i + 1]);
1021 }
else if (!strcmp(argv[
i],
"-bench")) {
1022 int iters = atoi(argv[
i + 1]);
1028 opts->iters = iters;
1030 }
else if (!strcmp(argv[
i],
"-flags")) {
1034 fprintf(stderr,
"invalid flags %s\n", argv[
i + 1]);
1037 }
else if (!strcmp(argv[
i],
"-backends")) {
1041 fprintf(stderr,
"invalid backends %s\n", argv[
i + 1]);
1044 }
else if (!strcmp(argv[
i],
"-dither")) {
1045 opts->dither = atoi(argv[
i + 1]);
1046 }
else if (!strcmp(argv[
i],
"-scaler") || !strcmp(argv[
i],
"-scaler_sub")) {
1047 int opt_is_scaler = !strcmp(argv[
i],
"-scaler");
1048 if (opt_is_scaler && !strcmp(argv[
i + 1],
"none")) {
1055 fprintf(stderr,
"invalid scaler algorithm %s\n", argv[
i + 1]);
1058 }
else if (!strcmp(argv[
i],
"-align_src")) {
1059 opts->align_src = atoi(argv[
i + 1]);
1060 if (
opts->align_src < 0 || (
opts->align_src & (
opts->align_src - 1))) {
1061 fprintf(stderr,
"invalid alignment %s\n", argv[
i + 1]);
1064 }
else if (!strcmp(argv[
i],
"-align_dst")) {
1065 opts->align_dst = atoi(argv[
i + 1]);
1066 if (
opts->align_dst < 0 || (
opts->align_dst & (
opts->align_dst - 1))) {
1067 fprintf(stderr,
"invalid alignment %s\n", argv[
i + 1]);
1070 }
else if (!strcmp(argv[
i],
"-api")) {
1073 fprintf(stderr,
"invalid api %s\n", argv[
i + 1]);
1077 }
else if (!strcmp(argv[
i],
"-hw")) {
1080 argv[
i + 1],
NULL, 0);
1082 fprintf(stderr,
"Failed to create Vulkan device '%s'\n",
1089 fprintf(stderr,
"Failed to retrieve Vulkan device constraints '%s'\n",
1094 }
else if (!strcmp(argv[
i],
"-threads")) {
1095 opts->threads = atoi(argv[
i + 1]);
1096 }
else if (!strcmp(argv[
i],
"-p")) {
1097 opts->prob = atof(argv[
i + 1]);
1098 }
else if (!strcmp(argv[
i],
"-pretty")) {
1099 opts->pretty = atoi(argv[
i + 1]);
1100 }
else if (!strcmp(argv[
i],
"-v")) {
1104 fprintf(stderr,
"bad option or argument missing (%s) see -help\n", argv[
i]);
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static const char *const format[]
static AVFormatContext * ctx
static AVDictionary * opts
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
#define ss(width, name, subs,...)
__device__ int printf(const char *,...)
reference-counted frame API
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_log_set_level(int level)
Set the log level.
int av_log_get_level(void)
Get the current log level.
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
av_warn_unused_result int sws_init_context(SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter)
Initialize the swscaler context sws_context.
int sws_scale_frame(SwsContext *sws, AVFrame *dst, const AVFrame *src)
Scale source data from src and write the output to dst.
SwsContext * sws_alloc_context(void)
Allocate an empty SwsContext and set its fields to default values.
void sws_free_context(SwsContext **ctx)
Free the context and everything associated with it, and write NULL to the provided pointer.
int sws_frame_setup(SwsContext *ctx, const AVFrame *dst, const AVFrame *src)
Like sws_scale_frame, but without actually scaling.
void sws_freeContext(SwsContext *swsContext)
Free the swscaler context swsContext.
@ SWS_BACKEND_LEGACY
Legacy bespoke format-specific code.
@ SWS_BICUBIC
2-tap cubic B-spline
@ SWS_BILINEAR
bilinear filtering
@ SWS_FULL_CHR_H_INP
Perform full chroma interpolation when downscaling RGB sources.
@ SWS_FAST_BILINEAR
Scaler selection options.
@ SWS_ACCURATE_RND
Force bit-exact output.
@ SWS_POINT
nearest neighbor
@ SWS_FULL_CHR_H_INT
Perform full chroma upsampling when upscaling to RGB.
int av_opt_eval_int(void *obj, const AVOption *o, const char *val, int *int_out)
int av_opt_eval_flags(void *obj, const AVOption *o, const char *val, int *flags_out)
const AVOption * av_opt_find(void *obj, const char *name, const char *unit, int opt_flags, int search_flags)
Look for an option in an object.
static const int weights[]
static AVBufferRef * hw_device_ctx
int av_hwdevice_ctx_create(AVBufferRef **pdevice_ref, enum AVHWDeviceType type, const char *device, AVDictionary *opts, int flags)
Open a device of the specified type and create an AVHWDeviceContext for it.
void av_hwframe_constraints_free(AVHWFramesConstraints **constraints)
Free an AVHWFrameConstraints structure.
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags)
Copy data to or from a hw surface.
AVHWFramesConstraints * av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, const void *hwconfig)
Get the constraints on HW frames given a device and the HW-specific configuration to be used with tha...
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
@ AV_HWDEVICE_TYPE_VULKAN
static int bad(InterplayACMContext *s, unsigned ind, unsigned col)
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
void av_force_cpu_flags(int arg)
Disables cpu detection and forces the specified flags.
int av_parse_cpu_caps(unsigned *flags, const char *s)
Parse CPU caps from a string and update the given AV_CPU_* flags based on that.
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Utility Preprocessor macros.
int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str)
Parse str and put in width_ptr and height_ptr the detected values.
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
@ AV_PIX_FMT_NB
number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of...
@ 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...
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
simple Pseudo Random Number Generator
static uint64_t ff_sfc64_get(FFSFC64 *s)
static void ff_sfc64_init(FFSFC64 *s, uint64_t seeda, uint64_t seedb, uint64_t seedc, int rounds)
Initialize sfc64 with up to 3 seeds.
static volatile sig_atomic_t sig
#define FF_ARRAY_ELEMS(a)
A reference to a data buffer.
uint8_t * data
The data buffer.
int depth
Number of bits in the component.
This structure describes decoded (raw) audio or video data.
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
This struct describes the constraints on hardware frames attached to a given device with a hardware-s...
This struct describes a set or pool of "hardware" frames (i.e.
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
int width
The allocated dimensions of the frames in this pool.
Context structure for the Lagged Fibonacci PRNG.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Main external API structure.
int src_h
Width and height of the source frame.
int dst_format
Destination pixel format.
int threads
How many threads to use for processing, or 0 for automatic selection.
SwsScaler scaler
Scaling filter.
int dst_h
Width and height of the destination frame.
SwsScaler scaler_sub
Scaler used specifically for up/downsampling subsampled (chroma) planes.
int src_w
Deprecated frame property overrides, for the legacy API only.
int src_format
Source pixel format.
SwsDither dither
Dither mode.
unsigned flags
Bitmask of SWS_*.
enum AVPixelFormat dst_fmt
enum AVPixelFormat src_fmt
static void error(const char *err)
static int ref[MAX_W *MAX_W]
static double speedup_min
static const char * speedup_color(double ratio)
static int init_ref(AVFrame *ref, const struct options *opts)
static double speedup_logavg
static int scale_new(AVFrame *dst, const AVFrame *src, const struct mode *mode, const struct options *opts, int64_t *out_time)
static float estimate_quantization_noise(enum AVPixelFormat fmt)
static void exit_handler(int sig)
static void print_test_params(char *buf, size_t buf_size, const AVFrame *src, const AVFrame *dst, const struct mode *mode, const struct options *opts)
static double speedup_max
static int fmt_disabled(const struct options *opts, enum AVPixelFormat fmt)
static float get_loss(const float ssim[4])
static int checked_sws_scale_frame(SwsContext *c, AVFrame *dst, const AVFrame *src)
static FFSFC64 prng_state
static int init_frame(AVFrame **pframe, const AVFrame *ref, int width, int height, enum AVPixelFormat format)
static int run_self_tests(const AVFrame *ref, const struct options *opts)
static int run_file_tests(const AVFrame *ref, FILE *fp, const struct options *opts)
static int parse_implementation(const char *str)
static int scale_hw(AVFrame *dst, const AVFrame *src, const struct mode *mode, const struct options *opts, int64_t *out_time)
static int run_test(enum AVPixelFormat src_fmt, enum AVPixelFormat dst_fmt, int dst_w, int dst_h, const struct mode *mode, const struct options *opts, const AVFrame *ref, AVFrame **psrc, const struct test_results *ref_r)
static int fmt_is_supported_by_hw(enum AVPixelFormat fmt)
static int scale_legacy(AVFrame *dst, const AVFrame *src, const struct mode *mode, const struct options *opts, int64_t *out_time)
static void get_ssim(float ssim[4], const AVFrame *out, const AVFrame *ref, int comps)
static int fmt_is_subsampled(enum AVPixelFormat fmt)
static SwsContext * sws_ref_src
static int parse_size(struct options *opts, const char *str, char **pbuf)
static int parse_options(int argc, char **argv, struct options *opts, FILE **fp)
static int fmt_comps(enum AVPixelFormat fmt)
static void print_results(const AVFrame *ref, const AVFrame *src, const AVFrame *dst, int dst_w, int dst_h, const struct mode *mode, const struct options *opts, const struct test_results *r, const struct test_results *ref_r, float expected_loss)
static AVHWFramesConstraints * hw_device_constr
static SwsContext * sws_src_dst
static int test_formats(const struct options *opts, enum AVPixelFormat src, enum AVPixelFormat dst)
static void unref_buffers(AVFrame *frame)
static SwsContext * sws_dst_out
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.