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]);
    }
}
Exemple #4
0
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);
        }
    }
}