FFmpeg
fourcc2pixfmt.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012 Stefano Sabatini
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 #include "config.h"
22 #if HAVE_UNISTD_H
23 #include <unistd.h> /* getopt */
24 #endif
25 
26 #include "libavutil/pixdesc.h"
27 #include "libavcodec/avcodec.h"
28 #include "libavutil/common.h"
29 #include "libavcodec/raw.h"
30 
31 #undef printf
32 #undef fprintf
33 
34 #if !HAVE_GETOPT
35 #include "compat/getopt.c"
36 #endif
37 
38 static void usage(void)
39 {
40  printf("Show the relationships between rawvideo pixel formats and FourCC tags.\n");
41  printf("usage: fourcc2pixfmt [OPTIONS]\n");
42  printf("\n"
43  "Options:\n"
44  "-l list the pixel format for each fourcc\n"
45  "-L list the fourccs for each pixel format\n"
46  "-p PIX_FMT given a pixel format, print the list of associated fourccs (one per line)\n"
47  "-h print this help\n");
48 }
49 
50 static void print_pix_fmt_fourccs(enum AVPixelFormat pix_fmt, const PixelFormatTag *pix_fmt_tags, char sep)
51 {
52  int i;
53 
54  for (i = 0; pix_fmt_tags[i].pix_fmt != AV_PIX_FMT_NONE; i++)
55  if (pix_fmt_tags[i].pix_fmt == pix_fmt)
56  printf("%s%c", av_fourcc2str(pix_fmt_tags[i].fourcc), sep);
57 }
58 
59 int main(int argc, char **argv)
60 {
61  int i, list_fourcc_pix_fmt = 0, list_pix_fmt_fourccs = 0;
62  const PixelFormatTag *pix_fmt_tags = avpriv_get_raw_pix_fmt_tags();
63  const char *pix_fmt_name = NULL;
64  char c;
65 
66  if (argc == 1) {
67  usage();
68  return 0;
69  }
70 
71  while ((c = getopt(argc, argv, "hp:lL")) != -1) {
72  switch (c) {
73  case 'h':
74  usage();
75  return 0;
76  case 'l':
77  list_fourcc_pix_fmt = 1;
78  break;
79  case 'L':
80  list_pix_fmt_fourccs = 1;
81  break;
82  case 'p':
83  pix_fmt_name = optarg;
84  break;
85  case '?':
86  usage();
87  return 1;
88  }
89  }
90 
91  if (list_fourcc_pix_fmt)
92  for (i = 0; pix_fmt_tags[i].pix_fmt != AV_PIX_FMT_NONE; i++)
93  printf("%s: %s\n", av_fourcc2str(pix_fmt_tags[i].fourcc),
94  av_get_pix_fmt_name(pix_fmt_tags[i].pix_fmt));
95 
96  if (list_pix_fmt_fourccs) {
97  for (i = 0; av_pix_fmt_desc_get(i); i++) {
98  const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(i);
99  if (!pix_desc->name || pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL)
100  continue;
101  printf("%s: ", pix_desc->name);
102  print_pix_fmt_fourccs(i, pix_fmt_tags, ' ');
103  printf("\n");
104  }
105  }
106 
107  if (pix_fmt_name) {
108  enum AVPixelFormat pix_fmt = av_get_pix_fmt(pix_fmt_name);
109  if (pix_fmt == AV_PIX_FMT_NONE) {
110  fprintf(stderr, "Invalid pixel format selected '%s'\n", pix_fmt_name);
111  return 1;
112  }
113  print_pix_fmt_fourccs(pix_fmt, pix_fmt_tags, '\n');
114  }
115 
116  return 0;
117 }
#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:2522
uint32_t fourcc
Definition: vaapi_decode.c:238
enum AVPixelFormat pix_fmt
Definition: raw.h:35
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
const char * name
Definition: pixdesc.h:82
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
#define av_fourcc2str(fourcc)
Definition: avutil.h:348
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
Definition: pixdesc.h:140
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:106
Raw Video Codec.
int main(int argc, char **argv)
Definition: fourcc2pixfmt.c:59
static void print_pix_fmt_fourccs(enum AVPixelFormat pix_fmt, const PixelFormatTag *pix_fmt_tags, char sep)
Definition: fourcc2pixfmt.c:50
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
static int getopt(int argc, char *argv[], char *opts)
Definition: getopt.c:41
common internal and external API header
static char * optarg
Definition: getopt.c:39
printf("static const uint8_t my_array[100] = {\n")
const struct PixelFormatTag * avpriv_get_raw_pix_fmt_tags(void)
Definition: raw.c:299
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
Definition: pixdesc.c:2450
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:2438
static void usage(void)
Definition: fourcc2pixfmt.c:38
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64