annotate ffmpeg/libavfilter/vf_swapuv.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
yading@11 3 *
yading@11 4 * This file is part of FFmpeg.
yading@11 5 *
yading@11 6 * FFmpeg is free software; you can redistribute it and/or
yading@11 7 * modify it under the terms of the GNU Lesser General Public
yading@11 8 * License as published by the Free Software Foundation; either
yading@11 9 * version 2.1 of the License, or (at your option) any later version.
yading@11 10 *
yading@11 11 * FFmpeg is distributed in the hope that it will be useful,
yading@11 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 14 * Lesser General Public License for more details.
yading@11 15 *
yading@11 16 * You should have received a copy of the GNU Lesser General Public
yading@11 17 * License along with FFmpeg; if not, write to the Free Software
yading@11 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 19 */
yading@11 20
yading@11 21 /**
yading@11 22 * @file
yading@11 23 * swap UV filter
yading@11 24 */
yading@11 25
yading@11 26 #include "libavutil/pixdesc.h"
yading@11 27 #include "avfilter.h"
yading@11 28 #include "formats.h"
yading@11 29 #include "internal.h"
yading@11 30 #include "video.h"
yading@11 31
yading@11 32 static void do_swap(AVFrame *frame)
yading@11 33 {
yading@11 34 FFSWAP(uint8_t*, frame->data[1], frame->data[2]);
yading@11 35 FFSWAP(int, frame->linesize[1], frame->linesize[2]);
yading@11 36 FFSWAP(uint64_t, frame->error[1], frame->error[2]);
yading@11 37 FFSWAP(AVBufferRef*, frame->buf[1], frame->buf[2]);
yading@11 38 }
yading@11 39
yading@11 40 static AVFrame *get_video_buffer(AVFilterLink *link, int w, int h)
yading@11 41 {
yading@11 42 AVFrame *picref = ff_default_get_video_buffer(link, w, h);
yading@11 43 do_swap(picref);
yading@11 44 return picref;
yading@11 45 }
yading@11 46
yading@11 47 static int filter_frame(AVFilterLink *link, AVFrame *inpicref)
yading@11 48 {
yading@11 49 do_swap(inpicref);
yading@11 50 return ff_filter_frame(link->dst->outputs[0], inpicref);
yading@11 51 }
yading@11 52
yading@11 53 static int is_planar_yuv(const AVPixFmtDescriptor *desc)
yading@11 54 {
yading@11 55 int i;
yading@11 56
yading@11 57 if (desc->flags & ~(PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA) ||
yading@11 58 desc->nb_components < 3 ||
yading@11 59 (desc->comp[1].depth_minus1 != desc->comp[2].depth_minus1))
yading@11 60 return 0;
yading@11 61 for (i = 0; i < desc->nb_components; i++) {
yading@11 62 if (desc->comp[i].offset_plus1 != 1 ||
yading@11 63 desc->comp[i].shift != 0 ||
yading@11 64 desc->comp[i].plane != i)
yading@11 65 return 0;
yading@11 66 }
yading@11 67
yading@11 68 return 1;
yading@11 69 }
yading@11 70
yading@11 71 static int query_formats(AVFilterContext *ctx)
yading@11 72 {
yading@11 73 AVFilterFormats *formats = NULL;
yading@11 74 int fmt;
yading@11 75
yading@11 76 for (fmt = 0; fmt < AV_PIX_FMT_NB; fmt++) {
yading@11 77 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
yading@11 78 if (is_planar_yuv(desc))
yading@11 79 ff_add_format(&formats, fmt);
yading@11 80 }
yading@11 81
yading@11 82 ff_set_common_formats(ctx, formats);
yading@11 83 return 0;
yading@11 84 }
yading@11 85
yading@11 86 static const AVFilterPad swapuv_inputs[] = {
yading@11 87 {
yading@11 88 .name = "default",
yading@11 89 .type = AVMEDIA_TYPE_VIDEO,
yading@11 90 .get_video_buffer = get_video_buffer,
yading@11 91 .filter_frame = filter_frame,
yading@11 92 },
yading@11 93 { NULL }
yading@11 94 };
yading@11 95
yading@11 96 static const AVFilterPad swapuv_outputs[] = {
yading@11 97 {
yading@11 98 .name = "default",
yading@11 99 .type = AVMEDIA_TYPE_VIDEO,
yading@11 100 },
yading@11 101 { NULL }
yading@11 102 };
yading@11 103
yading@11 104 AVFilter avfilter_vf_swapuv = {
yading@11 105 .name = "swapuv",
yading@11 106 .description = NULL_IF_CONFIG_SMALL("Swap U and V components."),
yading@11 107 .priv_size = 0,
yading@11 108 .query_formats = query_formats,
yading@11 109 .inputs = swapuv_inputs,
yading@11 110 .outputs = swapuv_outputs,
yading@11 111 };