mp4desc.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:17k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /****************************************************************************
  36.  *  Defines
  37.  */
  38. #define _ATTEMPT_ALTERNATE_PARSING_MODES
  39. #define _ATTEMPT_PREOCR_SYNTAX
  40. #define _ALLOW_SHORT_SLCONFIG
  41. #define _SHORTCUT_ON_DECCONFIG
  42. /****************************************************************************
  43.  *  Includes
  44.  */
  45. #include "mp4desc.h"
  46. #include "netbyte.h"
  47. /****************************************************************************
  48.  *  Statics
  49.  */
  50. inline static int swapEndian(UCHAR* pInOut, UINT32 ulLen)
  51. {
  52.     UINT32 i = 0, j = 0;
  53.     UCHAR c;
  54.     for (j = ulLen-1; i < ulLen/2; ++i, --j)
  55.     {
  56.         c = pInOut[i];
  57.         pInOut[i] = pInOut[j];
  58.         pInOut[j] = c;
  59.     }
  60.     return 0;
  61. }
  62. inline static ULONG32 GetUL32(UINT8 *pData)
  63. {
  64.     return (*pData << 24) |
  65.    (*(pData + 1) << 16) |
  66.    (*(pData + 2) << 8 ) |
  67.    *(pData + 3);
  68. }
  69. inline static UINT16 GetUI16(UINT8 *pData)
  70. {
  71.     return (*pData << 8) |
  72.     *(pData + 1);
  73. }
  74. inline static ULONG32 GetUI24(UINT8 *pData)
  75. {
  76.     return  (*pData << 16) |
  77.     (*(pData + 1) << 8) |
  78.     *(pData + 2);
  79. }
  80. inline static ULONG32 RoundUp(double x)
  81. {
  82.     ULONG32 rx = (ULONG32) x;
  83.     
  84.     if (rx != x)
  85.     {
  86. rx++;
  87.     }
  88.     
  89.     return rx;
  90. }
  91. /****************************************************************************
  92.  *  MP4BaseDescriptor
  93.  */
  94. /****************************************************************************
  95.  *  Public functions
  96.  */
  97. MP4BaseDescriptor::DescType MP4BaseDescriptor::GetDescType(UINT8 uTag)
  98. {
  99.     DescType eDescType = DTYP_UNKNOWN;
  100.     
  101.     if (uTag == 0x03)
  102.     {
  103. eDescType = DTYP_ESTREAM;
  104.     }
  105.     else if (uTag == 0x04)
  106.     {
  107. eDescType = DTYP_DECODER_CONFIG;
  108.     }
  109.     else if (uTag == 0x05)
  110.     {
  111. eDescType = DTYP_DECODER_INFO_SHORT;
  112.     }
  113.     else if (uTag == 0x06)
  114.     {
  115. eDescType = DTYP_SL_CONFIG;
  116.     }
  117.     
  118.     return eDescType;
  119. }
  120. /****************************************************************************
  121.  *  Protected functions
  122.  */
  123. UINT8 MP4BaseDescriptor::GetTag(UINT8* &pData, 
  124. ULONG32 &ulDataSize,
  125. BOOL bAdvance)
  126. {
  127.     UINT8 uTag;
  128.     ULONG32 ulTagSize = 0;
  129.     
  130.     uTag = pData[ulTagSize];
  131.     ulTagSize++;
  132.         
  133.     if (bAdvance)
  134.     {
  135. pData += ulTagSize;
  136. ulDataSize -= ulTagSize;
  137.     }
  138.     
  139.     return uTag;
  140. }
  141. ULONG32 MP4BaseDescriptor::GetSize(UINT8* &pData, 
  142.    ULONG32 &ulDataSize,
  143.    BOOL bAdvance)
  144. {
  145.     ULONG32 ulSize = 0;
  146.     ULONG32 ulFieldSize = 0;
  147.     while (ulDataSize > ulFieldSize)
  148.     {
  149. ulSize = (ulSize << 7);
  150. ulSize += (pData[ulFieldSize] & 0x7f);
  151. if ((pData[ulFieldSize] & 0x80) == 0)
  152. {
  153.     ulFieldSize++;
  154.     break;
  155. }
  156. ulFieldSize++;
  157.     }
  158.     
  159.     if (bAdvance)
  160.     {
  161. pData += ulFieldSize;
  162. ulDataSize -= ulFieldSize;
  163.     }
  164.     
  165.     return ulSize;
  166. }
  167. /****************************************************************************
  168.  *  SLConfigPredefined
  169.  */
  170. /****************************************************************************
  171.  *  Constructor/Destructor
  172.  */
  173. /****************************************************************************
  174.  *  Public functions
  175.  */
  176. HX_RESULT SLConfigPredefined::Unpack(UINT8* &pData, 
  177.      ULONG32 &ulSize,
  178.      ULONG32 ulFlags)
  179. {
  180.     LD bitInfo;
  181.     HX_RESULT retVal = HXR_INVALID_PARAMETER;
  182.     
  183.     if (ulSize >= 14)
  184.     {
  185. retVal = HXR_OK;
  186. initbuffer(pData, &bitInfo);
  187. m_bUseAccessUnitStartFlag = getbits1(&bitInfo);
  188. m_bUseAccessUnitEndFlag = getbits1(&bitInfo);
  189. m_bUseRandomAccessPointFlag = getbits1(&bitInfo);
  190. m_bUsePaddingFlag = getbits1(&bitInfo);
  191. m_bUseTimeStampsFlag = getbits1(&bitInfo);
  192. m_bUseWallClockTimeStampFlag = getbits1(&bitInfo);
  193. m_bUseIdleFlag = getbits1(&bitInfo);
  194. m_bDurationFlag = getbits1(&bitInfo);
  195. pData++;
  196. m_ulTimeStampResolution = GetUL32(pData);
  197. pData += 4;
  198. m_ulOCRResolution = GetUL32(pData);
  199. pData += 4;
  200. m_uTimeStampLength = *(pData++);
  201. m_uOCRLength = *(pData++);
  202. m_AU_Length = *(pData++);
  203. m_uInstantBitrateLength = *(pData++);
  204. initbuffer(pData, &bitInfo);
  205. m_uDegradationPriorityLength = getbits(4, &bitInfo);
  206. m_uSeqNumLength = getbits(4, &bitInfo);
  207. pData++;
  208. ulSize -= 14;
  209.     }
  210.     
  211.     if ((retVal == HXR_OK) && 
  212. m_bDurationFlag)
  213.     {
  214. retVal = HXR_INVALID_PARAMETER;
  215. if (ulSize >= 8)
  216. {
  217.     m_ulTimeScale = GetUL32(pData);
  218.     pData += 4;
  219.     m_uAccessUnitDuration = GetUI16(pData);
  220.     pData += 2;
  221.     m_uCompositionUnitDuration = GetUI16(pData);
  222.     pData += 2;
  223.     ulSize -= 8;
  224. }
  225.     }
  226.     if ((retVal == HXR_OK) &&
  227. (!m_bUseTimeStampsFlag))
  228.     {
  229. retVal = HXR_INVALID_PARAMETER;
  230. ULONG32 ulSegmentSize = RoundUp(8.0 + m_uTimeStampLength / 4.0);
  231. m_ullStartDecodingTimeStamp = 0;
  232. m_ullStartCompositionTimeStamp = 0;
  233. if ((m_uTimeStampLength < 64) &&
  234.     (ulSize >= ulSegmentSize) &&
  235.     (sizeof(double) == 8))
  236. {     
  237.     memcpy(&m_dWallClockTimeStamp, pData, 8); /* Flawfinder: ignore */
  238.     if (!TestBigEndian())
  239.     {
  240. swapEndian((UINT8*) &m_dWallClockTimeStamp, 8);
  241.     }
  242.     // initialization of m_ullStartDecodingTimeStamp
  243.     // and m_ullStartCompositionTimeStamp needed
  244.     HX_ASSERT(HXR_OK == HXR_NOTIMPL);
  245.     pData += ulSegmentSize;
  246.     ulSize -= ulSegmentSize;
  247.     retVal = HXR_NOTIMPL;
  248. }
  249.     }
  250.     return retVal;
  251. }
  252. /****************************************************************************
  253.  *  SLConfigDescriptor
  254.  */
  255. /****************************************************************************
  256.  *  Constructor/Destructor
  257.  */
  258. SLConfigDescriptor::SLConfigDescriptor(void)
  259.     : m_uLength(0)
  260.     , m_pPredefined(NULL)
  261.     , m_bOCRstreamFlag(FALSE)
  262. {
  263.     ;
  264. }
  265. SLConfigDescriptor::~SLConfigDescriptor()
  266. {
  267.     HX_DELETE(m_pPredefined);
  268. }
  269. /****************************************************************************
  270.  *  Public functions
  271.  */
  272. HX_RESULT SLConfigDescriptor::Unpack(UINT8* &pData, 
  273.      ULONG32 &ulSize,
  274.      ULONG32 ulFlags)
  275. {
  276.     HX_RESULT retVal = HXR_INVALID_PARAMETER;
  277.     
  278.     if (ulSize >= 3)
  279.     {
  280. m_uTag = GetTag(pData, ulSize, TRUE);
  281. retVal = HXR_OK;
  282.     }
  283.     
  284.     if (retVal == HXR_OK)
  285.     {
  286. retVal = HXR_INVALID_PARAMETER;
  287. if (ulSize >= 2)
  288. {
  289.     m_uLength = (UINT8) GetSize(pData, ulSize, TRUE);
  290.     if (ulSize >= 1)
  291.     {
  292. m_uPredefined = *(pData++);
  293. ulSize--;
  294. retVal = HXR_OK;
  295.     }
  296. }
  297.     }
  298.     if ((retVal == HXR_OK) &&
  299. (m_uPredefined == 0))
  300.     {
  301. retVal = HXR_OUTOFMEMORY;
  302. m_pPredefined = new SLConfigPredefined;
  303. if (m_pPredefined)
  304. {
  305.     retVal = m_pPredefined->Unpack(pData, ulSize);
  306. }
  307.     }
  308.     if (retVal == HXR_OK)
  309.     {
  310. #ifndef _ALLOW_SHORT_SLCONFIG
  311. retVal = HXR_INVALID_PARAMETER;
  312. #endif // _ALLOW_SHORT_SLCONFIG
  313. if (ulSize >= 1)
  314. {
  315.     m_bOCRstreamFlag = ((((*pData) >> 7) & 0x01) == 1);
  316.     m_uReserved = ((*(pData++)) & 0x7F);
  317.     ulSize--;
  318.     retVal = HXR_OK;
  319. }
  320.     }
  321.     if ((retVal == HXR_OK) &&
  322. (m_bOCRstreamFlag))
  323.     {
  324. retVal = HXR_INVALID_PARAMETER;
  325. if (ulSize >= 2)
  326. {
  327.     m_OCR_ES_Id = GetUI16(pData);
  328.     pData += 2;
  329.     ulSize -= 2;
  330.     retVal = HXR_OK;
  331. }
  332.     }
  333.     return retVal;
  334. }
  335.     
  336. /****************************************************************************
  337.  *  DecoderSpecifcInfo
  338.  */
  339. /****************************************************************************
  340.  *  Constructor/Destructor
  341.  */
  342. DecoderSpecifcInfo::DecoderSpecifcInfo(void)
  343.     : m_ulLength(0)
  344.     , m_pData(NULL)
  345. {
  346.     ;
  347. }
  348. DecoderSpecifcInfo::~DecoderSpecifcInfo()
  349. {
  350.     HX_DELETE(m_pData);
  351. }
  352. /****************************************************************************
  353.  *  Public functions
  354.  */
  355. HX_RESULT DecoderSpecifcInfo::Unpack(UINT8* &pData, 
  356.      ULONG32 &ulSize,
  357.      ULONG32 ulFlags)
  358. {
  359.     ULONG32 ulTagSize = 1;
  360.     HX_RESULT retVal = HXR_INVALID_PARAMETER;
  361.     m_ulFlags = ulFlags;
  362.     
  363.     if (ulSize >= 1)
  364.     {
  365. m_uTag = GetTag(pData, ulSize, TRUE);
  366. retVal = HXR_OK;
  367.     }
  368.     
  369.     if (retVal == HXR_OK)
  370.     {
  371. switch (GetDescType(m_uTag))
  372. {
  373. case DTYP_DECODER_INFO_SHORT:
  374.     m_ulLength = GetSize(pData, ulSize, TRUE);
  375.     break;
  376. default:
  377.     retVal = HXR_INVALID_PARAMETER;
  378.     break;
  379. }
  380.     }
  381.     if ((ulFlags & SIZE_HEADER_INCLUSIVE) && (retVal == HXR_OK))
  382.     {
  383. if (m_ulLength > 2)
  384. {
  385.     m_ulLength -= 2;
  386. }
  387.     }
  388.     if ((retVal == HXR_OK) &&
  389. (m_ulLength > 0))
  390.     {
  391. retVal = HXR_INVALID_PARAMETER;
  392. if (ulSize >= m_ulLength)
  393. {
  394.     m_pData = new UINT8 [m_ulLength];
  395.     retVal = HXR_OUTOFMEMORY;
  396.     if (m_pData)
  397.     {
  398. memcpy(m_pData, pData, m_ulLength); /* Flawfinder: ignore */
  399. pData += m_ulLength;
  400. ulSize -= m_ulLength;
  401. retVal = HXR_OK;
  402.     }
  403. }
  404.     }
  405.     return retVal;
  406. }
  407. /****************************************************************************
  408.  *  DecoderConfigDescriptor
  409.  */
  410. /****************************************************************************
  411.  *  Constructor/Destructor
  412.  */
  413. DecoderConfigDescriptor::DecoderConfigDescriptor(void)
  414.     : m_uLength(0)
  415.     , m_pDecSpecificInfo(NULL)
  416. {
  417.     ;
  418. }
  419. DecoderConfigDescriptor::~DecoderConfigDescriptor()
  420. {
  421.     HX_DELETE(m_pDecSpecificInfo);
  422. }
  423. /****************************************************************************
  424.  *  Public functions
  425.  */
  426. HX_RESULT DecoderConfigDescriptor::Unpack(UINT8* &pData, 
  427.   ULONG32 &ulSize,
  428.   ULONG32 ulFlags)
  429. {
  430.     HX_RESULT retVal = HXR_INVALID_PARAMETER;
  431.     
  432.     m_ulFlags = ulFlags;
  433.     if (ulSize >= 15)
  434.     {
  435. m_uTag = GetTag(pData, ulSize, TRUE);
  436. retVal = HXR_OK;
  437.     }
  438.     
  439.     if (retVal == HXR_OK)
  440.     {
  441. retVal = HXR_INVALID_PARAMETER;
  442. if (ulSize >= 14)
  443. {
  444.     m_uLength = (UINT8) GetSize(pData, ulSize, TRUE);
  445.     if (ulSize >= 13)
  446.     {
  447. m_uObjectProfileIndication = *(pData++);
  448. m_uStreamType = ((*pData) >> 2);
  449. m_bUpStream = (((*pData) >> 1) & 0x01);
  450. m_bReservedBit = ((*pData) & 0x01);
  451. pData++;
  452. m_ulBufferSizeDB = GetUI24(pData);
  453. pData += 3;
  454. m_ulMaxBitrate = GetUL32(pData);
  455. pData += 4;
  456. m_ulAvgBitrate = GetUL32(pData);
  457. pData += 4;
  458. ulSize -= 13;
  459. retVal = HXR_OK;
  460.     }
  461. }
  462.     }
  463.     if (retVal == HXR_OK)
  464.     {
  465. if (ulSize > 0)
  466. {
  467.     UINT8 uTag = GetTag(pData, ulSize);
  468.     if (GetDescType(uTag) == DTYP_DECODER_INFO_SHORT)
  469.     {
  470. m_pDecSpecificInfo = new DecoderSpecifcInfo;
  471.     
  472. retVal = HXR_OUTOFMEMORY;
  473. if (m_pDecSpecificInfo)
  474. {
  475.     retVal = m_pDecSpecificInfo->Unpack(pData, 
  476. ulSize, 
  477. ulFlags);
  478. }
  479.     }
  480. }
  481.     }
  482.     return retVal;
  483. }
  484.     
  485. /****************************************************************************
  486.  *  ES_Descriptor
  487.  */
  488. /****************************************************************************
  489.  *  Constructor/Destructor
  490.  */
  491. ES_Descriptor::ES_Descriptor(void)
  492.     : m_uLength(0)
  493.     , m_pURLString(NULL)
  494.     , m_pExtDescrArray(NULL)
  495.     , m_pLangDescr(NULL)
  496.     , m_pDecConfigDescr(NULL)
  497.     , m_pSLConfigDescr(NULL)
  498.     , m_pIPIPtr(NULL)
  499.     , m_pIPIDS(NULL)
  500.     , m_pQOSDescr(NULL)
  501. {
  502.     ;
  503. }
  504. ES_Descriptor::~ES_Descriptor(void)
  505. {
  506.     HX_VECTOR_DELETE(m_pURLString);
  507.     HX_DELETE(m_pExtDescrArray);
  508.     HX_DELETE(m_pLangDescr);
  509.     HX_DELETE(m_pDecConfigDescr);
  510.     HX_DELETE(m_pSLConfigDescr);
  511.     HX_DELETE(m_pIPIPtr);
  512.     HX_DELETE(m_pIPIDS);
  513.     HX_DELETE(m_pQOSDescr);
  514. }
  515. /****************************************************************************
  516.  *  Public functions
  517.  */
  518. HX_RESULT ES_Descriptor::Unpack(UINT8* &pData, 
  519. ULONG32 &ulSize,
  520. ULONG32 ulFlags)
  521. {
  522.     LD bitInfo;
  523.     UINT8 uTag;
  524.     UINT8* pPreOCRData = NULL;
  525.     ULONG32 ulPreOCRSize = 0;
  526.     UINT8* pLastData = NULL;
  527.     ULONG32 ulLastSize = 0;
  528.     ULONG32 ulStartSize = ulSize;
  529.     BOOL bAlternateParseMode = FALSE;
  530.     BOOL bAttemptPreOCRSyntax = FALSE;
  531.     HX_RESULT retVal = HXR_INVALID_PARAMETER;
  532.     
  533.     m_ulFlags = ulFlags;
  534.     if (ulSize >= 5)
  535.     {
  536. m_uTag = GetTag(pData, ulSize, TRUE);
  537. retVal = HXR_OK;
  538.     }
  539.     
  540.     if (retVal == HXR_OK)
  541.     {
  542. retVal = HXR_INVALID_PARAMETER;
  543. if (ulSize >= 4)
  544. {   
  545.     m_uLength = (UINT16) GetSize(pData, ulSize, TRUE);
  546.     
  547.     if (ulSize >= 3)
  548.     {
  549. m_uESid = GetUI16(pData);
  550. pData += 2;
  551.     
  552. initbuffer(pData, &bitInfo);
  553. m_bStreamDependenceFlag = getbits1(&bitInfo);
  554. m_bURLflag = getbits1(&bitInfo);
  555. m_bOCRStreamFlag = (getbits1(&bitInfo) != 0);
  556. m_uStreamPriority = (UINT8) getbits(5, &bitInfo);
  557. pData++;
  558.     
  559. ulSize -= 3;
  560. retVal = HXR_OK;
  561.     }
  562. }
  563.     }
  564.     
  565.     if (retVal == HXR_OK)
  566.     {
  567. if (m_bStreamDependenceFlag)
  568. {
  569.     retVal = HXR_INVALID_PARAMETER;
  570.     if (ulSize >= 2)
  571.     {
  572. retVal = HXR_OK;
  573. m_uDependsOn_ES_ID = GetUI16(pData);
  574. pData += 2;
  575. ulSize -= 2;
  576.     }
  577. }
  578.     }
  579.     
  580.     if (retVal == HXR_OK)
  581.     {
  582. if (m_bURLflag)
  583. {
  584.     retVal = HXR_INVALID_PARAMETER;
  585.     if (ulSize >= 1)
  586.     {
  587. ULONG32 ulURLLength = pData[0];
  588. pData++;
  589. ulSize--;
  590. if (ulSize >= ulURLLength)
  591. {
  592.     m_pURLString = new UINT8 [ulURLLength + 1];
  593.     
  594.     retVal = HXR_OUTOFMEMORY;
  595.     if (m_pURLString)
  596.     {
  597. retVal = HXR_OK;
  598.     }
  599.     
  600.     if (retVal == HXR_OK)
  601.     {
  602. memcpy(m_pURLString, pData, ulURLLength); /* Flawfinder: ignore */
  603. m_pURLString[ulURLLength] = '';
  604. pData += ulURLLength;
  605. ulSize -= ulURLLength;
  606.     }
  607. }
  608.     }
  609. }
  610.     }
  611.     
  612.     do
  613.     {
  614. bAttemptPreOCRSyntax = FALSE;
  615. if (retVal == HXR_OK)
  616. {
  617.     if (m_bOCRStreamFlag)
  618.     {
  619. pPreOCRData = pData;
  620. ulPreOCRSize = ulSize;
  621. retVal = HXR_INVALID_PARAMETER;
  622. if (ulSize >= 2)
  623. {
  624.     retVal = HXR_OK;
  625.     
  626.     m_uOCR_ES_ID = GetUI16(pData);
  627.     pData += 2;
  628.     
  629.     ulSize -= 2;
  630. }
  631.     }
  632. }
  633. while ((retVal == HXR_OK) &&
  634.     (ulSize > 0))
  635. {
  636.     uTag = GetTag(pData, ulSize);
  637.     
  638.     switch (GetDescType(uTag))
  639.     {
  640.     case DTYP_DECODER_CONFIG:     
  641. pLastData = pData;
  642. ulLastSize = ulSize;
  643. HX_DELETE(m_pDecConfigDescr);
  644. m_pDecConfigDescr = new DecoderConfigDescriptor;
  645. if (bAlternateParseMode)
  646. {
  647.     m_ulFlags |= SIZE_HEADER_INCLUSIVE;
  648. }
  649. retVal = m_pDecConfigDescr->Unpack(pData, 
  650.     ulSize, 
  651.     m_ulFlags);
  652. #ifdef _SHORTCUT_ON_DECCONFIG
  653. if (SUCCEEDED(retVal))
  654. {
  655.     ulSize = 0;
  656. }
  657. #endif // _SHORTCUT_ON_DECCONFIG
  658. break;
  659.     case DTYP_SL_CONFIG:
  660. HX_DELETE(m_pSLConfigDescr);
  661. m_pSLConfigDescr = new SLConfigDescriptor;
  662. retVal = m_pSLConfigDescr->Unpack(pData, ulSize);
  663. break;
  664.     default:
  665. retVal = HXR_INVALID_PARAMETER;
  666. break;
  667.     }
  668.     
  669. #ifdef _ATTEMPT_ALTERNATE_PARSING_MODES
  670.     if (FAILED(retVal) &&
  671. pLastData &&
  672. (!bAlternateParseMode))
  673.     {
  674. bAlternateParseMode = TRUE;
  675. pData = pLastData;
  676. ulSize = ulLastSize;
  677. pLastData = NULL;
  678. ulLastSize = 0;
  679. retVal = HXR_OK;
  680.     }
  681. #endif // _ATTEMPT_ALTERNATE_PARSING_MODES
  682. }
  683. if (FAILED(retVal) && m_bOCRStreamFlag && pPreOCRData)
  684. {
  685. #ifdef _ATTEMPT_PREOCR_SYNTAX
  686.     // OCR was introduced later - after Phillips produced its files
  687.     // and thus some older files have OCR flag and no OCR_ES_ID
  688.     // since previously the OCR flag bit was considered reserved and
  689.     // had no meaning.
  690.     pData = pPreOCRData;
  691.     ulSize = ulPreOCRSize;
  692.     m_bOCRStreamFlag = FALSE;
  693.     bAttemptPreOCRSyntax = TRUE;
  694.     retVal = HXR_OK;
  695. #endif // _ATTEMPT_PREOCR_SYNTAX
  696. }
  697.     } while (bAttemptPreOCRSyntax);
  698.     
  699.     if (SUCCEEDED(retVal))
  700.     {
  701. if ((ulStartSize - ulSize) == m_uLength)
  702. {
  703.     m_ulFlags |= SIZE_HEADER_INCLUSIVE;
  704. }
  705.     }
  706.     return retVal;
  707. }