📄 editstream.c
字号:
if (size != sizeof(AVISTREAMINFOW))
return AVIERR_BADSIZE;
if (asi->dwScale == 0 || asi->dwRate == 0 || (LONG)asi->dwQuality < -1 ||
asi->dwQuality > ICQUALITY_HIGH)
return AVIERR_ERROR;
This->sInfo.wLanguage = asi->wLanguage;
This->sInfo.wPriority = asi->wPriority;
This->sInfo.dwStart = asi->dwStart;
if (asi->dwRate != 0)
This->sInfo.dwRate = asi->dwRate;
if (asi->dwScale != 0)
This->sInfo.dwScale = asi->dwScale;
if (asi->dwQuality <= ICQUALITY_HIGH)
This->sInfo.dwQuality = ICQUALITY_HIGH;
CopyRect(&This->sInfo.rcFrame, &asi->rcFrame);
memcpy(&This->sInfo.szName, &asi->szName, sizeof(asi->szName));
This->sInfo.dwEditCount++;
return AVIERR_OK;
}
static HRESULT WINAPI IEditAVIStream_fnQueryInterface(IAVIStream*iface,
REFIID refiid,LPVOID*obj)
{
IEditAVIStreamImpl *This = (IEditAVIStreamImpl *)iface;
assert(This->pae != NULL);
return IAVIEditStream_QueryInterface((IAVIEditStream*)This->pae,refiid,obj);
}
static ULONG WINAPI IEditAVIStream_fnAddRef(IAVIStream*iface)
{
IEditAVIStreamImpl *This = (IEditAVIStreamImpl *)iface;
assert(This->pae != NULL);
return IAVIEditStream_AddRef((IAVIEditStream*)This->pae);
}
static ULONG WINAPI IEditAVIStream_fnRelease(IAVIStream*iface)
{
IEditAVIStreamImpl *This = (IEditAVIStreamImpl *)iface;
assert(This->pae != NULL);
return IAVIEditStream_Release((IAVIEditStream*)This->pae);
}
static HRESULT WINAPI IEditAVIStream_fnCreate(IAVIStream*iface,
LPARAM lParam1,LPARAM lParam2)
{
IAVIEditStreamImpl *This = ((IEditAVIStreamImpl*)iface)->pae;
if (lParam2 != 0)
return AVIERR_ERROR;
if (This->pStreams == NULL) {
This->pStreams = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 256 * sizeof(EditStreamTable));
if (This->pStreams == NULL)
return AVIERR_MEMORY;
This->nTableSize = 256;
}
if (lParam1 != 0) {
IAVIStream_Info((PAVISTREAM)lParam1, &This->sInfo, sizeof(This->sInfo));
IAVIStream_AddRef((PAVISTREAM)lParam1);
This->pStreams[0].pStream = (PAVISTREAM)lParam1;
This->pStreams[0].dwStart = This->sInfo.dwStart;
This->pStreams[0].dwLength = This->sInfo.dwLength;
This->nStreams = 1;
}
return AVIERR_OK;
}
static HRESULT WINAPI IEditAVIStream_fnInfo(IAVIStream*iface,
AVISTREAMINFOW *psi,LONG size)
{
IEditAVIStreamImpl *This = (IEditAVIStreamImpl *)iface;
TRACE("(%p,%p,%d)\n",iface,psi,size);
assert(This->pae != NULL);
if (psi == NULL)
return AVIERR_BADPARAM;
if (size < 0)
return AVIERR_BADSIZE;
if (This->pae->bDecompress)
This->pae->sInfo.fccHandler = 0;
memcpy(psi, &This->pae->sInfo, min((DWORD)size, sizeof(This->pae->sInfo)));
if ((DWORD)size < sizeof(This->pae->sInfo))
return AVIERR_BUFFERTOOSMALL;
return AVIERR_OK;
}
static LONG WINAPI IEditAVIStream_fnFindSample(IAVIStream*iface,LONG pos,
LONG flags)
{
IAVIEditStreamImpl* const This = ((IEditAVIStreamImpl* const)iface)->pae;
PAVISTREAM stream;
DWORD streamPos, streamNr;
TRACE("(%p,%d,0x%08X)\n",iface,pos,flags);
if (flags & FIND_FROM_START)
pos = (LONG)This->sInfo.dwStart;
/* outside of stream? */
if (pos < (LONG)This->sInfo.dwStart ||
(LONG)This->sInfo.dwStart + (LONG)This->sInfo.dwLength <= pos)
return -1;
/* map our position to a stream and position in it */
if (AVIFILE_FindStreamInTable(This, pos, &stream, &streamPos,
&streamNr, TRUE))
return -1; /* doesn't exist */
if (This->bDecompress) {
/* only one stream -- format changes only at start */
if (flags & FIND_FORMAT)
return (flags & FIND_NEXT ? -1 : 0);
/* FIXME: map positions back to us */
return IAVIStream_FindSample(stream, streamPos, flags);
} else {
/* assume change of format every frame */
return pos;
}
}
static HRESULT WINAPI IEditAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,
LPVOID format,LONG*fmtsize)
{
IAVIEditStreamImpl* const This = ((IEditAVIStreamImpl* const)iface)->pae;
LPBITMAPINFOHEADER lp;
PAVISTREAM stream;
DWORD n;
HRESULT hr;
TRACE("(%p,%d,%p,%p)\n",iface,pos,format,fmtsize);
if (fmtsize == NULL || pos < This->sInfo.dwStart ||
This->sInfo.dwStart + This->sInfo.dwLength <= pos)
return AVIERR_BADPARAM;
/* find stream corresponding to position */
hr = AVIFILE_FindStreamInTable(This, pos, &stream, &n, NULL, FALSE);
if (FAILED(hr))
return hr;
if (! This->bDecompress)
return IAVIStream_ReadFormat(stream, n, format, fmtsize);
lp = (LPBITMAPINFOHEADER)AVIFILE_ReadFrame(This, stream, n);
if (lp == NULL)
return AVIERR_ERROR;
if (lp->biBitCount <= 8) {
n = (lp->biClrUsed > 0 ? lp->biClrUsed : 1 << lp->biBitCount);
n *= sizeof(RGBQUAD);
} else
n = 0;
n += lp->biSize;
memcpy(format, lp, min((LONG)n, *fmtsize));
hr = ((LONG)n > *fmtsize ? AVIERR_BUFFERTOOSMALL : AVIERR_OK);
*fmtsize = n;
return hr;
}
static HRESULT WINAPI IEditAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,
LPVOID format,LONG formatsize)
{
TRACE("(%p,%d,%p,%d)\n",iface,pos,format,formatsize);
return AVIERR_UNSUPPORTED;
}
static HRESULT WINAPI IEditAVIStream_fnRead(IAVIStream*iface,LONG start,
LONG samples,LPVOID buffer,
LONG buffersize,LONG*bytesread,
LONG*samplesread)
{
IAVIEditStreamImpl* const This = ((IEditAVIStreamImpl* const)iface)->pae;
PAVISTREAM stream;
DWORD streamPos, streamNr;
LONG readBytes, readSamples, count;
HRESULT hr;
TRACE("(%p,%d,%d,%p,%d,%p,%p) -- 0x%08X\n",iface,start,samples,
buffer,buffersize,bytesread,samplesread,This->sInfo.fccType);
/* check parameters */
if (bytesread != NULL)
*bytesread = 0;
if (samplesread != NULL)
*samplesread = 0;
if (buffersize < 0)
return AVIERR_BADSIZE;
if ((DWORD)start < This->sInfo.dwStart ||
This->sInfo.dwStart + This->sInfo.dwLength < (DWORD)start)
return AVIERR_BADPARAM;
if (! This->bDecompress) {
/* audio like data -- sample-based */
do {
if (samples == 0)
return AVIERR_OK; /* nothing at all or already done */
if (FAILED(AVIFILE_FindStreamInTable(This, start, &stream,
&streamPos, &streamNr, FALSE)))
return AVIERR_ERROR;
/* limit to end of the stream */
count = samples;
if (streamPos + count > EditStreamEnd(This, streamNr))
count = EditStreamEnd(This, streamNr) - streamPos;
hr = IAVIStream_Read(stream, streamPos, count, buffer, buffersize,
&readBytes, &readSamples);
if (FAILED(hr))
return hr;
if (readBytes == 0 && readSamples == 0 && count != 0)
return AVIERR_FILEREAD; /* for bad stream implementations */
if (samplesread != NULL)
*samplesread += readSamples;
if (bytesread != NULL)
*bytesread += readBytes;
if (buffer != NULL) {
buffer = ((LPBYTE)buffer)+readBytes;
buffersize -= readBytes;
}
start += count;
samples -= count;
} while (This->sInfo.dwStart + This->sInfo.dwLength > start);
} else {
/* video like data -- frame-based */
LPBITMAPINFOHEADER lp;
if (samples == 0)
return AVIERR_OK;
if (FAILED(AVIFILE_FindStreamInTable(This, start, &stream,
&streamPos, &streamNr, FALSE)))
return AVIERR_ERROR;
lp = AVIFILE_ReadFrame(This, stream, streamPos);
if (lp == NULL)
return AVIERR_ERROR;
if (buffer != NULL) {
/* need size of format to skip */
if (lp->biBitCount <= 8) {
count = lp->biClrUsed > 0 ? lp->biClrUsed : 1 << lp->biBitCount;
count *= sizeof(RGBQUAD);
} else
count = 0;
count += lp->biSize;
if (buffersize < lp->biSizeImage)
return AVIERR_BUFFERTOOSMALL;
memcpy(buffer, (LPBYTE)lp + count, lp->biSizeImage);
}
if (bytesread != NULL)
*bytesread = lp->biSizeImage;
if (samplesread != NULL)
*samplesread = 1;
}
return AVIERR_OK;
}
static HRESULT WINAPI IEditAVIStream_fnWrite(IAVIStream*iface,LONG start,
LONG samples,LPVOID buffer,
LONG buffersize,DWORD flags,
LONG*sampwritten,LONG*byteswritten)
{
TRACE("(%p,%d,%d,%p,%d,0x%08X,%p,%p)\n",iface,start,samples,buffer,
buffersize,flags,sampwritten,byteswritten);
/* be sure return parameters have correct values */
if (sampwritten != NULL)
*sampwritten = 0;
if (byteswritten != NULL)
*byteswritten = 0;
return AVIERR_UNSUPPORTED;
}
static HRESULT WINAPI IEditAVIStream_fnDelete(IAVIStream*iface,LONG start,
LONG samples)
{
IEditAVIStreamImpl *This = (IEditAVIStreamImpl *)iface;
TRACE("(%p,%d,%d)\n",iface,start,samples);
return IAVIEditStream_Cut((IAVIEditStream*)This->pae,&start,&samples,NULL);
}
static HRESULT WINAPI IEditAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,
LPVOID lp,LONG *lpread)
{
IAVIEditStreamImpl* const This = ((IEditAVIStreamImpl* const)iface)->pae;
DWORD n;
TRACE("(%p,0x%08X,%p,%p)\n",iface,fcc,lp,lpread);
/* check parameters */
if (lp == NULL || lpread == NULL)
return AVIERR_BADPARAM;
/* simply ask every stream and return the first block found */
for (n = 0; n < This->nStreams; n++) {
HRESULT hr = IAVIStream_ReadData(This->pStreams[n].pStream,fcc,lp,lpread);
if (SUCCEEDED(hr))
return hr;
}
*lpread = 0;
return AVIERR_NODATA;
}
static HRESULT WINAPI IEditAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,
LPVOID lp,LONG size)
{
TRACE("(%p,0x%08X,%p,%d)\n",iface,fcc,lp,size);
return AVIERR_UNSUPPORTED;
}
static HRESULT WINAPI IEditAVIStream_fnSetInfo(IAVIStream*iface,
AVISTREAMINFOW*info,LONG len)
{
IEditAVIStreamImpl *This = (IEditAVIStreamImpl *)iface;
TRACE("(%p,%p,%d)\n",iface,info,len);
return IAVIEditStream_SetInfo((IAVIEditStream*)This->pae,info,len);
}
static HRESULT WINAPI IEditStreamInternal_fnQueryInterface(IEditStreamInternal*iface,REFIID refiid,LPVOID*obj)
{
IEditStreamInternalImpl *This = (IEditStreamInternalImpl *)iface;
assert(This->pae != NULL);
return IAVIEditStream_QueryInterface((IAVIEditStream*)This->pae, refiid, obj);
}
static ULONG WINAPI IEditStreamInternal_fnAddRef(IEditStreamInternal*iface)
{
IEditStreamInternalImpl *This = (IEditStreamInternalImpl *)iface;
assert(This->pae != NULL);
return IAVIEditStream_AddRef((IAVIEditStream*)This->pae);
}
static ULONG WINAPI IEditStreamInternal_fnRelease(IEditStreamInternal*iface)
{
IEditStreamInternalImpl *This = (IEditStreamInternalImpl *)iface;
assert(This->pae != NULL);
return IAVIEditStream_Release((IAVIEditStream*)This->pae);
}
static HRESULT WINAPI IEditStreamInternal_fnGetEditStreamImpl(IEditStreamInternal*iface,LPVOID*ppimpl)
{
IEditStreamInternalImpl *This = (IEditStreamInternalImpl *)iface;
TRACE("(%p,%p) -> %p\n", iface, ppimpl, This->pae);
assert(This->pae != NULL);
assert(ppimpl != NULL);
*ppimpl = This->pae;
return AVIERR_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -