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

多媒体编程

开发平台:

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. #ifndef f_VIDEOSOURCE_H
  18. #define f_VIDEOSOURCE_H
  19. #include <windows.h>
  20. #include <vfw.h>
  21. #include "DubSource.h"
  22. class AVIStripeSystem;
  23. class AVIStripeIndexLookup;
  24. class IMJPEGDecoder;
  25. class IAVIReadHandler;
  26. class IAVIReadStream;
  27. class VideoSource : public DubSource {
  28. protected:
  29. HANDLE hBufferObject;
  30. LONG lBufferOffset;
  31. void *lpvBuffer;
  32. BITMAPINFOHEADER *bmihDecompressedFormat;
  33. long stream_desired_frame;
  34. long stream_current_frame;
  35. void *AllocFrameBuffer(long size);
  36. void FreeFrameBuffer();
  37. VideoSource();
  38. public:
  39. enum {
  40. IFMODE_NORMAL =0,
  41. IFMODE_SWAP =1,
  42. IFMODE_SPLIT1 =2,
  43. IFMODE_SPLIT2 =3,
  44. IFMODE_DISCARD1 =4,
  45. IFMODE_DISCARD2 =5,
  46. };
  47. virtual ~VideoSource();
  48. BITMAPINFOHEADER *getImageFormat() const {
  49. return (BITMAPINFOHEADER *)getFormat();
  50. }
  51. void *getFrameBuffer() {
  52. return lpvBuffer;
  53. }
  54. HANDLE getFrameBufferObject() {
  55. return hBufferObject;
  56. }
  57. LONG getFrameBufferOffset() {
  58. return lBufferOffset;
  59. }
  60. virtual bool setDecompressedFormat(int depth);
  61. virtual bool setDecompressedFormat(BITMAPINFOHEADER *pbih);
  62. BITMAPINFOHEADER *getDecompressedFormat() {
  63. return bmihDecompressedFormat;
  64. }
  65. virtual void streamSetDesiredFrame(long frame_num);
  66. virtual long streamGetNextRequiredFrame(BOOL *is_preroll);
  67. virtual int streamGetRequiredCount(long *pSize);
  68. virtual void *streamGetFrame(void *inputBuffer, long data_len, BOOL is_key, BOOL is_preroll, long frame_num) = NULL;
  69. virtual void streamBegin(bool fRealTime);
  70. virtual void invalidateFrameBuffer();
  71. virtual BOOL isFrameBufferValid() = NULL;
  72. virtual void *getFrame(LONG frameNum) = NULL;
  73. virtual char getFrameTypeChar(long lFrameNum) = 0;
  74. virtual bool isKeyframeOnly();
  75. virtual bool isType1();
  76. };
  77. class VideoSourceAVI : public VideoSource {
  78. private:
  79. IAVIReadHandler *pAVIFile;
  80. IAVIReadStream *pAVIStream;
  81. HIC hicDecomp, hicDecomp2;
  82. LONG lLastFrame;
  83. BITMAPINFOHEADER *bmihTemp;
  84. BOOL use_ICDecompressEx;
  85. AVIStripeSystem *stripesys;
  86. IAVIReadHandler **stripe_files;
  87. IAVIReadStream **stripe_streams;
  88. AVIStripeIndexLookup *stripe_index;
  89. int stripe_count;
  90. IMJPEGDecoder *mdec;
  91. HBITMAP hbmLame;
  92. bool fUseGDI;
  93. bool fAllKeyFrames;
  94. bool bIsType1;
  95. IAVIReadStream *format_stream;
  96. char *key_flags;
  97. bool use_internal;
  98. int mjpeg_mode;
  99. void *mjpeg_reorder_buffer;
  100. int mjpeg_reorder_buffer_size;
  101. long *mjpeg_splits;
  102. long mjpeg_last;
  103. long mjpeg_last_size;
  104. FOURCC fccForceVideo;
  105. FOURCC fccForceVideoHandler;
  106. void _construct();
  107. void _destruct();
  108. bool AttemptCodecNegotiation(BITMAPINFOHEADER *, bool);
  109. public:
  110. VideoSourceAVI(IAVIReadHandler *pAVI, AVIStripeSystem *stripesys=NULL, IAVIReadHandler **stripe_files=NULL, bool use_internal=false, int mjpeg_mode=0, FOURCC fccForceVideo=0, FOURCC fccForceVideoHandler=0);
  111. ~VideoSourceAVI();
  112. void Reinit();
  113. void redoKeyFlags();
  114. int _read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lBytesRead, LONG *lSamplesRead);
  115. BOOL _isKey(LONG samp);
  116. LONG nearestKey(LONG lSample);
  117. LONG prevKey(LONG lSample);
  118. LONG nextKey(LONG lSample);
  119. __int64 sampleOffset(LONG lSample);
  120. bool setDecompressedFormat(int depth);
  121. bool setDecompressedFormat(BITMAPINFOHEADER *pbih);
  122. void invalidateFrameBuffer();
  123. BOOL isFrameBufferValid();
  124. bool isStreaming();
  125. void streamBegin(bool fRealTime);
  126. void *streamGetFrame(void *inputBuffer, long data_len, BOOL is_key, BOOL is_preroll, long frame_num);
  127. void streamEnd();
  128. void *getFrame(LONG frameNum);
  129. HIC getDecompressorHandle() const { return hicDecomp; }
  130. bool isUsingInternalMJPEG() const { return !!mdec; }
  131. char getFrameTypeChar(long lFrameNum);
  132. bool isKeyframeOnly();
  133. bool isType1();
  134. };
  135. #endif