Esempio n. 1
0
HRESULT CWavPackSplitterFilterInputPin::DeliverOneFrame(WavPack_parser* wpp)
{
	IMediaSample *pSample;
	BYTE *Buffer = NULL;
	HRESULT hr;
	unsigned long FrameLenBytes = 0, FrameLenSamples = 0, FrameIndex = 0;

	// Get a new media sample
	hr = m_pParentFilter->m_pOutputPin->GetDeliveryBuffer(&pSample, NULL, NULL, 0);
	if (FAILED(hr)) {
		return hr;
	}

	hr = pSample->GetPointer(&Buffer);
	if (FAILED(hr)) {
		pSample->Release();
		return hr;
	}

	FrameLenBytes = wavpack_parser_read_frame(wpp, Buffer,
											  &FrameIndex, &FrameLenSamples);
	if (!FrameLenBytes) {
		// Something bad happened, let's end here
		pSample->Release();
		m_pParentFilter->m_pOutputPin->DeliverEndOfStream();
		// TODO : check if we need to stop the thread
		return hr;
	}
	pSample->SetActualDataLength(FrameLenBytes);

	REFERENCE_TIME rtStart, rtStop;
	rtStart = FrameIndex;
	rtStop = rtStart + FrameLenSamples;
	rtStart = (rtStart * 10000000) / wpp->sample_rate;
	rtStop = (rtStop * 10000000) / wpp->sample_rate;

	rtStart -= m_pParentFilter->m_rtStart;
	rtStop  -= m_pParentFilter->m_rtStart;

	pSample->SetTime(&rtStart, &rtStop);
	pSample->SetPreroll(FALSE);
	pSample->SetDiscontinuity(m_bDiscontinuity);
	if (m_bDiscontinuity) {
		m_bDiscontinuity = FALSE;
	}
	pSample->SetSyncPoint(TRUE);

	// Deliver the sample
	hr = m_pParentFilter->m_pOutputPin->Deliver(pSample);
	pSample->Release();
	pSample = NULL;
	if (FAILED(hr)) {
		return hr;
	}

	return S_OK;
}
HRESULT CWavPackDSSplitterInputPin::DeliverOneFrame(WavPack_parser* wpp)
{
    IMediaSample *pSample;
    BYTE *Buffer = NULL;
    HRESULT hr;
    unsigned long FrameLenBytes = 0, FrameLenSamples = 0, FrameIndex = 0;

    // Get a new media sample
    hr = m_pParentFilter->m_pOutputPin->GetDeliveryBuffer(&pSample, NULL, NULL, 0); 
    if (FAILED(hr))
    {
        DebugLog("CWavPackDSSplitterInputPin::DoProcessingLoop GetDeliveryBuffer failed 0x%08X",hr);
        return hr;
    }
    
    hr = pSample->GetPointer(&Buffer);
    if (FAILED(hr))
    {
        DebugLog("CWavPackDSSplitterInputPin::DoProcessingLoop GetPointer failed 0x%08X",hr);
        pSample->Release();
        return hr;
    }
    
    FrameLenBytes = wavpack_parser_read_frame(wpp, Buffer,
        &FrameIndex, &FrameLenSamples);
    if(!FrameLenBytes)
    {
        // Something bad happened, let's end here
        pSample->Release();
        m_pParentFilter->m_pOutputPin->DeliverEndOfStream();
        // TODO : check if we need to stop the thread
        DebugLog("CWavPackDSSplitterInputPin::DoProcessingLoop wavpack_parser_read_frame error");
        return hr;
    }
    pSample->SetActualDataLength(FrameLenBytes);
    
    if(wpp->is_correction == TRUE)
    {    
        IMediaSample2 *pSample2;
        if (SUCCEEDED(pSample->QueryInterface(IID_IMediaSample2, (void **)&pSample2)))
        {
            AM_SAMPLE2_PROPERTIES ams2p;
            ZeroMemory(&ams2p, sizeof(AM_SAMPLE2_PROPERTIES));
            hr = pSample2->GetProperties(sizeof(AM_SAMPLE2_PROPERTIES), (PBYTE)&ams2p);
            if(SUCCEEDED(hr))
            {            
                ams2p.dwStreamId = AM_STREAM_BLOCK_ADDITIONNAL;
                pSample2->SetProperties(sizeof(AM_SAMPLE2_PROPERTIES), (PBYTE)&ams2p);
            }
            pSample2->Release();
            pSample2 = NULL;
        }
    }
    
    REFERENCE_TIME rtStart, rtStop;
    rtStart = FrameIndex;
    rtStop = rtStart + FrameLenSamples;
    rtStart = (rtStart * 10000000) / wpp->sample_rate;
    rtStop = (rtStop * 10000000) / wpp->sample_rate;
    
    rtStart -= m_pParentFilter->m_rtStart;
    rtStop  -= m_pParentFilter->m_rtStart;
    
    pSample->SetTime(&rtStart, &rtStop);
    pSample->SetPreroll(FALSE);
    pSample->SetDiscontinuity(m_bDiscontinuity);
    if(m_bDiscontinuity)
    {
        m_bDiscontinuity = FALSE;
    }
    pSample->SetSyncPoint(TRUE);
    
    // Deliver the sample
    hr = m_pParentFilter->m_pOutputPin->Deliver(pSample);
    pSample->Release();
    pSample = NULL;
    if (FAILED(hr))
    {
        DebugLog("CWavPackDSSplitterInputPin::DoProcessingLoop Deliver failed 0x%08X",hr);
        return hr;
    }

    return S_OK;
}