DCL 4.0
Loading...
Searching...
No Matches
MediaInfo.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#undef _UNICODE
4#undef UNICODE
5
6#define _UNICODE
7#define UNICODE
8
9#include "MediaInfoDLL.h"
10
11#if __DCL_WINDOWS
12 #include <windows.h>
13#else
14 #include <dcl/_dlfcn.h>
15#endif
16
17#include <dcl/Dll.h>
18#include <dcl/Numeric.h>
19#include "MediaInfo.h"
20
21#define __TRACE_THIS 0
22#if __TRACE_THIS
23#define __DCL_TRACE1_N __DCL_TRACE1
24#define __DCL_TRACE2_N __DCL_TRACE2
25#define __DCL_TRACE3_N __DCL_TRACE3
26#define __DCL_TRACE4_N __DCL_TRACE4
27#else
28#define __DCL_TRACE1_N(fmt, arg)
29#define __DCL_TRACE2_N(fmt, arg1, arg2)
30#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
31#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
32#endif
33
34__DCL_BEGIN_NAMESPACE
35
36#undef __THIS_FILE__
37static const char_t __THIS_FILE__[] = __T("media/MediaInfo.cpp");
38
41{
42 if (!MediaInfo_Module) {
43 MediaInfoDLL_Load();
44 }
45 if (!MediaInfo_Module) {
46#if __DCL_WINDOWS
47 throw new DllException(MEDIAINFODLL_NAME, WINAPI_ERROR(GetLastError()));
48#else
49 String msg;
50 __DCL_VERIFY(__dlerror(msg) == 0);
51 throw new DllException(L"" MEDIAINFODLL_NAME, msg);
52#endif
53 };
54}
56{
57 if (MediaInfo_Module) {
58 MediaInfoDLL_UnLoad();
59 }
60}
61
62MediaInfo::MediaInfo(const String& _filename)
64{
65 if (!MediaInfo_Module) {
67 }
68
69 __handle = MediaInfo_New();
70 size_t r = MediaInfo_Open(__handle, _filename);
71 if (r == 0) {
72 throw new IOException(_filename, L"MediaInfo Open Failed");
73 }
74}
75
77{
78 MediaInfo_Close(__handle);
79 MediaInfo_Delete(__handle);
80}
81
82String MediaInfo::inform() const
83{
84 String r = MediaInfo_Inform(__handle, 0);
85 return r;
86}
87
88String MediaInfo::inform_r() const
89{
90 return inform().replace_r(L"[ \t]{2,}", L" ", true)
91 .replace_r(L" :", L":", true)
92 .replace_r(L"\r\n", L"\n", true)
93 .replace_r(L"Complete name[^\n]+\n", L"", true)
94 .trim();
95}
96
97String MediaInfo::option(const wchar_t* _option, const wchar_t* _value) const
98{
99 __DCL_ASSERT(_option != NULL);
100 String r = MediaInfo_Option(__handle, _option, _value ? _value : L"");
101 return r;
102}
103
104String MediaInfo::format() const
105{
106 return MediaInfo_Get(__handle, MediaInfo_Stream_General, 0, L"Format",
108}
109
110uint64_t MediaInfo::fileSize() const
111{
112 return UInt64::parse(
113 MediaInfo_Get(__handle, MediaInfo_Stream_General, 0, L"FileSize",
115 10, 0LLU
116 );
117}
118
119unsigned MediaInfo::videoCount() const
120{
121 return UInt32::parse(
122 MediaInfo_Get(__handle, MediaInfo_Stream_General, 0, L"VideoCount",
124 10, 0LU
125 );
126}
127
128unsigned MediaInfo::audioCount() const
129{
130 return UInt32::parse(
131 MediaInfo_Get(__handle, MediaInfo_Stream_General, 0, L"AudioCount",
133 10, 0LU
134 );
135}
136
137unsigned MediaInfo::imageCount() const
138{
139 return UInt32::parse(
140 MediaInfo_Get(__handle, MediaInfo_Stream_General, 0, L"ImageCount",
142 10, 0LU
143 );
144}
145
146String MediaInfo::videoFormat(size_t streamNumber) const
147{
148 return MediaInfo_Get(__handle, MediaInfo_Stream_Video, streamNumber, L"Format",
150}
151
152unsigned MediaInfo::videoWidth(size_t streamNumber) const
153{
154 return UInt32::parse(
155 MediaInfo_Get(__handle, MediaInfo_Stream_Video, streamNumber, L"Width",
157 10, 0LLU
158 );
159}
160
161unsigned MediaInfo::videoHeight(size_t streamNumber) const
162{
163 return UInt32::parse(
164 MediaInfo_Get(__handle, MediaInfo_Stream_Video, streamNumber, L"Height",
166 10, 0LLU
167 );
168}
169
170// Milliseconds
171uint64_t MediaInfo::videoDuration(size_t streamNumber) const
172{
173 return UInt64::parse(
174 MediaInfo_Get(__handle, MediaInfo_Stream_Video, streamNumber, L"Duration",
176 10, 0LLU
177 );
178}
179
180uint32_t MediaInfo::videoDurationAsSeconds(size_t streamNumber) const
181{
182 return (uint32_t) (videoDuration(streamNumber) / 1000);
183}
184
185unsigned MediaInfo::videoBitRate(size_t streamNumber) const
186{
187 return UInt32::parse(
188 MediaInfo_Get(__handle, MediaInfo_Stream_Video, streamNumber, L"BitRate",
190 10, 0LLU
191 );
192}
193
194unsigned MediaInfo::videoBitRateMinimum(size_t streamNumber) const
195{
196 return UInt32::parse(
197 MediaInfo_Get(__handle, MediaInfo_Stream_Video, streamNumber, L"BitRate_Minimum",
199 10, 0LLU
200 );
201}
202
203unsigned MediaInfo::videoBitRateMaximum(size_t streamNumber) const
204{
205 return UInt32::parse(
206 MediaInfo_Get(__handle, MediaInfo_Stream_Video, streamNumber, L"BitRate_Maxmum",
208 10, 0LLU
209 );
210}
211
212String MediaInfo::audioFormat(size_t streamNumber) const
213{
214 return MediaInfo_Get(__handle, MediaInfo_Stream_Audio, streamNumber, L"Format",
216}
217
218// Milliseconds
219uint64_t MediaInfo::audioDuration(size_t streamNumber) const
220{
221 return UInt64::parse(
222 MediaInfo_Get(__handle, MediaInfo_Stream_Audio, streamNumber, L"Duration",
224 10, 0LLU
225 );
226}
227
228uint32_t MediaInfo::audioDurationAsSeconds(size_t streamNumber) const
229{
230 return (uint32_t) (audioDuration(streamNumber) / 1000);
231}
232
233unsigned MediaInfo::audioBitRate(size_t streamNumber) const
234{
235 return UInt32::parse(
236 MediaInfo_Get(__handle, MediaInfo_Stream_Audio, streamNumber, L"BitRate",
238 10, 0LLU
239 );
240}
241
242unsigned MediaInfo::audioBitRateMinimum(size_t streamNumber) const
243{
244 return UInt32::parse(
245 MediaInfo_Get(__handle, MediaInfo_Stream_Audio, streamNumber, L"BitRate_Minimum",
247 10, 0LLU
248 );
249}
250
251unsigned MediaInfo::audioBitRateMaximum(size_t streamNumber) const
252{
253 return UInt32::parse(
254 MediaInfo_Get(__handle, MediaInfo_Stream_Audio, streamNumber, L"BitRate_Maxmum",
256 10, 0LLU
257 );
258}
259
260String MediaInfo::imageFormat(size_t streamNumber) const
261{
262 return MediaInfo_Get(__handle, MediaInfo_Stream_Image, streamNumber, L"Format",
264}
265
266unsigned MediaInfo::imageWidth(size_t streamNumber) const
267{
268 return UInt32::parse(
269 MediaInfo_Get(__handle, MediaInfo_Stream_Image, streamNumber, L"Width",
271 10, 0LLU
272 );
273}
274
275unsigned MediaInfo::imageHeight(size_t streamNumber) const
276{
277 return UInt32::parse(
278 MediaInfo_Get(__handle, MediaInfo_Stream_Image, streamNumber, L"Height",
280 10, 0LLU
281 );
282}
283
284static const wchar_t* __formatToType__[] = {
285 L"ShockWave", L"x-shockwave-flash"
286 , L"Flash Video", L"x-flv"
287 , L"AVI", L"avi"
288 , L"MPEG Audio", L"mpeg"
289 , L"MPEG Video", L"mpeg"
290 , L"CDXA/MPEG-PS", L"mp2p"
291 , L"MPEG-PS", L"mp2p"
292 , L"MPEG-4", L"mp4"
293 , L"OGG", L"ogg"
294 , L"WebM", L"webm"
295};
296
298{
299 if (imageCount() > 0) {
300 return L"image/" + format().toLowerCase();
301 }
302
303 String format = this->format();
304 const wchar_t* type = NULL;
305 for (size_t i = 0; i < __countof(__formatToType__, wchar_t*);
306 i++, i++) {
307 if (format.compareNoCase(__formatToType__[i]) == 0) {
308 type = __formatToType__[i + 1];
309 break;
310 }
311 }
312
313 StringBuilder r;
314 if (type != NULL) {
315 if (videoCount() > 0) {
316 r = L"video/";
317 }
318 else if (audioCount() > 0) {
319 r = L"audio/";
320 }
321 else {
322 r = L"application/";
323 }
324 r += type;
325 }
326 else {
327 r = L"application/octet-stream";
328 }
329 return r;
330}
331
332__DCL_END_NAMESPACE
DCLCAPI int __dlerror(String &r)
Definition _dlfcn.cpp:32
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:340
#define __countof(array, type)
Definition Config.h:365
wchar_t char_t
Definition Config.h:275
#define __DCL_THROWS2(e1, e2)
Definition Config.h:168
#define __DCL_THROWS1(e)
Definition Config.h:167
#define WINAPI_ERROR(n)
Definition Exception.h:72
#define MEDIAINFODLL_NAME
@ MediaInfo_Stream_Audio
@ MediaInfo_Stream_Image
@ MediaInfo_Stream_General
@ MediaInfo_Stream_Video
@ MediaInfo_Info_Name
@ MediaInfo_Info_Text
#define __DCL_VERIFY(expr)
Definition Object.h:373
#define __DCL_ASSERT(expr)
Definition Object.h:371
#define __T(str)
Definition Object.h:44
ByteString r
uint64_t fileSize() const
static void cleanup()
Definition MediaInfo.cpp:55
String videoFormat(size_t streamNumber) const
unsigned videoCount() const
unsigned imageHeight(size_t streamNumber) const
IOException * ~MediaInfo()
Definition MediaInfo.cpp:76
uint32_t audioDurationAsSeconds(size_t streamNumber) const
String inform_r() const
Definition MediaInfo.cpp:88
unsigned audioBitRateMaximum(size_t streamNumber) const
String format() const
unsigned videoWidth(size_t streamNumber) const
unsigned imageCount() const
unsigned videoBitRateMinimum(size_t streamNumber) const
String imageFormat(size_t streamNumber) const
String contentType() const
uint32_t videoDurationAsSeconds(size_t streamNumber) const
unsigned audioBitRateMinimum(size_t streamNumber) const
unsigned videoHeight(size_t streamNumber) const
uint64_t audioDuration(size_t streamNumber) const
unsigned videoBitRate(size_t streamNumber) const
unsigned videoBitRateMaximum(size_t streamNumber) const
String inform() const
Definition MediaInfo.cpp:82
static void initialize() __DCL_THROWS1(DllException *)
Definition MediaInfo.cpp:39
MediaInfo(const String &_filename) __DCL_THROWS2(DllException *
unsigned audioCount() const
String option(const wchar_t *_option, const wchar_t *_value=NULL) const
Definition MediaInfo.cpp:97
uint64_t videoDuration(size_t streamNumber) const
unsigned audioBitRate(size_t streamNumber) const
unsigned imageWidth(size_t streamNumber) const
String audioFormat(size_t streamNumber) const
static uint32_t parse(const wchar_t *_number, unsigned _base=10) __DCL_THROWS1(NumericConvertException *)
Definition Numeric.cpp:401
static uint64_t parse(const wchar_t *_number, unsigned _base=10) __DCL_THROWS1(NumericConvertException *)
Definition Numeric.cpp:617