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

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 MP4V_RN_3GPP_H263_PAYLOAD_MIME_TYPE "video/X-RN-3GPP-H263"
  40. #if defined(HELIX_FEATURE_VIDEO_H263_FAVOR_CORRUPTEDFRAMES_OVER_JITTER)
  41. #define NON_KEYFRM_DCDE_FALLBEHIND_THRSHLD  -33 // in milliseconds
  42. #else
  43. #define NON_KEYFRM_DCDE_FALLBEHIND_THRSHLD  -800 // in milliseconds
  44. #endif // HELIX_FEATURE_VIDEO_H263_FAVOR_CORRUPTEDFRAMES_OVER_JITTER
  45. #define DFLT_MAX_IMG_WIDTH 176
  46. #define DFLT_MAX_IMG_HEIGHT 144
  47. #define CCCC_ENCODE(b1, b2, b3, b4) ((b1 << 24) |
  48.  (b2 << 16) |
  49.  (b3 << 8)  |
  50.  b4)
  51. /****************************************************************************
  52.  *  Includes
  53.  */
  54. #include "h263vidfmt.h"
  55. #include "hxasm.h"
  56. #include "hxwin.h"
  57. #include "hxvsurf.h"
  58. // #include "hxvctrl.h"
  59. #include "hxsite2.h"
  60. #include "hxthread.h"
  61. #include "hxtick.h"
  62. #include "hxassert.h"
  63. #include "hxstrutl.h"
  64. #include "hxmarsh.h"
  65. #include "unkimp.h"
  66. #include "timeval.h"
  67. #include "cttime.h"
  68. #include "hxcodec.h"
  69. // #include "qtbatom.h"
  70. #include "h263video.h"
  71. /****************************************************************************
  72.  *  Locals
  73.  */
  74. /****************************************************************************
  75.  *  Method:
  76.  *    CQTVideoFormat::CQTVideoFormat
  77.  *
  78.  */
  79. CH263VideoFormat::CH263VideoFormat(IHXCommonClassFactory* pCommonClassFactory,
  80.    CH263VideoRenderer* pH263VideoRenderer)
  81.     : CVideoFormat(pCommonClassFactory, pH263VideoRenderer)
  82.     , m_pH263VideoRenderer(pH263VideoRenderer)
  83.     , m_pRssm(NULL)
  84.     , m_pMaxDims(NULL)
  85.     , m_pAssmDims(NULL)
  86.     , m_pDecoder(NULL)
  87.     , m_ulDecoderBufSize(0)
  88. {
  89.     HX_ASSERT(m_pCommonClassFactory);
  90.     HX_ASSERT(pH263VideoRenderer);
  91.     m_pH263VideoRenderer->AddRef();
  92. }
  93. /****************************************************************************
  94.  *  Method:
  95.  *    CQTVideoFormat::~CQTVideoFormat
  96.  *
  97.  */
  98. CH263VideoFormat::~CH263VideoFormat()
  99. {
  100.     HX_RELEASE(m_pH263VideoRenderer);
  101.     if (m_pRssm)
  102.     {
  103. m_pRssm->Close();
  104. m_pRssm->Release();
  105. m_pRssm = NULL;
  106.     }
  107.     HX_DELETE(m_pDecoder);
  108.     HX_DELETE(m_pMaxDims);
  109.     _Reset();
  110. }
  111. /****************************************************************************
  112.  *  Method:
  113.  *    CQTVideoFormat::Init
  114.  *
  115.  */
  116. HX_RESULT CH263VideoFormat::Init(IHXValues* pHeader)
  117. {
  118.     IHXBuffer* pMimeType = NULL;
  119.     const char* pMimeTypeData = NULL;
  120.     HX_RESULT retVal = CVideoFormat::Init(pHeader);
  121.     if (SUCCEEDED(retVal))
  122.     {
  123. retVal = pHeader->GetPropertyCString("MimeType", pMimeType);
  124.     }
  125.     if (SUCCEEDED(retVal))
  126.     {
  127. pMimeTypeData = (char*) pMimeType->GetBuffer();
  128. retVal = HXR_FAIL;
  129. if (pMimeTypeData)
  130. {
  131.     retVal = HXR_OK;
  132. }
  133.     }
  134.     if (SUCCEEDED(retVal))
  135.     {
  136. if (strcasecmp(pMimeTypeData, 
  137.        MP4V_RN_3GPP_H263_PAYLOAD_MIME_TYPE) == 0)
  138. {
  139.     IHXBuffer* pConfigData = NULL;
  140.     retVal = pHeader->GetPropertyBuffer("OpaqueData", pConfigData);
  141.     if (SUCCEEDED(retVal))
  142.     {
  143. retVal = ConfigFrom3GPPHeader(pConfigData);
  144.     }
  145.     HX_RELEASE(pConfigData);
  146.     // This payload is raw H263 frames and needs no assembly
  147.     HX_RELEASE(m_pRssm);
  148. }
  149. else
  150. {
  151.     // Assume H263 payload - Create Packet Assembler
  152.     retVal = HXR_OUTOFMEMORY;
  153.     m_pRssm = new CH263PayloadFormat();
  154.     if (m_pRssm)
  155.     {
  156. m_pRssm->AddRef();
  157. retVal = HXR_OK;
  158.     }
  159. }
  160.     }
  161.     HX_RELEASE(pMimeType);
  162.     // Create Decoder
  163.     if (SUCCEEDED(retVal))
  164.     {
  165. retVal = HXR_OUTOFMEMORY;
  166.     m_pDecoder = CreateDecoder();
  167. if (m_pDecoder)
  168. {
  169.     retVal = HXR_OK;
  170. }
  171.     }
  172.     if (SUCCEEDED(retVal) && m_pRssm)
  173.     {
  174. retVal = m_pRssm->Init(m_pCommonClassFactory, FALSE);
  175.     }
  176.     
  177.     if (SUCCEEDED(retVal) && m_pRssm)
  178.     {
  179. retVal = m_pRssm->SetStreamHeader(pHeader);
  180.     }
  181.     m_DecoderDims.cx = 0;
  182.     m_DecoderDims.cy = 0;
  183.     return retVal;
  184. }
  185. /****************************************************************************
  186.  *  Method:
  187.  *    CQTVideoFormat::CreateAssembledPacket
  188.  *
  189.  */
  190. CMediaPacket* CH263VideoFormat::CreateAssembledPacket(IHXPacket* pCodecData)
  191. {
  192.     CMediaPacket* pFramePacket = NULL;
  193.     IHXPacket* pPacket = NULL;
  194.     m_pH263VideoRenderer->BltIfNeeded();
  195.     if (m_pRssm)
  196.     {
  197. m_LastError = m_pRssm->SetPacket(pCodecData);
  198.         if( m_LastError == HXR_OUTOFMEMORY )
  199.         {
  200.     return NULL;
  201.         }
  202. m_pRssm->GetPacket(pPacket);
  203.     }
  204.     else if (!pCodecData->IsLost())
  205.     {
  206. // Since there is no packet assembler - assume no assembly is needed
  207. pPacket = pCodecData;
  208. pPacket->AddRef();
  209.     }
  210.     if (pPacket)
  211.     {
  212. HXxSize FrameDims;
  213. HXxSize* pFrameDims = NULL;
  214. IHXBuffer* pBuffer = pPacket->GetBuffer();
  215. if (pBuffer)
  216. {
  217. #ifdef _TRUST_MAX_DIMS_WHEN_AVAILABLE
  218.     if (!m_pMaxDims)
  219. #endif // _TRUST_MAX_DIMS_WHEN_AVAILABLE
  220.     {
  221. HX_RESULT status = 
  222.     CH263PayloadFormat::GetFrameDimensions(pBuffer, FrameDims);
  223. if (status == HXR_NO_DATA)
  224. {
  225.     // This is a custom size H263+ and we do not parse the
  226.     // bitstream deep enough to get to the custom size
  227.     if (m_pMaxDims &&
  228. (m_pMaxDims->cx != 0) &&
  229. (m_pMaxDims->cy != 0))
  230.     {
  231. FrameDims = *m_pMaxDims;
  232.     }
  233.     else
  234.     {
  235. FrameDims.cx = DFLT_MAX_IMG_WIDTH;
  236. FrameDims.cy = DFLT_MAX_IMG_HEIGHT;
  237.     }
  238. }
  239. // Assembler can extract the frame dimensions
  240. if ((status == HXR_OK) || (status == HXR_NO_DATA))
  241. {
  242.     if (!m_pAssmDims)
  243.     {
  244. m_pAssmDims = new HXxSize;
  245. pFrameDims = new HXxSize;
  246. if (pFrameDims && m_pAssmDims)
  247. {
  248.     *m_pAssmDims = *pFrameDims = FrameDims;
  249.     if (status == HXR_OK)
  250.     {
  251. // we resize only on actual frame dimensions
  252. m_pH263VideoRenderer->ResizeViewFrame(FrameDims);
  253.     }
  254. }
  255. else
  256. {
  257.     HX_DELETE(m_pAssmDims);
  258.     HX_DELETE(pFrameDims);
  259. }
  260.     }
  261.     else
  262.     {
  263. if (*m_pAssmDims != FrameDims)
  264. {
  265.     pFrameDims = new HXxSize;
  266.     
  267.     if (pFrameDims)
  268.     {
  269. *pFrameDims = FrameDims;
  270.     }
  271.     else
  272.     {
  273. HX_DELETE(m_pAssmDims);
  274.     }
  275. }
  276.     }
  277. }
  278.     }
  279. #ifdef _TRUST_MAX_SIZE_WHEN_AVAILABLE
  280.     else if ((!m_pAssmDims) && m_pMaxDims)
  281.     {
  282. // If assembler is absent, we should have max. dimensions
  283. // from out-of and config. data
  284. m_pAssmDims = new HXxSize;
  285. pFrameDims = new HXxSize;
  286. if (pFrameDims && m_pAssmDims)
  287. {
  288.     *m_pAssmDims = *pFrameDims = *m_pMaxDims;
  289. }
  290. else
  291. {
  292.     HX_DELETE(m_pAssmDims);
  293.     HX_DELETE(pFrameDims);
  294. }
  295.     }
  296. #endif // _TRUST_MAX_DIMS_WHEN_AVAILABLE
  297.     
  298.     if (m_pAssmDims)
  299.     {
  300. ULONG32 ulDataSize = pBuffer->GetSize();
  301. ULONG32 ulNewBufferSize = ulDataSize;
  302. UINT8* pData = pBuffer->GetBuffer();
  303. UINT8* pNewBuffer = (UINT8*) pBuffer;
  304. ULONG32 ulFlags = MDPCKT_USES_IHXBUFFER_FLAG;
  305. #ifdef _OVERALLOC_CODEC_DATA
  306. // If Reassembler is present, it is responsible for overallocating
  307. // data if needed
  308. if (!m_pRssm)
  309. {
  310.     ulFlags = 0;
  311.     ulNewBufferSize += _OVERALLOC_CODEC_DATA;
  312.     pNewBuffer = new UINT8 [ulNewBufferSize];
  313.     if (pNewBuffer)
  314.     {
  315. memcpy(pNewBuffer, pData, ulDataSize); /* Flawfinder: ignore */
  316.     }
  317.     pData = pNewBuffer;
  318. }
  319. #endif // _OVERALLOC_CODEC_DATA
  320. if (pNewBuffer)
  321. {
  322.     pFramePacket = new CMediaPacket(
  323.     pNewBuffer,
  324.     pData, 
  325.     ulNewBufferSize,
  326.     ulDataSize,
  327.     pPacket->GetTime(),
  328.     ulFlags,
  329.     pFrameDims);
  330. }
  331. if (pFramePacket)
  332. {
  333.     pFramePacket->SetSampleDescKiller(KillH263ampleDesc);
  334. }
  335. else
  336. {
  337.                     m_LastError = HXR_OUTOFMEMORY;
  338. }
  339.     }
  340.     pBuffer->Release();
  341. }
  342.     
  343.         if( m_LastError != HXR_OUTOFMEMORY )
  344.         {
  345.     m_pH263VideoRenderer->BltIfNeeded();
  346.         }
  347.     
  348. pPacket->Release();
  349.     }
  350.     else
  351.     {
  352. if (pCodecData->IsLost())
  353. {
  354. #if defined(HELIX_FEATURE_STATS)
  355.     m_pH263VideoRenderer->ReportLostFrame();
  356. #endif /* #if defined(HELIX_FEATURE_STATS) */
  357. }
  358.     }
  359.     return pFramePacket;
  360. }
  361. /****************************************************************************
  362.  *  Method:
  363.  *    CQTVideoFormat::Reset
  364.  *
  365.  */
  366. void CH263VideoFormat::Reset()
  367. {
  368.     _Reset();
  369.     CVideoFormat::Reset();
  370. }
  371. void CH263VideoFormat::_Reset(void)
  372. {
  373.     HX_DELETE(m_pAssmDims);
  374.     if (m_pRssm)
  375.     {
  376. m_pRssm->Reset();
  377.     }
  378.     m_DecoderDims.cx = 0;
  379.     m_DecoderDims.cy = 0;
  380.     m_ulDecoderBufSize = 0;
  381. }
  382. /****************************************************************************
  383.  *  Method:
  384.  *    CQTVideoFormat::CreateDecodedPacket
  385.  *
  386.  */
  387. CMediaPacket* CH263VideoFormat::CreateDecodedPacket(CMediaPacket* pFrameToDecode)
  388. {
  389.     HXxSize currentFrameDims;
  390.     CMediaPacket* pDecodedFrame = NULL;
  391.     UINT8* pData = NULL;
  392.     HX_ASSERT(pFrameToDecode);
  393.     // Compute Decode Buffer Storage if info. available
  394.     if (pFrameToDecode->m_pSampleDesc)
  395.     {
  396. if (memcmp(pFrameToDecode->m_pSampleDesc, 
  397.    &m_DecoderDims, 
  398.    sizeof(HXxSize)) != 0)
  399. {
  400.     m_DecoderDims = *((HXxSize*) pFrameToDecode->m_pSampleDesc);
  401.     m_ulDecoderBufSize = m_DecoderDims.cx * 
  402.  m_DecoderDims.cy * 
  403.  H263_PIXEL_SIZE / 
  404.  8;
  405.     m_LastFrameDims = m_DecoderDims;
  406.     if (m_pDecoder->InitDecoder(&m_DecoderDims) != HXR_OK)
  407.     {
  408. m_DecoderDims.cx = 0;
  409. m_DecoderDims.cy = 0;
  410. m_ulDecoderBufSize = 0;
  411.     }
  412. }
  413.     }
  414.     // Get the storage for the Decode Buffer
  415.     if (m_ulDecoderBufSize > 0)
  416.     {
  417. CMediaPacket* pVideoPacket = NULL;
  418. pVideoPacket = (CMediaPacket*) m_pFramePool->Get(m_ulDecoderBufSize);
  419. if (pVideoPacket)
  420. {
  421.     pData = pVideoPacket->m_pData;
  422.     
  423.     HX_ASSERT(pData);
  424.     
  425.     pVideoPacket->Init(pData,
  426.        m_ulDecoderBufSize,
  427.        pFrameToDecode->m_ulTime,
  428.        0,
  429.        pFrameToDecode->m_pSampleDesc);
  430.     
  431.     pFrameToDecode->m_pSampleDesc = NULL;
  432.     
  433.     pDecodedFrame = pVideoPacket;
  434. }
  435. else
  436. {
  437.     pData = new UINT8 [m_ulDecoderBufSize];
  438. }
  439.     }
  440.     if (pData && m_pH263VideoRenderer->IsActive())
  441.     {
  442. LONG32 lTimeAhead;
  443. lTimeAhead = m_pH263VideoRenderer->ComputeTimeAhead(
  444. pFrameToDecode->m_ulTime, 
  445. 0);
  446. if (lTimeAhead < NON_KEYFRM_DCDE_FALLBEHIND_THRSHLD)
  447. {
  448.     // Throw away this frame
  449.     if (pDecodedFrame)
  450.     {
  451. m_pFramePool->Put(pDecodedFrame);
  452. pDecodedFrame = NULL;
  453. pData = NULL;
  454.     }
  455.     else
  456.     {
  457. delete [] pData;
  458. pData = NULL;
  459.     }
  460. #if defined(HELIX_FEATURE_STATS)
  461.     m_pH263VideoRenderer->ReportDroppedFrame();
  462. #endif /* #if defined(HELIX_FEATURE_STATS) */
  463. }
  464.     }
  465.     // Decode
  466.     if (pData)
  467.     {
  468. m_pH263VideoRenderer->BltIfNeeded();
  469. if (m_pDecoder->DecodeFrame(pFrameToDecode,
  470.     pData,
  471.     &currentFrameDims) != HXR_OK)
  472. {
  473.     // Throw away this frame
  474.     if (pDecodedFrame)
  475.     {
  476. m_pFramePool->Put(pDecodedFrame);
  477. pDecodedFrame = NULL;
  478. pData = NULL;
  479.     }
  480.     else
  481.     {
  482. delete [] pData;
  483. pData = NULL;
  484.     }
  485. #if defined(HELIX_FEATURE_STATS)
  486.     m_pH263VideoRenderer->ReportDroppedFrame();
  487. #endif /* #if defined(HELIX_FEATURE_STATS) */
  488. }
  489.     }
  490.     m_pH263VideoRenderer->BltIfNeeded();
  491.     // If the frame is not formed yet, form it
  492.     if (!pDecodedFrame)
  493.     {
  494. if (pData)
  495. {
  496.     // Data exists to form the docoded packet with
  497.     pFrameToDecode->SetBuffer(pData,
  498.       pData,
  499.       m_ulDecoderBufSize, 
  500.       m_ulDecoderBufSize);
  501.     
  502.     pDecodedFrame = pFrameToDecode;
  503.     pFrameToDecode = NULL;
  504.     // If there is a change in frame size, forward the change
  505.     if (m_LastFrameDims != currentFrameDims)
  506.     {
  507. HXxSize* pNewFrameDims = new HXxSize;
  508. HX_ASSERT(currentFrameDims.cx <= m_DecoderDims.cx);
  509. HX_ASSERT(currentFrameDims.cy <= m_DecoderDims.cy);
  510. if (pNewFrameDims)
  511. {
  512.     *pNewFrameDims = currentFrameDims;
  513.     pDecodedFrame->SetSampleDesc(pNewFrameDims);
  514.     m_LastFrameDims = currentFrameDims;
  515. }
  516.     }
  517. }
  518. else if (pFrameToDecode->m_pSampleDesc)
  519. {
  520.     // No data exists to form the frame with, but description
  521.     // exists and must be passed down the pipe - form empty 
  522.     // frame packet
  523.     pDecodedFrame = pFrameToDecode;
  524.     pDecodedFrame->m_pData = NULL;
  525.     pDecodedFrame->m_ulDataSize = 0;
  526.     pFrameToDecode = NULL; 
  527. }
  528.     }
  529.   
  530.     if (pFrameToDecode != NULL)
  531.     {
  532. pFrameToDecode->Clear();
  533. delete pFrameToDecode;
  534.     }
  535.     
  536.     return pDecodedFrame;
  537. }
  538. /****************************************************************************
  539.  *  Method:
  540.  *    CH263VideoFormat::CSecureH263VideoFormat
  541.  *
  542.  */
  543. CH263Decoder* CH263VideoFormat::CreateDecoder()
  544. {
  545.     return new CH263Decoder(m_pH263VideoRenderer->GetContext());
  546. }
  547. /****************************************************************************
  548.  *  Method:
  549.  *    CH263VideoFormat::ConfigFrom3GPPHeader
  550.  *
  551.  */
  552. HX_RESULT CH263VideoFormat::ConfigFrom3GPPHeader(IHXBuffer* pConfigData)
  553. {
  554.     UINT8* pData;
  555.     ULONG32 ulSize;
  556.     HX_RESULT retVal = HXR_FAIL;
  557.     HX_DELETE(m_pMaxDims);
  558.     if (pConfigData)
  559.     {
  560. pData = pConfigData->GetBuffer();
  561. ulSize = pConfigData->GetSize();
  562. m_pMaxDims = new HXxSize;
  563. retVal = HXR_OUTOFMEMORY;
  564.     }
  565.     if (m_pMaxDims)
  566.     {
  567. retVal = HXR_OK;
  568. // We'll assume unknown size
  569. m_pMaxDims->cx = 0;
  570. m_pMaxDims->cy = 0;
  571. if (ulSize >= sizeof(DecoderSpecificInfoV20))
  572. {
  573.     // Try 3GPP-v2.0 DecoderSpecificInfo
  574.     if (getlong(((DecoderSpecificInfoV20*) pData)->pType)
  575. == CCCC_ENCODE('d', '2', '6', '3'))
  576.     {
  577. // Looks good as 3GPP-v2.0 DecoderSpecificInfo
  578. ;
  579.     }
  580.     else if ((ulSize >= sizeof(DecoderSpecificInfoV10))&&
  581.      (((DecoderSpecificInfoV10*) pData)->pTag[0] == 0x05))
  582.     {
  583. // Looks good as 3GPP-v1.0 DecoderSpecificInfo
  584. m_pMaxDims->cx = getshort(
  585.     ((DecoderSpecificInfoV10*) pData)->pMaxWidth);
  586. m_pMaxDims->cy = getshort(
  587.     ((DecoderSpecificInfoV10*) pData)->pMaxHeight);
  588.     }
  589. }
  590.     }
  591.     
  592.     return retVal;
  593. }
  594. /****************************************************************************
  595.  *  Method:
  596.  *    CH263VideoFormat::IsBitmapFormatChanged
  597.  *
  598.  */
  599. BOOL CH263VideoFormat::IsBitmapFormatChanged(
  600.     HXBitmapInfoHeader &BitmapInfoHeader,
  601.     CMediaPacket* pVideoPacket)
  602. {
  603.     if (pVideoPacket->m_pSampleDesc != NULL)
  604.     {
  605. HXxSize* pDims = (HXxSize*) pVideoPacket->m_pSampleDesc;
  606. if ((BitmapInfoHeader.biWidth != pDims->cx) ||
  607.     (BitmapInfoHeader.biHeight != pDims->cy))
  608. {
  609.     return TRUE;
  610. }
  611.     }
  612.     return FALSE;
  613. }
  614. /****************************************************************************
  615.  *  Method:
  616.  *    CH263VideoFormat::InitBitmapInfoHeader
  617.  *
  618.  */
  619. HX_RESULT CH263VideoFormat::InitBitmapInfoHeader(
  620.     HXBitmapInfoHeader &bitmapInfoHeader,
  621.     CMediaPacket* pVideoPacket)
  622. {
  623.     HXxSize* pDims = (HXxSize*) pVideoPacket->m_pSampleDesc;
  624.     if (pDims)
  625.     {
  626. bitmapInfoHeader.biWidth = pDims->cx;
  627. bitmapInfoHeader.biHeight = pDims->cy;
  628. bitmapInfoHeader.biSizeImage = bitmapInfoHeader.biWidth * 
  629.        bitmapInfoHeader.biHeight * 
  630.        bitmapInfoHeader.biBitCount / 
  631.        8;
  632.     }
  633.     return HXR_OK;
  634. }
  635. /****************************************************************************
  636.  *  Method:
  637.  *    CH263VideoFormat::KillH263ampleDesc
  638.  *
  639.  */
  640. void CH263VideoFormat::KillH263ampleDesc(void* pSampleDesc, void* pUserData)
  641. {
  642.     if (pSampleDesc)
  643.     {
  644. HXxSize* pFrameDims = (HXxSize*) pSampleDesc;
  645. delete pFrameDims;
  646.     }
  647. }