36 #define LB_MASK 0x00FEFEFE
37 #define RED_BLUE_MASK 0x00FF00FF
38 #define GREEN_MASK 0x0000FF00
46 uint32_t rgbtoyuv[1<<24];
54 #define OFFSET(x) offsetof(XBRContext, x)
55 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
63 static uint32_t
pixel_diff(uint32_t x, uint32_t
y,
const uint32_t *r2y)
65 #define YMASK 0xff0000
66 #define UMASK 0x00ff00
67 #define VMASK 0x0000ff
69 uint32_t yuv1 = r2y[x & 0xffffff];
70 uint32_t yuv2 = r2y[y & 0xffffff];
72 return (abs((yuv1 &
YMASK) - (yuv2 & YMASK)) >> 16) +
73 (abs((yuv1 &
UMASK) - (yuv2 & UMASK)) >> 8) +
77 #define ALPHA_BLEND_128_W(a, b) ((((a) & LB_MASK) >> 1) + (((b) & LB_MASK) >> 1))
78 #define ALPHA_BLEND_BASE(a, b, m, s) ( (RED_BLUE_MASK & (((a) & RED_BLUE_MASK) + (((((b) & RED_BLUE_MASK) - ((a) & RED_BLUE_MASK)) * (m)) >> (s)))) \
79 | (GREEN_MASK & (((a) & GREEN_MASK) + (((((b) & GREEN_MASK) - ((a) & GREEN_MASK)) * (m)) >> (s)))))
80 #define ALPHA_BLEND_32_W(a, b) ALPHA_BLEND_BASE(a, b, 1, 3)
81 #define ALPHA_BLEND_64_W(a, b) ALPHA_BLEND_BASE(a, b, 1, 2)
82 #define ALPHA_BLEND_192_W(a, b) ALPHA_BLEND_BASE(a, b, 3, 2)
83 #define ALPHA_BLEND_224_W(a, b) ALPHA_BLEND_BASE(a, b, 7, 3)
85 #define df(A, B) pixel_diff(A, B, r2y)
86 #define eq(A, B) (df(A, B) < 155)
88 #define FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \
89 N0, N1, N2, N3) do { \
90 if (PE != PH && PE != PF) { \
91 const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \
92 const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \
94 const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \
95 if (e < i && (!eq(PF,PB) && !eq(PH,PD) || eq(PE,PI) \
96 && (!eq(PF,I4) && !eq(PH,I5)) \
97 || eq(PE,PG) || eq(PE,PC))) { \
98 const unsigned ke = df(PF,PG); \
99 const unsigned ki = df(PH,PC); \
100 const int left = ke<<1 <= ki && PE != PG && PD != PG; \
101 const int up = ke >= ki<<1 && PE != PC && PB != PC; \
103 E[N3] = ALPHA_BLEND_224_W(E[N3], px); \
104 E[N2] = ALPHA_BLEND_64_W( E[N2], px); \
107 E[N3] = ALPHA_BLEND_192_W(E[N3], px); \
108 E[N2] = ALPHA_BLEND_64_W( E[N2], px); \
110 E[N3] = ALPHA_BLEND_192_W(E[N3], px); \
111 E[N1] = ALPHA_BLEND_64_W( E[N1], px); \
113 E[N3] = ALPHA_BLEND_128_W(E[N3], px); \
116 E[N3] = ALPHA_BLEND_128_W(E[N3], px); \
122 #define FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \
123 N0, N1, N2, N3, N4, N5, N6, N7, N8) do { \
124 if (PE != PH && PE != PF) { \
125 const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \
126 const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \
128 const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \
129 if (e < i && (!eq(PF,PB) && !eq(PF,PC) || !eq(PH,PD) && !eq(PH,PG) || eq(PE,PI) \
130 && (!eq(PF,F4) && !eq(PF,I4) || !eq(PH,H5) && !eq(PH,I5)) \
131 || eq(PE,PG) || eq(PE,PC))) { \
132 const unsigned ke = df(PF,PG); \
133 const unsigned ki = df(PH,PC); \
134 const int left = ke<<1 <= ki && PE != PG && PD != PG; \
135 const int up = ke >= ki<<1 && PE != PC && PB != PC; \
137 E[N7] = ALPHA_BLEND_192_W(E[N7], px); \
138 E[N6] = ALPHA_BLEND_64_W( E[N6], px); \
143 E[N7] = ALPHA_BLEND_192_W(E[N7], px); \
144 E[N5] = ALPHA_BLEND_64_W( E[N5], px); \
145 E[N6] = ALPHA_BLEND_64_W( E[N6], px); \
148 E[N5] = ALPHA_BLEND_192_W(E[N5], px); \
149 E[N7] = ALPHA_BLEND_64_W( E[N7], px); \
150 E[N2] = ALPHA_BLEND_64_W( E[N2], px); \
153 E[N8] = ALPHA_BLEND_224_W(E[N8], px); \
154 E[N5] = ALPHA_BLEND_32_W( E[N5], px); \
155 E[N7] = ALPHA_BLEND_32_W( E[N7], px); \
158 E[N8] = ALPHA_BLEND_128_W(E[N8], px); \
164 #define FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \
165 N15, N14, N11, N3, N7, N10, N13, N12, N9, N6, N2, N1, N5, N8, N4, N0) do { \
166 if (PE != PH && PE != PF) { \
167 const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \
168 const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \
170 const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \
171 if (e < i && (!eq(PF,PB) && !eq(PH,PD) || eq(PE,PI) \
172 && (!eq(PF,I4) && !eq(PH,I5)) \
173 || eq(PE,PG) || eq(PE,PC))) { \
174 const unsigned ke = df(PF,PG); \
175 const unsigned ki = df(PH,PC); \
176 const int left = ke<<1 <= ki && PE != PG && PD != PG; \
177 const int up = ke >= ki<<1 && PE != PC && PB != PC; \
179 E[N13] = ALPHA_BLEND_192_W(E[N13], px); \
180 E[N12] = ALPHA_BLEND_64_W( E[N12], px); \
181 E[N15] = E[N14] = E[N11] = px; \
182 E[N10] = E[N3] = E[N12]; \
185 E[N11] = ALPHA_BLEND_192_W(E[N11], px); \
186 E[N13] = ALPHA_BLEND_192_W(E[N13], px); \
187 E[N10] = ALPHA_BLEND_64_W( E[N10], px); \
188 E[N12] = ALPHA_BLEND_64_W( E[N12], px); \
192 E[N14] = ALPHA_BLEND_192_W(E[N14], px); \
193 E[N7 ] = ALPHA_BLEND_192_W(E[N7 ], px); \
194 E[N10] = ALPHA_BLEND_64_W( E[N10], px); \
195 E[N3 ] = ALPHA_BLEND_64_W( E[N3 ], px); \
199 E[N11] = ALPHA_BLEND_128_W(E[N11], px); \
200 E[N14] = ALPHA_BLEND_128_W(E[N14], px); \
204 E[N15] = ALPHA_BLEND_128_W(E[N15], px); \
216 const int slice_start = (input->
height * jobnr ) / nb_jobs;
218 const int nl = output->
linesize[0] >> 2;
219 const int nl1 = nl + nl;
220 const int nl2 = nl1 + nl;
222 for (y = slice_start; y <
slice_end; y++) {
224 uint32_t *
E = (uint32_t *)(output->
data[0] + y * output->
linesize[0] * n);
225 const uint32_t *sa2 = (uint32_t *)(input->
data[0] + y * input->
linesize[0] - 8);
226 const uint32_t *sa1 = sa2 - (input->
linesize[0]>>2);
227 const uint32_t *sa0 = sa1 - (input->
linesize[0]>>2);
228 const uint32_t *sa3 = sa2 + (input->
linesize[0]>>2);
229 const uint32_t *sa4 = sa3 + (input->
linesize[0]>>2);
238 if (y >= input->
height - 2) {
240 if (y == input->
height - 1) {
245 for (x = 0; x < input->
width; x++) {
246 const uint32_t
B1 = sa0[2];
247 const uint32_t PB = sa1[2];
248 const uint32_t PE = sa2[2];
249 const uint32_t PH = sa3[2];
250 const uint32_t H5 = sa4[2];
252 const int pprev = 2 - (x > 0);
253 const uint32_t
A1 = sa0[pprev];
254 const uint32_t PA = sa1[pprev];
255 const uint32_t
PD = sa2[pprev];
256 const uint32_t PG = sa3[pprev];
257 const uint32_t G5 = sa4[pprev];
259 const int pprev2 = pprev - (x > 1);
260 const uint32_t A0 = sa1[pprev2];
261 const uint32_t D0 = sa2[pprev2];
262 const uint32_t G0 = sa3[pprev2];
264 const int pnext = 3 - (x == input->
width - 1);
265 const uint32_t
C1 = sa0[pnext];
266 const uint32_t PC = sa1[pnext];
267 const uint32_t
PF = sa2[pnext];
268 const uint32_t PI = sa3[pnext];
269 const uint32_t I5 = sa4[pnext];
271 const int pnext2 = pnext + 1 - (x >= input->
width - 2);
272 const uint32_t
C4 = sa1[pnext2];
273 const uint32_t F4 = sa2[pnext2];
274 const uint32_t I4 = sa3[pnext2];
278 E[nl] = E[nl + 1] = PE;
280 FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, 0, 1, nl, nl+1);
281 FILT2(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, nl, 0, nl+1, 1);
282 FILT2(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, nl+1, nl, 1, 0);
283 FILT2(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, 1, nl+1, 0, nl);
286 E[nl] = E[nl+1] = E[nl+2] =
287 E[nl1] = E[nl1+1] = E[nl1+2] = PE;
289 FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, 0, 1, 2, nl, nl+1, nl+2, nl1, nl1+1, nl1+2);
290 FILT3(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, nl1, nl, 0, nl1+1, nl+1, 1, nl1+2, nl+2, 2);
291 FILT3(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, nl1+2, nl1+1, nl1, nl+2, nl+1, nl, 2, 1, 0);
292 FILT3(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, 2, nl+2, nl1+2, 1, nl+1, nl1+1, 0, nl, nl1);
294 E[0] = E[1] = E[2] = E[3] =
295 E[nl] = E[nl+1] = E[nl+2] = E[nl+3] =
296 E[nl1] = E[nl1+1] = E[nl1+2] = E[nl1+3] =
297 E[nl2] = E[nl2+1] = E[nl2+2] = E[nl2+3] = PE;
299 FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, nl2+3, nl2+2, nl1+3, 3, nl+3, nl1+2, nl2+1, nl2, nl1+1, nl+2, 2, 1, nl+1, nl1, nl, 0);
300 FILT4(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, 3, nl+3, 2, 0, 1, nl+2, nl1+3, nl2+3, nl1+2, nl+1, nl, nl1, nl1+1, nl2+2, nl2+1, nl2);
301 FILT4(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, 0, 1, nl, nl2, nl1, nl+1, 2, 3, nl+2, nl1+1, nl2+1, nl2+2, nl1+2, nl+3, nl1+3, nl2+3);
302 FILT4(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, nl2, nl1, nl2+1, nl2+3, nl2+2, nl1+1, nl, 0, nl+1, nl1+2, nl1+3, nl+3, nl+2, 1, 2, 3);
316 #define XBR_FUNC(size) \
317 static int xbr##size##x(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \
319 xbr_filter(arg, jobnr, nb_jobs, size); \
334 outlink->
w = inlink->
w * xbr->
n;
335 outlink->h = inlink->
h * xbr->
n;
381 static const xbrfunc_t xbrfuncs[] = {xbr2x, xbr3x, xbr4x};
386 for (bg = -255; bg < 256; bg++) {
387 for (rg = -255; rg < 256; rg++) {
388 const uint32_t
u = (uint32_t)((-169*rg + 500*bg)/1000) + 128;
389 const uint32_t
v = (uint32_t)(( 500*rg - 81*bg)/1000) + 128;
390 int startg =
FFMAX3(-bg, -rg, 0);
391 int endg =
FFMIN3(255-bg, 255-rg, 255);
392 uint32_t
y = (uint32_t)(( 299*rg + 1000*startg + 114*bg)/1000);
393 c = bg + (rg<<16) + 0x010101 * startg;
394 for (g = startg; g <= endg; g++) {
395 xbr->
rgbtoyuv[
c] = ((y++) << 16) + (u << 8) + v;
401 xbr->
func = xbrfuncs[xbr->
n - 2];
430 .priv_class = &xbr_class,
This structure describes decoded (raw) audio or video data.
static const AVOption xbr_options[]
int h
agreed upon image height
static const AVFilterPad xbr_inputs[]
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.
AVFilterLink ** inputs
array of pointers to input links
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int(* xbrfunc_t)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
#define FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1,N0, N1, N2, N3, N4, N5, N6, N7, N8)
#define FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1,N0, N1, N2, N3)
int nb_threads
Maximum number of threads used by filters in this graph.
A filter pad used for either input or output.
A link between two filters.
int width
width and height of the video frame
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...
static int config_output(AVFilterLink *outlink)
simple assert() macros that are a bit more flexible than ISO C assert().
static int query_formats(AVFilterContext *ctx)
int w
agreed upon image width
static av_always_inline void xbr_filter(const ThreadData *td, int jobnr, int nb_jobs, int n)
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.
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static uint32_t pixel_diff(uint32_t x, uint32_t y, const uint32_t *r2y)
const char * name
Filter name.
#define PD(a, b)
Pack two delta values (a,b) into one 16bit word according with endianness of the host machine...
AVFilterLink ** outputs
array of pointers to output links
AVFilterInternal * internal
An opaque struct for libavfilter internal use.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
avfilter_execute_func * execute
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
AVFilterContext * dst
dest filter
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-> out
#define FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1,N15, N14, N11, N3, N7, N10, N13, N12, N9, N6, N2, N1, N5, N8, N4, N0)
static const AVFilterPad xbr_outputs[]
static int init(AVFilterContext *ctx)
AVPixelFormat
Pixel format.
AVFILTER_DEFINE_CLASS(xbr)
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
uint32_t rgbtoyuv[1<< 24]
#define AV_PIX_FMT_0RGB32