FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
vf_swapuv.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * swap UV filter
24  */
25 
26 #include "libavutil/pixdesc.h"
27 #include "avfilter.h"
28 #include "formats.h"
29 #include "internal.h"
30 #include "video.h"
31 
32 static void do_swap(AVFrame *frame)
33 {
34  FFSWAP(uint8_t*, frame->data[1], frame->data[2]);
35  FFSWAP(int, frame->linesize[1], frame->linesize[2]);
36  FFSWAP(uint64_t, frame->error[1], frame->error[2]);
37  FFSWAP(AVBufferRef*, frame->buf[1], frame->buf[2]);
38 }
39 
40 static AVFrame *get_video_buffer(AVFilterLink *link, int w, int h)
41 {
42  AVFrame *picref = ff_default_get_video_buffer(link, w, h);
43  do_swap(picref);
44  return picref;
45 }
46 
47 static int filter_frame(AVFilterLink *link, AVFrame *inpicref)
48 {
49  do_swap(inpicref);
50  return ff_filter_frame(link->dst->outputs[0], inpicref);
51 }
52 
53 static int is_planar_yuv(const AVPixFmtDescriptor *desc)
54 {
55  int i;
56 
58  desc->nb_components < 3 ||
59  (desc->comp[1].depth_minus1 != desc->comp[2].depth_minus1))
60  return 0;
61  for (i = 0; i < desc->nb_components; i++) {
62  if (desc->comp[i].offset_plus1 != 1 ||
63  desc->comp[i].shift != 0 ||
64  desc->comp[i].plane != i)
65  return 0;
66  }
67 
68  return 1;
69 }
70 
72 {
74  int fmt;
75 
76  for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) {
77  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
78  if (is_planar_yuv(desc))
79  ff_add_format(&formats, fmt);
80  }
81 
82  return ff_set_common_formats(ctx, formats);
83 }
84 
85 static const AVFilterPad swapuv_inputs[] = {
86  {
87  .name = "default",
88  .type = AVMEDIA_TYPE_VIDEO,
89  .get_video_buffer = get_video_buffer,
90  .filter_frame = filter_frame,
91  },
92  { NULL }
93 };
94 
95 static const AVFilterPad swapuv_outputs[] = {
96  {
97  .name = "default",
98  .type = AVMEDIA_TYPE_VIDEO,
99  },
100  { NULL }
101 };
102 
104  .name = "swapuv",
105  .description = NULL_IF_CONFIG_SMALL("Swap U and V components."),
106  .query_formats = query_formats,
107  .inputs = swapuv_inputs,
108  .outputs = swapuv_outputs,
109 };
#define NULL
Definition: coverity.c:32
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2090
This structure describes decoded (raw) audio or video data.
Definition: frame.h:171
static int query_formats(AVFilterContext *ctx)
Definition: vf_swapuv.c:71
const char * fmt
Definition: avisynth_c.h:632
Main libavfilter public API header.
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:441
static enum AVSampleFormat formats[]
static int is_planar_yuv(const AVPixFmtDescriptor *desc)
Definition: vf_swapuv.c:53
static int filter_frame(AVFilterLink *link, AVFrame *inpicref)
Definition: vf_swapuv.c:47
uint16_t shift
Number of least significant bits that must be shifted away to get the value.
Definition: pixdesc.h:52
const char * name
Pad name.
Definition: internal.h:67
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1145
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:100
uint8_t
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:156
static AVFrame * frame
A filter pad used for either input or output.
Definition: internal.h:61
AVFilter ff_vf_swapuv
Definition: vf_swapuv.c:103
uint16_t depth_minus1
Number of bits in the component minus 1.
Definition: pixdesc.h:57
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:542
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:175
int ff_add_format(AVFilterFormats **avff, int64_t fmt)
Add fmt to the list of media formats contained in *avff.
Definition: formats.c:323
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:71
static void do_swap(AVFrame *frame)
Definition: vf_swapuv.c:32
uint64_t error[AV_NUM_DATA_POINTERS]
error
Definition: frame.h:351
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:199
uint8_t flags
Definition: pixdesc.h:90
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
Filter definition.
Definition: avfilter.h:470
const char * name
Filter name.
Definition: avfilter.h:474
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:648
static AVFrame * get_video_buffer(AVFilterLink *link, int w, int h)
Definition: vf_swapuv.c:40
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:182
AVFrame * ff_default_get_video_buffer(AVFilterLink *link, int w, int h)
Definition: video.c:43
A reference to a data buffer.
Definition: buffer.h:81
uint16_t plane
Which of the 4 planes contains the component.
Definition: pixdesc.h:34
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
Definition: pixdesc.h:111
uint16_t offset_plus1
Number of elements before the component of the first pixel plus 1.
Definition: pixdesc.h:46
A list of supported formats for one end of a filter link.
Definition: formats.h:64
An instance of a filter.
Definition: avfilter.h:633
#define FFSWAP(type, a, b)
Definition: common.h:69
static const AVFilterPad swapuv_inputs[]
Definition: vf_swapuv.c:85
static const AVFilterPad swapuv_outputs[]
Definition: vf_swapuv.c:95
internal API functions
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition: pixdesc.h:127