MediaTypeEx.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:10k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "DSUtil.h"
  3. #include "MediaTypeEx.h"
  4. #include <mmreg.h>
  5. #include <initguid.h>
  6. #include "....includemoreuuids.h"
  7. #include "....includeoggOggDS.h"
  8. CMediaTypeEx::CMediaTypeEx()
  9. {
  10. }
  11. CString CMediaTypeEx::ToString(IPin* pPin)
  12. {
  13. CString packing, type, codec, dim, rate, dur;
  14. // TODO
  15. if(majortype == MEDIATYPE_DVD_ENCRYPTED_PACK)
  16. {
  17. packing = _T("Encrypted MPEG2 Pack");
  18. }
  19. else if(majortype == MEDIATYPE_MPEG2_PACK)
  20. {
  21. packing = _T("MPEG2 Pack");
  22. }
  23. else if(majortype == MEDIATYPE_MPEG2_PES)
  24. {
  25. packing = _T("MPEG2 PES");
  26. }
  27. if(majortype == MEDIATYPE_Video)
  28. {
  29. type = _T("Video");
  30. BITMAPINFOHEADER bih;
  31. bool fBIH = ExtractBIH(this, &bih);
  32. int w, h, arx, ary;
  33. bool fDim = ExtractDim(this, w, h, arx, ary);
  34. if(fBIH && bih.biCompression)
  35. {
  36. codec = GetVideoCodecName(subtype, bih.biCompression);
  37. }
  38. if(codec.IsEmpty())
  39. {
  40. if(formattype == FORMAT_MPEGVideo) codec = _T("MPEG1 Video");
  41. else if(formattype == FORMAT_MPEG2_VIDEO) codec = _T("MPEG2 Video");
  42. else if(formattype == FORMAT_DiracVideoInfo) codec = _T("Dirac Video");
  43. }
  44. if(fDim)
  45. {
  46. dim.Format(_T("%dx%d"), w, h);
  47. if(w*ary != h*arx) dim.Format(_T("%s (%d:%d)"), CString(dim), arx, ary);
  48. }
  49. if(formattype == FORMAT_VideoInfo || formattype == FORMAT_MPEGVideo)
  50. {
  51. VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pbFormat;
  52. if(vih->AvgTimePerFrame) rate.Format(_T("%0.2ffps "), 10000000.0f / vih->AvgTimePerFrame);
  53. if(vih->dwBitRate) rate.Format(_T("%s%dKbps"), CString(rate), vih->dwBitRate/1000);
  54. }
  55. else if(formattype == FORMAT_VideoInfo2 || formattype == FORMAT_MPEG2_VIDEO || formattype == FORMAT_DiracVideoInfo)
  56. {
  57. VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)pbFormat;
  58. if(vih->AvgTimePerFrame) rate.Format(_T("%0.2ffps "), 10000000.0f / vih->AvgTimePerFrame);
  59. if(vih->dwBitRate) rate.Format(_T("%s%dKbps"), CString(rate), vih->dwBitRate/1000);
  60. }
  61. rate.Trim();
  62. if(subtype == MEDIASUBTYPE_DVD_SUBPICTURE)
  63. {
  64. type = _T("Subtitle");
  65. codec = _T("DVD Subpicture");
  66. }
  67. }
  68. else if(majortype == MEDIATYPE_Audio)
  69. {
  70. type = _T("Audio");
  71. if(formattype == FORMAT_WaveFormatEx)
  72. {
  73. WAVEFORMATEX* wfe = (WAVEFORMATEX*)Format();
  74. if(wfe->wFormatTag/* > WAVE_FORMAT_PCM && wfe->wFormatTag < WAVE_FORMAT_EXTENSIBLE
  75. && wfe->wFormatTag != WAVE_FORMAT_IEEE_FLOAT*/)
  76. {
  77. codec = GetAudioCodecName(subtype, wfe->wFormatTag);
  78. dim.Format(_T("%dHz"), wfe->nSamplesPerSec);
  79. if(wfe->nChannels == 1) dim.Format(_T("%s mono"), CString(dim));
  80. else if(wfe->nChannels == 2) dim.Format(_T("%s stereo"), CString(dim));
  81. else dim.Format(_T("%s %dch"), CString(dim), wfe->nChannels);
  82. if(wfe->nAvgBytesPerSec) rate.Format(_T("%dKbps"), wfe->nAvgBytesPerSec*8/1000);
  83. }
  84. }
  85. else if(formattype == FORMAT_VorbisFormat)
  86. {
  87. VORBISFORMAT* vf = (VORBISFORMAT*)Format();
  88. codec = GetAudioCodecName(subtype, 0);
  89. dim.Format(_T("%dHz"), vf->nSamplesPerSec);
  90. if(vf->nChannels == 1) dim.Format(_T("%s mono"), CString(dim));
  91. else if(vf->nChannels == 2) dim.Format(_T("%s stereo"), CString(dim));
  92. else dim.Format(_T("%s %dch"), CString(dim), vf->nChannels);
  93. if(vf->nAvgBitsPerSec) rate.Format(_T("%dKbps"), vf->nAvgBitsPerSec/1000);
  94. }
  95. else if(formattype == FORMAT_VorbisFormat2)
  96. {
  97. VORBISFORMAT2* vf = (VORBISFORMAT2*)Format();
  98. codec = GetAudioCodecName(subtype, 0);
  99. dim.Format(_T("%dHz"), vf->SamplesPerSec);
  100. if(vf->Channels == 1) dim.Format(_T("%s mono"), CString(dim));
  101. else if(vf->Channels == 2) dim.Format(_T("%s stereo"), CString(dim));
  102. else dim.Format(_T("%s %dch"), CString(dim), vf->Channels);
  103. }
  104. }
  105. else if(majortype == MEDIATYPE_Text)
  106. {
  107. type = _T("Text");
  108. }
  109. else if(majortype == MEDIATYPE_Subtitle)
  110. {
  111. type = _T("Subtitle");
  112. codec = GetSubtitleCodecName(subtype);
  113. }
  114. else
  115. {
  116. type = _T("Unknown");
  117. }
  118. if(CComQIPtr<IMediaSeeking> pMS = pPin)
  119. {
  120. REFERENCE_TIME rtDur = 0;
  121. if(SUCCEEDED(pMS->GetDuration(&rtDur)) && rtDur)
  122. {
  123. rtDur /= 10000000;
  124. int s = rtDur%60;
  125. rtDur /= 60;
  126. int m = rtDur%60;
  127. rtDur /= 60;
  128. int h = rtDur;
  129. if(h) dur.Format(_T("%d:%02d:%02d"), h, m, s);
  130. else if(m) dur.Format(_T("%02d:%02d"), m, s);
  131. else if(s) dur.Format(_T("%ds"), s);
  132. }
  133. }
  134. CString str;
  135. if(!codec.IsEmpty()) str += codec + _T(" ");
  136. if(!dim.IsEmpty()) str += dim + _T(" ");
  137. if(!rate.IsEmpty()) str += rate + _T(" ");
  138. if(!dur.IsEmpty()) str += dur + _T(" ");
  139. str.Trim(_T(" ,"));
  140. if(!str.IsEmpty()) str = type + _T(": ") + str;
  141. else str = type;
  142. return str;
  143. }
  144. CString CMediaTypeEx::GetVideoCodecName(const GUID& subtype, DWORD biCompression)
  145. {
  146. CString str;
  147. static CAtlMap<CString, CString, CStringElementTraits<CString> > names;
  148. if(names.IsEmpty())
  149. {
  150. names[_T("WMV1")] = _T("Windows Media Video 7");
  151. names[_T("WMV2")] = _T("Windows Media Video 8");
  152. names[_T("WMV3")] = _T("Windows Media Video 9");
  153. names[_T("DIV3")] = _T("DivX 3");
  154. names[_T("DX50")] = _T("DivX 5");
  155. names[_T("MP4V")] = _T("MPEG4 Video");
  156. names[_T("AVC1")] = _T("MPEG4 Video (AVC)");
  157. names[_T("RV10")] = _T("RealVideo 1");
  158. names[_T("RV20")] = _T("RealVideo 2");
  159. names[_T("RV30")] = _T("RealVideo 3");
  160. names[_T("RV40")] = _T("RealVideo 4");
  161. // names[_T("")] = _T("");
  162. }
  163. if(biCompression)
  164. {
  165. CString fcc;
  166. fcc.Format(_T("%4.4hs"), &biCompression);
  167. fcc.MakeUpper();
  168. if(!names.Lookup(fcc, str))
  169. {
  170. if(subtype == MEDIASUBTYPE_DiracVideo) str = _T("Dirac Video");
  171. // else if(subtype == ) str = _T("");
  172. else if(biCompression < 256) str.Format(_T("%d"), biCompression);
  173. else str = fcc;
  174. }
  175. }
  176. return str;
  177. }
  178. CString CMediaTypeEx::GetAudioCodecName(const GUID& subtype, WORD wFormatTag)
  179. {
  180. CString str;
  181. static CAtlMap<WORD, CString> names;
  182. if(names.IsEmpty())
  183. {
  184. names[WAVE_FORMAT_PCM] = _T("PCM");
  185. names[WAVE_FORMAT_EXTENSIBLE] = _T("WAVE_FORMAT_EXTENSIBLE");
  186. names[WAVE_FORMAT_IEEE_FLOAT] = _T("IEEE Float");
  187. names[WAVE_FORMAT_ADPCM] = _T("MS ADPCM");
  188. names[WAVE_FORMAT_ALAW] = _T("aLaw");
  189. names[WAVE_FORMAT_MULAW] = _T("muLaw");
  190. names[WAVE_FORMAT_DRM] = _T("DRM");
  191. names[WAVE_FORMAT_OKI_ADPCM] = _T("OKI ADPCM");
  192. names[WAVE_FORMAT_DVI_ADPCM] = _T("DVI ADPCM");
  193. names[WAVE_FORMAT_IMA_ADPCM] = _T("IMA ADPCM");
  194. names[WAVE_FORMAT_MEDIASPACE_ADPCM] = _T("Mediaspace ADPCM");
  195. names[WAVE_FORMAT_SIERRA_ADPCM] = _T("Sierra ADPCM");
  196. names[WAVE_FORMAT_G723_ADPCM] = _T("G723 ADPCM");
  197. names[WAVE_FORMAT_DIALOGIC_OKI_ADPCM] = _T("Dialogic OKI ADPCM");
  198. names[WAVE_FORMAT_MEDIAVISION_ADPCM] = _T("Media Vision ADPCM");
  199. names[WAVE_FORMAT_YAMAHA_ADPCM] = _T("Yamaha ADPCM");
  200. names[WAVE_FORMAT_DSPGROUP_TRUESPEECH] = _T("DSP Group Truespeech");
  201. names[WAVE_FORMAT_DOLBY_AC2] = _T("Dolby AC2");
  202. names[WAVE_FORMAT_GSM610] = _T("GSM610");
  203. names[WAVE_FORMAT_MSNAUDIO] = _T("MSN Audio");
  204. names[WAVE_FORMAT_ANTEX_ADPCME] = _T("Antex ADPCME");
  205. names[WAVE_FORMAT_CS_IMAADPCM] = _T("Crystal Semiconductor IMA ADPCM");
  206. names[WAVE_FORMAT_ROCKWELL_ADPCM] = _T("Rockwell ADPCM");
  207. names[WAVE_FORMAT_ROCKWELL_DIGITALK] = _T("Rockwell Digitalk");
  208. names[WAVE_FORMAT_G721_ADPCM] = _T("G721");
  209. names[WAVE_FORMAT_G728_CELP] = _T("G728");
  210. names[WAVE_FORMAT_MSG723] = _T("MSG723");
  211. names[WAVE_FORMAT_MPEG] = _T("MPEG Audio");
  212. names[WAVE_FORMAT_MPEGLAYER3] = _T("MPEG Audio Layer 3");
  213. names[WAVE_FORMAT_LUCENT_G723] = _T("Lucent G723");
  214. names[WAVE_FORMAT_VOXWARE] = _T("Voxware");
  215. names[WAVE_FORMAT_G726_ADPCM] = _T("G726");
  216. names[WAVE_FORMAT_G722_ADPCM] = _T("G722");
  217. names[WAVE_FORMAT_G729A] = _T("G729A");
  218. names[WAVE_FORMAT_MEDIASONIC_G723] = _T("MediaSonic G723");
  219. names[WAVE_FORMAT_ZYXEL_ADPCM] = _T("ZyXEL ADPCM");
  220. names[WAVE_FORMAT_RHETOREX_ADPCM] = _T("Rhetorex ADPCM");
  221. names[WAVE_FORMAT_VIVO_G723] = _T("Vivo G723");
  222. names[WAVE_FORMAT_VIVO_SIREN] = _T("Vivo Siren");
  223. names[WAVE_FORMAT_DIGITAL_G723] = _T("Digital G723");
  224. names[WAVE_FORMAT_SANYO_LD_ADPCM] = _T("Sanyo LD ADPCM");
  225. names[WAVE_FORMAT_CREATIVE_ADPCM] = _T("Creative ADPCM");
  226. names[WAVE_FORMAT_CREATIVE_FASTSPEECH8] = _T("Creative Fastspeech 8");
  227. names[WAVE_FORMAT_CREATIVE_FASTSPEECH10] = _T("Creative Fastspeech 10");
  228. names[WAVE_FORMAT_UHER_ADPCM] = _T("UHER ADPCM");
  229. names[WAVE_FORMAT_DOLBY_AC3] = _T("Dolby AC3");
  230. names[WAVE_FORMAT_DVD_DTS] = _T("DTS");
  231. names[WAVE_FORMAT_AAC] = _T("AAC");
  232. names[WAVE_FORMAT_FLAC] = _T("FLAC");
  233. names[WAVE_FORMAT_TTA1] = _T("TTA");
  234. names[WAVE_FORMAT_14_4] = _T("RealAudio 14.4");
  235. names[WAVE_FORMAT_28_8] = _T("RealAudio 28.8");
  236. names[WAVE_FORMAT_ATRC] = _T("RealAudio ATRC");
  237. names[WAVE_FORMAT_COOK] = _T("RealAudio COOK");
  238. names[WAVE_FORMAT_DNET] = _T("RealAudio DNET");
  239. names[WAVE_FORMAT_RAAC] = _T("RealAudio RAAC");
  240. names[WAVE_FORMAT_RACP] = _T("RealAudio RACP");
  241. names[WAVE_FORMAT_SIPR] = _T("RealAudio SIPR");
  242. names[WAVE_FORMAT_PS2_PCM] = _T("PS2 PCM");
  243. names[WAVE_FORMAT_PS2_ADPCM] = _T("PS2 ADPCM");
  244. names[0x0160] = _T("Windows Media Audio");
  245. names[0x0161] = _T("Windows Media Audio");
  246. names[0x0162] = _T("Windows Media Audio");
  247. names[0x0163] = _T("Windows Media Audio");
  248. // names[] = _T("");
  249. }
  250. if(!names.Lookup(wFormatTag, str))
  251. {
  252. if(subtype == MEDIASUBTYPE_Vorbis) str = _T("Vorbis (deprecated)");
  253. else if(subtype == MEDIASUBTYPE_Vorbis2) str = _T("Vorbis");
  254. else if(subtype == MEDIASUBTYPE_MP4A) str = _T("MPEG4 Audio");
  255. else if(subtype == MEDIASUBTYPE_FLAC_FRAMED) str = _T("FLAC (framed)");
  256. // else if(subtype == ) str = _T("");
  257. else str.Format(_T("0x%04x"), wFormatTag);
  258. }
  259. if(wFormatTag == WAVE_FORMAT_PCM)
  260. {
  261. if(subtype == MEDIASUBTYPE_DTS) str += _T(" (DTS)");
  262. else if(subtype == MEDIASUBTYPE_DOLBY_AC3) str += _T(" (AC3)");
  263. }
  264. return str;
  265. }
  266. CString CMediaTypeEx::GetSubtitleCodecName(const GUID& subtype)
  267. {
  268. CString str;
  269. static CAtlMap<GUID, CString> names;
  270. if(names.IsEmpty())
  271. {
  272. names[MEDIASUBTYPE_UTF8] = _T("UTF-8");
  273. names[MEDIASUBTYPE_SSA] = _T("SubStation Alpha");
  274. names[MEDIASUBTYPE_ASS] = _T("Advanced SubStation Alpha");
  275. names[MEDIASUBTYPE_USF] = _T("Universal Subtitle Format");
  276. names[MEDIASUBTYPE_VOBSUB] = _T("VobSub");
  277. // names[''] = _T("");
  278. }
  279. if(names.Lookup(subtype, str))
  280. {
  281. }
  282. return str;
  283. }