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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hvviddec.cpp,v 1.1.1.1.42.1 2004/07/09 01:56:14 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. /**********************************************************************
  50.  * VvVidDec.CPP   
  51.  *
  52.  *
  53.  * PUBLIC:
  54.  *
  55.  * CreateInstance - creates an object instance of this class
  56.  * Receive - receives input from the input pin,
  57.  *   sends decompressed output to output pin
  58.  * CheckInputType - called to verify media type supported by input pin
  59.  * CheckTransform - called to verify media type supported by output pin
  60.  * DecideBufferSize - called by output pin to set output sample buffer size
  61.  * StartStreaming - called by input pin when video streaming starts
  62.  * StopStreaming - called by input pin when video streaming ends
  63.  * GetMediaType - returns media types supported by output pin
  64.  * EndOfStream - called by output pin when end-of-stream is reached
  65.  * EndFlush - called by input pin when flushing stream
  66.  *
  67.  * VvVideoDecoderFilter - constructor function
  68.  * ~VvVideoDecoderFilter - destructor function
  69.  *
  70.  * PROTECTED:
  71.  *
  72.  * PRIVATE:
  73.  *
  74.  * Init - initializes all member variables of this class
  75.  *
  76.  * FILE DESCRIPTION:
  77.  *
  78.  * This file contains the source code for the Vivo Video 
  79.  * Decompression filter class, VvVideoDecoderFilter.  This filter
  80.  * is a Helix decoder that is used to decompress
  81.  * H.263 video format data.. THIS Abstraction of the LAYER does not make any sense??
  82.  **********************************************************************/
  83. #include "hvviddec.h"
  84. #include "hxcinst.h"
  85. #include "h263codecf.h"
  86. //*** begin VvVideoDecoderFilter class ***
  87. /**********************************************************************
  88.  *
  89.  * VvVideoDecoderFilter
  90.  *
  91.  * PARAMETERS:
  92.  *
  93.  * pFilterName: the string name for this transform filter
  94.  * lpUnknown:
  95.  * pHResult:
  96.  *
  97.  * RETURNS: None
  98.  *
  99.  * DESCRIPTION: Constructor function
  100.  *
  101.  *********************************************************************/
  102. VvVideoDecoderFilter::VvVideoDecoderFilter( HX_RESULT& ps )
  103. {
  104. Init(); // initialize the member variables of this class
  105. ps=HXR_OK;
  106. }
  107. /**********************************************************************
  108.  *
  109.  * CreateInstance
  110.  *
  111.  * PARAMETERS:
  112.  *
  113.  * lpUnknown:
  114.  * pHResult:
  115.  *
  116.  * RETURNS:
  117.  *
  118.  * CUnknown*:
  119.  *
  120.  * DESCRIPTION:
  121.  *
  122.  * This function is used to create an object instance of this
  123.  * class that will be registered in the system registry.
  124.  *
  125.  *********************************************************************/
  126. VvVideoDecoderFilter*
  127. VvVideoDecoderFilter::CreateInstance(HX_RESULT& ps)
  128. {
  129. VvVideoDecoderFilter *pcVideoFilter = NULL; // an instance of this transform filter
  130.     // try to create an instance of this transform filter class
  131. pcVideoFilter = new VvVideoDecoderFilter(ps);
  132. return( pcVideoFilter );
  133. }
  134. /**********************************************************************
  135.  *
  136.  * ~VvVideoDecoderFilter
  137.  *
  138.  * PARAMETERS: None
  139.  *
  140.  * RETURNS: None
  141.  *
  142.  * DESCRIPTION: Destructor function
  143.  *
  144.  *********************************************************************/
  145. VvVideoDecoderFilter::~VvVideoDecoderFilter( void )
  146. {
  147. if ( NULL != m_pcVideoCodec ) // if the video data stream was created 
  148. {
  149. delete m_pcVideoCodec; // delete the audio data stream
  150. m_pcVideoCodec = NULL; // clear its pointer
  151. }
  152. }
  153. /**********************************************************************
  154.  *
  155.  * Init
  156.  *
  157.  * PARAMETERS: None
  158.  *
  159.  * RETURNS: None
  160.  *
  161.  * DESCRIPTION:
  162.  *
  163.  * This function is used to initialize all the member variables
  164.  * of this class.
  165.  *
  166.  *********************************************************************/
  167. void 
  168. VvVideoDecoderFilter::Init( void )
  169. {
  170. m_pcVideoCodec = NULL; 
  171. m_bStartDecompress = FALSE;
  172. }
  173. /**********************************************************************
  174.  *
  175.  * Receive
  176.  *
  177.  * PARAMETERS:
  178.  *
  179.  * piInSample: the input sample that is passed into the input pin
  180.  *
  181.  * RETURNS:
  182.  *
  183.  * HRESULT: Returns NOERROR if this function is successful,
  184.  * otherwise returns the error that occurred.
  185.  *
  186.  * DESCRIPTION:
  187.  *
  188.  * This function gets called from the input pin whenever any
  189.  * sample data gets sent to the pin.  The sample data is then
  190.  * processed and delivered to the output pin.
  191.  *
  192.  *********************************************************************/
  193. HX_RESULT
  194. VvVideoDecoderFilter::Receive(
  195.      const HXVA_Image &src,
  196.            HXVA_Image &dst
  197. )
  198. {
  199. // this call is made to lock the critical section guarding the receiving 
  200. // thread; critical sections need to be locked in order to protect data 
  201. // during multithreading operations
  202. //CAutoLock cReceiveLock( &m_csReceive );
  203. HX_RESULT lResult = HXR_OK; // checks the return value of called functions
  204. if ( NULL == m_pcVideoCodec ) // if the video codec instance is invalid
  205. return( HXR_FAIL ); // exit this function 
  206. // if the video decompression process has not been started yet
  207. if ( m_bStartDecompress == FALSE )
  208. {
  209. // try to start the video decompression process
  210. lResult = m_pcVideoCodec->DecompressStart( src.format, dst.format );
  211. if ( lResult != HXR_OK ) // if the decompression process could not be started
  212. return( HXR_FAIL ); // return an error
  213. m_bStartDecompress = TRUE; // indicate that the video decompression has been started
  214. }
  215. // try to decompress the current video frame
  216. lResult = m_pcVideoCodec->DecompressConvert( src, dst );
  217. if ( lResult != HXR_OK ) // if the video frame could not be decompressed
  218. return( HXR_FAIL ); // return an error
  219. //piOutSample->SetTime( (REFERENCE_TIME*)&tStart,
  220. //   (REFERENCE_TIME*)&tStop );
  221. return( HXR_OK );
  222. /**********************************************************************
  223.  *
  224.  * DecideBufferSize
  225.  *
  226.  * PARAMETERS:
  227.  *
  228.  * piAllocator: the allocater used to allocate the required 
  229.  * output sample buffer memory
  230.  * psProperties: contains the actual buffer sizes required by
  231.  * the output sample
  232.  *
  233.  * RETURNS:
  234.  *
  235.  * HRESULT: Returns NOERROR if this function is successful,
  236.  * otherwise returns the error that occurred.
  237.  *
  238.  * DESCRIPTION:
  239.  *
  240.  * This function is called from the output pin to allocate the
  241.  * memory required to hold the output pin data stream.
  242.  *
  243.  *********************************************************************/
  244. HX_RESULT
  245. VvVideoDecoderFilter::DecideBufferSize(void)
  246. {
  247. return( HXR_OK );
  248. }
  249. /**********************************************************************
  250.  *
  251.  * StartStreaming
  252.  *
  253.  * PARAMETERS: None
  254.  *
  255.  * RETURNS:
  256.  *
  257.  * HRESULT: Returns NOERROR if this function is successful,
  258.  * otherwise returns the error that occurred.
  259.  *
  260.  * DESCRIPTION:
  261.  *
  262.  * This function gets called by the base filter classes whenever
  263.  * this filter is in the process of switching to active mode,
  264.  * paused or running.
  265.  *
  266.  *********************************************************************/
  267. HX_RESULT
  268. VvVideoDecoderFilter::StartStreaming(
  269. const HXVA_Image_Format &src_fmt,
  270.     const HXVA_Image_Format &dst_fmt
  271. {
  272. // this call is made to lock the critical section guarding this filter 
  273. // critical sections need to be locked in order to protect data during 
  274. // multithreading operations
  275. //CAutoLock cFilterLock( &m_csFilter );
  276. HX_RESULT lResult = HXR_OK; // checks the return of called functions
  277. // try to load the video codec into global memory
  278. lResult = TheCodec().Load();
  279. if ( lResult != HXR_OK ) // if it could not be loaded
  280. return( HXR_FAIL ); // return an error
  281. TheCodec().Enable(); // enable the video codec for use
  282. // GNEEL: SEND DOWN FID
  283. m_pcVideoCodec = TheCodec().OpenInstance( );
  284. if ( NULL == m_pcVideoCodec ) // if the video codec instance could not be created
  285. return( HXR_OUTOFMEMORY ); // return an out of memory error
  286. m_input_format = src_fmt;
  287. m_output_format = dst_fmt;
  288. return( HXR_OK );
  289. }
  290. /**********************************************************************
  291.  *
  292.  * StopStreaming
  293.  *
  294.  * PARAMETERS: None
  295.  *
  296.  * RETURNS:
  297.  *
  298.  * HRESULT: Returns NOERROR if this function is successful,
  299.  * otherwise returns the error that occurred.
  300.  *
  301.  * DESCRIPTION:
  302.  *
  303.  * This function gets called by the base filter classes whenever
  304.  * this transform filter is in the process of leaving active mode
  305.  * and entering stopped mode.
  306.  *
  307.  *********************************************************************/
  308. HX_RESULT
  309. VvVideoDecoderFilter::StopStreaming( void )
  310. {
  311. // this call is made to lock the critical sections guarding this filter 
  312. // and receiving thread; critical sections need to be locked in order to
  313. // protect data during multithreading operations
  314. //CAutoLock cFilterLock( &m_csFilter ),
  315. // cReceiveLock( &m_csReceive );
  316. if ( NULL == m_pcVideoCodec )
  317. return( HXR_FAIL );
  318. //end compression before deleting the pointer, otherwise codec stays open
  319. HX_RESULT lResult = HXR_OK; // checks the return of called functions
  320. if ( m_bStartDecompress == TRUE ) {
  321. lResult = m_pcVideoCodec->DecompressEnd();
  322. if ( lResult == HXR_OK ) {
  323. m_bStartDecompress = FALSE;
  324. }
  325. }
  326. // terminate the video codec instance to remove it from memory
  327. TheCodec().CloseInstance( (HXH263CodecInstance*) m_pcVideoCodec );
  328. m_pcVideoCodec = NULL;
  329. TheCodec().Disable();
  330. TheCodec().Free();
  331. return( HXR_OK );
  332. }
  333. /**********************************************************************
  334.  *
  335.  * EndOfStream
  336.  *
  337.  * PARAMETERS: None
  338.  *
  339.  * RETURNS:
  340.  *
  341.  * HRESULT: Returns NOERROR if this function is successful,
  342.  * otherwise returns the error that occurred.
  343.  *
  344.  * DESCRIPTION:
  345.  *
  346.  * This function gets called from the output pin whenever
  347.  * the output data has reached the end of the stream.  If this
  348.  * function is overridden, the end-of-stream notification must
  349.  * be passed to the next filter.
  350.  *
  351.  *********************************************************************/
  352. HX_RESULT
  353. VvVideoDecoderFilter::EndOfStream( void )
  354. {
  355. // this call is made to lock the critical section guarding the receiving 
  356. // thread; critical sections need to be locked in order to protect data 
  357. // during multithreading operations
  358. //CAutoLock cReceiveLock(&m_csReceive);
  359.     if ( NULL == m_pcVideoCodec ) 
  360. {
  361.         return HXR_FAIL;
  362.     }
  363. // return the end-of-stream notification to the next filter that
  364. // is connected to this filter
  365.     return HXR_OK;
  366. }
  367. /**********************************************************************
  368.  *
  369.  * EndFlush
  370.  *
  371.  * PARAMETERS: None
  372.  *
  373.  * RETURNS:
  374.  *
  375.  * HRESULT: Returns NOERROR if this function is successful,
  376.  * otherwise returns the error that occurred.
  377.  *
  378.  * DESCRIPTION:
  379.  *
  380.  * This function gets called from the input pin whenever the
  381.  * pin is leaving the flushing state.  If this function is 
  382.  * overridden, the notification must be passed to the next filter.
  383.  *
  384.  *********************************************************************/
  385. HX_RESULT
  386. VvVideoDecoderFilter::EndFlush( void )
  387. {
  388. // this call is made to lock the critical section guarding the receiving 
  389. // thread; critical sections need to be locked in order to protect data 
  390. // during multithreading operations
  391. //CAutoLock cReceiveLock(&m_csReceive);
  392. // return the flushing notification to the next filter that is
  393. // connected to this filter
  394.     return HXR_OK;
  395. }
  396. /**********************************************************************
  397.  *
  398.  * GetMediaType
  399.  *
  400.  * PARAMETERS:
  401.  *
  402.  * nPosition: the position of the media type in the media type list
  403.  * pcMediaType:the returned output pin media type
  404.  *
  405.  * RETURNS:
  406.  *
  407.  * HRESULT: Returns NOERROR if this function is successful,
  408.  * otherwise returns the error that occurred.
  409.  *
  410.  * DESCRIPTION:
  411.  *
  412.  * This function is called by the base filter classes to supply
  413.  * one of the media types that the output pin supports based on
  414.  * the position of the media type, nPosition, in the media type list.
  415.  *
  416.  *********************************************************************/
  417. HX_RESULT
  418. VvVideoDecoderFilter::GetMediaType( void )
  419. {
  420.     return( HXR_OK );
  421. }
  422. /**********************************************************************
  423.  *
  424.  * CheckInputType
  425.  *
  426.  * PARAMETERS:
  427.  *
  428.  * pcInMediaType: the media type associated with the input pin
  429.  *
  430.  * RETURNS:
  431.  *
  432.  * HRESULT: Returns NOERROR if this function is successful,
  433.  * otherwise returns the error that occurred.
  434.  *
  435.  * DESCRIPTION:
  436.  *
  437.  * This function gets called by the base filter classes to 
  438.  * verify that the input pin supports the input media type
  439.  * and to propose an output pin media type based on the 
  440.  * input pin media type.
  441.  *
  442.  *********************************************************************/
  443. HX_RESULT
  444. VvVideoDecoderFilter::CheckInputType( void )
  445. {
  446. return HXR_OK;
  447. }
  448. /**********************************************************************
  449.  *
  450.  * CheckTransform
  451.  *
  452.  * PARAMETERS:
  453.  *
  454.  * pcInMediaType: the media type associated with the input pin
  455.  * pcOutMediaType: the media type associated with the output pin
  456.  *
  457.  * RETURNS:
  458.  *
  459.  * HRESULT: Returns NOERROR if this function is successful,
  460.  * otherwise returns the error that occurred.
  461.  *
  462.  * DESCRIPTION:
  463.  *
  464.  * This function gets called by the base filter classes to verify
  465.  * that th input and output pins support their media types
  466.  *
  467.  *********************************************************************/
  468. HX_RESULT
  469. VvVideoDecoderFilter::CheckTransform( void )
  470. {
  471.     return HXR_OK;
  472. }
  473. //*** end VvVideoDecoderFilter class ***