You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavfi: port MP swapuv filter
This commit is contained in:
		| @@ -13,6 +13,7 @@ version next: | ||||
| - bluray protocol | ||||
| - blackdetect filter | ||||
| - libutvideo encoder wrapper (--enable-libutvideo) | ||||
| - swapuv filter | ||||
|  | ||||
|  | ||||
| version 0.10: | ||||
|   | ||||
| @@ -2631,6 +2631,9 @@ For example: | ||||
| will create two separate outputs from the same input, one cropped and | ||||
| one padded. | ||||
|  | ||||
| @section swapuv | ||||
| Swap U & V plane. | ||||
|  | ||||
| @section thumbnail | ||||
| Select the most representative frame in a given sequence of consecutive frames. | ||||
|  | ||||
|   | ||||
| @@ -87,6 +87,7 @@ OBJS-$(CONFIG_SETTB_FILTER)                  += vf_settb.o | ||||
| OBJS-$(CONFIG_SHOWINFO_FILTER)               += vf_showinfo.o | ||||
| OBJS-$(CONFIG_SLICIFY_FILTER)                += vf_slicify.o | ||||
| OBJS-$(CONFIG_SPLIT_FILTER)                  += vf_split.o | ||||
| OBJS-$(CONFIG_SWAPUV_FILTER)                 += vf_swapuv.o | ||||
| OBJS-$(CONFIG_THUMBNAIL_FILTER)              += vf_thumbnail.o | ||||
| OBJS-$(CONFIG_TINTERLACE_FILTER)             += vf_tinterlace.o | ||||
| OBJS-$(CONFIG_TRANSPOSE_FILTER)              += vf_transpose.o | ||||
|   | ||||
| @@ -95,6 +95,7 @@ void avfilter_register_all(void) | ||||
|     REGISTER_FILTER (SHOWINFO,    showinfo,    vf); | ||||
|     REGISTER_FILTER (SLICIFY,     slicify,     vf); | ||||
|     REGISTER_FILTER (SPLIT,       split,       vf); | ||||
|     REGISTER_FILTER (SWAPUV,      swapuv,      vf); | ||||
|     REGISTER_FILTER (THUMBNAIL,   thumbnail,   vf); | ||||
|     REGISTER_FILTER (TINTERLACE,  tinterlace,  vf); | ||||
|     REGISTER_FILTER (TRANSPOSE,   transpose,   vf); | ||||
|   | ||||
| @@ -29,7 +29,7 @@ | ||||
| #include "libavutil/avutil.h" | ||||
|  | ||||
| #define LIBAVFILTER_VERSION_MAJOR  2 | ||||
| #define LIBAVFILTER_VERSION_MINOR 63 | ||||
| #define LIBAVFILTER_VERSION_MINOR 64 | ||||
| #define LIBAVFILTER_VERSION_MICRO 100 | ||||
|  | ||||
| #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | ||||
|   | ||||
							
								
								
									
										93
									
								
								libavfilter/vf_swapuv.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								libavfilter/vf_swapuv.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| /* | ||||
|  * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at> | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @file | ||||
|  * swap UV filter | ||||
|  */ | ||||
|  | ||||
| #include "avfilter.h" | ||||
|  | ||||
| static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, | ||||
|                                            int w, int h) | ||||
| { | ||||
|     AVFilterBufferRef *picref = | ||||
|         avfilter_default_get_video_buffer(link, perms, w, h); | ||||
|     uint8_t *tmp; | ||||
|     int tmp2; | ||||
|  | ||||
|     tmp             = picref->data[2]; | ||||
|     picref->data[2] = picref->data[1]; | ||||
|     picref->data[1] = tmp; | ||||
|  | ||||
|     tmp2                = picref->linesize[2]; | ||||
|     picref->linesize[2] = picref->linesize[1]; | ||||
|     picref->linesize[1] = tmp2; | ||||
|  | ||||
|     return picref; | ||||
| } | ||||
|  | ||||
| static void start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref) | ||||
| { | ||||
|     AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0); | ||||
|  | ||||
|     outpicref->data[1] = inpicref->data[2]; | ||||
|     outpicref->data[2] = inpicref->data[1]; | ||||
|  | ||||
|     outpicref->linesize[1] = inpicref->linesize[2]; | ||||
|     outpicref->linesize[2] = inpicref->linesize[1]; | ||||
|  | ||||
|     avfilter_start_frame(link->dst->outputs[0], outpicref); | ||||
| } | ||||
|  | ||||
| static int query_formats(AVFilterContext *ctx) | ||||
| { | ||||
|     static const enum PixelFormat pix_fmts[] = { | ||||
|         PIX_FMT_YUV420P, PIX_FMT_YUVJ420P, PIX_FMT_YUVA420P, | ||||
|         PIX_FMT_YUV444P, PIX_FMT_YUVJ444P, PIX_FMT_YUVA444P, | ||||
|         PIX_FMT_YUV440P, PIX_FMT_YUVJ440P, | ||||
|         PIX_FMT_YUV422P, PIX_FMT_YUVJ422P, | ||||
|         PIX_FMT_YUV411P, | ||||
|         PIX_FMT_NONE, | ||||
|     }; | ||||
|  | ||||
|     avfilter_set_common_pixel_formats(ctx, avfilter_make_format_list(pix_fmts)); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| AVFilter avfilter_vf_swapuv = { | ||||
|     .name      = "swapuv", | ||||
|     .description = NULL_IF_CONFIG_SMALL("Swap U and V components."), | ||||
|     .priv_size = 0, | ||||
|     .query_formats = query_formats, | ||||
|  | ||||
|     .inputs = (const AVFilterPad[]) { | ||||
|         { .name             = "default", | ||||
|           .type             = AVMEDIA_TYPE_VIDEO, | ||||
|           .get_video_buffer = get_video_buffer, | ||||
|           .start_frame      = start_frame, }, | ||||
|         { .name = NULL } | ||||
|     }, | ||||
|     .outputs = (const AVFilterPad[]) { | ||||
|         { .name             = "default", | ||||
|           .type             = AVMEDIA_TYPE_VIDEO, }, | ||||
|         { .name             = NULL } | ||||
|     }, | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user