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

Symbian

开发平台:

Visual C++

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