📄 videosource.h
字号:
// 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -