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

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. #define INITGUID
  36. #include "hxtypes.h"
  37. #include "ihxpckts.h"
  38. #include "hxvamain.h"
  39. #include "h263vdec.h"
  40. #include "hxcinst.h"
  41. #include "hvviddec.h"
  42. //#define DEBUG_WRITEIO
  43. #ifdef DEBUG_WRITEIO // writes the input packets and output yuv
  44. #include "iowriter.h"
  45. YUVFileWriter  *writer = 0;
  46. #endif
  47. HX_RESULT HXEXPORT
  48. HXVtoYUV420Init(HXV10_INIT *pHxvInit, void **decoderState)
  49. {
  50.     HX_RESULT                   result;
  51.     HX_RESULT                  ps = HXR_OK;
  52. VvVideoDecoderFilter * decFlt=0;
  53. HXVA_Image_Format            in_format;
  54. HXVA_Image_Format            out_format;
  55.     if (!pHxvInit || !decoderState)
  56.         return HXR_POINTER;
  57. in_format.fid = HXVA_FID_H263PLUS;
  58.     in_format.dimensions.width = pHxvInit->pels;
  59.     in_format.dimensions.height = pHxvInit->lines;
  60.     in_format.Complete();
  61.     out_format.fid = HXVA_FID_YUV12;
  62.     out_format.dimensions = in_format.dimensions;
  63.     out_format.Complete();
  64.     
  65.     // CreateInstance
  66. decFlt = VvVideoDecoderFilter::CreateInstance(ps);
  67. if(!decFlt || ps!=HXR_OK)
  68. return HXR_OUTOFMEMORY;
  69. ps = HXR_OK;
  70. ps = decFlt->StartStreaming(in_format, out_format);
  71.     if(ps != HXR_OK) 
  72. {
  73. decFlt->StopStreaming();
  74. delete decFlt;
  75. return HXR_INVALID_PARAMETER;
  76. }
  77. *decoderState = decFlt;
  78. #ifdef DEBUG_WRITEIO
  79. BOOL failed;
  80. if(!writer)
  81. {
  82. writer = new YUVFileWriter("c:\out.yuv", out_format, failed);
  83. if(!failed)
  84. writer->Open();
  85. }
  86. #endif
  87.     return HXR_OK;
  88. }
  89. HX_RESULT HXEXPORT
  90. HXVtoYUV420Free(void *global)
  91. {
  92. ((VvVideoDecoderFilter *)(global))->StopStreaming();
  93. delete (VvVideoDecoderFilter *)(global);
  94. #ifdef DEBUG_WRITEIO
  95. if(writer)
  96. {
  97. writer->Close();
  98. delete writer;
  99. }
  100. #endif
  101. return HXR_OK;
  102. }
  103. HX_RESULT HXEXPORT
  104. HXVtoYUV420Transform
  105.     (
  106.     UCHAR     *pH263Packets,
  107.     UCHAR     *pDecodedFrameBuffer,
  108.     void      *pInputParams,
  109.     void      *pOutputParams,
  110.     void      *global
  111.     )
  112. {
  113.     HX_RESULT       result;
  114.     HX_RESULT      ps;
  115.     HXVA_Image       src;
  116.     HXVA_Image       dst;
  117.     INT32             temporal_offset = 0;
  118.     ULONG32 flags = 0;
  119.     ULONG32 notes = 0;
  120. VvVideoDecoderFilter *decFlt;
  121. decFlt = (VvVideoDecoderFilter *)(global);
  122.     H263DecoderInParams  * pH263In  = (H263DecoderInParams *)pInputParams;
  123.     H263DecoderOutParams * pH263Out = (H263DecoderOutParams *)pOutputParams;
  124.     if (decFlt==0 || !pH263In || !pH263Out)
  125.         return HXR_POINTER;
  126.     pH263Out->numFrames = 0;  // Until we learn otherwise
  127.     pH263Out->notes = 0;
  128.     pH263Out->timestamp = 0;
  129.     
  130.     src.format = decFlt->m_input_format;
  131.     src.size = pH263In->dataLength;
  132.     src.sequence_number = pH263In->timestamp;  // presentation time
  133.     src.SetBasePointer(pH263Packets);
  134.     dst.format = decFlt->m_output_format;
  135.     dst.size = 0;
  136.     dst.sequence_number = src.sequence_number;
  137.     dst.SetBasePointer(pDecodedFrameBuffer);
  138. ps = decFlt->Receive( src, dst);
  139. if(ps!=HXR_OK)
  140. {
  141. pH263Out->numFrames = 1;
  142. pH263Out->notes |= RV_DECODE_DONT_DRAW;
  143. pH263Out->width = decFlt->m_output_format.dimensions.width;
  144. pH263Out->height = decFlt->m_output_format.dimensions.height;
  145. if(dst.size == 0) 
  146. {
  147. dst.size = (pH263Out->width * pH263Out->height);
  148. dst.size += (dst.size >> 1);
  149. }
  150. // Assign the presentation time for the display frame
  151. pH263Out->timestamp = dst.sequence_number++;
  152. return HXR_OK;
  153. }
  154. // Assign the number of frames out
  155.     pH263Out->numFrames = 1;
  156.     pH263Out->notes = 0;
  157. pH263Out->width = decFlt->m_output_format.dimensions.width;
  158. pH263Out->height = decFlt->m_output_format.dimensions.height;
  159. if(dst.size == 0) 
  160.     {
  161.         dst.size = (pH263Out->width * pH263Out->height);
  162.         dst.size += (dst.size >> 1);
  163.     }
  164. // Assign the presentation time for the display frame
  165.     pH263Out->timestamp = dst.sequence_number++;
  166. #ifdef DEBUG_WRITEIO
  167. if (writer && !(notes & RV_DECODE_DONT_DRAW))
  168.     {
  169. writer->Write(dst);
  170.     }
  171. #endif
  172.     return HXR_OK;
  173. }