static HRESULT WINAPI ICMStream_fnWrite(IAVIStream *iface, LONG start, LONG samples, LPVOID buffer, LONG buffersize, DWORD flags, LPLONG sampwritten, LPLONG byteswritten) { IAVIStreamImpl *This = impl_from_IAVIStream(iface); HRESULT hr; TRACE("(%p,%d,%d,%p,%d,0x%08X,%p,%p)\n", iface, start, samples, buffer, buffersize, flags, sampwritten, byteswritten); /* clear return parameters if given */ if (sampwritten != NULL) *sampwritten = 0; if (byteswritten != NULL) *byteswritten = 0; /* check parameters */ if (buffer == NULL && (buffersize > 0 || samples > 0)) return AVIERR_BADPARAM; if (This->sInfo.fccHandler == comptypeDIB) { /* only pass through */ flags |= AVIIF_KEYFRAME; return IAVIStream_Write(This->pStream, start, samples, buffer, buffersize, flags, sampwritten, byteswritten); } else { /* compress data before writing to pStream */ if (samples != 1 && (sampwritten == NULL && byteswritten == NULL)) return AVIERR_UNSUPPORTED; This->lCurrent = start; hr = AVIFILE_EncodeFrame(This, This->lpbiInput, buffer); if (FAILED(hr)) return hr; if (This->lLastKey == start) flags |= AVIIF_KEYFRAME; return IAVIStream_Write(This->pStream, start, samples, This->lpCur, This->lpbiCur->biSizeImage, flags, byteswritten, sampwritten); } }
static HRESULT WINAPI ACMStream_fnWrite(IAVIStream *iface, LONG start, LONG samples, LPVOID buffer, LONG buffersize, DWORD flags, LPLONG sampwritten, LPLONG byteswritten) { IAVIStreamImpl *This = (IAVIStreamImpl *)iface; HRESULT hr; ULONG size; TRACE("(%p,%d,%d,%p,%d,0x%08X,%p,%p)\n", iface, start, samples, buffer, buffersize, flags, sampwritten, byteswritten); /* clear return parameters if given */ if (sampwritten != NULL) *sampwritten = 0; if (byteswritten != NULL) *byteswritten = 0; /* check parameters */ if (buffer == NULL && (buffersize > 0 || samples > 0)) return AVIERR_BADPARAM; /* Have we write capability? */ if ((This->sInfo.dwCaps & AVIFILECAPS_CANWRITE) == 0) return AVIERR_READONLY; /* also need a compressor */ if (This->has == NULL) return AVIERR_NOCOMPRESSOR; /* map our sizes to pStream sizes */ size = buffersize; CONVERT_THIS_to_STREAM(&size); CONVERT_THIS_to_STREAM(&start); /* no bytes to write? -- short circuit */ if (size == 0) { return IAVIStream_Write(This->pStream, -1, samples, buffer, size, flags, sampwritten, byteswritten); } /* Need to free source buffer used for reading? */ if (This->acmStreamHdr.pbSrc != NULL) { HeapFree(GetProcessHeap(), 0, This->acmStreamHdr.pbSrc); This->acmStreamHdr.pbSrc = NULL; This->acmStreamHdr.dwSrcUser = 0; } /* Need bigger destination buffer? */ if (This->acmStreamHdr.pbDst == NULL || This->acmStreamHdr.dwDstUser < size) { if (This->acmStreamHdr.pbDst == NULL) This->acmStreamHdr.pbDst = HeapAlloc(GetProcessHeap(), 0, size); else This->acmStreamHdr.pbDst = HeapReAlloc(GetProcessHeap(), 0, This->acmStreamHdr.pbDst, size); if (This->acmStreamHdr.pbDst == NULL) return AVIERR_MEMORY; This->acmStreamHdr.dwDstUser = size; } This->acmStreamHdr.cbStruct = sizeof(This->acmStreamHdr); This->acmStreamHdr.cbSrcLengthUsed = 0; This->acmStreamHdr.cbDstLengthUsed = 0; This->acmStreamHdr.cbDstLength = This->acmStreamHdr.dwDstUser; /* need to prepare stream? */ This->acmStreamHdr.pbSrc = buffer; This->acmStreamHdr.cbSrcLength = buffersize; if ((This->acmStreamHdr.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED) == 0) { if (acmStreamPrepareHeader(This->has, &This->acmStreamHdr, 0) != S_OK) { This->acmStreamHdr.pbSrc = NULL; This->acmStreamHdr.cbSrcLength = 0; return AVIERR_COMPRESSOR; } } /* now do the conversion */ /* FIXME: use ACM_CONVERTF_* flags */ if (acmStreamConvert(This->has, &This->acmStreamHdr, 0) != S_OK) hr = AVIERR_COMPRESSOR; else hr = AVIERR_OK; This->acmStreamHdr.pbSrc = NULL; This->acmStreamHdr.cbSrcLength = 0; if (FAILED(hr)) return hr; return IAVIStream_Write(This->pStream,-1,This->acmStreamHdr.cbDstLengthUsed / This->lpOutFormat->nBlockAlign,This->acmStreamHdr.pbDst, This->acmStreamHdr.cbDstLengthUsed,flags,sampwritten, byteswritten); }