FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
imgconvert.c
Go to the documentation of this file.
1 /*
2  * Misc image conversion routines
3  * Copyright (c) 2001, 2002, 2003 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * misc image conversion routines
25  */
26 
27 #include "avcodec.h"
28 #include "internal.h"
29 #include "mathops.h"
30 #include "libavutil/avassert.h"
31 #include "libavutil/colorspace.h"
32 #include "libavutil/common.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/internal.h"
35 #include "libavutil/imgutils.h"
36 
37 #if FF_API_GETCHROMA
38 void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
39 {
40  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
41  av_assert0(desc);
42  *h_shift = desc->log2_chroma_w;
43  *v_shift = desc->log2_chroma_h;
44 }
45 #endif
46 
48  enum AVPixelFormat src_pix_fmt,
49  int has_alpha)
50 {
51  return av_get_pix_fmt_loss(dst_pix_fmt, src_pix_fmt, has_alpha);
52 }
53 
54 enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
55  enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
56 {
57  return av_find_best_pix_fmt_of_2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, has_alpha, loss_ptr);
58 }
59 
60 #if AV_HAVE_INCOMPATIBLE_LIBAV_ABI
61 enum AVPixelFormat avcodec_find_best_pix_fmt2(const enum AVPixelFormat *pix_fmt_list,
62  enum AVPixelFormat src_pix_fmt,
63  int has_alpha, int *loss_ptr){
64  return avcodec_find_best_pix_fmt_of_list(pix_fmt_list, src_pix_fmt, has_alpha, loss_ptr);
65 }
66 #else
67 enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
68  enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
69 {
70  return avcodec_find_best_pix_fmt_of_2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, has_alpha, loss_ptr);
71 }
72 #endif
73 
75  enum AVPixelFormat src_pix_fmt,
76  int has_alpha, int *loss_ptr){
77  int i;
78 
79  enum AVPixelFormat best = AV_PIX_FMT_NONE;
80 
81  for(i=0; pix_fmt_list[i] != AV_PIX_FMT_NONE; i++)
82  best = avcodec_find_best_pix_fmt_of_2(best, pix_fmt_list[i], src_pix_fmt, has_alpha, loss_ptr);
83 
84  return best;
85 }
86 
87 #if FF_API_AVPICTURE
89 /* return true if yuv planar */
90 static inline int is_yuv_planar(const AVPixFmtDescriptor *desc)
91 {
92  int i;
93  int planes[4] = { 0 };
94 
95  if ( desc->flags & AV_PIX_FMT_FLAG_RGB
96  || !(desc->flags & AV_PIX_FMT_FLAG_PLANAR))
97  return 0;
98 
99  /* set the used planes */
100  for (i = 0; i < desc->nb_components; i++)
101  planes[desc->comp[i].plane] = 1;
102 
103  /* if there is an unused plane, the format is not planar */
104  for (i = 0; i < desc->nb_components; i++)
105  if (!planes[i])
106  return 0;
107  return 1;
108 }
109 
111  enum AVPixelFormat pix_fmt, int top_band, int left_band)
112 {
113  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
114  int y_shift;
115  int x_shift;
116  int max_step[4];
117 
118  if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
119  return -1;
120 
121  y_shift = desc->log2_chroma_h;
122  x_shift = desc->log2_chroma_w;
123  av_image_fill_max_pixsteps(max_step, NULL, desc);
124 
125  if (is_yuv_planar(desc)) {
126  dst->data[0] = src->data[0] + (top_band * src->linesize[0]) + left_band;
127  dst->data[1] = src->data[1] + ((top_band >> y_shift) * src->linesize[1]) + (left_band >> x_shift);
128  dst->data[2] = src->data[2] + ((top_band >> y_shift) * src->linesize[2]) + (left_band >> x_shift);
129  } else{
130  if(top_band % (1<<y_shift) || left_band % (1<<x_shift))
131  return -1;
132  dst->data[0] = src->data[0] + (top_band * src->linesize[0]) + (left_band * max_step[0]);
133  }
134 
135  dst->linesize[0] = src->linesize[0];
136  dst->linesize[1] = src->linesize[1];
137  dst->linesize[2] = src->linesize[2];
138  return 0;
139 }
140 
141 int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width,
142  enum AVPixelFormat pix_fmt, int padtop, int padbottom, int padleft, int padright,
143  int *color)
144 {
145  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
146  uint8_t *optr;
147  int y_shift;
148  int x_shift;
149  int yheight;
150  int i, y;
151  int max_step[4];
152 
153  if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
154  return -1;
155 
156  if (!is_yuv_planar(desc)) {
157  if (src)
158  return -1; //TODO: Not yet implemented
159 
160  av_image_fill_max_pixsteps(max_step, NULL, desc);
161 
162  if (padtop || padleft) {
163  memset(dst->data[0], color[0],
164  dst->linesize[0] * padtop + (padleft * max_step[0]));
165  }
166 
167  if (padleft || padright) {
168  optr = dst->data[0] + dst->linesize[0] * padtop +
169  (dst->linesize[0] - (padright * max_step[0]));
170  yheight = height - 1 - (padtop + padbottom);
171  for (y = 0; y < yheight; y++) {
172  memset(optr, color[0], (padleft + padright) * max_step[0]);
173  optr += dst->linesize[0];
174  }
175  }
176 
177  if (padbottom || padright) {
178  optr = dst->data[0] + dst->linesize[0] * (height - padbottom) -
179  (padright * max_step[0]);
180  memset(optr, color[0], dst->linesize[0] * padbottom +
181  (padright * max_step[0]));
182  }
183 
184  return 0;
185  }
186 
187  for (i = 0; i < 3; i++) {
188  x_shift = i ? desc->log2_chroma_w : 0;
189  y_shift = i ? desc->log2_chroma_h : 0;
190 
191  if (padtop || padleft) {
192  memset(dst->data[i], color[i],
193  dst->linesize[i] * (padtop >> y_shift) + (padleft >> x_shift));
194  }
195 
196  if (padleft || padright) {
197  optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
198  (dst->linesize[i] - (padright >> x_shift));
199  yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
200  for (y = 0; y < yheight; y++) {
201  memset(optr, color[i], (padleft + padright) >> x_shift);
202  optr += dst->linesize[i];
203  }
204  }
205 
206  if (src) { /* first line */
207  uint8_t *iptr = src->data[i];
208  optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
209  (padleft >> x_shift);
210  memcpy(optr, iptr, (width - padleft - padright) >> x_shift);
211  iptr += src->linesize[i];
212  optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
213  (dst->linesize[i] - (padright >> x_shift));
214  yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
215  for (y = 0; y < yheight; y++) {
216  memset(optr, color[i], (padleft + padright) >> x_shift);
217  memcpy(optr + ((padleft + padright) >> x_shift), iptr,
218  (width - padleft - padright) >> x_shift);
219  iptr += src->linesize[i];
220  optr += dst->linesize[i];
221  }
222  }
223 
224  if (padbottom || padright) {
225  optr = dst->data[i] + dst->linesize[i] *
226  ((height - padbottom) >> y_shift) - (padright >> x_shift);
227  memset(optr, color[i],dst->linesize[i] *
228  (padbottom >> y_shift) + (padright >> x_shift));
229  }
230  }
231 
232  return 0;
233 }
234 
235 #ifdef TEST
236 
237 int main(void){
238  int i;
239  int err=0;
240  int skip = 0;
241 
242  for (i=0; i<AV_PIX_FMT_NB*2; i++) {
243  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(i);
244  if(!desc || !desc->name) {
245  skip ++;
246  continue;
247  }
248  if (skip) {
249  av_log(NULL, AV_LOG_INFO, "%3d unused pixel format values\n", skip);
250  skip = 0;
251  }
252  av_log(NULL, AV_LOG_INFO, "pix fmt %s yuv_plan:%d avg_bpp:%d\n", desc->name, is_yuv_planar(desc), av_get_padded_bits_per_pixel(desc));
253  if ((!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)) != (desc->nb_components != 2 && desc->nb_components != 4)) {
254  av_log(NULL, AV_LOG_ERROR, "Alpha flag mismatch\n");
255  err = 1;
256  }
257  }
258  return err;
259 }
260 
261 #endif
263 #endif /* FF_API_AVPICTURE */
int plane
Which of the 4 planes contains the component.
Definition: pixdesc.h:35
#define NULL
Definition: coverity.c:32
static enum AVPixelFormat pix_fmt
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2157
misc image utilities
int av_picture_crop(AVPicture *dst, const AVPicture *src, enum AVPixelFormat pix_fmt, int top_band, int left_band)
Definition: imgconvert.c:110
Various defines for YUV<->RGB conversion.
Picture data structure.
Definition: avcodec.h:3666
int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt, int padtop, int padbottom, int padleft, int padright, int *color)
Definition: imgconvert.c:141
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:92
int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt, int has_alpha)
Definition: imgconvert.c:47
void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], const AVPixFmtDescriptor *pixdesc)
Compute the max pixel step for each plane of an image with a format described by pixdesc.
Definition: imgutils.c:34
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:117
uint8_t
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:173
attribute_deprecated int linesize[AV_NUM_DATA_POINTERS]
number of bytes per line
Definition: avcodec.h:3670
#define av_log(a,...)
const char * name
Definition: pixdesc.h:82
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:101
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition: pixdesc.h:148
static FF_DISABLE_DEPRECATION_WARNINGS int is_yuv_planar(const AVPixFmtDescriptor *desc)
Definition: imgconvert.c:90
int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel for the pixel format described by pixdesc, including any padding ...
Definition: pixdesc.c:2122
enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
Find the best pixel format to convert to given a certain source pixel format.
Definition: imgconvert.c:74
simple assert() macros that are a bit more flexible than ISO C assert().
common internal API header
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:106
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:83
attribute_deprecated uint8_t * data[AV_NUM_DATA_POINTERS]
pointers to the image data planes
Definition: avcodec.h:3668
#define src
Definition: vp9dsp.c:530
void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
Definition: imgconvert.c:38
enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
Definition: imgconvert.c:54
enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
Definition: imgconvert.c:67
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
Libavcodec external API header.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
BYTE int const BYTE int int int height
Definition: avisynth_c.h:676
int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt, int has_alpha)
Compute what kind of losses will occur when converting from one specific pixel format to another...
Definition: pixdesc.c:2425
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:80
common internal api header.
common internal and external API header
enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
Compute what kind of losses will occur when converting from one specific pixel format to another...
Definition: pixdesc.c:2436
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:81
number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of...
Definition: pixfmt.h:295
int main(int argc, char **argv)
Definition: main.c:22
AVPixelFormat
Pixel format.
Definition: pixfmt.h:61
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition: pixdesc.h:144
for(j=16;j >0;--j)
static int width