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

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 "amr_frame_info.h"
  37. #include "amr_flavor.h"
  38. #include "amr_frame_hdr.h"
  39. // These sizes are for AMR Core bits
  40. const ULONG32 CAMRFrameInfo::zm_frameBits[2][16] = {  
  41.     { 95, 103, 118, 134,  // AMR-NB
  42.      148, 159, 204, 244,
  43.       39,  43,  38,  37,
  44.       -1,  -1,  -1,   0 },
  45.     {132, 177, 253, 285,  // AMR-WB
  46.      317, 365, 397, 461, 
  47.      477,  40,  -1,  -1, 
  48.       -1,  -1,   0,   0}
  49. };
  50. const ULONG32 CAMRFrameInfo::zm_maxFrameBits[2] = {244,  // AMR-NB
  51.                                                    477}; // AMR-WB
  52. const ULONG32 CAMRFrameInfo::zm_frameDuration = 20;
  53. /*
  54.  * Given a buffer which may or may not contain
  55.  * the beginning of an AMR frame, this method
  56.  * finds the beginning of an AMR frame in this 
  57.  * buffer. For a beginning offset to be considered
  58.  * valid, ulMinFrames valid frames must be found
  59.  * from this point.
  60.  */
  61. BOOL CAMRFrameInfo::FindFrameBegin(AMRFlavor eFlavor,
  62.                                    BYTE* pBuf, UINT32 ulLen,
  63.                                    UINT32 ulMinFrames,
  64.                                    UINT32& rulFrameBegin)
  65. {
  66.     BOOL bRet = FALSE;
  67.     if (pBuf && ulLen && ulMinFrames)
  68.     {
  69.         BYTE*  pBufStart = pBuf;
  70.         BYTE*  pBufLimit = pBuf + ulLen;
  71.         UINT32 ulFrames  = 0;
  72.         while (pBuf < pBufLimit)
  73.         {
  74.             // Can we find ulMinFrames valid frames from
  75.             // starting with this byte?
  76.             if (TestForConsecutiveFrames(eFlavor,
  77.                                          pBuf,
  78.                                          pBufLimit - pBuf,
  79.                                          ulMinFrames))
  80.             {
  81.                 rulFrameBegin = pBuf - pBufStart;
  82.                 bRet = TRUE;
  83.                 break;
  84.             }
  85.             else
  86.             {
  87.                 // No, we didn't, so go to the next byte
  88.                 pBuf++;
  89.             }
  90.         }
  91.     }
  92.     return bRet;
  93. }
  94. BOOL CAMRFrameInfo::TestForConsecutiveFrames(AMRFlavor eFlavor, BYTE* pBuf,
  95.                                              UINT32 ulLen, UINT32 ulMinFrames)
  96. {
  97.     BOOL bRet = FALSE;
  98.     if (pBuf && ulLen)
  99.     {
  100.         BYTE*  pBufLimit   = pBuf + ulLen;
  101.         UINT32 ulNumFrames = 0;
  102.         while (pBuf < pBufLimit)
  103.         {
  104.             // Check if the padding bits are correctly set
  105.             if (!CAMRFrameHdr::ValidHdrByte(*pBuf))
  106.             {
  107.                 break;
  108.             }
  109.             // Parse the type and quality
  110.             CAMRFrameHdr cHdr(eFlavor);
  111.             cHdr.Unpack(pBuf); // advances the pointer by 1
  112.             // Make sure the number of data bits is not a ULONG32 -1
  113.             if (cHdr.DataBits() == ((ULONG32) -1))
  114.             {
  115.                 break;
  116.             }
  117.             // If we have enough bytes, we'll assume 
  118.             // a valid frame
  119.             if (pBuf + cHdr.DataBytes() <= pBufLimit)
  120.             {
  121.                 ulNumFrames++;
  122.             }
  123.             // Advance past the data bytes
  124.             pBuf += cHdr.DataBytes();
  125.         }
  126.         if (ulNumFrames >= ulMinFrames)
  127.         {
  128.             bRet = TRUE;
  129.         }
  130.     }
  131.     return bRet;
  132. }