41 uint32_t rgbtoyuv[1<<24];
49 #define OFFSET(x) offsetof(HQXContext, x)
50 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
60 return r2y[c & 0xffffff];
65 #define YMASK 0xff0000
66 #define UMASK 0x00ff00
67 #define VMASK 0x0000ff
68 #define ABSDIFF(a,b) (abs((int)(a)-(int)(b)))
70 return ABSDIFF(yuv1 &
YMASK, yuv2 & YMASK) > (48 << 16) ||
78 return (((((c1 & 0xff00ff00) >> 8) * w1 + ((c2 & 0xff00ff00) >> 8) * w2) << (8 - s)) & 0xff00ff00) |
79 (((((c1 & 0x00ff00ff) ) * w1 + ((c2 & 0x00ff00ff) ) * w2) >> s ) & 0x00ff00ff);
85 return (((((c1 & 0xff00ff00) >> 8) * w1 + ((c2 & 0xff00ff00) >> 8) * w2 + ((c3 & 0xff00ff00) >> 8) * w3) << (8 - s)) & 0xff00ff00) |
86 (((((c1 & 0x00ff00ff) ) * w1 + ((c2 & 0x00ff00ff) ) * w2 + ((c3 & 0x00ff00ff) ) * w3) >> s ) & 0x00ff00ff);
92 #define P(m, r) ((k_shuffled & (m)) == (r))
96 #define DROP4(z) ((z) > 4 ? (z)-1 : (z))
99 #define SHF(x, rot, n) (((x) >> ((rot) ? 7-DROP4(n) : DROP4(n)) & 1) << DROP4(p##n))
102 #define WDIFF(c1, c2) yuv_diff(rgb2yuv(r2y, c1), rgb2yuv(r2y, c2))
107 #define INTERP_BOOTSTRAP(rot) \
108 const int k_shuffled = SHF(k,rot,0) | SHF(k,rot,1) | SHF(k,rot,2) \
109 | SHF(k,rot,3) | 0 | SHF(k,rot,5) \
110 | SHF(k,rot,6) | SHF(k,rot,7) | SHF(k,rot,8); \
112 const uint32_t w0 = w[p0], w1 = w[p1], \
113 w3 = w[p3], w4 = w[p4], w5 = w[p5], \
121 int p0,
int p1,
int p2,
122 int p3,
int p4,
int p5,
123 int p6,
int p7,
int p8)
127 if ((
P(0xbf,0x37) ||
P(0xdb,0x13)) &&
WDIFF(w1, w5))
129 if ((
P(0xdb,0x49) ||
P(0xef,0x6d)) &&
WDIFF(w7, w3))
131 if ((
P(0x0b,0x0b) ||
P(0xfe,0x4a) ||
P(0xfe,0x1a)) &&
WDIFF(w3, w1))
133 if ((
P(0x6f,0x2a) ||
P(0x5b,0x0a) ||
P(0xbf,0x3a) ||
P(0xdf,0x5a) ||
134 P(0x9f,0x8a) ||
P(0xcf,0x8a) ||
P(0xef,0x4e) ||
P(0x3f,0x0e) ||
135 P(0xfb,0x5a) ||
P(0xbb,0x8a) ||
P(0x7f,0x5a) ||
P(0xaf,0x8a) ||
136 P(0xeb,0x8a)) &&
WDIFF(w3, w1))
144 if (
P(0xbf,0x37) ||
P(0xdb,0x13))
146 if (
P(0xdb,0x49) ||
P(0xef,0x6d))
148 if (
P(0x1b,0x03) ||
P(0x4f,0x43) ||
P(0x8b,0x83) ||
P(0x6b,0x43))
150 if (
P(0x4b,0x09) ||
P(0x8b,0x89) ||
P(0x1f,0x19) ||
P(0x3b,0x19))
152 if (
P(0x7e,0x2a) ||
P(0xef,0xab) ||
P(0xbf,0x8f) ||
P(0x7e,0x0e))
154 if (
P(0xfb,0x6a) ||
P(0x6f,0x6e) ||
P(0x3f,0x3e) ||
P(0xfb,0xfa) ||
155 P(0xdf,0xde) ||
P(0xdf,0x1e))
157 if (
P(0x0a,0x00) ||
P(0x4f,0x4b) ||
P(0x9f,0x1b) ||
P(0x2f,0x0b) ||
158 P(0xbe,0x0a) ||
P(0xee,0x0a) ||
P(0x7e,0x0a) ||
P(0xeb,0x4b) ||
170 const uint32_t *r2y,
int k,
172 int pos00,
int pos01,
173 int p0,
int p1,
int p2,
174 int p3,
int p4,
int p5,
175 int p6,
int p7,
int p8,
180 uint32_t *dst00 = &dst[dst_linesize*(pos00>>1) + (pos00&1)];
181 uint32_t *dst01 = &dst[dst_linesize*(pos01>>1) + (pos01&1)];
183 if ((
P(0xdb,0x49) ||
P(0xef,0x6d)) &&
WDIFF(w7, w3))
185 else if ((
P(0xbf,0x37) ||
P(0xdb,0x13)) &&
WDIFF(w1, w5))
187 else if ((
P(0x0b,0x0b) ||
P(0xfe,0x4a) ||
P(0xfe,0x1a)) &&
WDIFF(w3, w1))
189 else if ((
P(0x6f,0x2a) ||
P(0x5b,0x0a) ||
P(0xbf,0x3a) ||
P(0xdf,0x5a) ||
190 P(0x9f,0x8a) ||
P(0xcf,0x8a) ||
P(0xef,0x4e) ||
P(0x3f,0x0e) ||
191 P(0xfb,0x5a) ||
P(0xbb,0x8a) ||
P(0x7f,0x5a) ||
P(0xaf,0x8a) ||
192 P(0xeb,0x8a)) &&
WDIFF(w3, w1))
194 else if (
P(0x4b,0x09) ||
P(0x8b,0x89) ||
P(0x1f,0x19) ||
P(0x3b,0x19))
196 else if (
P(0x1b,0x03) ||
P(0x4f,0x43) ||
P(0x8b,0x83) ||
P(0x6b,0x43))
198 else if (
P(0x7e,0x2a) ||
P(0xef,0xab) ||
P(0xbf,0x8f) ||
P(0x7e,0x0e))
200 else if (
P(0x4f,0x4b) ||
P(0x9f,0x1b) ||
P(0x2f,0x0b) ||
P(0xbe,0x0a) ||
201 P(0xee,0x0a) ||
P(0x7e,0x0a) ||
P(0xeb,0x4b) ||
P(0x3b,0x1b))
203 else if (
P(0x0b,0x08) ||
P(0xf9,0x68) ||
P(0xf3,0x62) ||
P(0x6d,0x6c) ||
204 P(0x67,0x66) ||
P(0x3d,0x3c) ||
P(0x37,0x36) ||
P(0xf9,0xf8) ||
205 P(0xdd,0xdc) ||
P(0xf3,0xf2) ||
P(0xd7,0xd6) ||
P(0xdd,0x1c) ||
206 P(0xd7,0x16) ||
P(0x0b,0x02))
211 if ((
P(0xfe,0xde) ||
P(0x9e,0x16) ||
P(0xda,0x12) ||
P(0x17,0x16) ||
212 P(0x5b,0x12) ||
P(0xbb,0x12)) &&
WDIFF(w1, w5))
214 else if ((
P(0x0f,0x0b) ||
P(0x5e,0x0a) ||
P(0xfb,0x7b) ||
P(0x3b,0x0b) ||
215 P(0xbe,0x0a) ||
P(0x7a,0x0a)) &&
WDIFF(w3, w1))
217 else if (
P(0xbf,0x8f) ||
P(0x7e,0x0e) ||
P(0xbf,0x37) ||
P(0xdb,0x13))
219 else if (
P(0x02,0x00) ||
P(0x7c,0x28) ||
P(0xed,0xa9) ||
P(0xf5,0xb4) ||
222 else if (
P(0x4f,0x4b) ||
P(0xfb,0x7b) ||
P(0xfe,0x7e) ||
P(0x9f,0x1b) ||
223 P(0x2f,0x0b) ||
P(0xbe,0x0a) ||
P(0x7e,0x0a) ||
P(0xfb,0x4b) ||
224 P(0xfb,0xdb) ||
P(0xfe,0xde) ||
P(0xfe,0x56) ||
P(0x57,0x56) ||
225 P(0x97,0x16) ||
P(0x3f,0x1e) ||
P(0xdb,0x12) ||
P(0xbb,0x12))
236 const uint32_t *r2y,
int k,
238 int pos00,
int pos01,
239 int pos10,
int pos11,
240 int p0,
int p1,
int p2,
241 int p3,
int p4,
int p5,
242 int p6,
int p7,
int p8)
246 uint32_t *dst00 = &dst[dst_linesize*(pos00>>1) + (pos00&1)];
247 uint32_t *dst01 = &dst[dst_linesize*(pos01>>1) + (pos01&1)];
248 uint32_t *dst10 = &dst[dst_linesize*(pos10>>1) + (pos10&1)];
249 uint32_t *dst11 = &dst[dst_linesize*(pos11>>1) + (pos11&1)];
251 const int cond00 = (
P(0xbf,0x37) ||
P(0xdb,0x13)) &&
WDIFF(w1, w5);
252 const int cond01 = (
P(0xdb,0x49) ||
P(0xef,0x6d)) &&
WDIFF(w7, w3);
253 const int cond02 = (
P(0x6f,0x2a) ||
P(0x5b,0x0a) ||
P(0xbf,0x3a) ||
254 P(0xdf,0x5a) ||
P(0x9f,0x8a) ||
P(0xcf,0x8a) ||
255 P(0xef,0x4e) ||
P(0x3f,0x0e) ||
P(0xfb,0x5a) ||
256 P(0xbb,0x8a) ||
P(0x7f,0x5a) ||
P(0xaf,0x8a) ||
257 P(0xeb,0x8a)) &&
WDIFF(w3, w1);
258 const int cond03 =
P(0xdb,0x49) ||
P(0xef,0x6d);
259 const int cond04 =
P(0xbf,0x37) ||
P(0xdb,0x13);
260 const int cond05 =
P(0x1b,0x03) ||
P(0x4f,0x43) ||
P(0x8b,0x83) ||
262 const int cond06 =
P(0x4b,0x09) ||
P(0x8b,0x89) ||
P(0x1f,0x19) ||
264 const int cond07 =
P(0x0b,0x08) ||
P(0xf9,0x68) ||
P(0xf3,0x62) ||
265 P(0x6d,0x6c) ||
P(0x67,0x66) ||
P(0x3d,0x3c) ||
266 P(0x37,0x36) ||
P(0xf9,0xf8) ||
P(0xdd,0xdc) ||
267 P(0xf3,0xf2) ||
P(0xd7,0xd6) ||
P(0xdd,0x1c) ||
268 P(0xd7,0x16) ||
P(0x0b,0x02);
269 const int cond08 = (
P(0x0f,0x0b) ||
P(0x2b,0x0b) ||
P(0xfe,0x4a) ||
270 P(0xfe,0x1a)) &&
WDIFF(w3, w1);
271 const int cond09 =
P(0x2f,0x2f);
272 const int cond10 =
P(0x0a,0x00);
273 const int cond11 =
P(0x0b,0x09);
274 const int cond12 =
P(0x7e,0x2a) ||
P(0xef,0xab);
275 const int cond13 =
P(0xbf,0x8f) ||
P(0x7e,0x0e);
276 const int cond14 =
P(0x4f,0x4b) ||
P(0x9f,0x1b) ||
P(0x2f,0x0b) ||
277 P(0xbe,0x0a) ||
P(0xee,0x0a) ||
P(0x7e,0x0a) ||
278 P(0xeb,0x4b) ||
P(0x3b,0x1b);
279 const int cond15 =
P(0x0b,0x03);
285 else if ((
P(0x0b,0x0b) ||
P(0xfe,0x4a) ||
P(0xfe,0x1a)) &&
WDIFF(w3, w1))
297 else if (
P(0x0f,0x0b) ||
P(0x5e,0x0a) ||
P(0x2b,0x0b) ||
P(0xbe,0x0a) ||
298 P(0x7a,0x0a) ||
P(0xee,0x0a))
315 else if (
P(0x0b,0x08))
327 else if (
P(0xf3,0x62) ||
P(0x67,0x66) ||
P(0x37,0x36) ||
P(0xf3,0xf2) ||
328 P(0xd7,0xd6) ||
P(0xd7,0x16) ||
P(0x0b,0x02))
345 else if (
P(0x0b,0x02))
357 else if (
P(0x0b,0x08) ||
P(0xf9,0x68) ||
P(0x6d,0x6c) ||
P(0x3d,0x3c) ||
358 P(0xf9,0xf8) ||
P(0xdd,0xdc) ||
P(0xdd,0x1c))
365 if ((
P(0x7f,0x2b) ||
P(0xef,0xab) ||
P(0xbf,0x8f) ||
P(0x7f,0x0f)) &&
374 else if (
P(0x0a,0x00) ||
P(0x7e,0x2a) ||
P(0xef,0xab) ||
P(0xbf,0x8f) ||
390 const int slice_start = (height * jobnr ) / nb_jobs;
391 const int slice_end = (height * (jobnr+1)) / nb_jobs;
392 const int dst_linesize =
out->linesize[0];
393 const int src_linesize = in->
linesize[0];
394 uint8_t *dst =
out->data[0] + slice_start * dst_linesize *
n;
397 const int dst32_linesize = dst_linesize >> 2;
398 const int src32_linesize = src_linesize >> 2;
400 for (y = slice_start; y <
slice_end; y++) {
401 const uint32_t *src32 = (
const uint32_t *)src;
402 uint32_t *dst32 = (uint32_t *)dst;
403 const int prevline = y > 0 ? -src32_linesize : 0;
404 const int nextline = y < height - 1 ? src32_linesize : 0;
406 for (x = 0; x <
width; x++) {
407 const int prevcol = x > 0 ? -1 : 0;
408 const int nextcol = x < width -1 ? 1 : 0;
409 const uint32_t w[3*3] = {
410 src32[prevcol + prevline], src32[prevline], src32[prevline + nextcol],
411 src32[prevcol ], src32[ 0], src32[ nextcol],
412 src32[prevcol + nextline], src32[nextline], src32[nextline + nextcol]
414 const uint32_t yuv1 =
rgb2yuv(r2y, w[4]);
415 const int pattern = (w[4] != w[0] ? (
yuv_diff(yuv1,
rgb2yuv(r2y, w[0]))) : 0)
425 dst32[dst32_linesize*0 + 0] =
hq2x_interp_1x1(r2y, pattern, w, 0,1,2,3,4,5,6,7,8);
426 dst32[dst32_linesize*0 + 1] =
hq2x_interp_1x1(r2y, pattern, w, 2,1,0,5,4,3,8,7,6);
427 dst32[dst32_linesize*1 + 0] =
hq2x_interp_1x1(r2y, pattern, w, 6,7,8,3,4,5,0,1,2);
428 dst32[dst32_linesize*1 + 1] =
hq2x_interp_1x1(r2y, pattern, w, 8,7,6,5,4,3,2,1,0);
430 hq3x_interp_2x1(dst32, dst32_linesize, r2y, pattern, w, 0,1, 0,1,2,3,4,5,6,7,8, 0);
431 hq3x_interp_2x1(dst32 + 1, dst32_linesize, r2y, pattern, w, 1,3, 2,5,8,1,4,7,0,3,6, 1);
432 hq3x_interp_2x1(dst32 + 1*dst32_linesize, dst32_linesize, r2y, pattern, w, 2,0, 6,3,0,7,4,1,8,5,2, 1);
433 hq3x_interp_2x1(dst32 + 1*dst32_linesize + 1, dst32_linesize, r2y, pattern, w, 3,2, 8,7,6,5,4,3,2,1,0, 0);
434 dst32[dst32_linesize + 1] = w[4];
436 hq4x_interp_2x2(dst32, dst32_linesize, r2y, pattern, w, 0,1,2,3, 0,1,2,3,4,5,6,7,8);
437 hq4x_interp_2x2(dst32 + 2, dst32_linesize, r2y, pattern, w, 1,0,3,2, 2,1,0,5,4,3,8,7,6);
438 hq4x_interp_2x2(dst32 + 2*dst32_linesize, dst32_linesize, r2y, pattern, w, 2,3,0,1, 6,7,8,3,4,5,0,1,2);
439 hq4x_interp_2x2(dst32 + 2*dst32_linesize + 2, dst32_linesize, r2y, pattern, w, 3,2,1,0, 8,7,6,5,4,3,2,1,0);
449 dst += dst_linesize *
n;
453 #define HQX_FUNC(size) \
454 static int hq##size##x(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \
456 hqx_filter(arg, jobnr, nb_jobs, size); \
479 outlink->
w = inlink->
w * hqx->
n;
480 outlink->
h = inlink->
h * hqx->
n;
483 inlink->
w, inlink->
h, outlink->
w, outlink->
h);
514 static const hqxfunc_t hqxfuncs[] = {hq2x, hq3x, hq4x};
519 for (bg=-255; bg<256; bg++) {
520 for (rg=-255; rg<256; rg++) {
521 const uint32_t
u = (uint32_t)((-169*rg + 500*bg)/1000) + 128;
522 const uint32_t v = (uint32_t)(( 500*rg - 81*bg)/1000) + 128;
523 int startg =
FFMAX3(-bg, -rg, 0);
524 int endg =
FFMIN3(255-bg, 255-rg, 255);
525 uint32_t y = (uint32_t)(( 299*rg + 1000*startg + 114*bg)/1000);
526 c = bg + (rg<<16) + 0x010101 * startg;
527 for (g = startg; g <= endg; g++) {
528 hqx->
rgbtoyuv[
c] = ((y++) << 16) + (u << 8) + v;
534 hqx->
func = hqxfuncs[hqx->
n - 2];
558 .description =
NULL_IF_CONFIG_SMALL(
"Scale the input by 2, 3 or 4 using the hq*x magnification algorithm."),
564 .priv_class = &hqx_class,
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
This structure describes decoded (raw) audio or video data.
static av_always_inline uint32_t interp_3px(uint32_t c1, int w1, uint32_t c2, int w2, uint32_t c3, int w3, int s)
int h
agreed upon image height
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
struct AVFilterGraph * graph
filtergraph this filter belongs to
const char * name
Pad name.
static av_cold int init(AVFilterContext *ctx)
AVFilterLink ** inputs
array of pointers to input links
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
static av_always_inline void hq3x_interp_2x1(uint32_t *dst, int dst_linesize, const uint32_t *r2y, int k, const uint32_t *w, int pos00, int pos01, int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int rotate)
int nb_threads
Maximum number of threads used by filters in this graph.
#define AV_LOG_VERBOSE
Detailed information.
A filter pad used for either input or output.
A link between two filters.
static av_always_inline int yuv_diff(uint32_t yuv1, uint32_t yuv2)
int width
width and height of the video frame
static int query_formats(AVFilterContext *ctx)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void * priv
private data for use by the filter
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
simple assert() macros that are a bit more flexible than ISO C assert().
static av_always_inline void hqx_filter(const ThreadData *td, int jobnr, int nb_jobs, int n)
int w
agreed upon image width
AVFILTER_DEFINE_CLASS(hqx)
static const AVFilterPad hqx_outputs[]
static const AVFilterPad hqx_inputs[]
AVFilterContext * src
source filter
static av_always_inline uint32_t interp_2px(uint32_t c1, int w1, uint32_t c2, int w2, int s)
static const AVFilterPad outputs[]
static int config_output(AVFilterLink *outlink)
#define INTERP_BOOTSTRAP(rot)
int format
agreed upon media format
static av_always_inline void hq4x_interp_2x2(uint32_t *dst, int dst_linesize, const uint32_t *r2y, int k, const uint32_t *w, int pos00, int pos01, int pos10, int pos11, int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8)
static const AVFilterPad inputs[]
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
const uint32_t * rgbtoyuv
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;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);returnNULL;}returnac;}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;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->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);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
Describe the class of an AVClass context structure.
const char * name
Filter name.
AVFilterLink ** outputs
array of pointers to output links
static enum AVPixelFormat pix_fmts[]
AVFilterInternal * internal
An opaque struct for libavfilter internal use.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static const AVOption hqx_options[]
avfilter_execute_func * execute
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
static av_always_inline uint32_t hq2x_interp_1x1(const uint32_t *r2y, int k, const uint32_t *w, int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8)
AVFilterContext * dst
dest filter
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.
AVPixelFormat
Pixel format.
static av_always_inline uint32_t rgb2yuv(const uint32_t *r2y, uint32_t c)
uint32_t rgbtoyuv[1<< 24]
int(* hqxfunc_t)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.