void CompositionObject::SetPalette(int nNbEntry, HDMV_PALETTE* pPalette, bool bIsHD) { m_nColorNumber = nNbEntry; for (int i = 0; i < nNbEntry; i++) { if (bIsHD) { m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec709(pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb); } else { m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec601(pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb); } } }
void CompositionObject::SetPalette(int nNbEntry, const HDMV_PALETTE* pPalette, bool BT709, int sourceBlackLevel, int sourceWhiteLevel, int targetBlackLevel, int targetWhiteLevel) { m_nColorNumber = nNbEntry; for (int i = 0; i < nNbEntry; i++) { if (BT709) { m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec709(pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb, sourceBlackLevel, sourceWhiteLevel, targetBlackLevel, targetWhiteLevel); } else { m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec601(pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb, sourceBlackLevel, sourceWhiteLevel, targetBlackLevel, targetWhiteLevel); } } }
void CompositionObject::SetPalette(int nNbEntry, HDMV_PALETTE* pPalette, bool bIsHD) { m_nColorNumber = nNbEntry; for(int i = 0; i < m_nColorNumber; i++) { // if (pPalette[i].T != 0) // Prevent ugly background when Alpha=0 (but RGB different from 0) { if(bIsHD) m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec709(pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb); else m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec601(pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb); } // TRACE_HDMVSUB ("%03d : %08x\n", pPalette[i].entry_id, m_Colors[pPalette[i].entry_id]); } }
void TsubtitlePGSParser::parsePalette(Tbitdata &bitData, int nSize) { BYTE palette_id = bitData.readByte(); BYTE palette_version_number = bitData.readByte(); //TODO ASSERT((nSize - 2) % sizeof(HDMV_PALETTE) == 0); int nNbEntry = (nSize - 2) / sizeof(HDMV_PALETTE); // If palette already exists for this id overwrite it (it will be always the case) ThdmvPalettes::iterator p = m_palettes.find(palette_id); if (p != m_palettes.end()) { m_pDefaultPalette = (*p).second; } else { // Create the new palette and add it to the list (don't know if PGS can have several palettes in parallel) m_pDefaultPalette = new ThdmvPalette(); m_palettes.insert(std::make_pair(palette_id, m_pDefaultPalette)); } m_nDefaultPaletteNbEntry = palette_id; m_pDefaultPalette->reset(); BYTE y, cr, cb, a, entry_id; /*int r_add, g_add, b_add; int r, g, b; uint8_t ff_cropTbl[256 + 2 * 1024] = {0, }; const uint8_t *cm = ff_cropTbl + 1024;*/ m_nColorNumber = nNbEntry; bool bIsHD = m_VideoDescriptor.nVideoWidth > 720; for (int i = 0; i < m_nColorNumber; i++) { entry_id = bitData.readByte(); y = bitData.readByte(); cr = bitData.readByte(); cb = bitData.readByte(); a = bitData.readByte(); if (bIsHD) { m_pDefaultPalette->m_Colors[entry_id] = YCrCbToRGB_Rec709(a, y, cr, cb); } else { m_pDefaultPalette->m_Colors[entry_id] = YCrCbToRGB_Rec601(a, y, cr, cb); } } }