int CPGSSub::ParsePresentationSegment(REFERENCE_TIME rt, CGolombBuffer* pGBuffer) { m_pCurrentPresentationSegment.Free(); m_pCurrentPresentationSegment.Attach(DEBUG_NEW HDMV_PRESENTATION_SEGMENT()); m_pCurrentPresentationSegment->rtStart = rt; m_pCurrentPresentationSegment->rtStop = UNKNOWN_TIME; // Unknown for now ParseVideoDescriptor(pGBuffer, &m_pCurrentPresentationSegment->video_descriptor); ParseCompositionDescriptor(pGBuffer, &m_pCurrentPresentationSegment->composition_descriptor); m_pCurrentPresentationSegment->palette_update_flag = !!(pGBuffer->ReadByte() & 0x80); m_pCurrentPresentationSegment->CLUT.id = pGBuffer->ReadByte(); m_pCurrentPresentationSegment->objectCount = pGBuffer->ReadByte(); TRACE_PGSSUB(_T("CPGSSub::ParsePresentationSegment Size = %d, state = %#x, nObjectNumber = %d\n"), pGBuffer->GetSize(), m_pCurrentPresentationSegment->composition_descriptor.bState, m_pCurrentPresentationSegment->objectCount); for (int i = 0; i < m_pCurrentPresentationSegment->objectCount; i++) { std::unique_ptr<CompositionObject> pCompositionObject(DEBUG_NEW CompositionObject()); if (ParseCompositionObject(pGBuffer, pCompositionObject)) { m_pCurrentPresentationSegment->objects.emplace_back(std::move(pCompositionObject)); } } return m_pCurrentPresentationSegment->objectCount; }
int CHdmvSub::ParsePresentationSegment(CGolombBuffer* pGBuffer) { COMPOSITION_DESCRIPTOR CompositionDescriptor; BYTE nObjectNumber; //bool palette_update_flag; //BYTE palette_id_ref; ParseVideoDescriptor(pGBuffer, &m_VideoDescriptor); ParseCompositionDescriptor(pGBuffer, &CompositionDescriptor); pGBuffer->ReadByte(); //palette_update_flag = !!(pGBuffer->ReadByte() & 0x80); pGBuffer->ReadByte(); //palette_id_ref = pGBuffer->ReadByte(); nObjectNumber = pGBuffer->ReadByte(); TRACE_HDMVSUB( "CHdmvSub::ParsePresentationSegment Size = %d, nObjectNumber = %d\n", pGBuffer->GetSize(), nObjectNumber); if (nObjectNumber > 0) { delete m_pCurrentObject; m_pCurrentObject = DNew CompositionObject(); m_pCurrentObject->m_nObjectNumber = nObjectNumber; for (int i=0; i<nObjectNumber; i++) { ParseCompositionObject (pGBuffer, m_pCurrentObject); } } return nObjectNumber; }
int CHdmvSub::ParsePresentationSegment(CGolombBuffer* pGBuffer) { COMPOSITION_DESCRIPTOR CompositionDescriptor; BYTE nObjectNumber; bool palette_update_flag; BYTE palette_id_ref; ParseVideoDescriptor(pGBuffer, &m_VideoDescriptor); ParseCompositionDescriptor(pGBuffer, &CompositionDescriptor); palette_update_flag = !!(pGBuffer->ReadByte() & 0x80); palette_id_ref = pGBuffer->ReadByte(); nObjectNumber = pGBuffer->ReadByte(); if (nObjectNumber > 0) { delete m_pCurrentObject; m_pCurrentObject = DNew CompositionObject(); ParseCompositionObject (pGBuffer, m_pCurrentObject); } return nObjectNumber; }
int CHdmvSub::ParsePresentationSegment(REFERENCE_TIME rt, CGolombBuffer* pGBuffer) { m_pCurrentPresentationSegment = DEBUG_NEW HDMV_PRESENTATION_SEGMENT(); m_pCurrentPresentationSegment->rtStart = rt; m_pCurrentPresentationSegment->rtStop = _I64_MAX; ParseVideoDescriptor(pGBuffer, &m_pCurrentPresentationSegment->video_descriptor); ParseCompositionDescriptor(pGBuffer, &m_pCurrentPresentationSegment->composition_descriptor); m_pCurrentPresentationSegment->palette_update_flag = !!(pGBuffer->ReadByte() & 0x80); m_pCurrentPresentationSegment->CLUT.id = pGBuffer->ReadByte(); m_pCurrentPresentationSegment->objectCount = pGBuffer->ReadByte(); TRACE_HDMVSUB( (_T("CHdmvSub::ParsePresentationSegment Size = %d, state = %#x, nObjectNumber = %d\n"), pGBuffer->GetSize(), m_pCurrentPresentationSegment->composition_descriptor.bState, m_pCurrentPresentationSegment->objectCount) ); for (int i = 0; i < m_pCurrentPresentationSegment->objectCount; i++) { CompositionObject* pCompositionObject = DEBUG_NEW CompositionObject(); ParseCompositionObject(pGBuffer, pCompositionObject); m_pCurrentPresentationSegment->objects.AddTail(pCompositionObject); } return m_pCurrentPresentationSegment->objectCount; }
void CHdmvSub::ParsePresentationSegment(CGolombBuffer* pGBuffer, REFERENCE_TIME rtTime) { COMPOSITION_DESCRIPTOR CompositionDescriptor; BYTE nObjectNumber; bool palette_update_flag; BYTE palette_id_ref; ParseVideoDescriptor(pGBuffer, &m_VideoDescriptor); ParseCompositionDescriptor(pGBuffer, &CompositionDescriptor); palette_update_flag = !!(pGBuffer->ReadByte() & 0x80); UNREFERENCED_PARAMETER(palette_update_flag); palette_id_ref = pGBuffer->ReadByte(); nObjectNumber = pGBuffer->ReadByte(); TRACE_HDMVSUB(_T("CHdmvSub::ParsePresentationSegment() : Size = %d, nObjectNumber = %d, palette_id_ref = %d, compositionNumber = %d\n"), pGBuffer->GetSize(), nObjectNumber, palette_id_ref, CompositionDescriptor.nNumber); if (m_pCurrentWindow && m_pCurrentWindow->m_nObjectNumber && m_pCurrentWindow->m_compositionNumber != -1) { for (int i = 0; i < m_pCurrentWindow->m_nObjectNumber; i++) { if (m_pCurrentWindow->Objects[i]) { CompositionObject* pObject = m_pCurrentWindow->Objects[i]; CompositionObject& pObjectData = m_ParsedObjects[pObject->m_object_id_ref]; if (pObjectData.m_width) { pObject->m_rtStop = rtTime; pObject->m_width = pObjectData.m_width; pObject->m_height = pObjectData.m_height; pObject->SetRLEData(pObjectData.GetRLEData(), pObjectData.GetRLEDataSize(), pObjectData.GetRLEDataSize()); if (!pObject->HavePalette() && m_CLUT[palette_id_ref].Palette) { pObject->SetPalette(m_CLUT[palette_id_ref].pSize, m_CLUT[palette_id_ref].Palette, m_VideoDescriptor.nVideoWidth > 720); } TRACE_HDMVSUB(_T(" store Segment : m_object_id_ref = %d, m_window_id_ref = %d, compositionNumber = %d, [%10I64d -> %10I64d], [%s -> %s]\n"), m_pCurrentWindow->Objects[i]->m_object_id_ref, m_pCurrentWindow->Objects[i]->m_window_id_ref, m_pCurrentWindow->Objects[i]->m_compositionNumber, m_pCurrentWindow->Objects[i]->m_rtStart, m_pCurrentWindow->Objects[i]->m_rtStop, ReftimeToString(m_pCurrentWindow->Objects[i]->m_rtStart), ReftimeToString(m_pCurrentWindow->Objects[i]->m_rtStop)); m_pObjects.AddTail (m_pCurrentWindow->Objects[i]); } else { delete m_pCurrentWindow->Objects[i]; } } m_pCurrentWindow->Objects[i] = NULL; } } if (!m_pCurrentWindow) { m_pCurrentWindow = DNew HDMV_WindowDefinition(); } else { m_pCurrentWindow->Reset(); } if (nObjectNumber > 0) { m_pCurrentWindow->m_nObjectNumber = nObjectNumber; m_pCurrentWindow->m_palette_id_ref = (SHORT)palette_id_ref; m_pCurrentWindow->m_compositionNumber = CompositionDescriptor.nNumber; for (int i = 0; i < nObjectNumber; i++) { m_pCurrentWindow->Objects[i] = DNew CompositionObject(); m_pCurrentWindow->Objects[i]->m_rtStart = rtTime; m_pCurrentWindow->Objects[i]->m_rtStop = _I64_MAX; m_pCurrentWindow->Objects[i]->m_compositionNumber = CompositionDescriptor.nNumber; ParseCompositionObject(pGBuffer, m_pCurrentWindow->Objects[i]); } } }