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

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