00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00026 #include "avfilter.h"
00027 #include "formats.h"
00028 #include "internal.h"
00029 #include "video.h"
00030
00031 static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms,
00032 int w, int h)
00033 {
00034 AVFilterBufferRef *picref =
00035 ff_default_get_video_buffer(link, perms, w, h);
00036 uint8_t *tmp;
00037 int tmp2;
00038
00039 tmp = picref->data[2];
00040 picref->data[2] = picref->data[1];
00041 picref->data[1] = tmp;
00042
00043 tmp2 = picref->linesize[2];
00044 picref->linesize[2] = picref->linesize[1];
00045 picref->linesize[1] = tmp2;
00046
00047 return picref;
00048 }
00049
00050 static int filter_frame(AVFilterLink *link, AVFilterBufferRef *inpicref)
00051 {
00052 uint8_t *tmp_data;
00053 int tmp_linesize;
00054
00055 tmp_data = inpicref->data[1];
00056 inpicref->data[1] = inpicref->data[2];
00057 inpicref->data[2] = tmp_data;
00058
00059 tmp_linesize = inpicref->linesize[1];
00060 inpicref->linesize[1] = inpicref->linesize[2];
00061 inpicref->linesize[2] = tmp_linesize;
00062
00063 return ff_filter_frame(link->dst->outputs[0], inpicref);
00064 }
00065
00066 static int query_formats(AVFilterContext *ctx)
00067 {
00068 static const enum AVPixelFormat pix_fmts[] = {
00069 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVA420P,
00070 AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVA444P,
00071 AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUVJ440P,
00072 AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVJ422P,
00073 AV_PIX_FMT_YUV411P,
00074 AV_PIX_FMT_NONE,
00075 };
00076
00077 ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
00078 return 0;
00079 }
00080
00081 static const AVFilterPad swapuv_inputs[] = {
00082 {
00083 .name = "default",
00084 .type = AVMEDIA_TYPE_VIDEO,
00085 .get_video_buffer = get_video_buffer,
00086 .filter_frame = filter_frame,
00087 },
00088 { NULL }
00089 };
00090
00091 static const AVFilterPad swapuv_outputs[] = {
00092 {
00093 .name = "default",
00094 .type = AVMEDIA_TYPE_VIDEO,
00095 },
00096 { NULL }
00097 };
00098
00099 AVFilter avfilter_vf_swapuv = {
00100 .name = "swapuv",
00101 .description = NULL_IF_CONFIG_SMALL("Swap U and V components."),
00102 .priv_size = 0,
00103 .query_formats = query_formats,
00104 .inputs = swapuv_inputs,
00105 .outputs = swapuv_outputs,
00106 };