sdppyldinfo.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:14k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: sdppyldinfo.cpp,v 1.2.32.1 2004/07/09 02:05:16 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxtypes.h"
  50. #include "hxassert.h"
  51. #include "hlxclib/string.h"
  52. #include "rtptypes.h"
  53. /****************************************************************************
  54.  *  Defines
  55.  */
  56. #define RTP_PAYLOAD_MAP_SIZE 35
  57. #define RTP_BAD_PAYLOAD_TYPE 0xFFFFFFFF
  58. /****************************************************************************
  59.  *  Global - Types
  60.  */
  61. struct RTPPayloadInfo 
  62. {
  63.     const char* pEncoding;
  64.     UINT32  ulRTPFactor;
  65.     UINT32  ulHXFactor;
  66.     BOOL    bTimestampDeliv;
  67.     UINT32  ulBitRate;
  68.     UINT16  usChannels;
  69. };
  70. struct MimeTypeToClockRateInfo
  71. {
  72.     const char* pMimeType;
  73.     UINT32 ulSamplesPerSecond;    
  74. };
  75. struct RTPPayloadHeaderPair
  76. {
  77.     ULONG32 ulPayloadType;
  78.     const BYTE* pHeader;
  79.     ULONG32 ulHeaderSize;
  80. };
  81. /* opaque data for known RTP payloads */
  82. const BYTE p_zPCMU_DATA[] = 
  83. {
  84.     0x01, 0x00, 0x01, 0x00, 0x40, 0x1f, 0x00, 0x00,
  85.     0x40, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 
  86.     0x00, 0x00, 0x26, 0x26 
  87. };
  88. const BYTE p_zPCMA_DATA[] =
  89. {
  90.     0x06, 0x00, 0x01, 0x00, 0x40, 0x1f, 0x00, 0x00,
  91.     0x40, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 
  92.     0x00, 0x00, 0x26, 0x26 
  93. };
  94. const BYTE p_zL162CH_DATA[] =
  95. {
  96.     0x00, 0x00, 0x43, 0x50, 0x00, 0x01, 0x00, 0x02, 
  97.     0x00, 0x00, 0xac, 0x44, 0x00, 0x10, 0x00, 0x00
  98. };
  99. const BYTE p_zL161CH_DATA[] =
  100. {
  101.     0x00, 0x00, 0x43, 0x50, 0x00, 0x01, 0x00, 0x01, 
  102.     0x00, 0x00, 0xac, 0x44, 0x00, 0x10, 0x00, 0x00
  103. };
  104. const BYTE p_zGSM_DATA[] =
  105. {
  106.     0x31, 0x00, 0x01, 0x00, 0x40, 0x1f, 0x00, 0x00,
  107.     0x59, 0x06, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00,
  108.     0x02, 0x00, 0x40, 0x01, 0x26, 0x26
  109. };
  110. typedef struct tPCMHEADER
  111. {
  112.     UINT16      usFormatTag;  /* format type */
  113.     UINT16      usChannels;   /* number of channels (i.e. mono, stereo..*/
  114.     UINT32      ulSamplesPerSec;   /* sample rate */
  115.     UINT16      usBitsPerSample;   /* number of bits per sample of mono data*/
  116.     UINT16      usSampleEndianness; /* for 16-bit samples, 0==little, 1==big */
  117. } PCMHEADER;
  118. /****************************************************************************
  119.  *  Payload to header table - must be NULL entry terminated
  120.  */
  121. const RTPPayloadHeaderPair z_PayloadHeaderPairList[] =
  122. {
  123.     { RTP_PAYLOAD_PCMU,     p_zPCMU_DATA,   sizeof(p_zPCMU_DATA)    },
  124.     { RTP_PAYLOAD_PCMA,     p_zPCMA_DATA,   sizeof(p_zPCMA_DATA)    },
  125.     { RTP_PAYLOAD_L16_2CH,  p_zL162CH_DATA, sizeof(p_zL162CH_DATA)  },
  126.     { RTP_PAYLOAD_L16_1CH,  p_zL161CH_DATA, sizeof(p_zL161CH_DATA)  },
  127.     { RTP_PAYLOAD_GSM,     p_zGSM_DATA,    sizeof(p_zGSM_DATA)     },
  128.     { RTP_BAD_PAYLOAD_TYPE, NULL,     0     }
  129. };
  130. /****************************************************************************
  131.  *  Payload to RN MimeType Table
  132.  *  This table identifies payloads RN can render and the mappings from
  133.  *  the payloads to renderer mime types.
  134.  *  With the transition to standard mime types supported by renderers,
  135.  *  this table will lose the function of mapping but will continue to
  136.  *  identify the renderer supported payloads.
  137.  */
  138. const char* const z_PayloadToRNMimeMap[RTP_PAYLOAD_MAP_SIZE] =
  139. {
  140.     "audio/PCMU", // 0
  141.     NULL, // 1
  142.     NULL, // 2
  143.     "audio/x-pn-gsm610", // 3
  144.     NULL, // 4
  145.     "audio/x-pn-dvi4", // 5
  146.     "audio/x-pn-dvi4", // 6
  147.     NULL, // 7
  148.     "audio/PCMA", // 8
  149.     NULL, // 9
  150.     "audio/L16", // 10
  151.     "audio/L16", // 11
  152.     NULL, // 12
  153.     NULL, // 13
  154.     "audio/MPA", // 14
  155.     NULL, // 15
  156.     NULL, // 16
  157.     NULL, // 17
  158.     NULL, // 18
  159.     NULL, // 19
  160.     NULL, // 20
  161.     NULL, // 21
  162.     NULL, // 22
  163.     NULL, // 23
  164.     NULL, // 24
  165.     NULL, // 25
  166.     "video/x-pn-jpeg-plugin", // 26
  167.     NULL, // 27
  168.     NULL, // 28
  169.     NULL, // 29
  170.     NULL, // 30
  171.     "video/H261", // 31
  172.     "video/MPV", // 32
  173.     NULL, // 33
  174.     "video/H263" // 34
  175. };
  176. /*
  177.  * Payload timestamp conversion table - contains the RTPTimestamp to
  178.  * HXTimestamp ratio factor as well as whether or not this payload
  179.  * is frame based or not.  Since packet size is not included in the To compute the timestamp conversion ratio
  180.  * use this formula for sample based payloads:
  181.  *
  182.  * ClockRate (sam/sec) * SampleSize (Bytes/Sample * Channels) / 1000 = 
  183.  * RTPFactor/HXFactor
  184.  *
  185.  * The stream headers RTPTimestampConversionFactor, HXTimestampConversionFactor
  186.  * and TimestampDelivery are added for known and supported payload types.
  187.  *
  188.  * To convert RTP to RMA time multiply the RTP timestamp by the fraction:
  189.  * RTPTimestampConversionFactor / HXTimestampConversionFactor
  190.  * To convert RMA to RTP time multiply the RMA timestamp by the fraction:
  191.  * HXTimestampConversionFactor / RTPTimestampConversionFactor
  192.  *
  193.  * This information should be exposed with IHXRTPTimestampConverter
  194.  */
  195. /* taken from draft-ietf-avt-profile-new-08.txt */ 
  196. const RTPPayloadInfo z_pPayloads[RTP_PAYLOAD_MAP_SIZE] = 
  197. {
  198. /*   encoding   RTP     RMA     TSD     BW Channels */
  199.     { "PCMU", 8, 1, 0, 64000,     1 }, // 0   8000/8/1
  200.     { "1016", 8, 1, 1, 0,     1 }, // 1   8000/N/1
  201.     { "G726-32",8, 1, 0, 32000,     1 }, // 2   8000/4/1
  202.     { "GSM", 8, 1, 1, 0,     1 }, // 3   8000/N/1
  203.     { "G723", 8, 1, 1, 0,     1 }, // 4   8000/N/1
  204.     { "DVI4", 8, 1, 0, 32000,     1 }, // 5   8000/4/1
  205.     { "DVI4", 16, 1, 0, 64000,     1 }, // 6  16000/4/1
  206.     { "LPC", 8, 1, 1, 0,     1 }, // 7   8000/N/1
  207.     { "PCMA", 8, 1, 0, 64000,     1 }, // 8   8000/8/1
  208.     { "G722", 8, 1, 0, 64000,     1 }, // 9   8000/8/1
  209.     { "L16", 441, 10, 0, 1411200,    2 }, // 10 44100/16/2
  210.     { "L16", 441, 10, 0, 705600,     1 }, // 11 44100/16/1
  211.     { "QCELP", 8, 1, 1, 0,     1 }, // 12  8000/N/1
  212.     { NULL, 0, 0, 0, 0,     0 }, // 13 reserved
  213.     { "MPA", 90, 1, 1, 0,     0 }, // 14 90000/N
  214.     { "G728", 8, 1, 1, 0,     1 }, // 15  8000/N/1
  215.     { "DVI4", 441, 40, 0, 44100,     1 }, // 16 11025/4/1
  216.     { "DVI4", 441, 20, 0, 88200,     1 }, // 17 22050/4/1
  217.     { "G729", 8, 1, 1, 0,     1 }, // 18  8000/N/1
  218.     { NULL, 0, 0, 0, 0,     0 }, // 19 reserved
  219.     { NULL, 0, 0, 0, 0,     0 }, // 20 unassigned
  220.     { NULL, 0, 0, 0, 0,     0 }, // 21 unassigned
  221.     { NULL, 0, 0, 0, 0,     0 }, // 22 unassigned
  222.     { NULL, 0, 0, 0, 0,     0 }, // 23 unassigned
  223.     { NULL, 0, 0, 0, 0,     0 }, // 24 unassigned
  224.     { "CelB", 90, 1, 1, 0,     0 }, // 25 90000/N
  225.     { "JPEG", 90, 1, 1, 0,     0 }, // 26 90000/N
  226.     { NULL, 0, 0, 0, 0,     0 }, // 27 unassigned
  227.     { "nv", 90, 1, 1, 0,     0 }, // 28 90000/N
  228.     { NULL, 0, 0, 0, 0,     0 }, // 29 unassigned
  229.     { NULL, 0, 0, 0, 0,     0 }, // 30 unassigned
  230.     { "H261", 90, 1, 1, 0,     0 }, // 31 90000/N
  231.     { "MPV", 90, 1, 1, 0,     0 }, // 32 90000/N  
  232.     { "MP2T", 90, 1, 1, 0,     0 }, // 33 90000/N
  233.     { "H263", 90, 1, 1, 0,     0 }, // 34 90000/N
  234. };
  235. const UINT32 z_cPayloads = 
  236.     sizeof(z_pPayloads) / 
  237.     sizeof(z_pPayloads[0]);
  238. /*
  239.  *  yet another table for mimetype to samplespersecond
  240.  */
  241. const MimeTypeToClockRateInfo z_pMimeTypeToClockRate[] = 
  242. {
  243.     { "video/H263-1998",    90000},
  244.     { "audio/mpa-robust",   90000}
  245. };
  246. const UINT32 z_cMimeTypeToClockRate = 
  247.     sizeof(z_pMimeTypeToClockRate) / 
  248.     sizeof(z_pMimeTypeToClockRate[0]);
  249. const UINT8* SDPGetGSMOpaqueData()
  250. {
  251.     return p_zGSM_DATA;
  252. }
  253. ULONG32 SDPGetGSMOpaqueDataSize()
  254. {
  255.     return sizeof(p_zGSM_DATA);
  256. }
  257. /****************************************************************************
  258.  *  SDPIsStaticPayload
  259.  */
  260. BOOL SDPIsStaticPayload(ULONG32 ulPayloadType)
  261. {
  262.     return (ulPayloadType < RTP_PAYLOAD_MAP_SIZE);
  263. }
  264. /****************************************************************************
  265.  *  SDPMapPayloadToRTPFactor
  266.  */
  267. UINT32 SDPMapPayloadToRTPFactor(ULONG32 ulPayloadType)
  268. {
  269.     HX_ASSERT(SDPIsStaticPayload(ulPayloadType));
  270.     return z_pPayloads[ulPayloadType].ulRTPFactor;
  271. }
  272. /****************************************************************************
  273.  *  SDPMapPayloadToRMAFactor
  274.  */
  275. UINT32 SDPMapPayloadToRMAFactor(ULONG32 ulPayloadType)
  276. {
  277.     HX_ASSERT(SDPIsStaticPayload(ulPayloadType));
  278.     return z_pPayloads[ulPayloadType].ulHXFactor;
  279. }
  280. /****************************************************************************
  281.  *  SDPMapPayloadToSamplesPerSecond
  282.  */
  283. ULONG32 SDPMapPayloadToSamplesPerSecond(ULONG32 ulPayloadType)
  284. {
  285.     if (SDPIsStaticPayload(ulPayloadType))
  286.     {
  287.         return (ULONG32) (1000.0 *
  288.                           ((double) SDPMapPayloadToRTPFactor(ulPayloadType)) /
  289.                           ((double) SDPMapPayloadToRMAFactor(ulPayloadType)));
  290.     }
  291.     return 0;
  292. }
  293. /****************************************************************************
  294.  *  SDPIsTimestampDeliverable
  295.  */
  296. BOOL SDPIsTimestampDeliverable(ULONG32 ulPayloadType)
  297. {
  298.     HX_ASSERT(SDPIsStaticPayload(ulPayloadType));
  299.     return z_pPayloads[ulPayloadType].bTimestampDeliv;
  300. }
  301. /****************************************************************************
  302.  *  SDPMapPayloadToEncodingName
  303.  */
  304. const char* SDPMapPayloadToEncodingName(ULONG32 ulPayloadType)
  305. {
  306.     if (SDPIsStaticPayload(ulPayloadType))
  307.     {
  308.         return z_pPayloads[ulPayloadType].pEncoding;
  309.     }
  310.     return NULL;
  311. }
  312. /****************************************************************************
  313.  *  SDPMapPayloadToEncodingName
  314.  */
  315. const char* SDPMapPayloadToMimeType(ULONG32 ulPayloadType)
  316. {
  317.     if (SDPIsStaticPayload(ulPayloadType))
  318.     {
  319.         return z_PayloadToRNMimeMap[ulPayloadType];
  320.     }
  321.     return NULL;
  322. }
  323. /****************************************************************************
  324.  *  SDPMapPayloadToChannels
  325.  */
  326. UINT16 SDPMapPayloadToChannels(ULONG32 ulPayloadType)
  327. {
  328.     if (SDPIsStaticPayload(ulPayloadType))
  329.     {
  330.         return z_pPayloads[ulPayloadType].usChannels;   
  331.     }
  332.     return 0;
  333. }
  334. /****************************************************************************
  335.  *  SDPMapPayloadToBitrate
  336.  */
  337. ULONG32 SDPMapPayloadToBitrate(ULONG32 ulPayloadType)
  338. {
  339.     if (SDPIsStaticPayload(ulPayloadType))
  340.     {
  341.         return z_pPayloads[ulPayloadType].ulBitRate;   
  342.     }
  343.     return 0;
  344. }
  345. /****************************************************************************
  346.  *  SDPMapMimeTypeToSampleRate
  347.  */
  348. ULONG32 SDPMapMimeTypeToSampleRate(const char* pMimeType)
  349. {
  350.     ULONG32 ulSamplesPerSecond = 0;
  351.     for (ULONG32 ulIdx = 0; 
  352.          ulIdx < z_cMimeTypeToClockRate; 
  353.          ulIdx++)
  354.     {
  355.         if (z_pMimeTypeToClockRate[ulIdx].pMimeType &&
  356.             !strcasecmp(
  357.                 z_pMimeTypeToClockRate[ulIdx].pMimeType,
  358.                 pMimeType))
  359.         {
  360.             ulSamplesPerSecond = 
  361.                 z_pMimeTypeToClockRate[ulIdx].ulSamplesPerSecond;
  362.             break;
  363.         }
  364.     }
  365.     return ulSamplesPerSecond;
  366. }
  367. /****************************************************************************
  368.  *  SDPMapPayloadToHeaderData
  369.  */
  370. const UCHAR* SDPMapPayloadToHeaderData(ULONG32 ulPayloadType,
  371.                                        ULONG32& ulDataSize)
  372. {
  373.     const RTPPayloadHeaderPair* pPair;
  374.     for (pPair = z_PayloadHeaderPairList;
  375.          pPair->pHeader;
  376.          pPair++)
  377.     {
  378.         if (pPair->ulPayloadType == ulPayloadType)
  379.         {
  380.             ulDataSize = pPair->ulHeaderSize;
  381.             return pPair->pHeader;
  382.         }
  383.     }
  384.     
  385.     ulDataSize = 0;
  386.     return NULL;
  387. }