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;
}
Beispiel #2
0
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;
}
QTPixelBuffer QTDecompressionSession::decompress(QTPixelBuffer inBuffer)
{
    if (!canDecompress(inBuffer))
        return QTPixelBuffer();
    
    inBuffer.lockBaseAddress();
    ICMDecompressionSessionDecodeFrame(m_session,
        static_cast<UInt8*>(inBuffer.baseAddress()),
        inBuffer.dataSize(),
        0, // frameOptions
        0, // frameTime
        0); // sourceFrameRefCon

    // Because we passed in 0 for frameTime, the above function
    // is synchronous, and the client callback will have been
    // called before the function returns, and m_latestFrame
    // will contain the newly decompressed frame.
    return m_latestFrame;
}