FFmpeg  4.3.9
vsrc_mptestsrc.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (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
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 /**
22  * @file
23  * MP test source, ported from MPlayer libmpcodecs/vf_test.c
24  */
25 
26 #include "libavutil/avstring.h"
27 #include "libavutil/opt.h"
28 #include "libavutil/parseutils.h"
29 #include "libavutil/pixdesc.h"
30 #include "avfilter.h"
31 #include "internal.h"
32 #include "formats.h"
33 #include "video.h"
34 
35 #define WIDTH 512
36 #define HEIGHT 512
37 
38 enum test_type {
51 };
52 
53 typedef struct MPTestContext {
54  const AVClass *class;
58  int hsub, vsub;
59  int test; ///< test_type
61 
62 #define OFFSET(x) offsetof(MPTestContext, x)
63 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
64 static const AVOption mptestsrc_options[]= {
65  { "rate", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },
66  { "r", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },
67  { "duration", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },
68  { "d", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },
69 
70  { "test", "set test to perform", OFFSET(test), AV_OPT_TYPE_INT, {.i64=TEST_ALL}, 0, INT_MAX, FLAGS, "test" },
71  { "t", "set test to perform", OFFSET(test), AV_OPT_TYPE_INT, {.i64=TEST_ALL}, 0, INT_MAX, FLAGS, "test" },
72  { "dc_luma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_DC_LUMA}, INT_MIN, INT_MAX, FLAGS, "test" },
73  { "dc_chroma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_DC_CHROMA}, INT_MIN, INT_MAX, FLAGS, "test" },
74  { "freq_luma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_FREQ_LUMA}, INT_MIN, INT_MAX, FLAGS, "test" },
75  { "freq_chroma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_FREQ_CHROMA}, INT_MIN, INT_MAX, FLAGS, "test" },
76  { "amp_luma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_AMP_LUMA}, INT_MIN, INT_MAX, FLAGS, "test" },
77  { "amp_chroma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_AMP_CHROMA}, INT_MIN, INT_MAX, FLAGS, "test" },
78  { "cbp", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_CBP}, INT_MIN, INT_MAX, FLAGS, "test" },
79  { "mv", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_MV}, INT_MIN, INT_MAX, FLAGS, "test" },
80  { "ring1", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_RING1}, INT_MIN, INT_MAX, FLAGS, "test" },
81  { "ring2", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_RING2}, INT_MIN, INT_MAX, FLAGS, "test" },
82  { "all", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_ALL}, INT_MIN, INT_MAX, FLAGS, "test" },
83  { "max_frames", "Set the maximum number of frames generated for each test", OFFSET(max_frames),
84  AV_OPT_TYPE_INT64, {.i64 = 30}, 1, INT64_MAX, FLAGS },
85  { "m", "Set the maximum number of frames generated for each test", OFFSET(max_frames),
86  AV_OPT_TYPE_INT64, {.i64 = 30}, 1, INT64_MAX, FLAGS },
87  { NULL }
88 };
89 
90 AVFILTER_DEFINE_CLASS(mptestsrc);
91 
92 static double c[64];
93 
94 static void init_idct(void)
95 {
96  int i, j;
97 
98  for (i = 0; i < 8; i++) {
99  double s = i == 0 ? sqrt(0.125) : 0.5;
100 
101  for (j = 0; j < 8; j++)
102  c[i*8+j] = s*cos((M_PI/8.0)*i*(j+0.5));
103  }
104 }
105 
106 static void idct(uint8_t *dst, int dst_linesize, int src[64])
107 {
108  int i, j, k;
109  double tmp[64];
110 
111  for (i = 0; i < 8; i++) {
112  for (j = 0; j < 8; j++) {
113  double sum = 0.0;
114 
115  for (k = 0; k < 8; k++)
116  sum += c[k*8+j] * src[8*i+k];
117 
118  tmp[8*i+j] = sum;
119  }
120  }
121 
122  for (j = 0; j < 8; j++) {
123  for (i = 0; i < 8; i++) {
124  double sum = 0.0;
125 
126  for (k = 0; k < 8; k++)
127  sum += c[k*8+i]*tmp[8*k+j];
128 
129  dst[dst_linesize*i + j] = av_clip_uint8(lrint(sum));
130  }
131  }
132 }
133 
134 static void draw_dc(uint8_t *dst, int dst_linesize, int color, int w, int h)
135 {
136  int x, y;
137 
138  for (y = 0; y < h; y++)
139  for (x = 0; x < w; x++)
140  dst[x + y*dst_linesize] = color;
141 }
142 
143 static void draw_basis(uint8_t *dst, int dst_linesize, int amp, int freq, int dc)
144 {
145  int src[64];
146 
147  memset(src, 0, 64*sizeof(int));
148  src[0] = dc;
149  if (amp)
150  src[freq] = amp;
151  idct(dst, dst_linesize, src);
152 }
153 
154 static void draw_cbp(uint8_t *dst[3], int dst_linesize[3], int cbp, int amp, int dc)
155 {
156  if (cbp&1) draw_basis(dst[0] , dst_linesize[0], amp, 1, dc);
157  if (cbp&2) draw_basis(dst[0]+8 , dst_linesize[0], amp, 1, dc);
158  if (cbp&4) draw_basis(dst[0]+ 8*dst_linesize[0], dst_linesize[0], amp, 1, dc);
159  if (cbp&8) draw_basis(dst[0]+8+8*dst_linesize[0], dst_linesize[0], amp, 1, dc);
160  if (cbp&16) draw_basis(dst[1] , dst_linesize[1], amp, 1, dc);
161  if (cbp&32) draw_basis(dst[2] , dst_linesize[2], amp, 1, dc);
162 }
163 
164 static void dc_test(uint8_t *dst, int dst_linesize, int w, int h, int off)
165 {
166  const int step = FFMAX(256/(w*h/256), 1);
167  int x, y, color = off;
168 
169  for (y = 0; y < h; y += 16) {
170  for (x = 0; x < w; x += 16) {
171  draw_dc(dst + x + y*dst_linesize, dst_linesize, color, 8, 8);
172  color += step;
173  }
174  }
175 }
176 
177 static void freq_test(uint8_t *dst, int dst_linesize, int off)
178 {
179  int x, y, freq = 0;
180 
181  for (y = 0; y < 8*16; y += 16) {
182  for (x = 0; x < 8*16; x += 16) {
183  draw_basis(dst + x + y*dst_linesize, dst_linesize, 4*(96+off), freq, 128*8);
184  freq++;
185  }
186  }
187 }
188 
189 static void amp_test(uint8_t *dst, int dst_linesize, int off)
190 {
191  int x, y, amp = off;
192 
193  for (y = 0; y < 16*16; y += 16) {
194  for (x = 0; x < 16*16; x += 16) {
195  draw_basis(dst + x + y*dst_linesize, dst_linesize, 4*amp, 1, 128*8);
196  amp++;
197  }
198  }
199 }
200 
201 static void cbp_test(uint8_t *dst[3], int dst_linesize[3], int off)
202 {
203  int x, y, cbp = 0;
204 
205  for (y = 0; y < 16*8; y += 16) {
206  for (x = 0; x < 16*8; x += 16) {
207  uint8_t *dst1[3];
208  dst1[0] = dst[0] + x*2 + y*2*dst_linesize[0];
209  dst1[1] = dst[1] + x + y* dst_linesize[1];
210  dst1[2] = dst[2] + x + y* dst_linesize[2];
211 
212  draw_cbp(dst1, dst_linesize, cbp, (64+off)*4, 128*8);
213  cbp++;
214  }
215  }
216 }
217 
218 static void mv_test(uint8_t *dst, int dst_linesize, int off)
219 {
220  int x, y;
221 
222  for (y = 0; y < 16*16; y++) {
223  if (y&16)
224  continue;
225  for (x = 0; x < 16*16; x++)
226  dst[x + y*dst_linesize] = x + off*8/(y/32+1);
227  }
228 }
229 
230 static void ring1_test(uint8_t *dst, int dst_linesize, int off)
231 {
232  int x, y, color = 0;
233 
234  for (y = off; y < 16*16; y += 16) {
235  for (x = off; x < 16*16; x += 16) {
236  draw_dc(dst + x + y*dst_linesize, dst_linesize, ((x+y)&16) ? color : -color, 16, 16);
237  color++;
238  }
239  }
240 }
241 
242 static void ring2_test(uint8_t *dst, int dst_linesize, int off)
243 {
244  int x, y;
245 
246  for (y = 0; y < 16*16; y++) {
247  for (x = 0; x < 16*16; x++) {
248  double d = hypot(x-8*16, y-8*16);
249  double r = d/20 - (int)(d/20);
250  if (r < off/30.0) {
251  dst[x + y*dst_linesize] = 255;
252  dst[x + y*dst_linesize+256] = 0;
253  } else {
254  dst[x + y*dst_linesize] = x;
255  dst[x + y*dst_linesize+256] = x;
256  }
257  }
258  }
259 }
260 
262 {
263  MPTestContext *test = ctx->priv;
264 
265  test->max_pts = test->duration >= 0 ?
267  test->pts = 0;
268 
269  av_log(ctx, AV_LOG_VERBOSE, "rate:%d/%d duration:%f\n",
270  test->frame_rate.num, test->frame_rate.den,
271  test->duration < 0 ? -1 : test->max_pts * av_q2d(av_inv_q(test->frame_rate)));
272  init_idct();
273 
274  return 0;
275 }
276 
277 static int config_props(AVFilterLink *outlink)
278 {
279  AVFilterContext *ctx = outlink->src;
280  MPTestContext *test = ctx->priv;
281  const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(outlink->format);
282 
283  test->hsub = pix_desc->log2_chroma_w;
284  test->vsub = pix_desc->log2_chroma_h;
285 
286  outlink->w = WIDTH;
287  outlink->h = HEIGHT;
288  outlink->time_base = av_inv_q(test->frame_rate);
289 
290  return 0;
291 }
292 
294 {
295  static const enum AVPixelFormat pix_fmts[] = {
297  };
298 
299  AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
300  if (!fmts_list)
301  return AVERROR(ENOMEM);
302  return ff_set_common_formats(ctx, fmts_list);
303 }
304 
305 static int request_frame(AVFilterLink *outlink)
306 {
307  MPTestContext *test = outlink->src->priv;
308  AVFrame *picref;
309  int w = WIDTH, h = HEIGHT,
310  cw = AV_CEIL_RSHIFT(w, test->hsub), ch = AV_CEIL_RSHIFT(h, test->vsub);
311  uint64_t frame = outlink->frame_count_in / test->max_frames;
312  uint64_t mod = outlink->frame_count_in % test->max_frames;
313  enum test_type tt = test->test;
314  int i;
315 
316  if (test->max_pts >= 0 && test->pts > test->max_pts)
317  return AVERROR_EOF;
318  picref = ff_get_video_buffer(outlink, w, h);
319  if (!picref)
320  return AVERROR(ENOMEM);
321  picref->pts = test->pts++;
322 
323  // clean image
324  for (i = 0; i < h; i++)
325  memset(picref->data[0] + i*picref->linesize[0], 0, w);
326  for (i = 0; i < ch; i++) {
327  memset(picref->data[1] + i*picref->linesize[1], 128, cw);
328  memset(picref->data[2] + i*picref->linesize[2], 128, cw);
329  }
330 
331  if (tt == TEST_ALL && mod) /* draw a black frame at the beginning of each test */
332  tt = frame%(TEST_NB-1);
333 
334  switch (tt) {
335  case TEST_DC_LUMA: dc_test(picref->data[0], picref->linesize[0], 256, 256, mod); break;
336  case TEST_DC_CHROMA: dc_test(picref->data[1], picref->linesize[1], 256, 256, mod); break;
337  case TEST_FREQ_LUMA: freq_test(picref->data[0], picref->linesize[0], mod); break;
338  case TEST_FREQ_CHROMA: freq_test(picref->data[1], picref->linesize[1], mod); break;
339  case TEST_AMP_LUMA: amp_test(picref->data[0], picref->linesize[0], mod); break;
340  case TEST_AMP_CHROMA: amp_test(picref->data[1], picref->linesize[1], mod); break;
341  case TEST_CBP: cbp_test(picref->data , picref->linesize , mod); break;
342  case TEST_MV: mv_test(picref->data[0], picref->linesize[0], mod); break;
343  case TEST_RING1: ring1_test(picref->data[0], picref->linesize[0], mod); break;
344  case TEST_RING2: ring2_test(picref->data[0], picref->linesize[0], mod); break;
345  }
346 
347  return ff_filter_frame(outlink, picref);
348 }
349 
350 static const AVFilterPad mptestsrc_outputs[] = {
351  {
352  .name = "default",
353  .type = AVMEDIA_TYPE_VIDEO,
354  .request_frame = request_frame,
355  .config_props = config_props,
356  },
357  { NULL }
358 };
359 
361  .name = "mptestsrc",
362  .description = NULL_IF_CONFIG_SMALL("Generate various test pattern."),
363  .priv_size = sizeof(MPTestContext),
364  .priv_class = &mptestsrc_class,
365  .init = init,
367  .inputs = NULL,
368  .outputs = mptestsrc_outputs,
369 };
#define NULL
Definition: coverity.c:32
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2549
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
AVOption.
Definition: opt.h:246
#define HEIGHT
static int config_props(AVFilterLink *outlink)
Main libavfilter public API header.
static void init_idct(void)
int num
Numerator.
Definition: rational.h:59
static av_cold int init(AVFilterContext *ctx)
static int request_frame(AVFilterLink *outlink)
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:104
static void dc_test(uint8_t *dst, int dst_linesize, int w, int h, int off)
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:92
int test
test_type
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:300
const char * name
Pad name.
Definition: internal.h:60
static void cbp_test(uint8_t *dst[3], int dst_linesize[3], int off)
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1075
uint8_t
AVRational frame_rate
#define av_cold
Definition: attributes.h:88
AVOptions.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:393
static AVFrame * frame
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
#define AVERROR_EOF
End of file.
Definition: error.h:55
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
#define av_log(a,...)
A filter pad used for either input or output.
Definition: internal.h:54
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
#define src
Definition: vp8dsp.c:254
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:605
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:101
#define AVERROR(e)
Definition: error.h:43
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:188
const char * r
Definition: vf_curves.c:114
void * priv
private data for use by the filter
Definition: avfilter.h:353
AVFILTER_DEFINE_CLASS(mptestsrc)
#define FFMAX(a, b)
Definition: common.h:94
int64_t max_frames
static av_const double hypot(double x, double y)
Definition: libm.h:366
static void ring2_test(uint8_t *dst, int dst_linesize, int off)
static const AVFilterPad mptestsrc_outputs[]
uint8_t w
Definition: llviddspenc.c:38
AVFormatContext * ctx
Definition: movenc.c:48
#define s(width, name)
Definition: cbs_vp9.c:257
static const AVFilterPad inputs[]
Definition: af_acontrast.c:193
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
static void mv_test(uint8_t *dst, int dst_linesize, int off)
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:331
AVFilter ff_vsrc_mptestsrc
static int query_formats(AVFilterContext *ctx)
#define OFFSET(x)
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
static int mod(int a, int b)
Modulo operation with only positive remainders.
Definition: vf_v360.c:671
long long int64_t
Definition: coverity.c:34
test_type
Describe the class of an AVClass context structure.
Definition: log.h:67
Filter definition.
Definition: avfilter.h:144
int64_t duration
Rational number (pair of numerator and denominator).
Definition: rational.h:58
offset must point to AVRational
Definition: opt.h:236
const char * name
Filter name.
Definition: avfilter.h:148
static void amp_test(uint8_t *dst, int dst_linesize, int off)
misc parsing utilities
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:275
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> dc
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:314
static void draw_basis(uint8_t *dst, int dst_linesize, int amp, int freq, int dc)
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
#define FLAGS
int
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
static double c[64]
int den
Denominator.
Definition: rational.h:60
static void draw_dc(uint8_t *dst, int dst_linesize, int color, int w, int h)
A list of supported formats for one end of a filter link.
Definition: formats.h:64
#define lrint
Definition: tablegen.h:53
#define WIDTH
An instance of a filter.
Definition: avfilter.h:338
static void ring1_test(uint8_t *dst, int dst_linesize, int off)
static const AVOption mptestsrc_options[]
static void idct(uint8_t *dst, int dst_linesize, int src[64])
#define M_PI
Definition: mathematics.h:52
static void draw_cbp(uint8_t *dst[3], int dst_linesize[3], int cbp, int amp, int dc)
internal API functions
static void freq_test(uint8_t *dst, int dst_linesize, int off)
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:58
static uint8_t tmp[11]
Definition: aes_ctr.c:26