autodetect.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // VirtualDub - Video processing and capture application
  2. // Copyright (C) 1998-2001 Avery Lee
  3. //
  4. // This program is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program; if not, write to the Free Software
  16. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #include <math.h>
  18. #include <windows.h>
  19. #include "VideoSource.h"
  20. //#include "command.h"
  21. ///////////////////////////////////////////////////////////////////////////
  22. #define R(x) ((((x)&0xFF000000)>>24) | (((x)&0x00FF0000)>>8) | (((x)&0x0000FF00)<<8) | (((x)&0x000000FF)<<24))
  23. const struct CodecEntry {
  24. FOURCC fcc;
  25. const char *name;
  26. } codec_entries[]={
  27. { R('VCR1'), "ATI video 1" },
  28. { R('VCR2'), "ATI video 2" },
  29. { R('TR20'), "Duck TrueMotion 2.0" },
  30. { R('dvsd'), "DV" },
  31. { R('HFYU'), "Huffyuv" },
  32. { R('I263'), "Intel H.263" },
  33. { R('I420'), "LifeView YUV12 codec" },
  34. { R('IR21'), "Indeo Video 2.1" },
  35. { R('IV31'), "Indeo Video 3.1" },
  36. { R('IV32'), "Indeo Video 3.2" },
  37. { R('IV41'), "Indeo Video 4.1" },
  38. { R('IV50'), "Indeo Video 5.x" },
  39. { R('UCOD'), "Iterated Systems' ClearVideo" },
  40. { R('mjpg'), "Motion JPEG" },
  41. { R('MJPG'), "Motion JPEG" },
  42. { R('dmb1'), "Motion JPEG (Matrox)" },
  43. { R('MPG4'), "Microsoft High-Speed MPEG-4 " },
  44. { R('MP42'), "Microsoft High-Speed MPEG-4 V2" },
  45. { R('MP43'), "Microsoft High-Speed MPEG-4 V3" },
  46. { R('DIV3'), "Microsoft High-Speed MPEG-4 V3 [Hack: DivX Low-Motion]" },
  47. { R('DIV4'), "Microsoft High-Speed MPEG-4 V3 [Hack: DivX Fast-Motion]" },
  48. { R('AP41'), "Microsoft High-Speed MPEG-4 V3 [Hack: AngelPotion Definitive]" },
  49. { R('MRLE'), "Microsoft RLE" },
  50. { R('MSVC'), "Microsoft Video 1" },
  51. { R('CRAM'), "Microsoft Video 1" },
  52. { R('DIVX'), "OpenDIVX" },
  53. { R('CVID'), "Radius Cinepak" },
  54. { R('VIVO'), "VivoActive" },
  55. { R('VDST'), "VirtualDub frameclient driver" },
  56. };
  57. #undef R
  58. const char *LookupVideoCodec(FOURCC fccType) {
  59. int i;
  60. for(i=0; i<3; i++) {
  61. int c = (int)((fccType>>(8*i)) & 255);
  62. if (isalpha(c))
  63. fccType = (fccType & ~(FOURCC)(0xff << (i*8))) | (toupper(c) << (i*8));
  64. }
  65. for(i=0; i<sizeof codec_entries/sizeof codec_entries[0]; i++)
  66. if (codec_entries[i].fcc == fccType)
  67. return codec_entries[i].name;
  68. return NULL;
  69. }
  70. ///////////////////////////////////////////////////////////////////////////
  71. #if 0
  72. struct AutodetectEntry {
  73. int iWidth, iHeight;
  74. long lMicroSecsPerFrame;
  75. long lFrames;
  76. char *lpszName;
  77. } ad_entries[]={
  78. { 240, 180, 33333, 3524, "AD Police opening" },
  79. { 320, 240, 33333, 2657, "Ah My Goddess! opening" },
  80. { 160, 128, 33333, 2755, "Ah My Goddess! opening" },
  81. { 240, 180, 33333, 2790, "Ah My Goddess! opening" },
  82. { 320, 240, 33333, 2774, "Ah My Goddess! ending" },
  83. { 160, 128, 41667, 1792, "Armitage III opening" },
  84. { 320, 240, 33333, 2718, "Bakuretsu Hunter opening" },
  85. { 320, 240, 66667, 1354, "Blue Seed opening" },
  86. { 352, 240, 33367, 6903, "Bubblegum Crisis - Rock Me" },
  87. { 352, 240, 33367, 5728, "Bubblegum Crisis - Touchdown to Tomorrow" },
  88. { 352, 240, 33367, 3606, "Bubblegum Crash opening" },
  89. { 160, 120, 66667, 1487, "Cat Girl Nuku Nuku opening #1" },
  90. { 160, 120, 66667, 1536, "Cat Girl Nuku Nuku opening #2" },
  91. { 160, 120, 33333, 3063, "Cat Girl Nuku Nuku opening #2" },
  92. { 320, 240, 66738, 1491, "DNA^2 opening" },
  93. { 160, 128, 33333, 2765, "DNA^2 opening" },
  94. { 160, 128, 41667, 2488, "El-Hazard opening #2" },
  95. { 320, 240, 41667, 2736, "El-Hazard ending" },
  96. { 160, 128, 41667, 2301, "El-Hazard opening #1" },
  97. { 352, 240, 33367, 2988, "El-Hazard TV opening #1" },
  98. { 320, 240, 33333, 2955, "El-Hazard TV opening #1" },
  99. { 160, 120, 99887, 1180, "El-Hazard TV opening #2" },
  100. { 240, 180, 33333, 3405, "El-Hazard TV opening #2" },
  101. { 320, 240, 33367, 4292, "Final Fantasy VIII preview" },
  102. { 352, 240, 33367, 2763, "Fushigi Yuugi opening" },
  103. { 320, 240, 33333, 2709, "Fushigi Yuugi opening" },
  104. { 320, 240, 33367, 2402, "Fushigi Yuugi ending" },
  105. { 320, 240, 66667, 1381, "Idol Project opening" },
  106. { 288, 224, 41667, 2378, "Iria opening" },
  107. { 352, 240, 33333, 3033, "Key the Metal Idol opening" },
  108. { 352, 224, 33367, 2748, "Magical Knights Rayearth opening #1" },
  109. { 320, 240, 33333, 2772, "Magical Knights Rayearth opening #1" },
  110. { 320, 240, 33333, 2711, "Magical Knights Rayearth opening #2" },
  111. { 160, 120, 99971, 2325, "Magical Knights Rayearth OAV opening" },
  112. { 320, 240, 33333, 2805, "Maison Ikkoku opening" },
  113. { 320, 240, 66667, 1350, "Marmalade Boy opening" },
  114. { 316, 236, 33333, 2701, "Martian Successor Nadesico opening" },
  115. { 320, 240, 66667, 1376, "Martian Successor Nadesico opening" },
  116. { 316, 240, 66667,  897, "Martian Successor Nadesico ending" },
  117. { 320, 240, 66667, 2159, "Martian Successor Nadesico - Yurika song" },
  118. { 352, 240, 33367, 2698, "Neon Genesis Evangelion opening #1" },
  119. { 160, 120, 33405, 2733, "Neon Genesis Evangelion opening #1" },
  120. { 240, 180, 33333, 2709, "Neon Genesis Evangelion opening #1" },
  121. { 320, 240, 55444, 1643, "Neon Genesis Evangelion opening #1 (subtitled)" },
  122. { 320, 240, 33333, 2708, "Neon Genesis Evangelion opening #2" },
  123. { 160, 120, 66667, 1431, "Nurse Angel Ririka opening" },
  124. { 320, 240, 33333, 2722, "Pretty Sammy opening" },
  125. { 320, 240, 41667, 2176, "Rurouni Kenshin opening" },
  126. { 352, 240, 33367, 3080, "Rurouni Kenshin opening" },
  127. { 316, 236,100000,  913, "Sailor Moon SuperS movie opening" },
  128. { 240, 180, 33333, 2529, "Tenchi Muyo TV opening" },
  129. { 352, 240, 33367, 2088, "Visions of Escaflowne ending" },
  130. { 320, 227,100000,  693, "Visions of Escaflowne ending" },
  131. { 160, 120, 33405, 2081, "Visions of Escaflowne ending" },
  132. { 320, 240, 33367, 2648, "Visions of Escaflowne opening" },
  133. { 320, 240, 66740, 1361, "Visions of Escaflowne opening" },
  134. { 316, 240, 66667, 1047, "Wedding Peach ending" },
  135. { 316, 240, 66667, 1333, "Wedding Peach opening" },
  136. { 240, 180, 33333, 3010, "You're Under Arrest opening" },
  137. { 320, 240, 33367, 2560, "Yu Yu Hakusho opening" },
  138. { 320, 240, 33333, 2610, "Yu Yu Hakusho opening" },
  139. { 0 }
  140. };
  141. char *AutodetectFile(VideoSource *pvs) {
  142. AutodetectEntry *pae = ad_entries;
  143. while(pae->iWidth) {
  144. if (pae->iWidth == pvs->getImageFormat()->biWidth
  145. && pae->iHeight == pvs->getImageFormat()->biHeight
  146. && abs(pae->lMicroSecsPerFrame - MulDiv(pvs->streamInfo.dwScale, 1000000, pvs->streamInfo.dwRate))<100
  147. && pae->lFrames == (pvs->lSampleLast - pvs->lSampleFirst)
  148. )
  149. return pae->lpszName;
  150. ++pae;
  151. }
  152. return NULL;
  153. }
  154. #else
  155. char *AutodetectFile(VideoSource *pvs) {
  156. return NULL;
  157. }
  158. #endif