FFmpeg
imgutils.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "libavutil/imgutils.c"
20 #include "libavutil/crc.h"
21 #include "libavutil/mem.h"
22 
23 #undef printf
24 static int check_image_fill(enum AVPixelFormat pix_fmt, int w, int h) {
25  uint8_t *data[4];
26  size_t sizes[4];
27  ptrdiff_t linesizes1[4], offsets[3] = { 0 };
28  int i, total_size, linesizes[4];
29 
30  if (av_image_fill_linesizes(linesizes, pix_fmt, w) < 0)
31  return -1;
32  for (i = 0; i < 4; i++)
33  linesizes1[i] = linesizes[i];
34  if (av_image_fill_plane_sizes(sizes, pix_fmt, h, linesizes1) < 0)
35  return -1;
36  total_size = av_image_fill_pointers(data, pix_fmt, h, (void *)1, linesizes);
37  if (total_size < 0)
38  return -1;
39  for (i = 0; i < 4 && data[i]; i++);
40  printf("planes: %d", i);
41  // Test the output of av_image_fill_linesizes()
42  printf(", linesizes:");
43  for (i = 0; i < 4; i++)
44  printf(" %3d", linesizes[i]);
45  // Test the output of av_image_fill_plane_sizes()
46  printf(", plane_sizes:");
47  for (i = 0; i < 4; i++)
48  printf(" %5"SIZE_SPECIFIER, sizes[i]);
49  // Test the output of av_image_fill_pointers()
50  for (i = 0; i < 3 && data[i + 1]; i++)
51  offsets[i] = data[i + 1] - data[i];
52  printf(", plane_offsets:");
53  for (i = 0; i < 3; i++)
55  printf(", total_size: %d", total_size);
56 
57  return 0;
58 }
59 
61 {
62  uint8_t *data[4];
63  ptrdiff_t linesizes1[4];
64  int ret, total_size, linesizes[4];
65 
66  ret = av_image_fill_linesizes(linesizes, pix_fmt, w);
67  if (ret < 0)
68  return ret;
69  total_size = av_image_alloc(data, linesizes, w, h, pix_fmt, 4);
70  if (total_size < 0) {
71  printf("alloc failure");
72  return total_size;
73  }
74  printf("total_size: %6d", total_size);
75  if (desc->flags & AV_PIX_FMT_FLAG_PAL)
76  total_size -= 256 * 4;
77  // Make it non-black by default...
78  memset(data[0], 0xA3, total_size);
79  for (int i = 0; i < 4; i++)
80  linesizes1[i] = linesizes[i];
81  for (enum AVColorRange range = 0; range < AVCOL_RANGE_NB; range++) {
82  ret = av_image_fill_black(data, linesizes1, pix_fmt, range, w, h);
83  printf(", black_%s_crc: ", av_color_range_name(range));
84  if (ret < 0) {
85  printf("----------");
86  } else {
88  printf("0x%08"PRIx32, av_crc(crc, 0, data[0], total_size));
89  }
90  }
91  av_freep(&data[0]);
92 
93  return 0;
94 }
95 
96 int main(void)
97 {
98  int64_t x, y;
99 
100  for (y = -1; y<UINT_MAX; y+= y/2 + 1) {
101  for (x = -1; x<UINT_MAX; x+= x/2 + 1) {
102  int ret = av_image_check_size(x, y, 0, NULL);
103  printf("%d", ret >= 0);
104  }
105  printf("\n");
106  }
107  printf("\n");
108 
109  for (int i = 0; i < 2; i++) {
110  printf(i ? "\nimage_fill_black tests\n" : "image_fill tests\n");
112  int w = 64, h = 48;
114 
115  if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL)
116  continue;
117 
118  printf("%-16s", desc->name);
119  if (i == 0)
121  else
123  printf("\n");
124  }
125  }
126 
127  return 0;
128 }
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
AVCRC
uint32_t AVCRC
Definition: crc.h:46
w
uint8_t w
Definition: llviddspenc.c:38
check_image_fill_black
static int check_image_fill_black(const AVPixFmtDescriptor *desc, enum AVPixelFormat pix_fmt, int w, int h)
Definition: imgutils.c:60
data
const char data[16]
Definition: mxf.c:148
av_pix_fmt_desc_next
const AVPixFmtDescriptor * av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
Iterate over all pixel format descriptors known to libavutil.
Definition: pixdesc.c:2972
crc.h
AV_PIX_FMT_FLAG_HWACCEL
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
Definition: pixdesc.h:128
AVCOL_RANGE_NB
@ AVCOL_RANGE_NB
Not part of ABI.
Definition: pixfmt.h:687
imgutils.c
av_image_fill_pointers
int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, uint8_t *ptr, const int linesizes[4])
Fill plane data pointers for an image with pixel format pix_fmt and height height.
Definition: imgutils.c:145
av_image_fill_linesizes
int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width)
Fill plane linesizes for an image with pixel format pix_fmt and width width.
Definition: imgutils.c:89
offsets
static const int offsets[]
Definition: hevc_pel.c:34
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
av_color_range_name
const char * av_color_range_name(enum AVColorRange range)
Definition: pixdesc.c:3281
PTRDIFF_SPECIFIER
#define PTRDIFF_SPECIFIER
Definition: internal.h:128
NULL
#define NULL
Definition: coverity.c:32
sizes
static const int sizes[][2]
Definition: img2dec.c:59
av_image_fill_plane_sizes
int av_image_fill_plane_sizes(size_t sizes[4], enum AVPixelFormat pix_fmt, int height, const ptrdiff_t linesizes[4])
Fill plane sizes for an image with pixel format pix_fmt and height height.
Definition: imgutils.c:111
av_image_alloc
int av_image_alloc(uint8_t *pointers[4], int linesizes[4], int w, int h, enum AVPixelFormat pix_fmt, int align)
Allocate an image with size w and h and pixel format pix_fmt, and fill pointers and linesizes accordi...
Definition: imgutils.c:218
av_image_fill_black
int av_image_fill_black(uint8_t *const dst_data[4], const ptrdiff_t dst_linesize[4], enum AVPixelFormat pix_fmt, enum AVColorRange range, int width, int height)
Overwrite the image data with black.
Definition: imgutils.c:660
printf
printf("static const uint8_t my_array[100] = {\n")
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2464
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
av_pix_fmt_desc_get_id
enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
Definition: pixdesc.c:2984
check_image_fill
static int check_image_fill(enum AVPixelFormat pix_fmt, int w, int h)
Definition: imgutils.c:24
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
main
int main(void)
Definition: imgutils.c:96
ret
ret
Definition: filter_design.txt:187
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:129
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:392
AV_CRC_32_IEEE_LE
@ AV_CRC_32_IEEE_LE
Definition: crc.h:53
desc
const char * desc
Definition: libsvtav1.c:79
mem.h
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
h
h
Definition: vp9dsp_template.c:2038
av_image_check_size
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:318
AVColorRange
AVColorRange
Visual content value range.
Definition: pixfmt.h:651
AV_PIX_FMT_FLAG_PAL
#define AV_PIX_FMT_FLAG_PAL
Pixel format has a palette in data[1], values are indexes in this palette.
Definition: pixdesc.h:120