int qDecodeAPI(QDecoder *decoder, char* bytes, int byteSize) { OSErr err; ICMFrameTimeRecord frameTime = {{0}}; TimeValue time; decoder->inFrameCount++; time = decoder->inFrameCount * 100; // make up something plausible frameTime.recordSize = sizeof(ICMFrameTimeRecord); *(TimeValue64 *)&frameTime.value = time; frameTime.scale = decoder->timeScale; frameTime.rate = fixed1; frameTime.frameNumber = decoder->inFrameCount; frameTime.flags = icmFrameTimeIsNonScheduledDisplayTime; err = ICMDecompressionSessionDecodeFrame(decoder->session, (UInt8*)bytes, byteSize, NULL, &frameTime, NULL); if (err != noErr) { fprintf(QSTDERR, "\nqDecodeQT(): cannot decode frame"); fprintf(QSTDERR, "\n\tQUICKTIME ERROR CODE: %d", err); return -5; } ICMDecompressionSessionSetNonScheduledDisplayTime(decoder->session, time, decoder->timeScale, 0 ); return noErr; }
static HRESULT WINAPI QTVDecoder_Receive(TransformFilter *tf, IMediaSample *pSample) { QTVDecoderImpl* This = impl_from_TransformFilter(tf); HRESULT hr; DWORD cbSrcStream; LPBYTE pbSrcStream; ICMFrameTimeRecord frameTime = {{0}}; TimeValue time = 1; TimeScale timeScale = 1; OSStatus err = noErr; LONGLONG tStart, tStop; hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) { ERR("Cannot get pointer to sample data (%x)\n", hr); goto error; } cbSrcStream = IMediaSample_GetActualDataLength(pSample); if (IMediaSample_GetTime(pSample, &tStart, &tStop) != S_OK) tStart = tStop = 0; time = tStart; frameTime.recordSize = sizeof(ICMFrameTimeRecord); *(TimeValue64 *)&frameTime.value = tStart; frameTime.scale = 1; frameTime.rate = fixed1; frameTime.duration = tStop - tStart; frameTime.frameNumber = 0; frameTime.flags = icmFrameTimeIsNonScheduledDisplayTime; err = ICMDecompressionSessionDecodeFrame(This->decompressionSession, (UInt8 *)pbSrcStream, cbSrcStream, NULL, &frameTime, pSample); if (err != noErr) { ERR("Error with ICMDecompressionSessionDecodeFrame\n"); hr = E_FAIL; goto error; } ICMDecompressionSessionSetNonScheduledDisplayTime(This->decompressionSession, time, timeScale, 0); ICMDecompressionSessionFlush(This->decompressionSession); hr = This->decodeHR; error: return hr; }