AvTranscoder  0.9.4
C++APIforLibav/FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
util.cpp
Go to the documentation of this file.
1 #include "util.hpp"
2 
3 extern "C" {
4 #include <libavutil/pixdesc.h>
5 }
6 
7 #include <utility>
8 #include <algorithm>
9 
10 namespace avtranscoder
11 {
12 
13 std::vector<std::string> getSupportedPixelFormats(const std::string& videoCodecName)
14 {
15  std::vector<std::string> pixelFormats;
16 
17  // all video codec concerned
18  if(videoCodecName == "")
19  {
20  const AVPixFmtDescriptor* pixFmtDesc = NULL;
21 
22 #if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(51, 44, 0)
23  for(int pix_fmt = 0; pix_fmt < PIX_FMT_NB; ++pix_fmt)
24  pixFmtDesc = &av_pix_fmt_descriptors[pix_fmt];
25 #else
26  while((pixFmtDesc = av_pix_fmt_desc_next(pixFmtDesc)) != NULL)
27 #endif
28  {
29  if(!pixFmtDesc->name)
30  continue;
31  pixelFormats.push_back(std::string(pixFmtDesc->name));
32  }
33  }
34  // specific video codec
35  else
36  {
37  const AVCodec* videoCodec = avcodec_find_encoder_by_name(videoCodecName.c_str());
38  if(videoCodec && videoCodec->pix_fmts != NULL)
39  {
40  size_t pix_fmt = 0;
41  while(videoCodec->pix_fmts[pix_fmt] != -1)
42  {
43 #if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(51, 44, 0)
44  const AVPixFmtDescriptor* pix_desc = &av_pix_fmt_descriptors[videoCodec->pix_fmts[pix_fmt]];
45 #else
46  const AVPixFmtDescriptor* pix_desc = av_pix_fmt_desc_get(videoCodec->pix_fmts[pix_fmt]);
47 #endif
48  if(!pix_desc || !pix_desc->name)
49  continue;
50  pixelFormats.push_back(std::string(pix_desc->name));
51  ++pix_fmt;
52  }
53  }
54  }
55  return pixelFormats;
56 }
57 
58 std::vector<std::string> getSupportedSampleFormats(const std::string& audioCodecName)
59 {
60  std::vector<std::string> sampleFormats;
61 
62  // all audio codec concerned
63  if(audioCodecName.empty())
64  {
65  for(size_t sampleFormat = 0; sampleFormat < AV_SAMPLE_FMT_NB; ++sampleFormat)
66  {
67  sampleFormats.push_back(av_get_sample_fmt_name(static_cast<AVSampleFormat>(sampleFormat)));
68  }
69  }
70  // specific audio codec
71  else
72  {
73  const AVCodec* audioCodec = avcodec_find_encoder_by_name(audioCodecName.c_str());
74  if(audioCodec && audioCodec->sample_fmts != NULL)
75  {
76  size_t sample_fmt = 0;
77  while(audioCodec->sample_fmts[sample_fmt] != -1)
78  {
79  const char* sampleFormatName = av_get_sample_fmt_name(audioCodec->sample_fmts[sample_fmt]);
80  if(sampleFormatName)
81  sampleFormats.push_back(std::string(sampleFormatName));
82  sample_fmt++;
83  }
84  }
85  }
86 
87  return sampleFormats;
88 }
89 
90 AVPixelFormat getAVPixelFormat(const std::string& pixelFormat)
91 {
92  return av_get_pix_fmt(pixelFormat.c_str());
93 }
94 
95 AVSampleFormat getAVSampleFormat(const std::string& sampleFormat)
96 {
97  return av_get_sample_fmt(sampleFormat.c_str());
98 }
99 
100 std::string getPixelFormatName(const AVPixelFormat pixelFormat)
101 {
102  const char* formatName = av_get_pix_fmt_name(pixelFormat);
103  return formatName ? std::string(formatName) : "";
104 }
105 
106 std::string getSampleFormatName(const AVSampleFormat sampleFormat)
107 {
108  const char* formatName = av_get_sample_fmt_name(sampleFormat);
109  return formatName ? std::string(formatName) : "";
110 }
111 
112 std::vector<AVOutputFormat*> getAvailableFormats()
113 {
114  std::vector<AVOutputFormat*> formats;
115 
116  AVOutputFormat* fmt = NULL;
117  while((fmt = av_oformat_next(fmt)))
118  {
119  if(!fmt->name)
120  continue;
121 
122  formats.push_back(fmt);
123  }
124  return formats;
125 }
126 
128 {
129  NamesMap formatsNames;
130  std::vector<AVOutputFormat*> formats = getAvailableFormats();
131  for(size_t i = 0; i < formats.size(); ++i)
132  {
133  AVOutputFormat* fmt = formats.at(i);
134  formatsNames.insert(std::make_pair(std::string(fmt->name), std::string(fmt->long_name ? fmt->long_name : "")));
135  }
136  return formatsNames;
137 }
138 
140 {
141  NamesMap formatsNames;
142  std::vector<AVOutputFormat*> formats = getAvailableFormats();
143  for(size_t i = 0; i < formats.size(); ++i)
144  {
145  AVOutputFormat* fmt = formats.at(i);
146  // skip format which cannot handle video
147  if(fmt->video_codec == AV_CODEC_ID_NONE)
148  continue;
149  formatsNames.insert(std::make_pair(std::string(fmt->name), std::string(fmt->long_name ? fmt->long_name : "")));
150  }
151  return formatsNames;
152 }
153 
155 {
156  NamesMap formatsNames;
157  std::vector<AVOutputFormat*> formats = getAvailableFormats();
158  for(size_t i = 0; i < formats.size(); ++i)
159  {
160  AVOutputFormat* fmt = formats.at(i);
161  // skip format which cannot handle audio
162  if(fmt->audio_codec == AV_CODEC_ID_NONE)
163  continue;
164  formatsNames.insert(std::make_pair(std::string(fmt->name), std::string(fmt->long_name ? fmt->long_name : "")));
165  }
166  return formatsNames;
167 }
168 
169 std::vector<AVCodec*> getAvailableCodecs()
170 {
171  std::vector<AVCodec*> codecs;
172 
173  AVCodec* c = NULL;
174  while((c = av_codec_next(c)))
175  {
176  if(!c->name)
177  continue;
178 
179  codecs.push_back(c);
180  }
181  return codecs;
182 }
183 
185 {
186  NamesMap videoCodecsNames;
187  std::vector<AVCodec*> codecs = getAvailableCodecs();
188  for(size_t i = 0; i < codecs.size(); ++i)
189  {
190  AVCodec* c = codecs.at(i);
191  if(c->type == AVMEDIA_TYPE_VIDEO)
192  {
193  videoCodecsNames.insert(std::make_pair(std::string(c->name), std::string(c->long_name ? c->long_name : "")));
194  }
195  }
196  return videoCodecsNames;
197 }
198 
200 {
201  NamesMap audioCodecsNames;
202  std::vector<AVCodec*> codecs = getAvailableCodecs();
203  for(size_t i = 0; i < codecs.size(); ++i)
204  {
205  AVCodec* c = codecs.at(i);
206  if(c->type == AVMEDIA_TYPE_AUDIO)
207  {
208  audioCodecsNames.insert(std::make_pair(std::string(c->name), std::string(c->long_name ? c->long_name : "")));
209  }
210  }
211  return audioCodecsNames;
212 }
213 
215 {
216  OptionArrayMap optionsPerFormat;
217 
218  AVOutputFormat* outputFormat = av_oformat_next(NULL);
219 
220  // iterate on formats
221  while(outputFormat)
222  {
223  if(!outputFormat->name)
224  continue;
225 
226  const std::string outputFormatName(outputFormat->name);
227  OptionArray options;
228  if(outputFormat->priv_class)
229  {
230  loadOptions(options, (void*)&outputFormat->priv_class, 0);
231  }
232  optionsPerFormat.insert(std::make_pair(outputFormatName, options));
233  outputFormat = av_oformat_next(outputFormat);
234  }
235  return optionsPerFormat;
236 }
237 
239 {
240  OptionArrayMap videoCodecOptions;
241 
242  AVCodec* codec = av_codec_next(NULL);
243 
244  // iterate on codecs
245  while(codec)
246  {
247  if(!codec->name)
248  continue;
249 
250  // add only video codec
251  if(codec->type == AVMEDIA_TYPE_VIDEO)
252  {
253  const std::string videoCodecName(codec->name);
254  OptionArray options;
255  if(codec->priv_class)
256  {
257  loadOptions(options, (void*)&codec->priv_class, 0);
258  }
259  videoCodecOptions.insert(std::make_pair(videoCodecName, options));
260  }
261  codec = av_codec_next(codec);
262  }
263  return videoCodecOptions;
264 }
265 
267 {
268  OptionArrayMap audioCodecOptions;
269 
270  AVCodec* codec = av_codec_next(NULL);
271 
272  // iterate on codecs
273  while(codec)
274  {
275  if(!codec->name)
276  continue;
277 
278  // add only audio codec
279  if(codec->type == AVMEDIA_TYPE_AUDIO)
280  {
281  const std::string audioCodecName(codec->name);
282  OptionArray options;
283  if(codec->priv_class)
284  {
285  loadOptions(options, (void*)&codec->priv_class, 0);
286  }
287  audioCodecOptions.insert(std::make_pair(audioCodecName, options));
288  }
289  codec = av_codec_next(codec);
290  }
291  return audioCodecOptions;
292 }
293 }
std::map< std::string, OptionArray > OptionArrayMap
Definition: util.hpp:21
void loadOptions(OptionMap &outOptions, void *av_class, int req_flags)
Definition: Option.cpp:227
NamesMap getAvailableAudioCodecsNames()
Get a map of short/long names of all audio codecs available in FFmpeg / libav.
Definition: util.cpp:199
std::vector< Option > OptionArray
Definition: Option.hpp:118
std::vector< std::string > getSupportedPixelFormats(const std::string &videoCodecName)
Get pixel format supported by a video codec.
Definition: util.cpp:13
AVPixelFormat getAVPixelFormat(const std::string &pixelFormat)
Get the corresponding AVPixelFormat from the pixel format name.
Definition: util.cpp:90
std::vector< std::string > getSupportedSampleFormats(const std::string &audioCodecName)
Get sample format supported by an audio codec.
Definition: util.cpp:58
std::vector< AVOutputFormat * > getAvailableFormats()
Definition: util.cpp:112
#define AV_CODEC_ID_NONE
Definition: common.hpp:46
std::string getPixelFormatName(const AVPixelFormat pixelFormat)
Definition: util.cpp:100
OptionArrayMap getAvailableOptionsPerOutputFormat()
Get the list of options for each output format.
Definition: util.cpp:214
std::map< std::string, std::string > NamesMap
Definition: util.hpp:22
NamesMap getAvailableAudioFormatsNames()
Get a map of short/long names of all formats dedicate for video available in FFmpeg / libav...
Definition: util.cpp:154
std::vector< AVCodec * > getAvailableCodecs()
Definition: util.cpp:169
NamesMap getAvailableVideoCodecsNames()
Get a map of short/long names of all video codecs available in FFmpeg / libav.
Definition: util.cpp:184
NamesMap getAvailableFormatsNames()
Get a map of short/long names of all formats available in FFmpeg / libav.
Definition: util.cpp:127
OptionArrayMap getAvailableOptionsPerVideoCodec()
Get the list of options for each video codec.
Definition: util.cpp:238
NamesMap getAvailableVideoFormatsNames()
Get a map of short/long names of all formats dedicate for video available in FFmpeg / libav...
Definition: util.cpp:139
OptionArrayMap getAvailableOptionsPerAudioCodec()
Get the list of options for each audio codec.
Definition: util.cpp:266
#define AVPixelFormat
Definition: common.hpp:43
std::string getSampleFormatName(const AVSampleFormat sampleFormat)
Definition: util.cpp:106
AVSampleFormat getAVSampleFormat(const std::string &sampleFormat)
Get the corresponding AVSampleFormat from the sample format name.
Definition: util.cpp:95
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy