52#define GET_RESULT(A, B, C, D) ((A != C || A != D) - (B != C || B != D))
54#define INTERPOLATE(A, B) (((A & hi_pixel_mask) >> 1) + ((B & hi_pixel_mask) >> 1) + (A & B & lo_pixel_mask))
56#define Q_INTERPOLATE(A, B, C, D) ((A & q_hi_pixel_mask) >> 2) + ((B & q_hi_pixel_mask) >> 2) + ((C & q_hi_pixel_mask) >> 2) + ((D & q_hi_pixel_mask) >> 2) \
57 + ((((A & q_lo_pixel_mask) + (B & q_lo_pixel_mask) + (C & q_lo_pixel_mask) + (D & q_lo_pixel_mask)) >> 2) & q_lo_pixel_mask)
65 const uint8_t *
src = in->
data[0];
66 uint8_t *
dst =
out->data[0];
67 const int src_linesize = in->
linesize[0];
68 const int dst_linesize =
out->linesize[0];
73 const uint8_t *src_line[4];
74 const int bpp =
s->bpp;
75 const uint32_t hi_pixel_mask =
s->hi_pixel_mask;
76 const uint32_t lo_pixel_mask =
s->lo_pixel_mask;
77 const uint32_t q_hi_pixel_mask =
s->q_hi_pixel_mask;
78 const uint32_t q_lo_pixel_mask =
s->q_lo_pixel_mask;
88#define READ_COLOR4(dst, src_line, off) dst = *((const uint32_t *)src_line + off)
89#define READ_COLOR3(dst, src_line, off) dst = AV_RL24 (src_line + 3*off)
90#define READ_COLOR2(dst, src_line, off) dst = s->is_be ? AV_RB16(src_line + 2 * off) : AV_RL16(src_line + 2 * off)
95 dst_line[0] =
dst + dst_linesize*2*y;
96 dst_line[1] =
dst + dst_linesize*(2*y+1);
118 for (x = 0; x <
width; x++) {
119 uint32_t product1a, product1b, product2a, product2b;
127 product2b =
color[2][1];
128 product1b = product2b;
130 product2b =
color[1][1];
131 product1b = product2b;
141 product1b =
color[1][2];
143 product1b =
color[1][1];
147 product2b = product1b;
169 product2a =
color[2][1];
176 product1a =
color[1][1];
181 AV_WN32A(dst_line[0] + x * 8, product1a);
182 AV_WN32A(dst_line[0] + x * 8 + 4, product1b);
183 AV_WN32A(dst_line[1] + x * 8, product2a);
184 AV_WN32A(dst_line[1] + x * 8 + 4, product2b);
187 AV_WL24(dst_line[0] + x * 6, product1a);
188 AV_WL24(dst_line[0] + x * 6 + 3, product1b);
189 AV_WL24(dst_line[1] + x * 6, product2a);
190 AV_WL24(dst_line[1] + x * 6 + 3, product2b);
194 AV_WB32(dst_line[0] + x * 4, product1a | (product1b << 16));
195 AV_WB32(dst_line[1] + x * 4, product2a | (product2b << 16));
197 AV_WL32(dst_line[0] + x * 4, product1a | (product1b << 16));
198 AV_WL32(dst_line[1] + x * 4, product2a | (product2b << 16));
234 src_line[0] = src_line[1];
235 src_line[1] = src_line[2];
236 src_line[2] = src_line[3];
239 src_line[3] = src_line[2];
241 src_line[3] += src_linesize;
259 s->hi_pixel_mask = 0xFEFEFEFE;
260 s->lo_pixel_mask = 0x01010101;
261 s->q_hi_pixel_mask = 0xFCFCFCFC;
262 s->q_lo_pixel_mask = 0x03030303;
277 s->hi_pixel_mask = 0xF7DEF7DE;
278 s->lo_pixel_mask = 0x08210821;
279 s->q_hi_pixel_mask = 0xE79CE79C;
280 s->q_lo_pixel_mask = 0x18631863;
290 s->hi_pixel_mask = 0x7BDE7BDE;
291 s->lo_pixel_mask = 0x04210421;
292 s->q_hi_pixel_mask = 0x739C739C;
293 s->q_lo_pixel_mask = 0x0C630C63;
305 outlink->
w = inlink->
w*2;
306 outlink->
h = inlink->
h*2;
310 inlink->
w, inlink->
h, outlink->
w, outlink->
h);
326 out->width = outlink->
w;
327 out->height = outlink->
h;
355 .p.name =
"super2xsai",
356 .p.description =
NULL_IF_CONFIG_SMALL(
"Scale the input by 2x using the Super2xSaI pixel art algorithm."),
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static int config_input(AVFilterLink *inlink)
const FFFilter ff_vf_super2xsai
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
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.
#define AV_LOG_VERBOSE
Detailed information.
static int config_output(AVBitStreamFilterLink *outlink)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
#define FILTER_PIXFMTS_ARRAY(array)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
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.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
@ AV_PIX_FMT_BGR565BE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
@ AV_PIX_FMT_RGB555BE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_RGB565LE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_BGR555BE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
@ AV_PIX_FMT_RGB565BE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
@ AV_PIX_FMT_BGR555LE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_BGR565LE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
AVFilterLink ** inputs
array of pointers to input links
void * priv
private data for use by the filter
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
int bpp
bytes per pixel, pixel stride for each (packed) pixel
Used for passing data between threads.
static AVFormatContext * ctx
#define READ_COLOR2(dst, src_line, off)
static int config_input(AVFilterLink *inlink)
static const AVFilterPad super2xsai_outputs[]
#define Q_INTERPOLATE(A, B, C, D)
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
#define READ_COLOR3(dst, src_line, off)
static int super2xsai(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
#define GET_RESULT(A, B, C, D)
static int config_output(AVFilterLink *outlink)
#define READ_COLOR4(dst, src_line, off)
#define INTERPOLATE(A, B)
static const AVFilterPad super2xsai_inputs[]
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)