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

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. #include "hxtypes.h"
  36. #include "hlxclib/stdio.h"
  37. #include "hlxosstr.h"
  38. #include "hxcom.h"              // IUnknown
  39. #include "hxcomm.h"            // IHXCommonClassFactory
  40. #include "ihxpckts.h"           // IHXBuffer, IHXPacket, IHXValues
  41. #include "hxplugn.h"           // IHXPlugin
  42. #include "hxrendr.h"           // IHXRenderer
  43. #include "hxengin.h"           // IHXInterruptSafe
  44. #include "hxcore.h"            // IHXStream
  45. #include "hxausvc.h"           // Audio Services
  46. #include "hxmon.h"             // IHXStatistics
  47. #include "hxupgrd.h"           // IHXUpgradeCollection
  48. #include "hxslist.h"            // CHXSimpleList
  49. #include "carray.h"             // CHXPtrArray
  50. #include "tconverter.h" // CHXTimestampConverter
  51. #include "hxstrutl.h"
  52. #include "mpadecobj.h"          // MPEG Audio Decoder (selects fixed-pt or floating-pt based on HELIX_CONFIG_FIXEDPOINT)
  53. #include "mp3format.h"          // MP3 formatter
  54. #ifdef DEMUXER
  55. #include "xmddemuxer.h"         // Demuxer
  56. #include "xmdtypes.h"
  57. #endif
  58. #include "mp3rend.h"            // CRnMp3Ren
  59. #include "pktparse.h"           // CPacketParser
  60. #include "robpktparse.h"        // CRobustPacketParser
  61. CRobustPacketParser::CRobustPacketParser() :
  62.     CPacketParser(),    
  63.     m_ulIndex(0),
  64.     m_bFirstFrame(TRUE),
  65.     m_pTsConvert(NULL)
  66. //    m_dNextFrameTime(0.0),
  67. //    m_dFrameTime(0.0)
  68. {
  69.     m_bReformatted = TRUE;
  70. }
  71. CRobustPacketParser::~CRobustPacketParser()
  72. {
  73.     m_Cycles.DeleteAll();
  74.     HX_DELETE(m_pTsConvert);
  75. }
  76. HX_RESULT
  77. CRobustPacketParser::AddPacket(IHXPacket* pPacket, INT32 streamOffsetTime)
  78. {
  79.     if(pPacket == NULL)
  80.         return HXR_INVALID_PARAMETER;
  81.     // Get the buffer.
  82.     IHXBuffer* pPacketBuf = pPacket->GetBuffer();
  83.     if(pPacketBuf == NULL || pPacketBuf->GetSize() == 0)
  84.     {
  85.         HX_RELEASE(pPacketBuf);
  86.         return HXR_INVALID_PARAMETER;
  87.     }
  88.     double dTime;
  89.     // Get the packet time
  90.     IHXRTPPacket *pRtpPacket = NULL;
  91.     pPacket->QueryInterface(IID_IHXRTPPacket, (void**)&pRtpPacket);
  92.     if (pRtpPacket)
  93.     {
  94. if (!m_pTsConvert)
  95. {
  96.     m_pTsConvert = new CHXTimestampConverter(CHXTimestampConverter::FACTORS,
  97.      1,
  98.      90);
  99.     if (m_pTsConvert)
  100.     {
  101. m_pTsConvert->setHXAnchor(pPacket->GetTime());
  102.     }
  103. }
  104. if (m_pTsConvert)
  105. {
  106.     dTime = m_pTsConvert->rtp2hxa(pRtpPacket->GetRTPTime());
  107. }
  108. else
  109. {
  110.     dTime = pRtpPacket->GetRTPTime() / 90.0;
  111. }
  112.         pRtpPacket->Release();
  113.     }
  114.     else
  115.     {
  116.         //dTime = pPacket->GetTime();
  117.         dTime = pPacket->GetTime();
  118.     }
  119.     if(streamOffsetTime > dTime)
  120.     {
  121.         dTime =  0;
  122.     }
  123.     else
  124.     {
  125.         dTime -= streamOffsetTime;
  126.     }
  127.     // Set the time for the first frame in the packet
  128.     UINT32 ulOffset = GetFrameInfo(pPacketBuf, 0, dTime);
  129.     
  130.     while(ulOffset < pPacketBuf->GetSize())
  131.     {
  132.         ulOffset = GetFrameInfo(pPacketBuf, ulOffset, -1);
  133.     }
  134.     return HXR_OK;
  135. }
  136. UINT32
  137. CRobustPacketParser::GetFrame(UCHAR*& pFrameBuffer, double& dTime, BOOL& bLost)                              
  138. {    
  139.     pFrameBuffer = NULL;
  140.     dTime = 0.0;
  141.     bLost = FALSE;
  142.     // If we don't have any frames yet
  143.     if(m_Cycles.IsEmpty())
  144.     {
  145.         return 0;
  146.     }
  147.     SCycle* pCycle = NULL;
  148.     BOOL bNextCycle = TRUE;
  149.     BOOL bCheckLoss = FALSE;
  150.     SFrameInfo* pFrameInfo = NULL;
  151.     UINT32 ulIndex = m_ulIndex;
  152.     pCycle = (SCycle*)m_Cycles.GetHead();
  153.     while(bNextCycle)
  154.     {
  155.         // This will never be NULL since we never add NULL
  156.         HX_ASSERT(pCycle != NULL);  
  157.         pFrameInfo = pCycle->pFrames[ulIndex];
  158.         if(pFrameInfo && pFrameInfo->bComplete)
  159.         {
  160.             // we have a frame ready!            
  161.             bNextCycle = FALSE;
  162.         }
  163.         else
  164.         {
  165.             // we haven't got to the next cycle yet, keep waiting
  166.             if(m_Cycles.GetCount() <= 1 && !m_bEndOfPackets)
  167.             {
  168.                 m_ulIndex = ulIndex;
  169.                 return 0;
  170.             }
  171.             // this frame is lost (we still have more this cycle)
  172.             if(ulIndex < (UINT32)pCycle->nMaxIndex)
  173.             {
  174.                 #if defined(WIN32) && defined(_DEBUG)
  175.                 char str[256]; /* Flawfinder: ignore */
  176.                 SafeSprintf(str, 256, "Known packet loss: Index: %d, Cycle: %d, "
  177.                         "Frag: %cn", ulIndex, pCycle->nCycleIndex, 
  178.                         pFrameInfo ? 'y' : 'n');
  179.                 OutputDebugString(OS_STRING(str));
  180.                 #endif // defined(WIN32) && defined(_DEBUG)
  181.                 // If we have a partial frame, release it
  182.                 HX_DELETE(pCycle->pFrames[ulIndex]);
  183.                 if(m_bFirstFrame)
  184.                 {
  185.                     #if defined(WIN32) && defined(_DEBUG)
  186.                     OutputDebugString(OS_STRING("First frame missing. Ignoring.n"));
  187.                     #endif // defined(WIN32) && defined(_DEBUG)                    
  188.    
  189.                     // If this was the first frame, ignore it and keep looking                    
  190.                     while(++ulIndex <= (UINT32)pCycle->nMaxIndex && bNextCycle)
  191.                     {                        
  192.                         pFrameInfo = pCycle->pFrames[ulIndex];
  193.                         if(pFrameInfo && pFrameInfo->bComplete)
  194.                         {
  195.                             // we have a frame ready!                       
  196.                             bNextCycle = FALSE;                            
  197.                             break;
  198.                         }
  199.                         HX_DELETE(pCycle->pFrames[ulIndex]);
  200.                     }                    
  201.                 }
  202.                 else
  203.                 {
  204.                     m_ulIndex++;
  205.                     bLost = TRUE;
  206.                     bNextCycle = FALSE;
  207.                 }
  208.             }
  209.             if(bNextCycle)
  210.             {
  211.                 // We're done with this cycle, so get rid of it and 
  212.                 // go to the next    
  213.                 m_Cycles.RemoveHead();
  214.                 delete pCycle;
  215.                 ulIndex = 0;                
  216.                 if(m_Cycles.GetCount() > 0)
  217.                 {
  218.                     pCycle = (SCycle*)(m_Cycles.GetHead());
  219.                 }
  220.                 else if (m_bEndOfPackets)
  221.                 {
  222.                     m_ulIndex = 0;
  223.                     return 0;
  224.                 }                
  225.             }
  226.         }
  227.     }
  228.     
  229.     // Try to get the frame presentation time
  230.     double dPresTime;
  231.     // If it's lost, go with the default time
  232.     if(bLost)
  233.     {
  234.         dPresTime = m_dNextPts;
  235.     }
  236.     // Else if this frame has a time stamp, use it
  237.     else if(pFrameInfo->dTime >= 0)
  238.     {
  239.         dPresTime = pFrameInfo->dTime;
  240.     }
  241.     // Else if we have calculated the start time of this cycle
  242.     // (based on another frame with a timestamp) calculate this one
  243.     else if(pCycle->dStartTime >= 0)
  244.     {
  245.         dPresTime = pCycle->dStartTime + m_dFrameTime*ulIndex;
  246.     }
  247.     // Else we have no time stamps for any frames in this cycle yet.
  248.     // Check if we have later cycles with timestamps
  249.     else
  250.     {
  251.         dPresTime = -1.0;
  252.         SCycle* pTmpCycle = pCycle;        
  253.         while((pTmpCycle = m_Cycles.GetNext(pTmpCycle)) != 0)
  254.         {
  255.             if(pTmpCycle->dStartTime >= 0)
  256.             {
  257.                 // uh-oh, we got a full cycle without any time stamps!
  258.                 // either massive packet loss or a really crappy
  259.                 // interleaving algorithm. assume it's supposed to go now
  260.                 // and any unaccounted for loss is at the end of the cycle
  261.                 dPresTime = m_dNextPts;
  262.                 pCycle->dStartTime = dPresTime - m_dFrameTime*ulIndex;
  263.             }
  264.         }
  265.     }
  266.     // If we haven't gotten any timestamps yet this cycle, wait for
  267.     // the next packet.
  268.     if(dPresTime < 0)
  269.     {
  270.         if(!m_bEndOfPackets)
  271.         {
  272.             m_ulIndex = ulIndex;
  273.             return 0;
  274.         }
  275.         
  276.         // We don't have a time stamp, but there are no more packets coming
  277.         dPresTime = m_dNextPts;
  278.     }
  279.     // If this is the first frame, set the time accordingly
  280.     if(m_bFirstFrame)
  281.     {
  282. #if defined(WIN32) && defined(_DEBUG)
  283.         char str[256]; /* Flawfinder: ignore */
  284.         SafeSprintf(str, 256, "First decode, setting time to %lfn", dPresTime);
  285.         OutputDebugString(OS_STRING(str));
  286. #endif // defined(WIN32) && defined(_DEBUG)
  287.         m_dNextPts = dPresTime;
  288.     }
  289.     if(!m_bFirstFrame && dPresTime - m_dNextPts >= m_dFrameTime)
  290.     {
  291.         // We have frames lost before this one
  292. #if defined(WIN32) && defined(_DEBUG)
  293.         char str[256]; /* Flawfinder: ignore */
  294.         SafeSprintf(str, 256, "Apparent packet loss: Index: %d, Cycle: %d, "
  295.                 "PresTime: %lf, NextPts: %lf, FrameTime: %lfn", 
  296.                 ulIndex, pCycle->nCycleIndex, dPresTime, m_dNextPts, 
  297.                 m_dFrameTime);
  298.         OutputDebugString(OS_STRING(str));
  299. #endif // defined(WIN32) && defined(_DEBUG)
  300.         bLost = TRUE;
  301.     }
  302.     if(pFrameInfo && pFrameInfo->ulADUSize < 2)
  303.     {
  304.         // this frame is too small. skip it and do loss recovery
  305.         HX_DELETE(pCycle->pFrames[ulIndex]);
  306.         m_ulIndex = ulIndex + 1;
  307.         bLost = TRUE;
  308.     }
  309.     // If the frame was lost, we reuse the one already in the buffer,
  310.     // so don't need to copy or anything
  311.     if(!bLost)
  312.     {
  313.         IHXBuffer* pPacketBuf;
  314.         SFrameData* pFrameData;
  315.         UINT32 ulSize;        
  316.         UCHAR* pBuf;
  317.         UCHAR* pDecBuf = m_pDecBuffer;
  318.         m_ulDecBufBytes = 0;
  319.         // Copy the frame into the decode buffer
  320.         for(pFrameData= pFrameInfo->pFrameData; pFrameData != NULL;
  321.             pFrameData = pFrameData->pNext)
  322.         {
  323.             pPacketBuf = pFrameData->pPacketBuf;
  324.             if(pPacketBuf)
  325.             {
  326.                 pPacketBuf->Get(pBuf, ulSize);
  327.                 if(pBuf && ulSize >= pFrameData->ulOffset + 2)
  328.                 {
  329.                     // seek to the frame offset
  330.                     ulSize -= pFrameData->ulOffset;
  331.                     pBuf += pFrameData->ulOffset;
  332.             
  333.                     if(pFrameInfo->ulADUSize < ulSize)
  334.                     {
  335.                         ulSize = pFrameInfo->ulADUSize;
  336.                     }
  337.                     // Make sure it will actually fit
  338.                     if(ulSize > DEC_BUFFER_SIZE - m_ulDecBufBytes)
  339.                     {
  340.                         ulSize = DEC_BUFFER_SIZE - m_ulDecBufBytes;
  341.                     }
  342.             
  343.                     memcpy(pDecBuf, pBuf, ulSize); /* Flawfinder: ignore */
  344.                     m_ulDecBufBytes += ulSize;
  345.                     pDecBuf += ulSize;
  346.                 }
  347.             }
  348.         }
  349.         HX_DELETE(pCycle->pFrames[ulIndex]);
  350.         m_ulIndex = ulIndex + 1;
  351.     
  352.         // Clear the main_data_begin (since we're reformatted)
  353.         m_pFmt->ClearMainDataBegin(m_pDecBuffer);
  354.     }
  355.     pFrameBuffer = m_pDecBuffer;
  356.     dTime = dPresTime;
  357.     m_dNextPts = dPresTime + m_dFrameTime;
  358.     m_bFirstFrame = FALSE;   
  359.     return m_ulDecBufBytes;
  360. }
  361. UINT32 CRobustPacketParser::GetFrameInfo(IHXBuffer* pPacket, UINT32 ulOffset,
  362.                                          double dTime)
  363. {   
  364.     if(pPacket->GetSize() <= ulOffset)
  365.     {
  366.         return pPacket->GetSize();
  367.     }
  368.     UCHAR*  pBuf = pPacket->GetBuffer() + ulOffset;
  369.     // bit 0: continuation bit
  370.     BOOL    bCont = (pBuf[0] & 0x80) == 0 ? FALSE : TRUE; 
  371.     // bit 1: Descriptor type flag
  372.     int nDescSize = (pBuf[0] & 0x40) == 0 ? 1 : 2; 
  373.     
  374.     if(pPacket->GetSize() - ulOffset < (UINT32)nDescSize + 2)
  375.     {
  376.         return pPacket->GetSize();
  377.     }
  378.     UINT32 ulADUSize;
  379.     int nIndex;
  380.     int nCycle;
  381.     // in a one byte descriptor, bits 2-7 are the ADU size
  382.     // in a two byte descriptor, bits 2-15 are the size
  383.     ulADUSize = nDescSize == 1 ? (pBuf[0] & 0x3F) :
  384.                 ((UINT32)(pBuf[0] & 0x3F) << 8) + pBuf[1];
  385.     
  386.     pBuf += nDescSize;    
  387.     
  388.     // MPEG audio sync word is the first 12 bits, first 11 always set.
  389.     // if the sync word is in tact, we are not reordered
  390.     if(pBuf[0] == 0xFF && (pBuf[1] & 0xE0) == 0xE0)
  391.     {
  392.         nIndex = 0;
  393.         nCycle = -1;
  394.     }
  395.     // otherwise, the first 11 bits of the sync word are re-used to 
  396.     // identify the frame order    
  397.     else
  398.     {
  399.         // bits 0-7: frame index
  400.         nIndex = pBuf[0];
  401.         // bits 8-10: cycle
  402.         nCycle = (pBuf[1] & 0xE0) >> 5;
  403.     }
  404.     
  405.     SCycle* pCycle = m_Cycles.IsEmpty() ? NULL : (SCycle*)m_Cycles.GetTail();
  406.     if(!pCycle || nCycle != pCycle->nCycleIndex || nCycle < 0)
  407.     {
  408.         // This is a new cycle
  409.         pCycle = new SCycle(nCycle);
  410.         if(pCycle == NULL)
  411.         {
  412.             return pPacket->GetSize();
  413.         }
  414.         pCycle->nMaxIndex = nIndex;
  415.         m_Cycles.AddTail(pCycle);                   
  416.     }
  417.     else if(nIndex > pCycle->nMaxIndex)
  418.     {
  419.         pCycle->nMaxIndex = nIndex;
  420.     }
  421.     SFrameData* pFrameData = new SFrameData();
  422.     SFrameData* pIterator;
  423.     pPacket->AddRef();
  424.     pFrameData->pPacketBuf = pPacket;
  425.     pFrameData->ulOffset = ulOffset + nDescSize;
  426.     pFrameData->bCont = bCont;
  427.     
  428.     SFrameInfo* pInfo = pCycle->pFrames[nIndex];
  429.     if(pInfo != NULL)
  430.     {
  431.         // We have a frag. Note that the spec only accounts for a frame being 
  432.         // split accross two packets when reordered. If one is split across 
  433.         // more than two packets, we will assume the cont frags are in order
  434.         if(bCont || (pCycle->pFrames[nIndex]->pFrameData && 
  435.             !pCycle->pFrames[nIndex]->pFrameData->bCont))
  436.         {
  437.             pIterator = pCycle->pFrames[nIndex]->pFrameData;
  438.             if(pIterator)
  439.             {
  440.                 while(pIterator->pNext != NULL)
  441.                     pIterator = pIterator->pNext;
  442.                 pFrameData->pNext = NULL;
  443.                 pIterator->pNext = pFrameData;
  444.             }
  445.             else
  446.             {
  447.                 pFrameData->pNext = pCycle->pFrames[nIndex]->pFrameData;
  448.                 pCycle->pFrames[nIndex]->pFrameData = pFrameData;
  449.             }
  450.         }
  451.         // If this is not a continuation frame, it is the first frag
  452.         else
  453.         {
  454.             pFrameData->pNext = pCycle->pFrames[nIndex]->pFrameData;
  455.             pCycle->pFrames[nIndex]->pFrameData = pFrameData;
  456.         }    
  457.     }
  458.     else
  459.     {
  460.         pFrameData->pNext = NULL;
  461.         pInfo = new SFrameInfo();
  462.         pInfo->nIndex = nIndex;
  463.         pInfo->ulADUSize = ulADUSize;
  464.         pInfo->pFrameData = pFrameData;
  465.         pInfo->dTime = dTime;
  466.         pCycle->pFrames[nIndex] = pInfo;
  467.     }
  468.     UINT32 ulSize = 0;
  469.     for(pIterator = pCycle->pFrames[nIndex]->pFrameData; pIterator!= NULL;
  470.         pIterator = pIterator->pNext)
  471.     {        
  472.         HX_ASSERT(pIterator->pPacketBuf);
  473.         ulSize += pIterator->pPacketBuf->GetSize() - pIterator->ulOffset;
  474.     }
  475.     
  476.     pInfo->bComplete = ulSize >= pInfo->ulADUSize ? TRUE : FALSE;
  477.     // Set first 11 bits
  478.     pBuf[0]  = 0xFF;
  479.     pBuf[1] |= 0xE0;
  480.     // Init our decoder if needed
  481.     if(m_pDecoder || InitDecoder(pBuf, pPacket->GetSize() - ulOffset, FALSE))
  482.     {
  483.         // set the first frame's presentation time
  484.         if(dTime >= 0)
  485.         {
  486.             if(pCycle->dStartTime < 0)
  487.             {
  488.                 pCycle->dStartTime = dTime - m_dFrameTime*(nIndex);    
  489.             }
  490.         }   
  491.     }    
  492.     return min(pFrameData->ulOffset + ulADUSize, pPacket->GetSize());
  493. }
  494. HX_RESULT
  495. CRobustPacketParser::RenderAll()
  496. {
  497.     if(!m_pRenderer || !m_pFmt)
  498.     {
  499.         return HXR_FAIL;
  500.     }
  501.     UCHAR* pFrameBuf;
  502.     UINT32 ulSize;
  503.     BOOL bPacketLoss;
  504.     double dTime;
  505.     for(;;)
  506.     {
  507.         ulSize = GetFrame(pFrameBuf, dTime, bPacketLoss);
  508.         if(!pFrameBuf || !ulSize)
  509.         {
  510.             return HXR_OK;
  511.         }
  512.         if(!m_pDecoder && !InitDecoder(pFrameBuf, ulSize, TRUE))
  513.         {
  514.             return HXR_FAIL;
  515.         }
  516.         DecodeAndRender(pFrameBuf, ulSize, dTime, bPacketLoss);
  517.     }
  518. }
  519. void
  520. CRobustPacketParser::PreSeek()
  521.     m_Cycles.DeleteAll();
  522.     m_ulIndex = 0;
  523.     m_bFirstFrame = TRUE;
  524.     CPacketParser::PreSeek();
  525. }
  526. void
  527. CRobustPacketParser::PostSeek(UINT32 time)
  528.     m_Cycles.DeleteAll();
  529.     m_ulIndex = 0;
  530.     m_bFirstFrame = TRUE;
  531.     CPacketParser::PostSeek(time);
  532.     HX_DELETE(m_pTsConvert);
  533. }
  534. void
  535. CRobustPacketParser::EndOfPackets()
  536. {
  537.     m_bEndOfPackets = TRUE;
  538.     // Decode and render any frames left queued.
  539.     RenderAll();
  540. }