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