Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
    }
}