VideoSource.h
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:5k
- // VirtualDub - Video processing and capture application
- // Copyright (C) 1998-2001 Avery Lee
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation; either version 2 of the License, or
- // (at your option) any later version.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with this program; if not, write to the Free Software
- // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- #ifndef f_VIDEOSOURCE_H
- #define f_VIDEOSOURCE_H
- #include <windows.h>
- #include <vfw.h>
- #include "DubSource.h"
- class AVIStripeSystem;
- class AVIStripeIndexLookup;
- class IMJPEGDecoder;
- class IAVIReadHandler;
- class IAVIReadStream;
- class VideoSource : public DubSource {
- protected:
- HANDLE hBufferObject;
- LONG lBufferOffset;
- void *lpvBuffer;
- BITMAPINFOHEADER *bmihDecompressedFormat;
- long stream_desired_frame;
- long stream_current_frame;
- void *AllocFrameBuffer(long size);
- void FreeFrameBuffer();
- VideoSource();
- public:
- enum {
- IFMODE_NORMAL =0,
- IFMODE_SWAP =1,
- IFMODE_SPLIT1 =2,
- IFMODE_SPLIT2 =3,
- IFMODE_DISCARD1 =4,
- IFMODE_DISCARD2 =5,
- };
- virtual ~VideoSource();
- BITMAPINFOHEADER *getImageFormat() const {
- return (BITMAPINFOHEADER *)getFormat();
- }
- void *getFrameBuffer() {
- return lpvBuffer;
- }
- HANDLE getFrameBufferObject() {
- return hBufferObject;
- }
- LONG getFrameBufferOffset() {
- return lBufferOffset;
- }
- virtual bool setDecompressedFormat(int depth);
- virtual bool setDecompressedFormat(BITMAPINFOHEADER *pbih);
- BITMAPINFOHEADER *getDecompressedFormat() {
- return bmihDecompressedFormat;
- }
- virtual void streamSetDesiredFrame(long frame_num);
- virtual long streamGetNextRequiredFrame(BOOL *is_preroll);
- virtual int streamGetRequiredCount(long *pSize);
- virtual void *streamGetFrame(void *inputBuffer, long data_len, BOOL is_key, BOOL is_preroll, long frame_num) = NULL;
- virtual void streamBegin(bool fRealTime);
- virtual void invalidateFrameBuffer();
- virtual BOOL isFrameBufferValid() = NULL;
- virtual void *getFrame(LONG frameNum) = NULL;
- virtual char getFrameTypeChar(long lFrameNum) = 0;
- virtual bool isKeyframeOnly();
- virtual bool isType1();
- };
- class VideoSourceAVI : public VideoSource {
- private:
- IAVIReadHandler *pAVIFile;
- IAVIReadStream *pAVIStream;
- HIC hicDecomp, hicDecomp2;
- LONG lLastFrame;
- BITMAPINFOHEADER *bmihTemp;
- BOOL use_ICDecompressEx;
- AVIStripeSystem *stripesys;
- IAVIReadHandler **stripe_files;
- IAVIReadStream **stripe_streams;
- AVIStripeIndexLookup *stripe_index;
- int stripe_count;
- IMJPEGDecoder *mdec;
- HBITMAP hbmLame;
- bool fUseGDI;
- bool fAllKeyFrames;
- bool bIsType1;
- IAVIReadStream *format_stream;
- char *key_flags;
- bool use_internal;
- int mjpeg_mode;
- void *mjpeg_reorder_buffer;
- int mjpeg_reorder_buffer_size;
- long *mjpeg_splits;
- long mjpeg_last;
- long mjpeg_last_size;
- FOURCC fccForceVideo;
- FOURCC fccForceVideoHandler;
- void _construct();
- void _destruct();
- bool AttemptCodecNegotiation(BITMAPINFOHEADER *, bool);
- public:
- VideoSourceAVI(IAVIReadHandler *pAVI, AVIStripeSystem *stripesys=NULL, IAVIReadHandler **stripe_files=NULL, bool use_internal=false, int mjpeg_mode=0, FOURCC fccForceVideo=0, FOURCC fccForceVideoHandler=0);
- ~VideoSourceAVI();
- void Reinit();
- void redoKeyFlags();
- int _read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lBytesRead, LONG *lSamplesRead);
- BOOL _isKey(LONG samp);
- LONG nearestKey(LONG lSample);
- LONG prevKey(LONG lSample);
- LONG nextKey(LONG lSample);
- __int64 sampleOffset(LONG lSample);
- bool setDecompressedFormat(int depth);
- bool setDecompressedFormat(BITMAPINFOHEADER *pbih);
- void invalidateFrameBuffer();
- BOOL isFrameBufferValid();
- bool isStreaming();
- void streamBegin(bool fRealTime);
- void *streamGetFrame(void *inputBuffer, long data_len, BOOL is_key, BOOL is_preroll, long frame_num);
- void streamEnd();
- void *getFrame(LONG frameNum);
- HIC getDecompressorHandle() const { return hicDecomp; }
- bool isUsingInternalMJPEG() const { return !!mdec; }
- char getFrameTypeChar(long lFrameNum);
- bool isKeyframeOnly();
- bool isType1();
- };
- #endif