Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

466 lines
16 KiB

  1. /****************************************************************************
  2. *
  3. * AVIFILE.H
  4. *
  5. * routines for reading Standard AVI files
  6. *
  7. * Copyright (c) 1992, 1993 Microsoft Corporation. All Rights Reserved.
  8. *
  9. * You have a royalty-free right to use, modify, reproduce and
  10. * distribute the Sample Files (and/or any modified version) in
  11. * any way you find useful, provided that you agree that
  12. * Microsoft has no warranty obligations or liability for any
  13. * Sample Application Files which are modified.
  14. *
  15. ***************************************************************************/
  16. #if !defined( _AVIFILE_H_ )
  17. #define _AVIFILE_H_
  18. #ifdef __cplusplus
  19. extern "C" { /* Assume C declarations for C++ */
  20. #endif /* __cplusplus */
  21. #define CreateStream CS // !!!ack
  22. #ifndef mmioFOURCC
  23. #define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
  24. ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \
  25. ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
  26. #endif
  27. #ifndef streamtypeVIDEO
  28. #define streamtypeVIDEO mmioFOURCC('v', 'i', 'd', 's')
  29. #define streamtypeAUDIO mmioFOURCC('a', 'u', 'd', 's')
  30. #define streamtypeMIDI mmioFOURCC('m', 'i', 'd', 's')
  31. #define streamtypeTEXT mmioFOURCC('t', 'x', 't', 's')
  32. #endif
  33. #ifndef AVIIF_KEYFRAME
  34. #define AVIIF_KEYFRAME 0x00000010L // this frame is a key frame.
  35. #endif
  36. //
  37. // Structures used by AVIStreamInfo & AVIFileInfo.
  38. //
  39. // These are related to, but not identical to, the header chunks
  40. // in an AVI file.
  41. //
  42. typedef struct _AVISTREAMINFO {
  43. DWORD fccType;
  44. DWORD fccHandler;
  45. DWORD dwFlags; /* Contains AVITF_* flags */
  46. DWORD dwCaps;
  47. WORD wPriority;
  48. WORD wLanguage;
  49. DWORD dwScale;
  50. DWORD dwRate; /* dwRate / dwScale == samples/second */
  51. DWORD dwStart;
  52. DWORD dwLength; /* In units above... */
  53. DWORD dwInitialFrames;
  54. DWORD dwSuggestedBufferSize;
  55. DWORD dwQuality;
  56. DWORD dwSampleSize;
  57. RECT rcFrame;
  58. DWORD dwEditCount;
  59. DWORD dwFormatChangeCount;
  60. char szName[64];
  61. } AVISTREAMINFO, FAR * LPAVISTREAMINFO;
  62. #define AVISTREAMINFO_DISABLED 0x00000001
  63. #define AVISTREAMINFO_FORMATCHANGES 0x00010000
  64. typedef struct _AVIFILEINFO {
  65. DWORD dwMaxBytesPerSec; // max. transfer rate
  66. DWORD dwFlags; // the ever-present flags
  67. DWORD dwCaps;
  68. DWORD dwStreams;
  69. DWORD dwSuggestedBufferSize;
  70. DWORD dwWidth;
  71. DWORD dwHeight;
  72. DWORD dwScale;
  73. DWORD dwRate; /* dwRate / dwScale == samples/second */
  74. DWORD dwLength;
  75. DWORD dwEditCount;
  76. char szFileType[64]; // descriptive string for file type?
  77. } AVIFILEINFO, FAR * LPAVIFILEINFO;
  78. // Flags for dwFlags
  79. #define AVIFILEINFO_HASINDEX 0x00000010
  80. #define AVIFILEINFO_MUSTUSEINDEX 0x00000020
  81. #define AVIFILEINFO_ISINTERLEAVED 0x00000100
  82. #define AVIFILEINFO_WASCAPTUREFILE 0x00010000
  83. #define AVIFILEINFO_COPYRIGHTED 0x00020000
  84. // Flags for dwCaps
  85. #define AVIFILECAPS_CANREAD 0x00000001
  86. #define AVIFILECAPS_CANWRITE 0x00000002
  87. #define AVIFILECAPS_ALLKEYFRAMES 0x00000010
  88. #define AVIFILECAPS_NOCOMPRESSION 0x00000020
  89. typedef BOOL (FAR PASCAL * AVISAVECALLBACK)(int);
  90. /************************************************************************/
  91. /* Declaration for the AVICOMPRESSOPTIONS structure. Make sure it */
  92. /* matches the AutoDoc in avisave.c !!! */
  93. /************************************************************************/
  94. typedef struct {
  95. DWORD fccType; /* stream type, for consistency */
  96. DWORD fccHandler; /* compressor */
  97. DWORD dwKeyFrameEvery; /* keyframe rate */
  98. DWORD dwQuality; /* compress quality 0-10,000 */
  99. DWORD dwBytesPerSecond; /* bytes per second */
  100. DWORD dwFlags; /* flags... see aviopts.h */
  101. LPVOID lpFormat; /* save format */
  102. DWORD cbFormat;
  103. LPVOID lpParms; /* compressor options */
  104. DWORD cbParms;
  105. DWORD dwInterleaveEvery; /* for non-video streams only */
  106. } AVICOMPRESSOPTIONS, FAR *LPAVICOMPRESSOPTIONS;
  107. //
  108. // Defines for the dwFlags field of the AVICOMPRESSOPTIONS struct
  109. // Each of these flags determines if the appropriate field in the structure
  110. // (dwInterleaveEvery, dwBytesPerSecond, and dwKeyFrameEvery) is payed
  111. // attention to. See the autodoc in avisave.c for details.
  112. //
  113. #define AVICOMPRESSF_INTERLEAVE 0x00000001 // interleave
  114. #define AVICOMPRESSF_DATARATE 0x00000002 // use a data rate
  115. #define AVICOMPRESSF_KEYFRAMES 0x00000004 // use keyframes
  116. #define AVICOMPRESSF_VALID 0x00000008 // has valid data?
  117. #ifdef __cplusplus
  118. } /* End of extern "C" { */
  119. #endif /* __cplusplus */
  120. #include "aviiface.h"
  121. #ifdef __cplusplus
  122. extern "C" { /* Assume C declarations for C++ */
  123. #endif /* __cplusplus */
  124. //
  125. // functions
  126. //
  127. STDAPI_(void) AVIFileInit(void); // Call this first!
  128. STDAPI_(void) AVIFileExit(void);
  129. STDAPI_(ULONG) AVIFileAddRef (PAVIFILE pfile);
  130. STDAPI_(ULONG) AVIFileRelease (PAVIFILE pfile);
  131. STDAPI AVIFileOpen (PAVIFILE FAR * ppfile, LPCSTR szFile,
  132. UINT uMode, LPCLSID lpHandler);
  133. STDAPI AVIFileInfo (PAVIFILE pfile, AVIFILEINFO FAR * pfi, LONG lSize);
  134. STDAPI AVIFileGetStream (PAVIFILE pfile, PAVISTREAM FAR * ppavi, DWORD fccType, LONG lParam);
  135. STDAPI AVIFileCreateStream (PAVIFILE pfile,
  136. PAVISTREAM FAR *ppavi,
  137. AVISTREAMINFO FAR *psi);
  138. STDAPI AVIFileWriteData (PAVIFILE pfile,
  139. DWORD ckid,
  140. LPVOID lpData,
  141. LONG cbData);
  142. STDAPI AVIFileReadData (PAVIFILE pfile,
  143. DWORD ckid,
  144. LPVOID lpData,
  145. LONG FAR *lpcbData);
  146. STDAPI AVIFileEndRecord (PAVIFILE pfile);
  147. STDAPI_(ULONG) AVIStreamAddRef (PAVISTREAM pavi);
  148. STDAPI_(ULONG) AVIStreamRelease (PAVISTREAM pavi);
  149. STDAPI AVIStreamInfo (PAVISTREAM pavi, AVISTREAMINFO FAR * psi, LONG lSize);
  150. STDAPI_(LONG) AVIStreamFindSample(PAVISTREAM pavi, LONG lPos, LONG lFlags);
  151. STDAPI AVIStreamReadFormat (PAVISTREAM pavi, LONG lPos,LPVOID lpFormat,LONG FAR *lpcbFormat);
  152. STDAPI AVIStreamSetFormat (PAVISTREAM pavi, LONG lPos,LPVOID lpFormat,LONG cbFormat);
  153. STDAPI AVIStreamReadData (PAVISTREAM pavi, DWORD fcc, LPVOID lp, LONG FAR *lpcb);
  154. STDAPI AVIStreamWriteData (PAVISTREAM pavi, DWORD fcc, LPVOID lp, LONG cb);
  155. STDAPI AVIStreamRead (PAVISTREAM pavi,
  156. LONG lStart,
  157. LONG lSamples,
  158. LPVOID lpBuffer,
  159. LONG cbBuffer,
  160. LONG FAR * plBytes,
  161. LONG FAR * plSamples);
  162. #define AVISTREAMREAD_CONVENIENT (-1L)
  163. STDAPI AVIStreamWrite (PAVISTREAM pavi,
  164. LONG lStart, LONG lSamples,
  165. LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags,
  166. LONG FAR *plSampWritten,
  167. LONG FAR *plBytesWritten);
  168. // Right now, these just use AVIStreamInfo() to get information, then
  169. // return some of it. Can they be more efficient?
  170. STDAPI_(LONG) AVIStreamStart (PAVISTREAM pavi);
  171. STDAPI_(LONG) AVIStreamLength (PAVISTREAM pavi);
  172. STDAPI_(LONG) AVIStreamTimeToSample (PAVISTREAM pavi, LONG lTime);
  173. STDAPI_(LONG) AVIStreamSampleToTime (PAVISTREAM pavi, LONG lSample);
  174. STDAPI AVIStreamBeginStreaming(PAVISTREAM pavi, LONG lStart, LONG lEnd, LONG lRate);
  175. STDAPI AVIStreamEndStreaming(PAVISTREAM pavi);
  176. //
  177. // helper functions for using IGetFrame
  178. //
  179. STDAPI_(PGETFRAME) AVIStreamGetFrameOpen(PAVISTREAM pavi,
  180. LPBITMAPINFOHEADER lpbiWanted);
  181. STDAPI_(LPVOID) AVIStreamGetFrame(PGETFRAME pg, LONG lPos);
  182. STDAPI AVIStreamGetFrameClose(PGETFRAME pg);
  183. // !!! We need some way to place an advise on a stream....
  184. // STDAPI AVIStreamHasChanged (PAVISTREAM pavi);
  185. // Shortcut function
  186. STDAPI AVIStreamOpenFromFile(PAVISTREAM FAR *ppavi, LPCSTR szFile,
  187. DWORD fccType, LONG lParam,
  188. UINT mode, CLSID FAR *pclsidHandler);
  189. // Use to create disembodied streams
  190. STDAPI AVIStreamCreate(PAVISTREAM FAR *ppavi, LONG lParam1, LONG lParam2,
  191. CLSID FAR *pclsidHandler);
  192. // PHANDLER AVIAPI AVIGetHandler (PAVISTREAM pavi, PAVISTREAMHANDLER psh);
  193. // PAVISTREAM AVIAPI AVIGetStream (PHANDLER p);
  194. //
  195. // flags for AVIStreamFindSample
  196. //
  197. #define FIND_DIR 0x0000000FL // direction
  198. #define FIND_NEXT 0x00000001L // go forward
  199. #define FIND_PREV 0x00000004L // go backward
  200. #define FIND_TYPE 0x000000F0L // type mask
  201. #define FIND_KEY 0x00000010L // find key frame.
  202. #define FIND_ANY 0x00000020L // find any (non-empty) sample
  203. #define FIND_FORMAT 0x00000040L // find format change
  204. #define FIND_RET 0x0000F000L // return mask
  205. #define FIND_POS 0x00000000L // return logical position
  206. #define FIND_LENGTH 0x00001000L // return logical size
  207. #define FIND_OFFSET 0x00002000L // return physical position
  208. #define FIND_SIZE 0x00003000L // return physical size
  209. #define FIND_INDEX 0x00004000L // return physical index position
  210. //
  211. // stuff to support backward compat.
  212. //
  213. #define AVIStreamFindKeyFrame AVIStreamFindSample
  214. #define FindKeyFrame FindSample
  215. #define AVIStreamClose AVIStreamRelease
  216. #define AVIFileClose AVIFileRelease
  217. #define AVIStreamInit AVIFileInit
  218. #define AVIStreamExit AVIFileExit
  219. #define SEARCH_NEAREST FIND_PREV
  220. #define SEARCH_BACKWARD FIND_PREV
  221. #define SEARCH_FORWARD FIND_NEXT
  222. #define SEARCH_KEY FIND_KEY
  223. #define SEARCH_ANY FIND_ANY
  224. //
  225. // helper macros.
  226. //
  227. #define AVIStreamSampleToSample(pavi1, pavi2, l) \
  228. AVIStreamTimeToSample(pavi1,AVIStreamSampleToTime(pavi2, l))
  229. #define AVIStreamNextSample(pavi, l) \
  230. AVIStreamFindSample(pavi,l+1,FIND_NEXT|FIND_ANY)
  231. #define AVIStreamPrevSample(pavi, l) \
  232. AVIStreamFindSample(pavi,l-1,FIND_PREV|FIND_ANY)
  233. #define AVIStreamNearestSample(pavi, l) \
  234. AVIStreamFindSample(pavi,l,FIND_PREV|FIND_ANY)
  235. #define AVIStreamNextKeyFrame(pavi,l) \
  236. AVIStreamFindSample(pavi,l+1,FIND_NEXT|FIND_KEY)
  237. #define AVIStreamPrevKeyFrame(pavi, l) \
  238. AVIStreamFindSample(pavi,l-1,FIND_PREV|FIND_KEY)
  239. #define AVIStreamNearestKeyFrame(pavi, l) \
  240. AVIStreamFindSample(pavi,l,FIND_PREV|FIND_KEY)
  241. #define AVIStreamIsKeyFrame(pavi, l) \
  242. (AVIStreamNearestKeyFrame(pavi,l) == l)
  243. #define AVIStreamPrevSampleTime(pavi, t) \
  244. AVIStreamSampleToTime(pavi, AVIStreamPrevSample(pavi,AVIStreamTimeToSample(pavi,t)))
  245. #define AVIStreamNextSampleTime(pavi, t) \
  246. AVIStreamSampleToTime(pavi, AVIStreamNextSample(pavi,AVIStreamTimeToSample(pavi,t)))
  247. #define AVIStreamNearestSampleTime(pavi, t) \
  248. AVIStreamSampleToTime(pavi, AVIStreamNearestSample(pavi,AVIStreamTimeToSample(pavi,t)))
  249. #define AVIStreamNextKeyFrameTime(pavi, t) \
  250. AVIStreamSampleToTime(pavi, AVIStreamNextKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
  251. #define AVIStreamPrevKeyFrameTime(pavi, t) \
  252. AVIStreamSampleToTime(pavi, AVIStreamPrevKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
  253. #define AVIStreamNearestKeyFrameTime(pavi, t) \
  254. AVIStreamSampleToTime(pavi, AVIStreamNearestKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
  255. #define AVIStreamStartTime(pavi) \
  256. AVIStreamSampleToTime(pavi, AVIStreamStart(pavi))
  257. #define AVIStreamLengthTime(pavi) \
  258. AVIStreamSampleToTime(pavi, AVIStreamLength(pavi))
  259. #define AVIStreamEnd(pavi) \
  260. (AVIStreamStart(pavi) + AVIStreamLength(pavi))
  261. #define AVIStreamEndTime(pavi) \
  262. AVIStreamSampleToTime(pavi, AVIStreamEnd(pavi))
  263. #define AVIStreamSampleSize(pavi, lPos, plSize) \
  264. AVIStreamRead(pavi,lPos,1,NULL,0,plSize,NULL)
  265. #define AVIStreamFormatSize(pavi, lPos, plSize) \
  266. AVIStreamReadFormat(pavi,lPos,NULL,plSize)
  267. #define AVIStreamDataSize(pavi, fcc, plSize) \
  268. AVIStreamReadData(pavi,fcc,NULL,plSize)
  269. /****************************************************************************
  270. *
  271. * AVISave routines and structures
  272. *
  273. ***************************************************************************/
  274. #ifndef comptypeDIB
  275. #define comptypeDIB mmioFOURCC('D', 'I', 'B', ' ')
  276. #endif
  277. STDAPI AVIMakeCompressedStream(
  278. PAVISTREAM FAR * ppsCompressed,
  279. PAVISTREAM ppsSource,
  280. AVICOMPRESSOPTIONS FAR * lpOptions,
  281. CLSID FAR *pclsidHandler);
  282. EXTERN_C HRESULT CDECL AVISave (LPCSTR szFile,
  283. CLSID FAR *pclsidHandler,
  284. AVISAVECALLBACK lpfnCallback,
  285. int nStreams,
  286. PAVISTREAM pfile,
  287. LPAVICOMPRESSOPTIONS lpOptions,
  288. ...);
  289. STDAPI AVISaveV(LPCSTR szFile,
  290. CLSID FAR *pclsidHandler,
  291. AVISAVECALLBACK lpfnCallback,
  292. int nStreams,
  293. PAVISTREAM FAR * ppavi,
  294. LPAVICOMPRESSOPTIONS FAR *plpOptions);
  295. STDAPI_(BOOL) AVISaveOptions(HWND hwnd,
  296. UINT uiFlags,
  297. int nStreams,
  298. PAVISTREAM FAR *ppavi,
  299. LPAVICOMPRESSOPTIONS FAR *plpOptions);
  300. STDAPI AVISaveOptionsFree(int nStreams,
  301. LPAVICOMPRESSOPTIONS FAR *plpOptions);
  302. // FLAGS FOR uiFlags:
  303. //
  304. // Same as the flags for ICCompressorChoose (see compman.h)
  305. // These determine what the compression options dialog for video streams
  306. // will look like.
  307. STDAPI AVIBuildFilter(LPSTR lpszFilter, LONG cbFilter, BOOL fSaving);
  308. STDAPI AVIMakeFileFromStreams(PAVIFILE FAR * ppfile,
  309. int nStreams,
  310. PAVISTREAM FAR * papStreams);
  311. STDAPI AVIMakeStreamFromClipboard(UINT cfFormat, HANDLE hGlobal, PAVISTREAM FAR *ppstream);
  312. /****************************************************************************
  313. *
  314. * Clipboard routines
  315. *
  316. ***************************************************************************/
  317. STDAPI AVIPutFileOnClipboard(PAVIFILE pf);
  318. STDAPI AVIGetFromClipboard(PAVIFILE FAR * lppf);
  319. STDAPI AVIClearClipboard(void);
  320. /****************************************************************************
  321. *
  322. * Editing routines
  323. *
  324. ***************************************************************************/
  325. STDAPI CreateEditableStream(
  326. PAVISTREAM FAR * ppsEditable,
  327. PAVISTREAM psSource);
  328. STDAPI EditStreamCut(PAVISTREAM pavi, LONG FAR *plStart, LONG FAR *plLength, PAVISTREAM FAR * ppResult);
  329. STDAPI EditStreamCopy(PAVISTREAM pavi, LONG FAR *plStart, LONG FAR *plLength, PAVISTREAM FAR * ppResult);
  330. STDAPI EditStreamPaste(PAVISTREAM pavi, LONG FAR *plPos, LONG FAR *plLength, PAVISTREAM pstream, LONG lStart, LONG lEnd);
  331. STDAPI EditStreamClone(PAVISTREAM pavi, PAVISTREAM FAR *ppResult);
  332. STDAPI EditStreamSetName(PAVISTREAM pavi, LPCSTR lpszName);
  333. STDAPI EditStreamSetInfo(PAVISTREAM pavi, AVISTREAMINFO FAR * lpInfo, LONG cbInfo);
  334. #ifdef __cplusplus
  335. } /* End of extern "C" { */
  336. #endif /* __cplusplus */
  337. #endif
  338. /* - - - - - - - - */
  339. #ifndef AVIERR_OK
  340. #define AVIERR_OK 0L
  341. #define MAKE_AVIERR(error) MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x4000 + error)
  342. // !!! Questions to be answered:
  343. // How can you get a string form of these errors?
  344. // Which of these errors should be replaced by errors in SCODE.H?
  345. #define AVIERR_UNSUPPORTED MAKE_AVIERR(101)
  346. #define AVIERR_BADFORMAT MAKE_AVIERR(102)
  347. #define AVIERR_MEMORY MAKE_AVIERR(103)
  348. #define AVIERR_INTERNAL MAKE_AVIERR(104)
  349. #define AVIERR_BADFLAGS MAKE_AVIERR(105)
  350. #define AVIERR_BADPARAM MAKE_AVIERR(106)
  351. #define AVIERR_BADSIZE MAKE_AVIERR(107)
  352. #define AVIERR_BADHANDLE MAKE_AVIERR(108)
  353. #define AVIERR_FILEREAD MAKE_AVIERR(109)
  354. #define AVIERR_FILEWRITE MAKE_AVIERR(110)
  355. #define AVIERR_FILEOPEN MAKE_AVIERR(111)
  356. #define AVIERR_COMPRESSOR MAKE_AVIERR(112)
  357. #define AVIERR_NOCOMPRESSOR MAKE_AVIERR(113)
  358. #define AVIERR_READONLY MAKE_AVIERR(114)
  359. #define AVIERR_NODATA MAKE_AVIERR(115)
  360. #define AVIERR_BUFFERTOOSMALL MAKE_AVIERR(116)
  361. #define AVIERR_CANTCOMPRESS MAKE_AVIERR(117)
  362. #define AVIERR_USERABORT MAKE_AVIERR(198)
  363. #define AVIERR_ERROR MAKE_AVIERR(199)
  364. #endif