HRESULT CPGSSub::Render(SubPicDesc& spd, REFERENCE_TIME rt, RECT& bbox, bool bRemoveOldSegments) { CAutoLock cAutoLock(&m_csCritSec); bool bRendered = false; rt -= m_rtCurrentSegmentStart; // Make sure the timing are relative to the current segment start if (bRemoveOldSegments) { RemoveOldSegments(rt); } POSITION posPresentationSegment = FindPresentationSegment(rt); if (posPresentationSegment) { const auto& pPresentationSegment = m_pPresentationSegments.GetAt(posPresentationSegment); bool BT709 = m_infoSourceTarget.sourceMatrix == BT_709 ? true : m_infoSourceTarget.sourceMatrix == NONE ? (pPresentationSegment->video_descriptor.nVideoWidth > 720) : false; TRACE_PGSSUB(_T("CPGSSub:Render Presentation segment %d --> %s - %s\n"), pPresentationSegment->composition_descriptor.nNumber, ReftimeToString(pPresentationSegment->rtStart + m_rtCurrentSegmentStart), (pPresentationSegment->rtStop == INFINITE_TIME) ? _T("?") : ReftimeToString(pPresentationSegment->rtStop + m_rtCurrentSegmentStart)); bbox.left = bbox.top = LONG_MAX; bbox.right = bbox.bottom = 0; POSITION pos = pPresentationSegment->objects.GetHeadPosition(); while (pos) { const auto& pObject = pPresentationSegment->objects.GetNext(pos); if (pObject->GetRLEDataSize() && pObject->m_width > 0 && pObject->m_height > 0 && spd.w >= (pObject->m_horizontal_position + pObject->m_width) && spd.h >= (pObject->m_vertical_position + pObject->m_height)) { pObject->SetPalette(pPresentationSegment->CLUT.size, pPresentationSegment->CLUT.palette, BT709, m_infoSourceTarget.sourceBlackLevel, m_infoSourceTarget.sourceWhiteLevel, m_infoSourceTarget.targetBlackLevel, m_infoSourceTarget.targetWhiteLevel); bbox.left = std::min(pObject->m_horizontal_position, bbox.left); bbox.top = std::min(pObject->m_vertical_position, bbox.top); bbox.right = std::max(pObject->m_horizontal_position + pObject->m_width, bbox.right); bbox.bottom = std::max(pObject->m_vertical_position + pObject->m_height, bbox.bottom); TRACE_PGSSUB(_T(" --> Object %d (Pos=%dx%d, Res=%dx%d, SPDRes=%dx%d)\n"), pObject->m_object_id_ref, pObject->m_horizontal_position, pObject->m_vertical_position, pObject->m_width, pObject->m_height, spd.w, spd.h); pObject->RenderHdmv(spd); bRendered = true; } else { TRACE_PGSSUB(_T(" --> Invalid object %d\n"), pObject->m_object_id_ref); } } } if (!bRendered) { bbox = { 0, 0, 0, 0 }; } return S_OK; }
HRESULT CPGSSub::Render(SubPicDesc& spd, REFERENCE_TIME rt, RECT& bbox, bool bRemoveOldSegments) { CAutoLock cAutoLock(&m_csCritSec); bool bRendered = false; if (bRemoveOldSegments) { RemoveOldSegments(rt); } POSITION posPresentationSegment = FindPresentationSegment(rt); if (posPresentationSegment) { const auto& pPresentationSegment = m_pPresentationSegments.GetAt(posPresentationSegment); m_eSourceMatrix = ColorConvTable::NONE ? (pPresentationSegment->video_descriptor.nVideoWidth > 720) ? ColorConvTable::BT709 : ColorConvTable::BT601 : m_eSourceMatrix; TRACE_PGSSUB(_T("CPGSSub:Render Presentation segment %d --> %s - %s\n"), pPresentationSegment->composition_descriptor.nNumber, ReftimeToString(pPresentationSegment->rtStart), (pPresentationSegment->rtStop == UNKNOWN_TIME) ? _T("?") : ReftimeToString(pPresentationSegment->rtStop)); bbox.left = bbox.top = LONG_MAX; bbox.right = bbox.bottom = 0; for (const auto& pObject : pPresentationSegment->objects) { if (pObject->GetRLEDataSize() && pObject->m_width > 0 && pObject->m_height > 0 && spd.w >= (pObject->m_horizontal_position + pObject->m_width) && spd.h >= (pObject->m_vertical_position + pObject->m_height)) { pObject->SetPalette(pPresentationSegment->CLUT.size, pPresentationSegment->CLUT.palette.data(), m_eSourceMatrix); bbox.left = std::min(pObject->m_horizontal_position, bbox.left); bbox.top = std::min(pObject->m_vertical_position, bbox.top); bbox.right = std::max(pObject->m_horizontal_position + pObject->m_width, bbox.right); bbox.bottom = std::max(pObject->m_vertical_position + pObject->m_height, bbox.bottom); TRACE_PGSSUB(_T(" --> Object %d (Pos=%dx%d, Res=%dx%d, SPDRes=%dx%d)\n"), pObject->m_object_id_ref, pObject->m_horizontal_position, pObject->m_vertical_position, pObject->m_width, pObject->m_height, spd.w, spd.h); pObject->RenderHdmv(spd); bRendered = true; } else { TRACE_PGSSUB(_T(" --> Invalid object %d\n"), pObject->m_object_id_ref); } } } if (!bRendered) { bbox = { 0, 0, 0, 0 }; } return S_OK; }
void CHdmvSub::Render(SubPicDesc& spd, REFERENCE_TIME rt, RECT& bbox) { RemoveOldSegments(rt); HDMV_PRESENTATION_SEGMENT* pPresentationSegment = FindPresentationSegment(rt); bbox.left = LONG_MAX; bbox.top = LONG_MAX; bbox.right = 0; bbox.bottom = 0; if (pPresentationSegment) { POSITION pos = pPresentationSegment->objects.GetHeadPosition(); TRACE_HDMVSUB(_T("CHdmvSub:Render Presentation segment %d --> %s - %s\n"), pPresentationSegment->composition_descriptor.nNumber, ReftimeToString(pPresentationSegment->rtStart), ReftimeToString(pPresentationSegment->rtStop)); while (pos) { CompositionObject* pObject = pPresentationSegment->objects.GetNext(pos); if (pObject->GetRLEDataSize() && pObject->m_width > 0 && pObject->m_height > 0 && spd.w >= (pObject->m_horizontal_position + pObject->m_width) && spd.h >= (pObject->m_vertical_position + pObject->m_height)) { pObject->SetPalette(pPresentationSegment->CLUT.size, pPresentationSegment->CLUT.palette, pPresentationSegment->video_descriptor.nVideoWidth > 720); bbox.left = min(pObject->m_horizontal_position, bbox.left); bbox.top = min(pObject->m_vertical_position, bbox.top); bbox.right = max(pObject->m_horizontal_position + pObject->m_width, bbox.right); bbox.bottom = max(pObject->m_vertical_position + pObject->m_height, bbox.bottom); TRACE_HDMVSUB(_T(" --> Object %d (Pos=%dx%d, Res=%dx%d, SPDRes=%dx%d)\n"), pObject->m_object_id_ref, pObject->m_horizontal_position, pObject->m_vertical_position, pObject->m_width, pObject->m_height, spd.w, spd.h); pObject->RenderHdmv(spd); } else { TRACE_HDMVSUB(_T(" --> Invalid object %d\n"), pObject->m_object_id_ref); } } } }