qtatoms.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 253 行

CPP
253
字号
/* ***** BEGIN LICENSE BLOCK ***** 
 * Version: RCSL 1.0/RPSL 1.0 
 *  
 * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
 *      
 * The contents of this file, and the files included with this file, are 
 * subject to the current version of the RealNetworks Public Source License 
 * Version 1.0 (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the RealNetworks Community Source License Version 1.0 
 * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
 * in which case the RCSL will apply. You may also obtain the license terms 
 * directly from RealNetworks.  You may not use this file except in 
 * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
 * applicable to this file, the RCSL.  Please see the applicable RPSL or 
 * RCSL for the rights, obligations and limitations governing use of the 
 * contents of the file.  
 *  
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the portions 
 * it created. 
 *  
 * This file, and the files included with this file, is distributed and made 
 * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
 * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
 * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
 * 
 * Technology Compatibility Kit Test Suite(s) Location: 
 *    http://www.helixcommunity.org/content/tck 
 * 
 * Contributor(s): 
 *  
 * ***** END LICENSE BLOCK ***** */ 

/****************************************************************************
 *  Includes
 */
#include "qtatoms.h"

#ifndef QTCONFIG_SPEED_OVER_SIZE
#include "qtatoms_inline.h"
#endif	// QTCONFIG_SPEED_OVER_SIZE


/****************************************************************************
 *  The atom factory
 */
CQTAtom* CreateQTAtom(QTAtomType AtomType,
		      ULONG32 ulOffset,
		      ULONG32 ulSize, 
		      CQTAtom *pParent,
		      ULONG32 ulAtomID,
		      UINT16 uChildCount)
{
    switch (AtomType)
    {
    case QT_trak:
	return new CQT_trak_Atom(ulOffset, ulSize, pParent);
    case QT_tkhd:
	return new CQT_tkhd_Atom(ulOffset, ulSize, pParent);
    case QT_mdia:
	return new CQT_mdia_Atom(ulOffset, ulSize, pParent);
    case QT_mdhd:
	return new CQT_mdhd_Atom(ulOffset, ulSize, pParent);
    case QT_hdlr:
	return new CQT_hdlr_Atom(ulOffset, ulSize, pParent);
    case QT_edts:
	return new CQT_edts_Atom(ulOffset, ulSize, pParent);
    case QT_elst:
	return new CQT_elst_Atom(ulOffset, ulSize, pParent);
    case QT_udta:
	return new CQT_udta_Atom(ulOffset, ulSize, pParent);
    case QT_minf:
	return new CQT_minf_Atom(ulOffset, ulSize, pParent);
    case QT_dinf:
	return new CQT_dinf_Atom(ulOffset, ulSize, pParent);
    case QT_dref:
	return new CQT_dref_Atom(ulOffset, ulSize, pParent);
    case QT_stbl:
	return new CQT_stbl_Atom(ulOffset, ulSize, pParent);
    case QT_stts:
	return new CQT_stts_Atom(ulOffset, ulSize, pParent);
    case QT_ctts:
	return new CQT_ctts_Atom(ulOffset, ulSize, pParent);
    case QT_stss:
	return new CQT_stss_Atom(ulOffset, ulSize, pParent);
    case QT_stsd:
	return new CQT_stsd_Atom(ulOffset, ulSize, pParent);
    case QT_stsz:
	return new CQT_stsz_Atom(ulOffset, ulSize, pParent);
    case QT_stsc:
	return new CQT_stsc_Atom(ulOffset, ulSize, pParent);
    case QT_stco:
	return new CQT_stco_Atom(ulOffset, ulSize, pParent);
    case QT_name:
	return new CQT_name_Atom(ulOffset, ulSize, pParent);
    case QT_moov:
	return new CQT_moov_Atom(ulOffset, ulSize, pParent);
    case QT_mvhd:
	return new CQT_mvhd_Atom(ulOffset, ulSize, pParent);
    case QT_ftyp:
	return new CQT_ftyp_Atom(ulOffset, ulSize, pParent);
#ifndef QTCONFIG_3GPPCLIENT_ATOMSET_ONLY
    case QT_tref:
	return new CQT_tref_Atom(ulOffset, ulSize, pParent);
    case QT_hint:
	return new CQT_hint_Atom(ulOffset, ulSize, pParent);
    case QT_hinf:
	return new CQT_hinf_Atom(ulOffset, ulSize, pParent);
    case QT_hnti:
	return new CQT_hnti_Atom(ulOffset, ulSize, pParent);
    case QT_sdp:
	return new CQT_sdp_Atom(ulOffset, ulSize, pParent);
    case QT_trpy:
	return new CQT_trpy_Atom(ulOffset, ulSize, pParent);
    case QT_nump:
	return new CQT_nump_Atom(ulOffset, ulSize, pParent);
    case QT_tpyl:
	return new CQT_tpyl_Atom(ulOffset, ulSize, pParent);
    case QT_payt:
	return new CQT_payt_Atom(ulOffset, ulSize, pParent);
    case QT_rtp:
	return new CQT_rtp_Atom(ulOffset, ulSize, pParent);
    case QT_iods:
	return new CQT_iods_Atom(ulOffset, ulSize, pParent);
#endif	// QTCONFIG_3GPPCLIENT_ATOMSET_ONLY

    /***
// /-->> XXXEH- UNFINISHED code; much of this won't need to be handled here:
    case QT_tx3g:  // / TextSampleEntry
//	return new CQT_tx3g_Atom(ulOffset, ulSize, pParent);
    case QT_ftab:  // / FontTableBox
//	return new CQT_ftab_Atom(ulOffset, ulSize, pParent);
    case QT_styl:  // / TextStyleBox
//	return new CQT_styl_Atom(ulOffset, ulSize, pParent);
    case QT_hlit:  // / TextHighlightBox
//	return new CQT_hlit_Atom(ulOffset, ulSize, pParent);
    case QT_hclr:  // / TextHighlightColorBox
//	return new CQT_hclr_Atom(ulOffset, ulSize, pParent);
    case QT_krok:  // / TextKaraokeBox
//	return new CQT_krok_Atom(ulOffset, ulSize, pParent);
    case QT_href:  // / TextHyperTextBox
//	return new CQT_href_Atom(ulOffset, ulSize, pParent);
    case QT_tbox:  // / TextboxBox
//	return new CQT_tbox_Atom(ulOffset, ulSize, pParent);
    case QT_blnk:  // / BlinkBox
//	return new CQT_blnk_Atom(ulOffset, ulSize, pParent);
	HX_ASSERT(0);
	break;
// / <<--  end UNFINISHED code.
    ***/

    default:
	/* nothing to do */
	break;
    }

    return NULL;
}



CQT_stsd_Atom::TextSampleEntry::TextSampleEntry(ArrayEntry* pPackedEntry,
               UINT32 ulSzOfPackedEntry)
{
#if defined(NEED_DATA_IN_TEXTSAMPLEENTRY_FOR_MP4FF)
    UINT8* pUnpkdEntryData = (UINT8*)pPackedEntry;
    UINT32 ulByteCount = 0;
    UINT16 ui = 0;
    memcpy(this, pUnpkdEntryData, sizeof(ArrayEntry));
    if (ulSzOfPackedEntry < sizeof(TextSampleEntry))
    {
	goto done;
    }
    ulByteCount += sizeof(ArrayEntry);
    ulDisplayFlags = GetUL32(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 4;
    horizontalJustification = pUnpkdEntryData[ulByteCount];
    ulByteCount += 1;
    verticalJustification = pUnpkdEntryData[ulByteCount];
    ulByteCount += 1;
    memcpy(&uBackgroundColorRGBA, &pUnpkdEntryData[ulByteCount], 4); /* Flawfinder: ignore */
    ulByteCount += 4;
    defaultTextBox.top = (INT16)GetUI16(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 2;
    defaultTextBox.left = (INT16)GetUI16(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 2;
    defaultTextBox.bottom = (INT16)GetUI16(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 2;
    defaultTextBox.right = (INT16)GetUI16(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 2;
    defaultStyle.startChar =  (INT16)GetUI16(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 2;
    defaultStyle.endChar =  (INT16)GetUI16(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 2;
    defaultStyle.fontID =  (INT16)GetUI16(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 2;
    defaultStyle.faceStyleFlags = pUnpkdEntryData[ulByteCount];
    ulByteCount += 1;
    defaultStyle.fontSize = pUnpkdEntryData[ulByteCount];
    ulByteCount += 1;
    memcpy(&defaultStyle.textColorRGBA, &pUnpkdEntryData[ulByteCount], 4); /* Flawfinder: ignore */
    ulByteCount += 4;
    fontTable.ulFontTableSizeInBytes = GetUL32(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 4;
    memcpy(&fontTable.FTAB, &pUnpkdEntryData[ulByteCount], 4);
    HX_ASSERT(!strncmp((const char*)fontTable.FTAB, (const char*)"ftab", 4)); /* Flawfinder: ignore */
    ulByteCount += 4;
    fontTable.entryCount = GetUI16(&pUnpkdEntryData[ulByteCount]);
    ulByteCount += 2;
    fontTable.pFontEntries = new FontRecord[fontTable.entryCount];
    for (ui = 0; ui < fontTable.entryCount  &&
	    ulByteCount<=ulSzOfPackedEntry; ui++)
    {
	fontTable.pFontEntries[ui].fontID = GetUI16(&pUnpkdEntryData[ulByteCount]);
	ulByteCount += 2;
	fontTable.pFontEntries[ui].fontNameLength = pUnpkdEntryData[ulByteCount];
	ulByteCount += 1;
	fontTable.pFontEntries[ui].pFont =
		new UINT8[fontTable.pFontEntries[ui].fontNameLength+1];
	memcpy(fontTable.pFontEntries[ui].pFont, &pUnpkdEntryData[ulByteCount], /* Flawfinder: ignore */
		fontTable.pFontEntries[ui].fontNameLength);
	(fontTable.pFontEntries[ui].pFont)[fontTable.pFontEntries[ui].fontNameLength] = '\0';
	ulByteCount += fontTable.pFontEntries[ui].fontNameLength;
    }
    HX_ASSERT(ulSzOfPackedEntry == ulByteCount);

done:
    return;

#endif // /defined(NEED_DATA_IN_TEXTSAMPLEENTRY_FOR_MP4FF)
}


CQT_stsd_Atom::FontTableBox::~FontTableBox()
{
#if defined(NEED_DATA_IN_TEXTSAMPLEENTRY_FOR_MP4FF)
    if (pFontEntries  &&  entryCount)
    {
	for (UINT16 ui = entryCount-1; ui; ui--)
	{
	    if (pFontEntries[ui].pFont)
	    {
		delete [] (pFontEntries[ui].pFont);
	    }
	}
	delete pFontEntries;
	pFontEntries = NULL;
    }
#endif // /defined(NEED_DATA_IN_TEXTSAMPLEENTRY_FOR_MP4FF)
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?