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

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * CHXSymClipInfo.cpp
  3.  * ---------------
  4.  *
  5.  *
  6.  *
  7.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  8.  *
  9.  *****************************************************************************/
  10.   
  11. #include "hxtypes.h"
  12. #include "hxsym_debug.h"
  13. #include "hxsym_leaveutil.h"
  14. #include "hxdebug_hxapi.h"
  15. #include "hxapihelp_player.h"
  16. #include "hxapihelp.h"
  17. #include "chxavplayer.h"
  18. #include "chxavcleanstring.h"
  19. #include "chxavconfignames.h"
  20. #include "chxavcleanupstack.h"
  21. #include "comptr.h"
  22. #include "comptr_traits.h"
  23. #include "chxavutil.h"
  24. #include "chxsymclipinfo.h"
  25. /*
  26.  * CHXSymClipInfo
  27.  * -----------
  28.  *
  29.  */
  30. CHXSymClipInfo::CHXSymClipInfo() 
  31. : m_bHasVideo(false)
  32. , m_bIsLive(false)
  33. {
  34. }
  35. /*
  36.  * ~CHXSymClipInfo
  37.  * -------------
  38.  * Destructor.
  39.  *
  40.  */
  41. CHXSymClipInfo::~CHXSymClipInfo()
  42. {
  43.     Reset();
  44. }
  45. void CHXSymClipInfo::Reset()
  46. {
  47.     CleanupHeaders();
  48.     CleanupBitrateInfo();
  49.     CleanupURLs();
  50.     m_bHasVideo = false;
  51.     m_bIsLive = false;
  52.     m_strServer = "";
  53. }
  54. /*
  55.  * Release file and stream headers for all sources
  56.  */
  57. void CHXSymClipInfo::CleanupHeaders()
  58. {
  59.     TInt count = m_sourceHeaders.GetSize();
  60.     for(TInt idx = 0; idx < count; ++idx)
  61.     {
  62.         CHXPtrArray* pSourceHeaders = reinterpret_cast<CHXPtrArray*>(m_sourceHeaders[idx]);
  63.         CleanupHeaders(pSourceHeaders);
  64.         delete pSourceHeaders;
  65.     }
  66.     m_sourceHeaders.RemoveAll();
  67. }
  68. /*
  69.  * Release file and stream headers for the given source
  70.  */
  71. void CHXSymClipInfo::CleanupHeaders(CHXPtrArray* pSourceHeaders)
  72. {
  73.     HX_ASSERT(pSourceHeaders);
  74.     TInt count = pSourceHeaders->GetSize();
  75.     for(TInt idx = 0; idx < count; ++idx)
  76.     {
  77.         delete reinterpret_cast<comptr<IHXValues>*>((*pSourceHeaders)[idx]);
  78.     }
  79.     pSourceHeaders->RemoveAll();
  80. }
  81. /*
  82.  * delete and clear bitrate value info
  83.  */
  84. void CHXSymClipInfo::CleanupBitrateInfo()
  85. {
  86.     TInt count = m_bitrateInfo.GetSize();
  87.     for(TInt idx = 0; idx < count; ++idx)
  88.     {
  89.         CHXPtrArray* pBitrateValues = reinterpret_cast<CHXPtrArray*>(m_bitrateInfo[idx]);
  90.         delete pBitrateValues;
  91.     }
  92.     m_bitrateInfo.RemoveAll();
  93. }
  94. /*
  95.  * delete source URLs
  96.  */
  97. void CHXSymClipInfo::CleanupURLs()
  98. {
  99.     TInt count = m_sourceURLs.GetSize();
  100.     for(TInt idx = 0; idx < count; ++idx)
  101.     {
  102.         CHXString* pStr = reinterpret_cast<CHXString*>(m_sourceURLs[idx]);
  103.         delete pStr;
  104.     }
  105.     m_sourceURLs.RemoveAll();
  106. }
  107. /*
  108.  * Collect source URLs from active player.
  109.  */
  110. void CHXSymClipInfo::CacheURLsL(IHXPlayer* pPlayer)
  111. {
  112.     CleanupURLs();
  113.     UINT32 sourceCount = pPlayer->GetSourceCount();
  114.     m_sourceURLs.SetSize(sourceCount);
  115.     for(UINT32 idxSource = 0; idxSource < sourceCount; ++idxSource)
  116.     {
  117.         comptr<IHXStreamSource> streamSource = player::GetSource(pPlayer, idxSource);
  118.         CHXString* pStr = new CHXString(streamSource->GetURL());
  119.         DPRINTF(SYMP_INFO, ("CHXSymClipInfo::CacheURLsL(): src %lu url is '%.*s'n", idxSource, 300, static_cast<const char*>(*pStr)));
  120.         m_sourceURLs[idxSource] = pStr;
  121.     }
  122. }
  123. /*
  124.  * Collect file and stream headers from active player. 
  125.  */
  126. void CHXSymClipInfo::CacheHeadersL(IHXPlayer* pPlayer)
  127. {
  128.     CleanupHeaders();
  129.     UINT32 sourceCount = pPlayer->GetSourceCount();
  130.     m_sourceHeaders.SetSize(sourceCount);
  131.     for(UINT32 idxSource = 0; idxSource < sourceCount; ++idxSource)
  132.     {
  133.         m_sourceHeaders[idxSource] = new (ELeave) CHXPtrArray;
  134.         CHXPtrArray* pHeaderArray = reinterpret_cast<CHXPtrArray*>(m_sourceHeaders[idxSource]);
  135.         // set source header total count == one file header + stream headers
  136.         UINT32 streamCount = player::GetStreamCount(pPlayer, idxSource);
  137.         pHeaderArray->SetSize(streamCount + 1); 
  138.     
  139.         comptr<IHXValues> fileHeader = player::GetFileHeader(pPlayer, 0);
  140.         
  141.         // HX_ASSERT(fileHeader); // sourceCount > 0 and no file header; this is possible for SDP
  142.         if(!fileHeader)
  143.         {
  144.             CleanupHeaders();
  145.             break;
  146.         }
  147.         // assign file header
  148.         comptr<IHXValues>* pHeader = new (ELeave) comptr<IHXValues>;
  149.         *pHeader = fileHeader;
  150.         
  151.         // stick it in
  152.         (*pHeaderArray)[0] = pHeader;
  153.         
  154.         // stream headers
  155.         for(UINT32 idxStream = 0; idxStream < streamCount; ++idxStream)
  156.         {
  157.             UINT32 idxHeader = idxStream + 1;
  158.             // assign stream header
  159.             pHeader = new (ELeave) comptr<IHXValues>;
  160.             *pHeader = player::GetStreamHeader(pPlayer, idxSource, idxStream);
  161.             // stick it in
  162.             (*pHeaderArray)[idxHeader] = pHeader;
  163.            
  164.         }
  165.     }
  166. }
  167. /*
  168.  * return header at given index within array of headers for given source index
  169.  */
  170. comptr<IHXValues> CHXSymClipInfo::GetHeaderHelper(UINT32 idxSource, UINT32 idxHeader) const
  171. {
  172.     comptr<IHXValues> header;
  173.     if(idxSource < m_sourceHeaders.GetSize())
  174.     {
  175.         CHXPtrArray* pSourceHeaders = reinterpret_cast<CHXPtrArray*>(m_sourceHeaders[idxSource]);
  176.         HX_ASSERT(pSourceHeaders);
  177.         HX_ASSERT(!pSourceHeaders->IsEmpty());
  178.     
  179.         if(idxHeader < pSourceHeaders->GetSize())
  180.         {
  181.             header = *(reinterpret_cast<comptr<IHXValues>*>((*pSourceHeaders)[idxHeader]));
  182.         }
  183.     }
  184.     
  185.     return header;
  186. }
  187. /*
  188.  * save live and video presentation info
  189.  */
  190. void CHXSymClipInfo::CachePresentationInfoL(IHXPlayer* pPlayer)
  191. {
  192.     m_bIsLive = pPlayer->IsLive();
  193.     m_bHasVideo = DoCheckForNonAudioStreams();
  194. }
  195. void CHXSymClipInfo::CacheRequestInfo(IHXRequest* pRequest)
  196. {
  197.     HX_ASSERT(pRequest);
  198.     dbg::DumpObject(pRequest);
  199.     comptr<IHXValues> respHeaders;
  200.     pRequest->GetResponseHeaders(respHeaders.AsRef());
  201.     if( respHeaders )
  202.     {
  203.         // store server name (if present) for clip info
  204.         val::GetString(respHeaders, "Server", m_strServer);
  205.     }
  206. }
  207.     
  208. // helper
  209. bool CHXSymClipInfo::DoCheckForNonAudioStreams()
  210. {
  211.     // XXXLCM this won't work for smil with all audio streams (first source has smil mimetype)
  212.     UINT32 sourceCount = GetSourceCount();
  213.     for(UINT32 idxSource = 0; idxSource < sourceCount; ++idxSource)
  214.     {
  215.         UINT32 streamCount = GetStreamCount(idxSource);
  216.         for(UINT32 idx = 0; idx < streamCount; ++idx)
  217.         {
  218.             comptr<IHXValues> header = GetStreamHeader(idx, idxSource);
  219.             HX_ASSERT(header);
  220.             CHXString strMimeType;
  221.             val::GetString(header, "MimeType", strMimeType);
  222.             HX_ASSERT(!strMimeType.IsEmpty());
  223.             if( 0 != strMimeType.Left(5).CompareNoCase("audio"))
  224.             {
  225.                 // non-audio stream found
  226.                 DPRINTF(SYMP_INFO, ("CHXSymClipInfo::DoCheckForNonAudioStreams(): found '%s' (non-audio)n", static_cast<const char*>(strMimeType)));
  227.                 return true;
  228.             }
  229.         }
  230.     }
  231.     // everything is audio
  232.     DPRINTF(SYMP_INFO, ("CHXAvPlayer::DoCheckForNonAudioStreams(): audio onlyn"));
  233.     return false;
  234. }
  235. /*
  236.  * return file header for current or most-recent playback
  237.  */
  238. comptr<IHXValues> CHXSymClipInfo::GetFileHeader(UINT32 idxSource) const
  239. {
  240.     // file header is always first header in source headers array
  241.     return GetHeaderHelper(idxSource, 0);
  242.     
  243. }
  244. /*
  245.  * return url for current or most-recent playback
  246.  */
  247. const char* CHXSymClipInfo::GetURL(UINT32 idxSource) const
  248. {
  249.     const char* psz = 0;
  250.     if(idxSource < m_sourceURLs.GetSize())
  251.     {
  252.         CHXString* pStr = reinterpret_cast<CHXString*>(m_sourceURLs[idxSource]);
  253.         psz = *pStr;
  254.     }
  255.     return psz;
  256.     
  257. }
  258. /*
  259.  * return source count for current or most-recent playback
  260.  */
  261. UINT32 CHXSymClipInfo::GetSourceCount() const
  262.     return m_sourceHeaders.GetSize(); 
  263. }
  264. /*
  265.  * return stream count for current or most-recent playback
  266.  */
  267. UINT32  CHXSymClipInfo::GetStreamCount(UINT32 idxSource) const
  268. {
  269.     HX_ASSERT(idxSource < m_sourceHeaders.GetSize());
  270.     CHXPtrArray* pSourceHeaders = reinterpret_cast<CHXPtrArray*>(m_sourceHeaders[idxSource]);
  271.     HX_ASSERT(pSourceHeaders);
  272.     UINT32 count = pSourceHeaders->GetSize();
  273.     if( count > 0 )
  274.     {
  275.         --count; // minus one for file header
  276.     }
  277.     return count;
  278. }
  279. /*
  280.  * return stream header for current or most-recent playback
  281.  */
  282. comptr<IHXValues> CHXSymClipInfo::GetStreamHeader(UINT32 idxStream, UINT32 idxSource) const
  283. {
  284.     UINT32 idxStreamHeader = idxStream + 1; // plus one accounts for file header at slot 0
  285.     return GetHeaderHelper(idxSource, idxStreamHeader);
  286. }
  287. /*
  288.  * return best-known stream bitrate value for given stream index
  289.  */
  290. UINT32 CHXSymClipInfo::GetStreamBitrate(UINT32 idxStream, UINT32 idxSource) const
  291. {
  292.     //HX_ASSERT(idxSource < m_bitrateInfo.GetSize()); // possible if file/stream headers gotten but bitrate values not determined yet
  293.     UINT32 bitrate = 0;
  294.     if( idxSource < m_bitrateInfo.GetSize() )
  295.     {
  296.         CHXPtrArray* pBitrateValues = reinterpret_cast<CHXPtrArray*>(m_bitrateInfo[idxSource]);
  297.         HX_ASSERT(pBitrateValues);
  298.         HX_ASSERT(idxStream < pBitrateValues->GetSize());
  299.         if(idxStream < pBitrateValues->GetSize())
  300.         {
  301.             bitrate = reinterpret_cast<UINT32>((*pBitrateValues)[idxStream]);
  302.         }
  303.     }
  304.     return bitrate;
  305. }
  306. /*
  307.  * save best-known stream bitrate values
  308.  */
  309. void CHXSymClipInfo::SaveStreamBitrateValuesL(IHXPlayer* pPlayer)
  310. {
  311.     UINT32 sourceCount = pPlayer->GetSourceCount();
  312.     m_bitrateInfo.SetSize(sourceCount);
  313.     for(UINT32 idxSource = 0; idxSource < sourceCount; ++idxSource)
  314.     {
  315.         m_bitrateInfo[idxSource] = new (ELeave) CHXPtrArray;
  316.         CHXPtrArray* pBitrateValues = reinterpret_cast<CHXPtrArray*>(m_bitrateInfo[idxSource]);
  317.         UINT32 streamCount = player::GetStreamCount(pPlayer, idxSource);
  318.         pBitrateValues->SetSize(streamCount);
  319.         for(UINT32 idxStream = 0; idxStream < streamCount; ++idxStream)
  320.         {
  321.             // prefer asm bitrate connect value...
  322.             comptr<IHXStream> stream = player::GetStream(pPlayer, idxSource, idxStream);
  323.             void*& bitrate = (*pBitrateValues)[idxStream];
  324.             bitrate = reinterpret_cast<void*>(player::GetStreamASMBandwidth(stream));
  325.             // if no asm bitrate use header 'avgbitrate' value - this may be wrong value for streamed surestream case
  326.             if(0 == bitrate)
  327.             {
  328.                 UINT32 val = 0;
  329.                 comptr<IHXValues> streamHeader = GetStreamHeader(idxStream, idxSource);
  330.                 HX_ASSERT(streamHeader);
  331.                 if(streamHeader)
  332.                 {
  333.                     val::GetUINT32(streamHeader, "AvgBitrate", val);
  334.                     bitrate = reinterpret_cast<void*>(val);
  335.                 }
  336.                 
  337.             }
  338.     
  339.         }
  340.     }
  341. }
  342.