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

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 _OVERALLOC_CODEC_DATA 3
  39. #define FLUSH_ALL_PACKETS   0xFFFFFFFF
  40. #define CHAR_LF 0x0a
  41. #define CHAR_CR 0x0d
  42. #define FORMAT_PARAMETERS_PREFIX "a=fmtp:0 "
  43. #define FORMAT_PARAMETERS_PREFIX_SIZE (sizeof(FORMAT_PARAMETERS_PREFIX) - 1)
  44. #define MAX_AUPACKETS_IN_RTPPACKET 50
  45. #define MAX_PACKET_FRAGMENTS 256
  46. #define MAX_AU_FRAGMENTS 256
  47. #define MAX_AU_PACKETS 256
  48. #define MAX_INT_TEXT_LENGTH 10
  49. /****************************************************************************
  50.  *  Includes
  51.  */
  52. #include "hxtypes.h"
  53. #include "hxwintyp.h"
  54. #include "hxcom.h"
  55. #include "hxcomm.h"
  56. #include "hxassert.h"
  57. #include "hxslist.h"
  58. #include "hxstrutl.h"
  59. #include "hxcomm.h"
  60. #include "ihxpckts.h"
  61. #include "hxformt.h"
  62. #include "hxrendr.h"
  63. #include "hxformt.h"
  64. #include "hxengin.h"
  65. #include "bitstuff.h"
  66. #include "sdpchunk.h"
  67. #include "sdptools.h"
  68. #include "mp4gpyld.h"
  69. MP4GPayloadFormat::MP4GPayloadFormat()
  70.     : m_lRefCount     (0)
  71.     , m_pClassFactory     (NULL)
  72.     , m_pStreamHeader     (NULL)
  73.     , m_bFlushed     (FALSE)
  74.     , m_bUsesRTPPackets     (FALSE)
  75.     , m_bRTPPacketTested    (FALSE)
  76.     , m_bPacketize     (FALSE)
  77.     , m_ulSamplesPerSecond  (1000)
  78.     , m_ulRTPSamplesPerSecond(0)
  79.     , m_bPriorLoss     (FALSE)
  80.     , m_pPacketFragments    (NULL)
  81.     , m_pAUFragments     (NULL)
  82.     , m_pAUPackets     (NULL)
  83.     , m_ulMaxPacketFragments(MAX_PACKET_FRAGMENTS)
  84.     , m_ulMaxAUFragments    (MAX_AU_FRAGMENTS)
  85.     , m_ulMaxAUPackets     (MAX_AU_PACKETS)
  86.     , m_ulNumPacketFragments(0)
  87.     , m_ulNumAUFragments    (0)
  88.     , m_ulNumAUPackets     (0)
  89.     , m_bStartPacket     (TRUE)
  90.     , m_ulAUDuration     (0)
  91.     , m_ulFrameCount     (0)
  92.     , m_bLastReapedSet     (FALSE)
  93.     , m_bEarliestDeintTimeKnown(FALSE)
  94. {
  95.     ;
  96. }
  97. MP4GPayloadFormat::~MP4GPayloadFormat()
  98. {
  99.     Reset();
  100.     HX_VECTOR_DELETE(m_pPacketFragments);
  101.     HX_VECTOR_DELETE(m_pAUFragments);
  102.     HX_VECTOR_DELETE(m_pAUPackets);
  103.     HX_RELEASE(m_pClassFactory);
  104.     HX_RELEASE(m_pStreamHeader);
  105. }
  106. HX_RESULT MP4GPayloadFormat::Build(REF(IMP4APayloadFormat*) pFmt)
  107. {
  108.     pFmt = new MP4GPayloadFormat();
  109.     HX_RESULT res = HXR_OUTOFMEMORY;
  110.     if (pFmt)
  111.     {
  112. pFmt->AddRef();
  113. res = HXR_OK;
  114.     }
  115.     return res;
  116. }
  117. // *** IUnknown methods ***
  118. /////////////////////////////////////////////////////////////////////////
  119. //  Method:
  120. // IUnknown::QueryInterface
  121. //  Purpose:
  122. // Implement this to export the interfaces supported by your
  123. // object.
  124. //
  125. STDMETHODIMP
  126. MP4GPayloadFormat::QueryInterface(REFIID riid, void** ppvObj)
  127. {
  128.     QInterfaceList qiList[] =
  129.     {
  130. { GET_IIDHANDLE(IID_IUnknown), this },
  131. { GET_IIDHANDLE(IID_IHXPayloadFormatObject), (IHXPayloadFormatObject*) this },
  132.     };
  133.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  134. }
  135. /////////////////////////////////////////////////////////////////////////
  136. //  Method:
  137. // IUnknown::AddRef
  138. //  Purpose:
  139. // Everyone usually implements this the same... feel free to use
  140. // this implementation.
  141. //
  142. STDMETHODIMP_(ULONG32)
  143. MP4GPayloadFormat::AddRef()
  144. {
  145.     return InterlockedIncrement(&m_lRefCount);
  146. }
  147. /////////////////////////////////////////////////////////////////////////
  148. //  Method:
  149. // IUnknown::Release
  150. //  Purpose:
  151. // Everyone usually implements this the same... feel free to use
  152. // this implementation.
  153. //
  154. STDMETHODIMP_(ULONG32)
  155. MP4GPayloadFormat::Release()
  156. {
  157.     if (InterlockedDecrement(&m_lRefCount) > 0)
  158.     {
  159.         return m_lRefCount;
  160.     }
  161.     delete this;
  162.     return 0;
  163. }
  164. STDMETHODIMP
  165. MP4GPayloadFormat::Init(IUnknown* pContext,
  166. BOOL bPacketize)
  167. {
  168.     HX_RESULT retVal = HXR_OK;
  169.     HX_RELEASE(m_pClassFactory);
  170.     m_bPacketize = bPacketize;
  171.     if (SUCCEEDED(retVal))
  172.     {
  173. retVal = pContext->QueryInterface(IID_IHXCommonClassFactory,
  174.   (void**) &m_pClassFactory);
  175.     }
  176.     if (SUCCEEDED(retVal))
  177.     {
  178. retVal = HXR_OUTOFMEMORY;
  179. m_pPacketFragments = new IHXPacket* [m_ulMaxPacketFragments];
  180. m_pAUFragments = new CAUPacket* [m_ulMaxAUFragments];
  181. m_pAUPackets = new CAUPacket* [m_ulMaxAUPackets];
  182. if (m_pPacketFragments &&
  183.     m_pAUFragments &&
  184.     m_pAUPackets)
  185. {
  186.     memset(m_pPacketFragments, 0, sizeof(IHXPacket*) * m_ulMaxPacketFragments);
  187.     memset(m_pAUFragments, 0, sizeof(CAUPacket*) * m_ulMaxAUFragments);
  188.     memset(m_pAUPackets, 0, sizeof(CAUPacket*) * m_ulMaxAUPackets);
  189.     retVal = HXR_OK;
  190. }
  191.     }
  192.     return retVal;
  193. }
  194. STDMETHODIMP
  195. MP4GPayloadFormat::Reset()
  196. {
  197.     // Release all input packets we have stored
  198.     FlushQueues();
  199.     FlushArrays();
  200.     m_bFlushed = FALSE;
  201.     m_bPriorLoss = FALSE;
  202.     m_bStartPacket = TRUE;
  203.     m_ulFrameCount = 0;
  204.     m_TSConverter.Reset();
  205.     return HXR_OK;
  206. }
  207. STDMETHODIMP
  208. MP4GPayloadFormat::SetStreamHeader(IHXValues* pHeader)
  209. {
  210.     HX_RESULT retVal;
  211.     if (pHeader)
  212.     {
  213. m_pStreamHeader = pHeader;
  214. m_pStreamHeader->AddRef();
  215.     }
  216.     if (m_bPacketize)
  217.     {
  218. retVal = SetPacketizerHeader(pHeader);
  219.     }
  220.     else
  221.     {
  222. retVal = SetAssemblerHeader(pHeader);
  223.     }
  224.     return retVal;
  225. }
  226. HX_RESULT MP4GPayloadFormat::SetPacketizerHeader(IHXValues* pHeader)
  227. {
  228.     return HXR_OK;
  229. }
  230. HX_RESULT MP4GPayloadFormat::SetAssemblerHeader(IHXValues* pHeader)
  231. {
  232.     IHXBuffer* pMimeType = NULL;
  233.     const char* pMimeTypeData = NULL;
  234.     HX_RESULT retVal = HXR_INVALID_PARAMETER;
  235.     if (pHeader)
  236.     {
  237. retVal = HXR_OK;
  238.     }
  239.     if (SUCCEEDED(retVal))
  240.     {
  241. retVal = pHeader->GetPropertyCString("MimeType", pMimeType);
  242.     }
  243.     if (SUCCEEDED(retVal))
  244.     {
  245. pMimeTypeData = (char*) pMimeType->GetBuffer();
  246. retVal = HXR_FAIL;
  247. if (pMimeTypeData)
  248. {
  249.     retVal = HXR_OK;
  250. }
  251.     }
  252.     // Determine payload type here based on mime type
  253.     if (SUCCEEDED(retVal))
  254.     {
  255. retVal = HXR_FAIL;
  256. if ((strcasecmp(pMimeTypeData, "audio/mpeg4-simple-A2") == 0) ||
  257.     (strcasecmp(pMimeTypeData, "audio/x-ralf-mpeg4-generic") == 0) ||
  258.     (strcasecmp(pMimeTypeData, "audio/mpeg4-generic") == 0) ||
  259.     (strcasecmp(pMimeTypeData, "video/mpeg4-generic") == 0))
  260. {
  261.     retVal = HXR_OK;
  262. }
  263.     }
  264.     if (SUCCEEDED(retVal))
  265.     {
  266. char *pData = NULL;
  267. char* pAllocData = NULL;
  268. IHXBuffer* pSDPData = NULL;
  269. IHXValues* pValues = NULL;
  270. ULONG32 ulTryIdx = 0;
  271. do
  272. {
  273.     if (ulTryIdx == 0)
  274.     {
  275. retVal = pHeader->GetPropertyCString("SDPData", pSDPData);
  276. if (SUCCEEDED(retVal))
  277. {
  278.     pData = (char*) pSDPData->GetBuffer();
  279.     retVal = HXR_FAIL;
  280.     if (pData)
  281.     {
  282. retVal = HXR_OK;
  283.     }
  284. }
  285.     }
  286.     else
  287.     {
  288. retVal = pHeader->GetPropertyCString("PayloadParameters", pSDPData);
  289. if (SUCCEEDED(retVal))
  290. {
  291.     ULONG32 ulDataLen;
  292.     pData = (char*) pSDPData->GetBuffer();
  293.     ulDataLen = strlen(pData);
  294.     pAllocData = new char [ulDataLen +
  295. FORMAT_PARAMETERS_PREFIX_SIZE +
  296. 2];
  297.     retVal = HXR_OUTOFMEMORY;
  298.     if (pAllocData)
  299.     {
  300. strcpy(pAllocData, FORMAT_PARAMETERS_PREFIX); /* Flawfinder: ignore */
  301. strcpy(pAllocData + FORMAT_PARAMETERS_PREFIX_SIZE, pData); /* Flawfinder: ignore */
  302. pAllocData[FORMAT_PARAMETERS_PREFIX_SIZE + ulDataLen] =
  303.     CHAR_LF;
  304. pAllocData[FORMAT_PARAMETERS_PREFIX_SIZE + 1 + ulDataLen] =
  305.     '';
  306. pData = pAllocData;
  307. retVal = HXR_OK;
  308.     }
  309. }
  310.     }
  311.     if (SUCCEEDED(retVal))
  312.     {
  313. retVal = SDPParseChunk(pData,
  314.     strlen(pData),
  315.     pValues,
  316.     m_pClassFactory,
  317.     SDPCTX_Renderer);
  318.     }
  319.     HX_VECTOR_DELETE(pAllocData);
  320.     if (SUCCEEDED(retVal))
  321.     {
  322. retVal = SetAssemblerConfig(pValues);
  323.     }
  324.     if (SUCCEEDED(retVal))
  325.     {
  326. m_ulAUDuration = m_Config.m_ulConstantDuration;
  327.     }
  328.     HX_RELEASE(pSDPData);
  329.     HX_RELEASE(pValues);
  330.     ulTryIdx++;
  331. } while (FAILED(retVal) && (ulTryIdx < 2));
  332.     }
  333.     if (SUCCEEDED(retVal))
  334.     {
  335. m_pStreamHeader->GetPropertyULONG32("SamplesPerSecond",
  336.     m_ulRTPSamplesPerSecond);
  337.     }
  338.     HX_RELEASE(pMimeType);
  339.     return retVal;
  340. }
  341. HX_RESULT MP4GPayloadFormat::SetAssemblerConfig(IHXValues* pFMTParams)
  342. {
  343.     return m_Config.Init(pFMTParams, m_pClassFactory);
  344. }
  345. HX_RESULT MP4GPayloadFormat::CFormatConfig::Init(IHXValues* pFMTParams,
  346.  IHXCommonClassFactory* pClassFactory)
  347. {
  348.     IHXBuffer* pConfigString = NULL;
  349.     IHXBuffer* pModeString = NULL;
  350.     HX_RESULT retVal = HXR_OK;
  351.     HX_ASSERT(pFMTParams);
  352.     // Obtain Required parameters
  353.     retVal = pFMTParams->GetPropertyULONG32("FMTPstreamtype",
  354.     m_ulStreamType);
  355.     if (SUCCEEDED(retVal))
  356.     {
  357. retVal = pFMTParams->GetPropertyULONG32("FMTPprofile-level-id",
  358. m_ulProfileLevelID);
  359.     }
  360.     if (SUCCEEDED(retVal))
  361.     {
  362. retVal = pFMTParams->GetPropertyCString("FMTPconfig",
  363. pConfigString);
  364. if (FAILED(retVal))
  365. {
  366.     ULONG32 ulConfigVal = 0;
  367.     retVal = pFMTParams->GetPropertyULONG32("FMTPconfig",
  368.     ulConfigVal);
  369.     if (SUCCEEDED(retVal))
  370.     {
  371. retVal = pClassFactory->CreateInstance(IID_IHXBuffer,
  372.        (void**) &pConfigString);
  373.     }
  374.     if (SUCCEEDED(retVal))
  375.     {
  376. retVal = pConfigString->SetSize(MAX_INT_TEXT_LENGTH + 1);
  377.     }
  378.     if (SUCCEEDED(retVal))
  379.     {
  380. SafeSprintf((char*) pConfigString->GetBuffer(), MAX_INT_TEXT_LENGTH + 1, "%ld",
  381. ulConfigVal);
  382.     }
  383. }
  384.     }
  385.     // Obtain optional parameters
  386.     if (SUCCEEDED(retVal))
  387.     {
  388. pFMTParams->GetPropertyCString("FMTPmode", pModeString);
  389. pFMTParams->GetPropertyULONG32("FMTPConstantSize", m_ulConstantSize);
  390. pFMTParams->GetPropertyULONG32("FMTPConstantDuration", m_ulConstantDuration);
  391. pFMTParams->GetPropertyULONG32("FMTPSizeLength", m_ulSizeLength);
  392. pFMTParams->GetPropertyULONG32("FMTPIndexLength", m_ulIndexLength);
  393. pFMTParams->GetPropertyULONG32("FMTPIndexDeltaLength", m_ulIndexDeltaLength);
  394. pFMTParams->GetPropertyULONG32("FMTPCTSDeltaLength", m_ulCTSDeltaLength);
  395. pFMTParams->GetPropertyULONG32("FMTPDTSDeltaLength", m_ulDTSDeltaLength);
  396. pFMTParams->GetPropertyULONG32("FMTPAuxDataSizeLength", m_ulAuxDataSizeLength);
  397. pFMTParams->GetPropertyULONG32("FMTPProfile", m_ulProfile);
  398.     }
  399.     // Perform any needed translations
  400.     if (SUCCEEDED(retVal))
  401.     {
  402. // Determine Mode from Mode String
  403. if (pModeString)
  404. {
  405.     const char* pMode = (char*) pModeString->GetBuffer();
  406.     if (pMode)
  407.     {
  408. if (strcasecmp(pMode, "A0") == 0)
  409. {
  410.     m_Mode = MODE_A0;
  411. }
  412. else if (strcasecmp(pMode, "A1") == 0)
  413. {
  414.     m_Mode = MODE_A1;
  415. }
  416. else if (strcasecmp(pMode, "A2") == 0)
  417. {
  418.     m_Mode = MODE_A2;
  419. }
  420.     }
  421. }
  422. // Convert decoder configuration from ascii hex to binary
  423. if (pConfigString)
  424. {
  425.     ULONG32 ulConfigSize;
  426.     const char* pConfig = (char*) pConfigString->GetBuffer();
  427.     IHXBuffer* pConfigBuffer = NULL;
  428.     if (pConfig)
  429.     {
  430. ulConfigSize = strlen(pConfig) / 2;
  431. if (ulConfigSize > 0)
  432. {
  433.     retVal = pClassFactory->CreateInstance(IID_IHXBuffer,
  434.    (void**) &pConfigBuffer);
  435.     if (SUCCEEDED(retVal))
  436.     {
  437. retVal = pConfigBuffer->SetSize(ulConfigSize);
  438.     }
  439.     if (SUCCEEDED(retVal))
  440.     {
  441. retVal = HexStringToBinary(pConfigBuffer->GetBuffer(),
  442.    pConfig);
  443.     }
  444. }
  445.     }
  446.     if (SUCCEEDED(retVal))
  447.     {
  448. m_pConfig = pConfigBuffer;
  449. if (m_pConfig)
  450. {
  451.     m_pConfig->AddRef();
  452. }
  453.     }
  454.     HX_RELEASE(pConfigBuffer);
  455. }
  456.     }
  457.     // Compute dervied parameter
  458.     if (SUCCEEDED(retVal))
  459.     {
  460. m_bHasAUHeaders = ((m_ulSizeLength != 0) ||
  461.    (m_ulIndexLength != 0) ||
  462.    (m_ulIndexDeltaLength != 0) ||
  463.    (m_ulCTSDeltaLength != 0) ||
  464.    (m_ulDTSDeltaLength != 0));
  465.     }
  466.     HX_RELEASE(pModeString);
  467.     HX_RELEASE(pConfigString);
  468.     return retVal;
  469. }
  470. STDMETHODIMP
  471. MP4GPayloadFormat::GetStreamHeader(REF(IHXValues*) pHeader)
  472. {
  473.     HX_RESULT retVal = HXR_FAIL;
  474.     if (m_pStreamHeader)
  475.     {
  476. retVal = HXR_OK;
  477. pHeader = m_pStreamHeader;
  478. pHeader->AddRef();
  479.     }
  480.     return retVal;
  481. }
  482. STDMETHODIMP
  483. MP4GPayloadFormat::SetPacket(IHXPacket* pPacket)
  484. {
  485.     HX_RESULT retVal = HXR_OK;
  486.     HX_ASSERT(pPacket);
  487.     if (!m_bRTPPacketTested)
  488.     {
  489. IHXRTPPacket* pRTPPacket = NULL;
  490. m_bUsesRTPPackets = (pPacket->QueryInterface(
  491. IID_IHXRTPPacket,
  492. (void**) &pRTPPacket)
  493.     == HXR_OK);
  494. m_bRTPPacketTested = TRUE;
  495. HX_RELEASE(pRTPPacket);
  496. if (m_bUsesRTPPackets)
  497. {
  498.     if (m_ulRTPSamplesPerSecond == 0)
  499.     {
  500. m_ulRTPSamplesPerSecond = m_ulSamplesPerSecond;
  501.     }
  502.     HX_ASSERT(m_ulSamplesPerSecond != 0);
  503. }
  504. else
  505. {
  506.     m_ulRTPSamplesPerSecond = 1000; // RDT time stamp
  507. }
  508. m_TSConverter.SetBase(m_ulRTPSamplesPerSecond,
  509.       m_ulSamplesPerSecond);
  510.     }
  511.     if (m_bPacketize)
  512.     {
  513. retVal = SetPacketizerPacket(pPacket);
  514.     }
  515.     else
  516.     {
  517. retVal = SetAssemblerPacket(pPacket);
  518.     }
  519.     if (retVal == HXR_OK)
  520.     {
  521. // Add this packet to our list of input packets
  522. pPacket->AddRef();
  523. m_InputQueue.AddTail(pPacket);
  524.     }
  525.     else if (retVal == HXR_NO_DATA)
  526.     {
  527. retVal = HXR_OK;
  528.     }
  529.     return retVal;
  530. }
  531. HX_RESULT MP4GPayloadFormat::SetPacketizerPacket(IHXPacket* pPacket)
  532. {
  533.     return HXR_NOTIMPL;
  534. }
  535. HX_RESULT MP4GPayloadFormat::SetAssemblerPacket(IHXPacket* pPacket)
  536. {
  537.     ULONG32 ulPacketTime;
  538.     HX_RESULT retVal = HXR_NO_DATA;
  539.     if (!pPacket->IsLost())
  540.     {
  541. ulPacketTime = GetPacketTime(pPacket);
  542. if (m_bStartPacket)
  543. {
  544.     m_bStartPacket = FALSE;
  545.     m_ulLastPacketTime = ulPacketTime;
  546. }
  547. else if (ulPacketTime != m_ulLastPacketTime)
  548. {
  549.     m_ulFrameCount++;
  550.     m_ulLastPacketTime = ulPacketTime;
  551. }
  552. if (pPacket->GetASMRuleNumber() == 1)
  553. {
  554.     m_ulFrameCount++;
  555.     m_bStartPacket = TRUE;
  556. }
  557. retVal = HXR_OK;
  558.     }
  559.     return retVal;
  560. }
  561. STDMETHODIMP
  562. MP4GPayloadFormat::GetPacket(REF(IHXPacket*) pOutPacket)
  563. {
  564.     HX_RESULT retVal = HXR_OK;
  565.     if (m_bPacketize)
  566.     {
  567. retVal = GetPacketizerPacket(pOutPacket);
  568.     }
  569.     else
  570.     {
  571. retVal = GetAssemblerPacket(pOutPacket);
  572.     }
  573.     return retVal;
  574. }
  575. HX_RESULT MP4GPayloadFormat::GetPacketizerPacket(IHXPacket* &pOutPacket)
  576. {
  577.     HX_RESULT retVal = HXR_NOTIMPL;
  578.     return retVal;
  579. }
  580. HX_RESULT MP4GPayloadFormat::GetAssemblerPacket(IHXPacket* &pOutPacket)
  581. {
  582.     HX_RESULT retVal = HXR_NOTIMPL;
  583.     return retVal;
  584. }
  585. HX_RESULT MP4GPayloadFormat::CreateMediaPacket(CMediaPacket* &pOutMediaPacket)
  586. {
  587.     HX_RESULT retVal = HXR_OK;
  588.     CMediaPacket* pMediaPacket;
  589.     pMediaPacket = StripPacket();
  590.     if (!pMediaPacket)
  591.     {
  592. retVal = ProducePackets();
  593. if (retVal == HXR_OK)
  594. {
  595.     pMediaPacket = StripPacket();
  596. }
  597. else if ((retVal == HXR_NO_DATA) &&
  598.          m_bFlushed)
  599. {
  600.     retVal = HXR_STREAM_DONE;
  601. }
  602.     }
  603.     if (retVal == HXR_OK)
  604.     {
  605. pOutMediaPacket = pMediaPacket;
  606.     }
  607.     return retVal;
  608. }
  609. HX_RESULT MP4GPayloadFormat::SetSamplingRate(ULONG32 ulSamplesPerSecond)
  610. {
  611.     HX_RESULT retVal = HXR_UNEXPECTED;
  612.     if (!m_bRTPPacketTested)
  613.     {
  614. m_ulSamplesPerSecond = ulSamplesPerSecond;
  615. retVal = HXR_OK;
  616.     }
  617.     
  618.     return retVal;
  619. }
  620. ULONG32 MP4GPayloadFormat::GetTimeBase(void)
  621. {
  622.     return m_ulSamplesPerSecond;
  623. }
  624. HX_RESULT MP4GPayloadFormat::SetAUDuration(ULONG32 ulAUDuration)
  625. {
  626.     HX_RESULT retVal = HXR_OK;
  627.     if (m_Config.m_ulConstantDuration == 0)
  628.     {
  629. CTSConverter tempConverter;
  630. tempConverter.SetBase(m_ulSamplesPerSecond, m_ulRTPSamplesPerSecond);
  631. m_ulAUDuration = tempConverter.ConvertVector(ulAUDuration);
  632.     }
  633.     return retVal;
  634. }
  635. HX_RESULT MP4GPayloadFormat::SetTimeAnchor(ULONG32 ulTimeMs)
  636. {
  637.     CTSConverter tempConverter;
  638.     ULONG32 ulSamplesAnchor;
  639.     ULONG32 ulRTPSamplesAnchor;
  640.     tempConverter.SetBase(1000, m_ulSamplesPerSecond);
  641.     ulSamplesAnchor = tempConverter.ConvertVector(ulTimeMs);
  642.     tempConverter.SetBase(1000, m_ulRTPSamplesPerSecond);
  643.     ulRTPSamplesAnchor = tempConverter.ConvertVector(ulTimeMs);
  644.     m_TSConverter.SetAnchor(ulRTPSamplesAnchor, ulSamplesAnchor);
  645.     return HXR_OK;
  646. }
  647. CMediaPacket* MP4GPayloadFormat::StripPacket(void)
  648. {
  649.     CMediaPacket* pMediaPacket = NULL;
  650.     if (!m_OutputQueue.IsEmpty())
  651.     {
  652. pMediaPacket = (CMediaPacket*) m_OutputQueue.RemoveHead();
  653.     }
  654.     return pMediaPacket;
  655. }
  656. HX_RESULT MP4GPayloadFormat::ProducePackets(void)
  657. {
  658.     BOOL bTryAgain;
  659.     HX_RESULT retVal = HXR_OK;
  660.     do
  661.     {
  662. bTryAgain = FALSE;
  663. retVal = CollectPacketFragments(m_pPacketFragments, // out
  664. m_ulNumPacketFragments, // out
  665. m_ulMaxPacketFragments);// out
  666. if (retVal == HXR_OK)
  667. {
  668.     retVal = ParsePacketFragments(m_pAUFragments,     // out
  669.   m_ulNumAUFragments,     // out
  670.   m_ulMaxAUFragments,     // in/out
  671.   m_pPacketFragments,     // in
  672.   m_ulNumPacketFragments);  // in
  673.     if (retVal == HXR_OK)
  674.     {
  675. retVal = AggregateAUFragments(m_pAUPackets,     // out
  676.       m_ulNumAUPackets,     // out
  677.       m_ulMaxAUPackets,     // in/out
  678.       m_pAUFragments,     // in
  679.       m_ulNumAUFragments);  // in
  680.     }
  681.     bTryAgain = (retVal != HXR_OK);
  682.     if (retVal == HXR_OK)
  683.     {
  684. retVal = DeinterleaveAUPackets(m_pAUPackets,
  685.        m_ulNumAUPackets);
  686.     }
  687. }
  688.     } while (bTryAgain);
  689.     if (SUCCEEDED(retVal))
  690.     {
  691. retVal = ReapMediaPacket(m_ulLastPacketTime);
  692.     }
  693.     return retVal;
  694. }
  695. HX_RESULT MP4GPayloadFormat::CollectPacketFragments(IHXPacket** &pPacketFragments,
  696.     ULONG32 &ulNumPacketFragments,
  697.     ULONG32 &ulMaxPacketFragments)
  698. {
  699.     ULONG32 ulPacketTime;
  700.     IHXPacket* pPacket;
  701.     HX_RESULT retVal = HXR_NO_DATA;
  702.     FlushPacketArray(pPacketFragments, ulNumPacketFragments);
  703.     if (m_ulFrameCount != 0)
  704.     {
  705. pPacket = (IHXPacket*) m_InputQueue.RemoveHead();
  706. pPacketFragments[ulNumPacketFragments++] = pPacket;
  707. if (pPacket->GetASMRuleNumber() == 0)
  708. {
  709.     ulPacketTime = GetPacketTime(pPacket);
  710.     pPacket = (IHXPacket*) m_InputQueue.GetHead();
  711.     while (GetPacketTime(pPacket) == ulPacketTime)
  712.     {
  713. pPacket = (IHXPacket*) m_InputQueue.RemoveHead();
  714. pPacketFragments[ulNumPacketFragments++] = pPacket;
  715. if (pPacket->GetASMRuleNumber() != 0)
  716. {
  717.     // the last fragment carries the M(arker) bit, which is
  718.     // signalled by a rule != 0
  719.     break;
  720. }
  721. pPacket = (IHXPacket*) m_InputQueue.GetHead();
  722.     }
  723. }
  724. HX_ASSERT(ulNumPacketFragments <= ulMaxPacketFragments);
  725. m_ulFrameCount--;
  726. retVal = HXR_OK;
  727.     }
  728.     return retVal;
  729. }
  730. HX_RESULT MP4GPayloadFormat::ParsePacketFragments(CAUPacket** &pAUFragments,
  731.   ULONG32 &ulNumAUFragments,
  732.   ULONG32 &ulMaxAUFragments,
  733.   IHXPacket** pPacketFragments,
  734.   ULONG32& ulNumPacketFragments)
  735. {
  736.     HX_RESULT retVal;
  737.     ULONG32 ulIdx = 0;
  738.     FlushAUArray(pAUFragments, ulNumAUFragments);
  739.     do
  740.     {
  741. retVal = ParsePacketFragment(pAUFragments,
  742.      ulNumAUFragments,
  743.      ulMaxAUFragments,
  744.      pPacketFragments[ulIdx]);
  745. pPacketFragments[ulIdx]->Release();
  746. pPacketFragments[ulIdx] = NULL;
  747. ulIdx++;
  748.     } while ((retVal == HXR_OK) && (ulIdx < ulNumPacketFragments));
  749.     if (ulIdx >= ulNumPacketFragments)
  750.     {
  751. ulNumPacketFragments = 0;
  752.     }
  753.     return retVal;
  754. }
  755. HX_RESULT MP4GPayloadFormat::ParsePacketFragment(CAUPacket** &pAUFragments,
  756.  ULONG32 &ulNumAUFragments,
  757.  ULONG32 &ulMaxAUFragments,
  758.  IHXPacket* pPacketFragment)
  759. {
  760.     ULONG32 ulFirstAUFragment = ulNumAUFragments;
  761.     ULONG32 ulStartCTS = GetPacketTime(pPacketFragment);
  762.     ULONG32 ulCTS = ulStartCTS;
  763.     ULONG32 ulDTS = ulCTS;
  764.     ULONG32 ulIdx = 0;
  765.     ULONG32 ulBaseIdx = 0;
  766.     ULONG32 ulVal = 0;
  767.     ULONG32 ulAUHdrStart = 0;
  768.     ULONG32 ulAUHdrLength = 0; // in bits
  769.     ULONG32 ulAUHdrSize = 0; // in bytes
  770.     ULONG32 ulAuxStart = 0;
  771.     ULONG32 ulAuxLength = 0; // in bits
  772.     ULONG32 ulAuxSize = 0; // in bytes
  773.     ULONG32 ulAUStart = 0;
  774.     ULONG32 ulAUSizeSum = 0;
  775.     ULONG32 ulAUSize = 0;
  776.     ULONG32 ulFixedSizeAUCount = 0;
  777.     IHXBuffer* pBuffer = NULL;
  778.     UINT8* pData = NULL;
  779.     LD bitInfo;
  780.     CAUPacket* pAUPacket = 0;
  781.     BOOL bFirstAU = TRUE;
  782.     HX_RESULT retVal = HXR_FAIL;
  783.     HX_ASSERT(pPacketFragment);
  784.     pBuffer = pPacketFragment->GetBuffer();
  785.     if (pBuffer)
  786.     {
  787. pData = pBuffer->GetBuffer();
  788. if (pData)
  789. {
  790.      retVal = HXR_OK;
  791. }
  792. pBuffer->Release();
  793.     }
  794.     if (retVal == HXR_OK)
  795.     {
  796. // AU-headers-length
  797. if (m_Config.m_bHasAUHeaders)
  798. {
  799.     ulAUHdrLength = (pData[0] << 8) + (pData[1]);
  800.     ulAUHdrSize = ulAUHdrLength / 8;
  801.     if ((ulAUHdrSize * 8) != ulAUHdrLength)
  802.     {
  803. ulAUHdrSize++;
  804.     }
  805.     ulAUHdrStart += 2;
  806. }
  807. if (ulAUHdrLength > 0)
  808. {
  809.     // AU headers are present
  810.     initbuffer(pData + ulAUHdrStart, &bitInfo);
  811.     // AU-headers
  812.     do
  813.     {
  814. pAUPacket = new CAUPacket;
  815. if (!pAUPacket)
  816. {
  817.     retVal = HXR_OUTOFMEMORY;
  818.     break;
  819. }
  820. // Buffer
  821. pAUPacket->m_pBuffer = pBuffer;
  822. pBuffer->AddRef();
  823. // Data
  824. pAUPacket->m_pData = pData + ulAUSizeSum;
  825. // AU - size
  826. if (m_Config.m_ulSizeLength > 0)
  827. {
  828.     pAUPacket->m_ulSize = getbits(m_Config.m_ulSizeLength, &bitInfo);
  829. }
  830. else
  831. {
  832.     pAUPacket->m_ulSize = m_Config.m_ulConstantSize;
  833. }
  834. ulAUSizeSum += pAUPacket->m_ulSize;
  835. // AU - index
  836. if (bFirstAU)
  837. {
  838.     bFirstAU = FALSE;
  839.     pAUPacket->m_bMinTime = FALSE;
  840.     if (m_Config.m_ulIndexLength > 0)
  841.     {
  842. ulIdx = getbits(m_Config.m_ulIndexLength,
  843. &bitInfo);
  844.     }
  845.     else
  846.     {
  847. ulIdx = 0;
  848.     }
  849.     ulBaseIdx = ulIdx;
  850. }
  851. else
  852. {
  853.     pAUPacket->m_bMinTime = TRUE;
  854.     if (m_Config.m_ulIndexDeltaLength > 0)
  855.     {
  856. ulIdx += getbits(m_Config.m_ulIndexDeltaLength,
  857.  &bitInfo);
  858.     }
  859.     ulIdx++;
  860. }
  861. pAUPacket->m_ulIdx = ulIdx;
  862. // CTS
  863. ulVal = 0;
  864. if ((m_Config.m_ulCTSDeltaLength > 0) &&
  865.     getbits1(&bitInfo))
  866. {
  867.     ulVal = getbits(m_Config.m_ulCTSDeltaLength, &bitInfo);
  868.     ulVal = SignBitField(ulVal, m_Config.m_ulCTSDeltaLength);
  869.     ulVal = m_TSConverter.ConvertVector(ulVal);
  870.     pAUPacket->m_bMinTime = FALSE;
  871. }
  872. else
  873. {
  874.     ulVal = (ulIdx - ulBaseIdx) * m_TSConverter.ConvertVector(m_ulAUDuration);
  875.     pAUPacket->m_bMinTime = (pAUPacket->m_bMinTime &&
  876.      (ulVal == 0));
  877. }
  878. ulCTS = ulStartCTS + ulVal;
  879. pAUPacket->m_ulCTS = ulCTS;
  880. // DTS
  881. ulVal = 0;
  882. if (m_Config.m_ulDTSDeltaLength > 0)
  883. {
  884.     if (getbits1(&bitInfo))
  885.     {
  886. ulVal = getbits(m_Config.m_ulDTSDeltaLength, &bitInfo);
  887. // can be negative value
  888. if (ulVal >> (m_Config.m_ulDTSDeltaLength - 1))
  889. {
  890.     ulVal |= (~((1 << m_Config.m_ulDTSDeltaLength) - 1));
  891. }
  892. ulVal = m_TSConverter.ConvertVector(ulVal);
  893.     }
  894. }
  895. ulDTS = ulCTS + ulVal;
  896. pAUPacket->m_ulDTS = ulDTS;
  897. pAUFragments[ulNumAUFragments++] = pAUPacket;
  898.     } while (ulAUHdrLength > ((ULONG32) bitInfo.bitcnt) && ulMaxAUFragments > ulNumAUFragments);
  899. }
  900.     }
  901.     if (retVal == HXR_OK)
  902.     {
  903. // auxiliary data length
  904. ulAuxStart = ulAUHdrStart + ulAUHdrSize;
  905. ulAuxLength = m_Config.m_ulAuxDataSizeLength;
  906. if (ulAuxLength > 0)
  907. {
  908.     initbuffer(pData + ulAuxStart, &bitInfo);
  909.     ulAuxLength += getbits(ulAuxLength, &bitInfo);
  910. }
  911. ulAuxSize = ulAuxLength / 8;
  912. if ((ulAuxSize * 8) != ulAuxLength)
  913. {
  914.     ulAuxSize++;
  915. }
  916. ulAUStart = ulAuxStart + ulAuxSize;
  917. if (ulAUHdrSize > 0)
  918. {
  919.     // AU Headers were present and locations of AUs is
  920.     // known - just offset the AU location for inserted
  921.     // auxiliary data
  922.     for (ulIdx = ulFirstAUFragment; ulIdx < ulNumAUFragments; ulIdx++)
  923.     {
  924. pAUFragments[ulIdx]->m_pData += ulAUStart;
  925.     }
  926. }
  927. else
  928. {
  929.     // AU Headers are not present - rely on
  930.     // constant size configuration te determine the
  931.     // AU offsets
  932.     ulAUSizeSum = pBuffer->GetSize() - ulAUStart;
  933.     ulAUSize = m_Config.m_ulConstantSize;
  934.     if (ulAUSize == 0)
  935.     {
  936. ulAUSize = ulAUSizeSum;
  937.     }
  938.     if (ulAUSize > 0)
  939.     {
  940. if (ulAUSize <= ulAUSizeSum)
  941. {
  942.     ulFixedSizeAUCount = ulAUSizeSum / ulAUSize;
  943. }
  944. else
  945. {
  946.     // this can only happen if we have pre-configured AU sizes,
  947.     // no AU headers, and this AU has been fragmented.
  948.     if (ulAUSizeSum != 0)
  949.     {
  950. ulFixedSizeAUCount = 1;
  951.     }
  952. }
  953. if (ulFixedSizeAUCount > 0)
  954. {
  955.     ulIdx = 0;
  956.     retVal = HXR_OK;
  957.     do
  958.     {
  959. pAUPacket = new CAUPacket;
  960. if (!pAUPacket)
  961. {
  962.     retVal = HXR_OUTOFMEMORY;
  963.     break;
  964. }
  965. // Buffer
  966. pAUPacket->m_pBuffer = pBuffer;
  967. pBuffer->AddRef();
  968. // Data
  969. pAUPacket->m_pData = pData + ulAUStart + ulIdx * ulAUSize;
  970. // AU - size
  971. pAUPacket->m_ulSize = ulAUSize;
  972. // AU - index
  973. pAUPacket->m_ulIdx = ulIdx;
  974. // CTS
  975. ulVal = ulIdx * m_TSConverter.ConvertVector(m_ulAUDuration);
  976. pAUPacket->m_ulCTS = ulStartCTS + ulVal;
  977. if ((ulVal == 0) && (ulIdx != 0))
  978. {
  979.     pAUPacket->m_bMinTime = TRUE;
  980. }
  981. // DTS
  982. pAUPacket->m_ulDTS = pAUPacket->m_ulCTS;
  983. ulIdx++;
  984. pAUFragments[ulNumAUFragments++] = pAUPacket;
  985.     } while (ulIdx < ulFixedSizeAUCount && ulNumAUFragments < ulMaxAUFragments);
  986. }
  987.     }
  988. }
  989.     }
  990.     return retVal;
  991. }
  992. HX_RESULT MP4GPayloadFormat::AggregateAUFragments(CAUPacket** &pAUPackets,
  993.   ULONG32 &ulNumAUPackets,
  994.   ULONG32 &ulMaxAUPackets,
  995.   CAUPacket** pAUFragments,
  996.   ULONG32 &ulNumAUFragments)
  997. {
  998.     HX_RESULT retVal = HXR_OK;
  999.     FlushAUArray(pAUPackets, ulNumAUPackets);
  1000.     if (IsFragmentCollection(pAUFragments, ulNumAUFragments))
  1001.     {
  1002. // Compute actual fragment collection size
  1003. ULONG32 ulFragmentyIdx;
  1004. UINT32 ulHeaderSize;
  1005. ULONG32 ulActualCollectionSize = 0;
  1006. for (ulFragmentyIdx = 0;
  1007.      ulFragmentyIdx < ulNumAUFragments;
  1008.      ulFragmentyIdx++)
  1009. {
  1010.     ulHeaderSize = (UINT32) (pAUFragments[ulFragmentyIdx]->m_pData -
  1011.      pAUFragments[ulFragmentyIdx]->m_pBuffer->GetBuffer());
  1012.     ulActualCollectionSize += (pAUFragments[ulFragmentyIdx]->m_pBuffer->GetSize() -
  1013.        ulHeaderSize);
  1014. }
  1015. if (ulActualCollectionSize == pAUFragments[0]->m_ulSize)
  1016. {
  1017.     // All fragments are accounted for - aggregate all
  1018.     IHXBuffer* pBuffer = NULL;
  1019.     CAUPacket* pAUPacket = new CAUPacket;
  1020.     retVal = HXR_OUTOFMEMORY;
  1021.     if (pAUPacket)
  1022.     {
  1023. retVal = HXR_OK;
  1024.     }
  1025.     // Create Buffer
  1026.     if (SUCCEEDED(retVal))
  1027.     {
  1028. retVal = m_pClassFactory->CreateInstance(IID_IHXBuffer,
  1029.  (void**) &pBuffer);
  1030.     }
  1031.     if (SUCCEEDED(retVal))
  1032.     {
  1033. retVal = pBuffer->SetSize(ulActualCollectionSize);
  1034.     }
  1035.     // Aggregate into the Buffer
  1036.     if (SUCCEEDED(retVal))
  1037.     {
  1038. UINT8* pDataWriter = pBuffer->GetBuffer();
  1039. UINT32 ulFragmentSize;
  1040. for (ulFragmentyIdx = 0;
  1041.      ulFragmentyIdx < ulNumAUFragments;
  1042.      ulFragmentyIdx++)
  1043. {
  1044.     ulHeaderSize = (UINT32) (pAUFragments[ulFragmentyIdx]->m_pData -
  1045.      pAUFragments[ulFragmentyIdx]->m_pBuffer->GetBuffer());
  1046.     ulFragmentSize = pAUFragments[ulFragmentyIdx]->m_pBuffer->GetSize() -
  1047.      ulHeaderSize;
  1048.     memcpy(pDataWriter,     /* Flawfinder: ignore */
  1049.    pAUFragments[ulFragmentyIdx]->m_pData,
  1050.    ulFragmentSize);
  1051.     pDataWriter += ulFragmentSize;
  1052. }
  1053.     }
  1054.     // Populate the aggregated AUPacket
  1055.     if (SUCCEEDED(retVal))
  1056.     {
  1057. // Buffer
  1058. pAUPacket->m_pBuffer = pBuffer;
  1059. pBuffer = NULL;
  1060. // Data
  1061. pAUPacket->m_pData = pAUPacket->m_pBuffer->GetBuffer();
  1062. // AU - size
  1063. pAUPacket->m_ulSize = ulActualCollectionSize;
  1064. // AU - index
  1065. pAUPacket->m_ulIdx = pAUFragments[0]->m_ulIdx;
  1066. // CTS
  1067. pAUPacket->m_ulCTS = pAUFragments[0]->m_ulCTS;
  1068. pAUPacket->m_bMinTime = pAUFragments[0]->m_bMinTime;
  1069. // DTS
  1070. pAUPacket->m_ulDTS = pAUFragments[0]->m_ulDTS;
  1071. // Set to output
  1072. pAUPackets[0] = pAUPacket;
  1073. ulNumAUPackets = 1;
  1074. pAUPacket = NULL;
  1075.     }
  1076.     HX_RELEASE(pBuffer);
  1077.     HX_DELETE(pAUPacket);
  1078. }
  1079. else
  1080. {
  1081.     // Something is missing or is corrupted - discard data
  1082.     retVal = HXR_FAIL;
  1083. }
  1084. // Flush the input fragmants
  1085. FlushAUArray(pAUFragments, ulNumAUFragments);
  1086.     }
  1087.     else
  1088.     {
  1089. // No aggregation necessary
  1090. ulNumAUPackets = ulNumAUFragments;
  1091. memcpy(pAUPackets, pAUFragments, sizeof(CAUPacket*) * ulNumAUFragments); /* Flawfinder: ignore */
  1092. memset(pAUFragments, 0, sizeof(CAUPacket*) * ulNumAUFragments);
  1093. ulNumAUFragments = 0;
  1094.     }
  1095.     
  1096.     return retVal;
  1097. }
  1098. BOOL MP4GPayloadFormat::IsFragmentCollection(CAUPacket** pAUFragments,
  1099.      ULONG32 ulNumAUFragments)
  1100. {
  1101.     BOOL bRetVal = FALSE;
  1102.     if (ulNumAUFragments > 0)
  1103.     {
  1104. // Even if we have only one fragment, this could still be a fragment
  1105. // collection in which all but one fragment were lost
  1106. UINT32 ulHeaderSize = (UINT32) (pAUFragments[0]->m_pData -
  1107.         pAUFragments[0]->m_pBuffer->GetBuffer());
  1108. bRetVal = ((ulHeaderSize + pAUFragments[0]->m_ulSize)
  1109.    > pAUFragments[0]->m_pBuffer->GetSize());
  1110.     }
  1111.     return bRetVal;
  1112. }
  1113. HX_RESULT MP4GPayloadFormat::DeinterleaveAUPackets(CAUPacket** pAUPackets,
  1114.    ULONG32 &ulNumAUPackets)
  1115. {
  1116.     ULONG32 ulIdx;
  1117.     HX_RESULT retVal = HXR_OK;
  1118.     for (ulIdx = 0; ulIdx < ulNumAUPackets; ulIdx++)
  1119.     {
  1120. if (SUCCEEDED(DeinterleaveAUPacket(pAUPackets[ulIdx])))
  1121. {
  1122.     pAUPackets[ulIdx] = NULL;
  1123. }
  1124. else
  1125. {
  1126.     HX_DELETE(pAUPackets[ulIdx]);
  1127. }
  1128.     }
  1129.     ulNumAUPackets = 0;
  1130.     return retVal;
  1131. }
  1132. HX_RESULT MP4GPayloadFormat::DeinterleaveAUPacket(CAUPacket* pAUPacket)
  1133. {
  1134.     ULONG32 ulCount = m_DeinterleaveQueue.GetCount();
  1135.     if (ulCount == 0)
  1136.     {
  1137. m_DeinterleaveQueue.AddTail(pAUPacket);
  1138.     }
  1139.     else
  1140.     {
  1141. CAUPacket* pListAUPacket;
  1142. LISTPOSITION lPos = m_DeinterleaveQueue.GetTailPosition();
  1143. LISTPOSITION lInsertPos = lPos;
  1144. ULONG32 ulPrevIdx = 0xFFFFFFFF;
  1145. pListAUPacket = (CAUPacket*) m_DeinterleaveQueue.GetAt(lPos);
  1146. do
  1147. {
  1148.     if (!MayAUPacketPrecede(pAUPacket, pListAUPacket))
  1149.     {
  1150. m_DeinterleaveQueue.InsertAfter(lInsertPos, pAUPacket);
  1151. break;
  1152.     }
  1153.     ulCount--;
  1154.     if (ulCount == 0)
  1155.     {
  1156. CAUPacket lastReapedAUPacket;
  1157. lastReapedAUPacket.m_ulDTS = m_ulLastReapedDTS;
  1158. lastReapedAUPacket.m_ulIdx = m_ulLastReapedIdx;
  1159. lastReapedAUPacket.m_bMinTime = m_bLastReapedMinTime;
  1160. if (m_bLastReapedSet &&
  1161.     MayAUPacketPrecede(&lastReapedAUPacket, pAUPacket))
  1162. {
  1163.     m_DeinterleaveQueue.InsertBefore(lPos, pAUPacket);
  1164. }
  1165. else
  1166. {
  1167.     m_DeinterleaveQueue.InsertAfter(lInsertPos, pAUPacket);
  1168. }
  1169. break;
  1170.     }
  1171.     pListAUPacket = (CAUPacket*) m_DeinterleaveQueue.GetAtPrev(lPos);
  1172.     if (MayAUPacketPrecede(pListAUPacket, pAUPacket))
  1173.     {
  1174. lInsertPos = lPos;
  1175.     }
  1176. } while (TRUE);
  1177.     }
  1178.     return HXR_OK;
  1179. }
  1180. HX_RESULT MP4GPayloadFormat::ReapMediaPacket(ULONG32 ulLastPacketTime)
  1181. {
  1182.     CAUPacket* pAUPacket;
  1183.     CMediaPacket* pMediaPacket;
  1184.     HX_RESULT retVal = HXR_NO_DATA;
  1185.     if (!m_DeinterleaveQueue.IsEmpty())
  1186.     {
  1187. BOOL bTryAgain;
  1188. BOOL bUnknownTime;
  1189. if ((!m_bEarliestDeintTimeKnown) && (!m_bFlushed))
  1190. {
  1191.     m_bEarliestDeintTimeKnown = FindEarliestKnownDeintTime(m_ulEarliestDeintTimeKnown);
  1192. }
  1193. do
  1194. {
  1195.     bTryAgain = FALSE;
  1196.     pAUPacket = (CAUPacket*) m_DeinterleaveQueue.GetHead();
  1197.     if ((m_bEarliestDeintTimeKnown &&
  1198.  (!TestTimeGreater(m_ulEarliestDeintTimeKnown, m_ulLastPacketTime)))
  1199. ||
  1200. (m_bLastReapedSet &&
  1201.  (IndexDiff(pAUPacket->m_ulIdx, m_ulLastReapedIdx) == 1))
  1202. ||
  1203. m_bFlushed)
  1204.     {
  1205. ULONG32 ulFlags = MDPCKT_USES_IHXBUFFER_FLAG;
  1206. pAUPacket = (CAUPacket*) m_DeinterleaveQueue.GetHead();
  1207. bUnknownTime = pAUPacket->m_bMinTime;
  1208. if (bUnknownTime)
  1209. {
  1210.     ulFlags |= MDPCKT_HAS_UKNOWN_TIME_FLAG;
  1211. }
  1212. else
  1213. {
  1214.     m_bEarliestDeintTimeKnown = FALSE;
  1215. }
  1216. if (m_bLastReapedSet)
  1217. {
  1218.     if (IndexDiff(pAUPacket->m_ulIdx, m_ulLastReapedIdx) != 1)
  1219.     {
  1220. ulFlags |= MDPCKT_FOLLOWS_LOSS_FLAG;
  1221.     }
  1222. }
  1223. m_bLastReapedMinTime = pAUPacket->m_bMinTime;
  1224. m_ulLastReapedDTS = pAUPacket->m_ulCTS;
  1225. m_ulLastReapedIdx = pAUPacket->m_ulIdx;
  1226. m_bLastReapedSet = TRUE;
  1227. pMediaPacket = new CMediaPacket(pAUPacket->m_pBuffer,
  1228. pAUPacket->m_pData,
  1229. pAUPacket->m_ulSize,
  1230. pAUPacket->m_ulSize,
  1231. pAUPacket->m_ulCTS,
  1232. ulFlags,
  1233. NULL);
  1234. retVal = HXR_OUTOFMEMORY;
  1235. if (pMediaPacket)
  1236. {
  1237.     m_DeinterleaveQueue.RemoveHead();
  1238.     delete pAUPacket;
  1239.     m_OutputQueue.AddTail(pMediaPacket);
  1240.     bTryAgain = TRUE;
  1241.     retVal = HXR_OK;
  1242. }
  1243.     }
  1244.     else if ((!m_bEarliestDeintTimeKnown) && (!m_bFlushed))
  1245.     {
  1246. m_bEarliestDeintTimeKnown = FindEarliestKnownDeintTime(m_ulEarliestDeintTimeKnown);
  1247. bTryAgain = m_bEarliestDeintTimeKnown;
  1248.     }
  1249. } while (bTryAgain &&
  1250.  (!m_DeinterleaveQueue.IsEmpty()));
  1251.     }
  1252.     return retVal;
  1253. }
  1254. STDMETHODIMP
  1255. MP4GPayloadFormat::Flush()
  1256. {
  1257.     m_bFlushed = TRUE;
  1258.     return HXR_OK;
  1259. }
  1260. void MP4GPayloadFormat::FlushQueues(void)
  1261. {
  1262.     FlushInputQueue(FLUSH_ALL_PACKETS);
  1263.     FlushDeinterleaveQueue(FLUSH_ALL_PACKETS);
  1264.     FlushOutputQueue(FLUSH_ALL_PACKETS);
  1265. }
  1266. void MP4GPayloadFormat::FlushInputQueue(ULONG32 ulCount)
  1267. {
  1268.     IHXPacket* pDeadPacket;
  1269.     while ((ulCount > 0) && (!m_InputQueue.IsEmpty()))
  1270.     {
  1271. pDeadPacket = (IHXPacket*) m_InputQueue.RemoveHead();
  1272. HX_RELEASE(pDeadPacket);
  1273. if (ulCount != FLUSH_ALL_PACKETS)
  1274. {
  1275.     ulCount--;
  1276. }
  1277.     }
  1278. }
  1279. void MP4GPayloadFormat::FlushDeinterleaveQueue(ULONG32 ulCount)
  1280. {
  1281.     CAUPacket* pDeadPacket;
  1282.     while ((ulCount > 0) && (!m_DeinterleaveQueue.IsEmpty()))
  1283.     {
  1284. pDeadPacket = (CAUPacket*) m_DeinterleaveQueue.RemoveHead();
  1285. HX_DELETE(pDeadPacket);
  1286. if (ulCount != FLUSH_ALL_PACKETS)
  1287. {
  1288.     ulCount--;
  1289. }
  1290.     }
  1291.     m_bEarliestDeintTimeKnown = FALSE;
  1292.     m_bLastReapedSet = FALSE;
  1293. }
  1294. void MP4GPayloadFormat::FlushOutputQueue(ULONG32 ulCount)
  1295. {
  1296.     CMediaPacket* pDeadPacket;
  1297.     while ((ulCount > 0) && (!m_OutputQueue.IsEmpty()))
  1298.     {
  1299. pDeadPacket = (CMediaPacket*) m_OutputQueue.RemoveHead();
  1300. HX_DELETE(pDeadPacket);
  1301. if (ulCount != FLUSH_ALL_PACKETS)
  1302. {
  1303.     ulCount--;
  1304. }
  1305.     }
  1306. }
  1307. BOOL MP4GPayloadFormat::FindEarliestKnownDeintTime(ULONG32 &ulEarliestKnownDeintTime)
  1308. {
  1309.     ULONG32 ulCount;
  1310.     LISTPOSITION lPos;
  1311.     CAUPacket* pPacket;
  1312.     ulCount = m_DeinterleaveQueue.GetCount();
  1313.     if (ulCount > 0)
  1314.     {
  1315. lPos = m_DeinterleaveQueue.GetHeadPosition();
  1316. pPacket = (CAUPacket*) m_DeinterleaveQueue.GetHead();
  1317. do
  1318. {
  1319.     if (!pPacket->m_bMinTime)
  1320.     {
  1321. ulEarliestKnownDeintTime = pPacket->m_ulCTS;
  1322. return TRUE;
  1323.     }
  1324.     ulCount--;
  1325.     if (ulCount == 0)
  1326.     {
  1327. break;
  1328.     }
  1329.     pPacket = (CAUPacket*) m_DeinterleaveQueue.GetAtNext(lPos);
  1330. } while (TRUE);
  1331.     }
  1332.     return FALSE;
  1333. }
  1334. void MP4GPayloadFormat::FlushArrays(void)
  1335. {
  1336.     FlushPacketArray(m_pPacketFragments, m_ulNumPacketFragments);
  1337.     FlushAUArray(m_pAUFragments, m_ulNumAUFragments);
  1338.     FlushAUArray(m_pAUPackets, m_ulNumAUPackets);
  1339. }
  1340. ULONG32 MP4GPayloadFormat::GetPacketTime(IHXPacket* pPacket)
  1341. {
  1342.     ULONG32 ulTime;
  1343.     HX_ASSERT(pPacket);
  1344.     if (m_bUsesRTPPackets)
  1345.     {
  1346. ulTime = ((IHXRTPPacket*) pPacket)->GetRTPTime();
  1347.     }
  1348.     else
  1349.     {
  1350. ulTime = pPacket->GetTime();
  1351.     }
  1352.     ulTime = m_TSConverter.Convert(ulTime);
  1353.     return ulTime;
  1354. }
  1355. ULONG32 MP4GPayloadFormat::SignBitField(ULONG32 ulVal, ULONG32 ulNumBits)
  1356. {
  1357.     if (ulNumBits > 0)
  1358.     {
  1359. if (ulVal >> (ulNumBits - 1))
  1360. {
  1361.     ulVal = (0xFFFFFFFF & ulVal);
  1362. }
  1363.     }
  1364.     else
  1365.     {
  1366. ulVal = 0;
  1367.     }
  1368.     return ulVal;
  1369. }
  1370. BOOL MP4GPayloadFormat::TestIndexGreater(ULONG32 ulIdx1, ULONG32 ulIdx2)
  1371. {
  1372.     return (ulIdx1 > ulIdx2);
  1373. }
  1374. BOOL MP4GPayloadFormat::TestTimeGreater(ULONG32 ulTime1, ULONG32 ulTime2)
  1375. {
  1376.     return (((LONG32) (ulTime1 - ulTime2)) > 0);
  1377. }
  1378. LONG32 MP4GPayloadFormat::IndexDiff(ULONG32 ulIdx1, ULONG32 ulIdx2)
  1379. {
  1380.     return SignBitField(ulIdx1 - ulIdx2, m_Config.m_ulIndexLength);
  1381. }