STDMETHODIMP CDVBSub::Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox) { CAutoLock cAutoLock(&m_csCritSec); rt -= m_rtCurrentSegmentStart; // Make sure the timing are relative to the current segment start RemoveOldPages(rt); if (POSITION posPage = FindPage(rt)) { const auto& pPage = m_pages.GetAt(posPage); bool BT709 = m_infoSourceTarget.sourceMatrix == BT_709 ? true : m_infoSourceTarget.sourceMatrix == NONE ? (m_displayInfo.width > 720) : false; pPage->rendered = true; TRACE_DVB(_T("DVB - Renderer - %s - %s\n"), ReftimeToString(pPage->rtStart + m_rtCurrentSegmentStart), ReftimeToString(pPage->rtStop + m_rtCurrentSegmentStart)); int nRegion = 1, nObject = 1; for (POSITION pos = pPage->regionsPos.GetHeadPosition(); pos; nRegion++) { DVB_REGION_POS regionPos = pPage->regionsPos.GetNext(pos); if (POSITION posRegion = FindRegion(pPage, regionPos.id)) { const auto& pRegion = pPage->regions.GetAt(posRegion); if (POSITION posCLUT = FindClut(pPage, pRegion->CLUT_id)) { const auto& pCLUT = pPage->CLUTs.GetAt(posCLUT); for (POSITION posO = pRegion->objects.GetHeadPosition(); posO; nObject++) { DVB_OBJECT objectPos = pRegion->objects.GetNext(posO); if (POSITION posObject = FindObject(pPage, objectPos.object_id)) { const auto& pObject = pPage->objects.GetAt(posObject); short nX = regionPos.horizAddr + objectPos.object_horizontal_position; short nY = regionPos.vertAddr + objectPos.object_vertical_position; pObject->m_width = pRegion->width; pObject->m_height = pRegion->height; pObject->SetPalette(pCLUT->size, pCLUT->palette, BT709, m_infoSourceTarget.sourceBlackLevel, m_infoSourceTarget.sourceWhiteLevel, m_infoSourceTarget.targetBlackLevel, m_infoSourceTarget.targetWhiteLevel); pObject->RenderDvb(spd, nX, nY); TRACE_DVB(_T(" --> %d/%d - %d/%d\n"), nRegion, pPage->regionsPos.GetCount(), nObject, pRegion->objects.GetCount()); } } } } } bbox.left = 0; bbox.top = 0; bbox.right = m_displayInfo.width; bbox.bottom = m_displayInfo.height; } return S_OK; }
void CDVBSub::Render(SubPicDesc& spd, REFERENCE_TIME rt, RECT& bbox) { RemoveOldPages(rt); DVB_PAGE* pPage = FindPage(rt); if (pPage != nullptr) { pPage->rendered = true; TRACE_DVB(_T("DVB - Renderer - %s - %s\n"), ReftimeToString(pPage->rtStart), ReftimeToString(pPage->rtStop)); for (int i = 0; i < pPage->regionCount; i++) { DVB_REGION* pRegion = &pPage->regions[i]; DVB_CLUT* pCLUT = FindClut(pPage, pRegion->CLUT_id); if (pCLUT) { for (int j = 0; j < pRegion->objectCount; j++) { CompositionObject* pObject = FindObject(pPage, pRegion->objects[j].object_id); if (pObject) { short nX, nY; nX = pRegion->horizAddr + pRegion->objects[j].object_horizontal_position; nY = pRegion->vertAddr + pRegion->objects[j].object_vertical_position; pObject->m_width = pRegion->width; pObject->m_height = pRegion->height; pObject->SetPalette(pCLUT->size, pCLUT->palette, m_Display.width > 720); pObject->RenderDvb(spd, nX, nY); TRACE_DVB(_T(" --> %d/%d - %d/%d\n"), i + 1, pPage->regionCount, j + 1, pRegion->objectCount); } } } } bbox.left = 0; bbox.top = 0; bbox.right = m_Display.width; bbox.bottom = m_Display.height; } }