00001
00002
00003
00004
00005
00006 #define WINVER 0x400
00007 #define _WIN32_IE 0x501
00008 #define _WIN32_WINNT 0x400
00009
00010 #include "fsFileStream.h"
00011 #include "../system.h"
00012
00013 fsFileStream::fsFileStream()
00014 {
00015 m_uCurPos = 0;
00016 m_bMediaIsValid = FALSE;
00017 m_hFile = m_hIdx1File = INVALID_HANDLE_VALUE;
00018 }
00019
00020 fsFileStream::~fsFileStream ()
00021 {
00022 Close ();
00023 }
00024
00025 DWORD fsFileStream::Alignment()
00026 {
00027 return 1;
00028 }
00029
00030 void fsFileStream::Lock()
00031 {
00032 m_csLock.Lock();
00033 }
00034
00035 void fsFileStream::Unlock()
00036 {
00037 m_csLock.Unlock();
00038 }
00039
00040 HRESULT fsFileStream::SetPointer(LONGLONG llPos)
00041 {
00042 m_uCurPos = llPos;
00043 SetFilePointer (m_hFile, LONG (llPos), NULL, FILE_BEGIN);
00044 return S_OK;
00045 }
00046
00047 HRESULT fsFileStream::Size(LONGLONG *pllTotal, LONGLONG *pllAvail)
00048 {
00049 *pllTotal = GetFileSize (m_hFile, NULL);
00050 if (pllAvail)
00051 *pllAvail = m_uInMaxAvail == _UI64_MAX ? *pllTotal - m_uCurPos : m_uInMaxAvail;
00052 return VFW_S_ESTIMATED;
00053 }
00054
00055 typedef struct {
00056 DWORD ckid;
00057 DWORD dwFlags;
00058 DWORD dwChunkOffset;
00059 DWORD dwChunkLength;
00060 } AVIINDEXENTRY;
00061
00062 typedef struct {
00063 DWORD dwMicroSecPerFrame;
00064 DWORD dwMaxBytesPerSec;
00065 DWORD dwReserved1;
00066 DWORD dwFlags;
00067 DWORD dwTotalFrames;
00068 DWORD dwInitialFrames;
00069 DWORD dwStreams;
00070 DWORD dwSuggestedBufferSize;
00071 DWORD dwWidth;
00072 DWORD dwHeight;
00073 DWORD dwScale;
00074 DWORD dwRate;
00075 DWORD dwStart;
00076 DWORD dwLength;
00077 } MainAVIHeader;
00078
00079 HRESULT fsFileStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead)
00080 {
00081 CAutoLock lck(&m_csLock);
00082
00083 BOOL bFilled = FALSE;
00084
00085 if (m_hIdx1File != INVALID_HANDLE_VALUE)
00086 {
00087
00088 if (m_uCurPos >= m_idx1.Get_Idx1StartPosition ())
00089 {
00090 fsSetFilePointer (m_hIdx1File, m_uCurPos-m_idx1.Get_Idx1StartPosition (), FILE_BEGIN);
00091 ReadFile (m_hIdx1File, pbBuffer, dwBytesToRead, pdwBytesRead, 0);
00092 bFilled = TRUE;
00093 }
00094 }
00095
00096 if (m_uCurPos + dwBytesToRead > m_uInMaxAvail)
00097 {
00098 if (m_hIdx1File == INVALID_HANDLE_VALUE ||
00099 m_uCurPos < m_idx1.Get_Idx1StartPosition ())
00100 {
00101 if (pdwBytesRead)
00102 *pdwBytesRead = 0;
00103 return E_FAIL;
00104 }
00105 }
00106
00107 if (bFilled == FALSE)
00108 ReadFile (m_hFile, pbBuffer, dwBytesToRead, pdwBytesRead, NULL);
00109
00110 m_uCurPos += dwBytesToRead;
00111
00112 return S_OK;
00113 }
00114
00115 void fsFileStream::Attach(HANDLE hFile, UINT64 uInMaxAvail)
00116 {
00117 Close ();
00118 m_hFile = hFile;
00119
00120 m_bMediaIsValid = NULL != m_mtd.DetectMediaType (hFile);
00121 m_uInMaxAvail = uInMaxAvail;
00122 if (m_bMediaIsValid)
00123 {
00124
00125 if (m_mtd.Get_MediaType ()->subtype == MEDIASUBTYPE_Avi &&
00126 uInMaxAvail != _UI64_MAX)
00127 {
00128
00129
00130 char szTmp [MAX_PATH], szTmpFile [MAX_PATH];
00131 GetTempPath (MAX_PATH, szTmp);
00132
00133 GetTempFileName (szTmp, "afs", 0, szTmpFile);
00134
00135 m_hIdx1File = CreateFile (szTmpFile, GENERIC_READ|GENERIC_WRITE,
00136 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
00137 NULL);
00138
00139 if (m_hIdx1File != INVALID_HANDLE_VALUE)
00140 {
00141 if (FALSE == m_idx1.BuildIdx1 (hFile, m_hIdx1File, uInMaxAvail))
00142 {
00143 CloseHandle (m_hIdx1File);
00144 m_hIdx1File = INVALID_HANDLE_VALUE;
00145 }
00146 }
00147 }
00148 }
00149 }
00150
00151 void fsFileStream::Close()
00152 {
00153 HANDLE hFile = Detach ();
00154 if (hFile != INVALID_HANDLE_VALUE)
00155 CloseHandle (hFile);
00156 }
00157
00158 const AM_MEDIA_TYPE* fsFileStream::Get_MediaType()
00159 {
00160 return m_bMediaIsValid ? m_mtd.Get_MediaType () : NULL;
00161 }
00162
00163 HANDLE fsFileStream::Detach()
00164 {
00165 HANDLE hFile = m_hFile;
00166
00167 if (m_hFile != INVALID_HANDLE_VALUE)
00168 {
00169 if (m_hIdx1File != INVALID_HANDLE_VALUE)
00170 {
00171 CloseHandle (m_hIdx1File);
00172 m_hIdx1File = INVALID_HANDLE_VALUE;
00173 }
00174
00175 m_hFile = INVALID_HANDLE_VALUE;
00176 m_bMediaIsValid = FALSE;
00177 }
00178
00179 return hFile;
00180 }