📄 sdprendr.cpp
字号:
// *** IHXRenderer methods ***/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::StartStream// Purpose:// Called by client engine to inform the renderer of the stream it// will be rendering. The stream interface can provide access to// its source or player. This method also provides access to the // primary client controller interface.//STDMETHODIMP CSDPRenderer::StartStream( IHXStream* pStream, IHXPlayer* pPlayer){ HX_RESULT rc = HXR_OK; m_pStream = pStream; m_pStream->AddRef(); m_pPlayer = pPlayer; m_pPlayer->AddRef(); return rc;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::EndStream// Purpose:// Called by client engine to inform the renderer that the stream// is was rendering is closed.//STDMETHODIMP CSDPRenderer::EndStream(){ Cleanup(); return HXR_OK;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::OnHeader// Purpose:// Called by client engine when a header for this renderer is // available. The header will arrive before any packets.//STDMETHODIMP CSDPRenderer::OnHeader(IHXValues* pHeader){ return HXR_OK;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::OnPacket// Purpose:// Called by client engine when a packet for this renderer is // due.//STDMETHODIMP CSDPRenderer::OnPacket(IHXPacket* pPacket, LONG32 lTimeOffset){ HX_RESULT rc = HXR_OK; HX_ASSERT(lTimeOffset <= 0); IHXBuffer* pBuffer = pPacket->GetBuffer(); if(pBuffer) { rc = ProcessSDP(pBuffer); } HX_RELEASE(pBuffer); return rc;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::OnTimeSync// Purpose:// Called by client engine to inform the renderer of the current// time relative to the streams synchronized time-line. The // renderer should use this time value to update its display or// render it's stream data accordingly.//STDMETHODIMP CSDPRenderer::OnTimeSync(ULONG32 ulTime){ return HXR_OK;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::OnPreSeek// Purpose:// Called by client engine to inform the renderer that a seek is// about to occur. The render is informed the last time for the // stream's time line before the seek, as well as the first new// time for the stream's time line after the seek will be completed.//STDMETHODIMP CSDPRenderer::OnPreSeek(ULONG32 ulOldTime, ULONG32 ulNewTime){ return HXR_OK;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::OnPostSeek// Purpose:// Called by client engine to inform the renderer that a seek has// just occured. The render is informed the last time for the // stream's time line before the seek, as well as the first new// time for the stream's time line after the seek.//STDMETHODIMP CSDPRenderer::OnPostSeek(ULONG32 ulOldTime, ULONG32 ulNewTime){ return HXR_OK;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::OnPause// Purpose:// Called by client engine to inform the renderer that a pause has// just occured. The render is informed the last time for the // stream's time line before the pause.//STDMETHODIMP CSDPRenderer::OnPause(ULONG32 ulTime){ return HXR_OK;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::OnBegin// Purpose:// Called by client engine to inform the renderer that a begin or// resume has just occured. The render is informed the first time // for the stream's time line after the resume.//STDMETHODIMP CSDPRenderer::OnBegin(ULONG32 ulTime){ return HXR_OK;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::OnBuffering// Purpose:// Called by client engine to inform the renderer that buffering// of data is occuring. The render is informed of the reason for// the buffering (start-up of stream, seek has occured, network// congestion, etc.), as well as percentage complete of the // buffering process.//STDMETHODIMP CSDPRenderer::OnBuffering(ULONG32 ulFlags, UINT16 unPercentComplete){ return HXR_OK;}/////////////////////////////////////////////////////////////////////////// Method:// IHXRenderer::GetDisplayType// Purpose:// Called by client engine to ask the renderer for it's preferred// display type. When layout information is not present, the // renderer will be asked for it's prefered display type. Depending// on the display type a buffer of additional information may be // needed. This buffer could contain information about preferred// window size.//STDMETHODIMP CSDPRenderer::GetDisplayType( REF(HX_DISPLAY_TYPE) ulFlags, REF(IHXBuffer*) pBuffer){ ulFlags = HX_DISPLAY_NONE; return HXR_OK;}/************************************************************************ * Method: * IHXRenderer::OnEndofPackets * Purpose: * Called by client engine to inform the renderer that all the * packets have been delivered. However, if the user seeks before * EndStream() is called, renderer may start getting packets again * and the client engine will eventually call this function again. */STDMETHODIMP CSDPRenderer::OnEndofPackets(void){ return HXR_OK;}HX_RESULTCSDPRenderer::ProcessSDP(IHXBuffer* pSDPBuffer){ HX_RESULT rc = HXR_OK; UINT32 ulSDPBufferSize = 0; char* pszSDPBuffer = NULL; CHXString escapedSDP; CHXString url; CHXHeader* pTrackProps = NULL; CHXBuffer* pBuffer = NULL; IHXGroupManager* pGroupManager = NULL; IHXGroup* pGroup = NULL; if (!pSDPBuffer) { rc = HXR_FAILED; goto cleanup; } ulSDPBufferSize = pSDPBuffer->GetSize() + 1; pszSDPBuffer = new char[ulSDPBufferSize]; if (NULL == pszSDPBuffer) { rc = HXR_OUTOFMEMORY; goto cleanup; } memset(pszSDPBuffer, 0, ulSDPBufferSize); strncpy(pszSDPBuffer, (const char*)pSDPBuffer->GetBuffer(), pSDPBuffer->GetSize()); CHXURL::encodeURL(pszSDPBuffer, escapedSDP); url = HELIX_SDP_SCHEME; url += ":"; url += escapedSDP; if (HXR_OK != m_pContext->QueryInterface(IID_IHXGroupManager, (void**)&pGroupManager)) { rc = HXR_FAILED; goto cleanup; } pGroupManager->GetCurrentGroup(m_uGroupIndex); if (HXR_OK != pGroupManager->GetGroup(m_uGroupIndex, pGroup)) { HX_ASSERT(FALSE); rc = HXR_FAILED; goto cleanup; } pTrackProps = new CHXHeader; pTrackProps->AddRef(); pBuffer = new CHXBuffer(); pBuffer->AddRef(); pBuffer->Set((UCHAR*)(const char*)url, url.GetLength() + 1); pTrackProps->SetPropertyCString("src", pBuffer); pGroup->AddTrack(pTrackProps);cleanup: HX_VECTOR_DELETE(pszSDPBuffer); HX_RELEASE(pGroup); HX_RELEASE(pGroupManager); HX_RELEASE(pBuffer); HX_RELEASE(pTrackProps); return rc;}voidCSDPRenderer::Cleanup(void){ HX_RELEASE(m_pStream); HX_RELEASE(m_pPlayer); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -