FFmpeg  4.0
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 {
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 enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
61  enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
62 {
63  return avcodec_find_best_pix_fmt_of_2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, has_alpha, loss_ptr);
64 }
65 
67  enum AVPixelFormat src_pix_fmt,
68  int has_alpha, int *loss_ptr){
69  int i;
70 
71  enum AVPixelFormat best = AV_PIX_FMT_NONE;
72  int loss;
73 
74  for (i=0; pix_fmt_list[i] != AV_PIX_FMT_NONE; i++) {
75  loss = loss_ptr ? *loss_ptr : 0;
76  best = avcodec_find_best_pix_fmt_of_2(best, pix_fmt_list[i], src_pix_fmt, has_alpha, &loss);
77  }
78 
79  if (loss_ptr)
80  *loss_ptr = loss;
81  return best;
82 }
83 
84 #if FF_API_AVPICTURE
86 /* return true if yuv planar */
87 static inline int is_yuv_planar(const AVPixFmtDescriptor *desc)
88 {
89  int i;
90  int planes[4] = { 0 };
91 
92  if ( desc->flags & AV_PIX_FMT_FLAG_RGB
93  || !(desc->flags & AV_PIX_FMT_FLAG_PLANAR))
94  return 0;
95 
96  /* set the used planes */
97  for (i = 0; i < desc->nb_components; i++)
98  planes[desc->comp[i].plane] = 1;
99 
100  /* if there is an unused plane, the format is not planar */
101  for (i = 0; i < desc->nb_components; i++)
102  if (!planes[i])
103  return 0;
104  return 1;
105 }
106 
108  enum AVPixelFormat pix_fmt, int top_band, int left_band)
109 {
110  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
111  int y_shift;
112  int x_shift;
113  int max_step[4];
114 
115  if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
116  return -1;
117 
118  y_shift = desc->log2_chroma_h;
119  x_shift = desc->log2_chroma_w;
120  av_image_fill_max_pixsteps(max_step, NULL, desc);
121 
122  if (is_yuv_planar(desc)) {
123  dst->data[0] = src->data[0] + (top_band * src->linesize[0]) + left_band;
124  dst->data[1] = src->data[1] + ((top_band >> y_shift) * src->linesize[1]) + (left_band >> x_shift);
125  dst->data[2] = src->data[2] + ((top_band >> y_shift) * src->linesize[2]) + (left_band >> x_shift);
126  } else{
127  if(top_band % (1<<y_shift) || left_band % (1<<x_shift))
128  return -1;
129  dst->data[0] = src->data[0] + (top_band * src->linesize[0]) + (left_band * max_step[0]);
130  }
131 
132  dst->linesize[0] = src->linesize[0];
133  dst->linesize[1] = src->linesize[1];
134  dst->linesize[2] = src->linesize[2];
135  return 0;
136 }
137 
138 int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width,
139  enum AVPixelFormat pix_fmt, int padtop, int padbottom, int padleft, int padright,
140  int *color)
141 {
142  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
143  uint8_t *optr;
144  int y_shift;
145  int x_shift;
146  int yheight;
147  int i, y;
148  int max_step[4];
149 
150  if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
151  return -1;
152 
153  if (!is_yuv_planar(desc)) {
154  if (src)
155  return -1; //TODO: Not yet implemented
156 
157  av_image_fill_max_pixsteps(max_step, NULL, desc);
158 
159  if (padtop || padleft) {
160  memset(dst->data[0], color[0],
161  dst->linesize[0] * padtop + (padleft * max_step[0]));
162  }
163 
164  if (padleft || padright) {
165  optr = dst->data[0] + dst->linesize[0] * padtop +
166  (dst->linesize[0] - (padright * max_step[0]));
167  yheight = height - 1 - (padtop + padbottom);
168  for (y = 0; y < yheight; y++) {
169  memset(optr, color[0], (padleft + padright) * max_step[0]);
170  optr += dst->linesize[0];
171  }
172  }
173 
174  if (padbottom || padright) {
175  optr = dst->data[0] + dst->linesize[0] * (height - padbottom) -
176  (padright * max_step[0]);
177  memset(optr, color[0], dst->linesize[0] * padbottom +
178  (padright * max_step[0]));
179  }
180 
181  return 0;
182  }
183 
184  for (i = 0; i < 3; i++) {
185  x_shift = i ? desc->log2_chroma_w : 0;
186  y_shift = i ? desc->log2_chroma_h : 0;
187 
188  if (padtop || padleft) {
189  memset(dst->data[i], color[i],
190  dst->linesize[i] * (padtop >> y_shift) + (padleft >> x_shift));
191  }
192 
193  if (padleft || padright) {
194  optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
195  (dst->linesize[i] - (padright >> x_shift));
196  yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
197  for (y = 0; y < yheight; y++) {
198  memset(optr, color[i], (padleft + padright) >> x_shift);
199  optr += dst->linesize[i];
200  }
201  }
202 
203  if (src) { /* first line */
204  uint8_t *iptr = src->data[i];
205  optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
206  (padleft >> x_shift);
207  memcpy(optr, iptr, (width - padleft - padright) >> x_shift);
208  iptr += src->linesize[i];
209  optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
210  (dst->linesize[i] - (padright >> x_shift));
211  yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
212  for (y = 0; y < yheight; y++) {
213  memset(optr, color[i], (padleft + padright) >> x_shift);
214  memcpy(optr + ((padleft + padright) >> x_shift), iptr,
215  (width - padleft - padright) >> x_shift);
216  iptr += src->linesize[i];
217  optr += dst->linesize[i];
218  }
219  }
220 
221  if (padbottom || padright) {
222  optr = dst->data[i] + dst->linesize[i] *
223  ((height - padbottom) >> y_shift) - (padright >> x_shift);
224  memset(optr, color[i],dst->linesize[i] *
225  (padbottom >> y_shift) + (padright >> x_shift));
226  }
227  }
228 
229  return 0;
230 }
232 #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:2363
misc image utilities
const char * desc
Definition: nvenc.c:65
int av_picture_crop(AVPicture *dst, const AVPicture *src, enum AVPixelFormat pix_fmt, int top_band, int left_band)
Definition: imgconvert.c:107
Various defines for YUV<->RGB conversion.
void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Definition: imgconvert.c:38
Picture data structure.
Definition: avcodec.h:3793
#define src
Definition: vp8dsp.c:254
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:138
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:35
#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
attribute_deprecated int linesize[AV_NUM_DATA_POINTERS]
number of bytes per line
Definition: avcodec.h:3797
#define height
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:87
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:66
uint16_t width
Definition: gdv.c:47
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:3795
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:60
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
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:2642
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:84
common internal api header.
common internal and external API header
static const struct @272 planes[]
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:2653
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:85
number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of...
Definition: pixfmt.h:333
AVPixelFormat
Pixel format.
Definition: pixfmt.h:60
#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)