frame.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:10k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: frame.cpp,v 1.2 2005/01/30 05:11:40 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Thomas Davies (Original Author)
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  27. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  28. * the GPL or the LGPL are applicable instead of those above. If you wish to
  29. * allow use of your version of this file only under the terms of the either
  30. * the GPL or LGPL and not to allow others to use your version of this file
  31. * under the MPL, indicate your decision by deleting the provisions above
  32. * and replace them with the notice and other provisions required by the GPL
  33. * or LGPL. If you do not delete the provisions above, a recipient may use
  34. * your version of this file under the terms of any one of the MPL, the GPL
  35. * or the LGPL.
  36. * ***** END LICENSE BLOCK ***** */
  37. //Implementation of frame classes in frame.h
  38. #include <libdirac_common/frame.h>
  39. #include <libdirac_common/upconvert.h>
  40. using namespace dirac;
  41. #include <iostream>
  42. ///////////////
  43. //---Frame---//
  44. ///////////////
  45. Frame::Frame(const FrameParams& fp): 
  46.     m_fparams(fp),
  47.     m_Y_data(0),
  48.     m_U_data(0),
  49.     m_V_data(0),
  50.     m_upY_data(0),
  51.     m_upU_data(0),
  52.     m_upV_data(0)
  53. {
  54.     Init();
  55. }
  56. Frame::Frame( const Frame& cpy ): 
  57.     m_fparams(cpy.m_fparams),
  58.     m_Y_data(0),
  59.     m_U_data(0),
  60.     m_V_data(0),
  61.     m_upY_data(0),
  62.     m_upU_data(0),
  63.     m_upV_data(0)
  64. {
  65.     const ChromaFormat& cformat = m_fparams.CFormat();
  66.     //delete data to be overwritten
  67.     ClearData();
  68.     //now copy the data accross
  69.     m_Y_data = new PicArray( *(cpy.m_Y_data) );
  70.     if (cpy.m_upY_data != 0){
  71.         m_upY_data = new PicArray( *(cpy.m_upY_data) );
  72.     }
  73.     if (cformat != Yonly)
  74.     {
  75.         m_U_data = new PicArray( *(cpy.m_U_data) );
  76.         m_V_data = new PicArray( *(cpy.m_V_data) );
  77.         if ( cpy.m_upU_data != 0 )
  78.         {
  79.             m_upU_data = new PicArray( *(cpy.m_upU_data) );
  80.         }
  81.         if ( cpy.m_upV_data != 0 )
  82.         {
  83.             m_upV_data = new PicArray( *(cpy.m_upV_data) );
  84.         }
  85.     }
  86. }
  87. Frame::~Frame()
  88. {
  89.     ClearData();    
  90. }
  91. Frame& Frame::operator=(const Frame& rhs)
  92. {
  93.     if ( &rhs != this)
  94.     {
  95.         m_fparams=rhs.m_fparams;
  96.         const ChromaFormat& cformat=m_fparams.CFormat();
  97.         // Delete current data
  98.         ClearData();
  99.         // Copy the data across        
  100.         m_Y_data= new PicArray( *(rhs.m_Y_data) );
  101.         if ( rhs.m_upY_data != 0)
  102.             m_upY_data = new PicArray( *(rhs.m_upY_data) );
  103.         if (cformat != Yonly)
  104.         {
  105.             m_U_data= new PicArray( *(rhs.m_U_data) );            
  106.             if (rhs.m_upU_data!=0)
  107.                 m_upU_data = new PicArray(*(rhs.m_upU_data) );
  108.             m_V_data= new PicArray( *(rhs.m_V_data) );            
  109.             if (rhs.m_upV_data!=0)
  110.                 m_upV_data= new PicArray( *(rhs.m_upV_data) );
  111.         }
  112.     }
  113.     return *this;
  114. }
  115. //Other functions
  116. void Frame::Init()
  117. {
  118.     const ChromaFormat cformat=m_fparams.CFormat();
  119.     //first delete data if we need to
  120.     ClearData();
  121.      m_Y_data=new PicArray( m_fparams.Yl() , m_fparams.Xl());
  122.      m_Y_data->SetCSort( Y_COMP );
  123.      if(cformat == format422) 
  124.      {
  125.          m_U_data = new PicArray( m_fparams.Yl() , m_fparams.Xl()/2 ); 
  126.          m_U_data->SetCSort( U_COMP );
  127.          m_V_data = new PicArray( m_fparams.Yl() , m_fparams.Xl()/2 );
  128.          m_V_data->SetCSort( V_COMP );
  129.      }
  130.      else if (cformat == format420)
  131.      {
  132.          m_U_data = new PicArray( m_fparams.Yl()/2 , m_fparams.Xl()/2 );
  133.          m_U_data->SetCSort( U_COMP );
  134.          m_V_data = new PicArray( m_fparams.Yl()/2 , m_fparams.Xl()/2 ); 
  135.          m_V_data->SetCSort(V_COMP);
  136.      }
  137.      else if (cformat == format411)
  138.      {
  139.          m_U_data = new PicArray( m_fparams.Yl() , m_fparams.Xl()/4 );
  140.          m_U_data->SetCSort( U_COMP );
  141.          m_V_data = new PicArray( m_fparams.Yl() , m_fparams.Xl()/4 );
  142.          m_V_data->SetCSort( V_COMP );
  143.      }
  144.      else if (cformat==format444){
  145.          m_U_data = new PicArray( m_fparams.Yl() , m_fparams.Xl() ); 
  146.          m_U_data->SetCSort( U_COMP );
  147.          m_V_data = new PicArray( m_fparams.Yl() , m_fparams.Xl() );
  148.          m_V_data->SetCSort( V_COMP );
  149.     }
  150.     //(other formats all assumed to be Yonly
  151. }
  152. PicArray& Frame::Data(CompSort cs)
  153. {//another way to access the data
  154.     if (cs == U_COMP) return *m_U_data; 
  155.     else if (cs == V_COMP) return *m_V_data; 
  156.     else return *m_Y_data;
  157. }    
  158. const PicArray& Frame::Data(CompSort cs) const
  159. {//another way to access the data
  160.     if (cs == U_COMP) return *m_U_data; 
  161.     else if (cs == V_COMP) return *m_V_data; 
  162.     else return *m_Y_data;
  163. }
  164. PicArray& Frame::UpYdata()
  165. {
  166.     if (m_upY_data != 0)
  167.         return *m_upY_data;
  168.     else
  169.     {//we have to do the upconversion
  170.         m_upY_data = new PicArray( 2*m_Y_data->LengthY() , 2*m_Y_data->LengthX() );
  171.         UpConverter myupconv;
  172.         myupconv.DoUpConverter( *m_Y_data , *m_upY_data );
  173.         return *m_upY_data;
  174.     }
  175. }
  176. PicArray& Frame::UpUdata()
  177. {
  178.     if (m_upU_data != 0)
  179.         return *m_upU_data;
  180.     else
  181.     {//we have to do the upconversion
  182.         m_upU_data = new PicArray(2*m_U_data->LengthY() , 2*m_U_data->LengthX());
  183.         UpConverter myupconv;
  184.         myupconv.DoUpConverter( *m_U_data , *m_upU_data );
  185.         return *m_upU_data;
  186.     }
  187. }
  188. PicArray& Frame::UpVdata()
  189. {
  190.     if (m_upV_data != 0)
  191.         return *m_upV_data;
  192.     else
  193.     {//we have to do the upconversion
  194.     
  195.         m_upV_data = new PicArray( 2*m_V_data->LengthY() , 2*m_V_data->LengthX() );
  196.         UpConverter myupconv;
  197.         myupconv.DoUpConverter( *m_V_data , *m_upV_data );
  198.         return *m_upV_data;
  199.     }
  200. }
  201. PicArray& Frame::UpData(CompSort cs)
  202. {
  203.     if (cs == U_COMP)
  204.         return UpUdata(); 
  205.     else if (cs == V_COMP) 
  206.         return UpVdata(); 
  207.     else 
  208.         return UpYdata();
  209. }    
  210. const PicArray& Frame::UpYdata() const
  211. {
  212.     if (m_upY_data != 0)
  213.         return *m_upY_data;
  214.     else
  215.     {
  216.         //We have to do the upconversion
  217.         //Although we're changing a value - the pointer to the array - it doesn't affect the state of
  218.         //the object as viewable from outside. So the pointers to the upconveted data have been 
  219.         //declared mutable.
  220.         m_upY_data = new PicArray( 2*m_Y_data->LengthY() , 2*m_Y_data->LengthX() );
  221.         UpConverter myupconv;
  222.         myupconv.DoUpConverter( *m_Y_data , *m_upY_data );
  223.         return *m_upY_data;
  224.     }
  225. }
  226. const PicArray& Frame::UpUdata() const
  227. {
  228.     if (m_upU_data != 0)
  229.         return *m_upU_data;
  230.     else
  231.     {
  232.         //We have to do the upconversion
  233.         //Although we're changing a value - the pointer to the array - it doesn't affect the state of
  234.         //the object as viewable from outside. So the pointers to the upconveted data have been 
  235.         //declared mutable.
  236.         m_upU_data = new PicArray( 2*m_U_data->LengthY() , 2*m_U_data->LengthX() );
  237.         UpConverter myupconv;
  238.         myupconv.DoUpConverter( *m_U_data , *m_upU_data );
  239.         return *m_upU_data;
  240.     }
  241. }
  242. const PicArray& Frame::UpVdata() const
  243. {
  244.     if (m_upV_data != 0)
  245.         return *m_upV_data;
  246.     else
  247.     {
  248.         //We have to do the upconversion
  249.         //Although we're changing a value - the pointer to the array - it doesn't affect the state of
  250.         //the object as viewable from outside. So the pointers to the upconveted data have been 
  251.         //declared mutable.
  252.  
  253.         m_upV_data = new PicArray( 2*m_V_data->LengthY() , 2*m_V_data->LengthX() );
  254.         UpConverter myupconv;
  255.         myupconv.DoUpConverter( *m_V_data , *m_upV_data );
  256.         return *m_upV_data;
  257.     }
  258. }
  259. const PicArray& Frame::UpData(CompSort cs) const
  260. {
  261.     if (cs == U_COMP) 
  262.         return UpUdata(); 
  263.     else if (cs == V_COMP)
  264.         return UpVdata(); 
  265.     else 
  266.         return UpYdata();
  267. }    
  268. void Frame::ClipComponent(PicArray& pic_data)
  269. {
  270.     for (int j=pic_data.FirstY() ; j<=pic_data.LastY() ; ++j)
  271.     {
  272.         for (int i=pic_data.FirstX() ; i<=pic_data.LastX() ; ++i)
  273.         {
  274.             pic_data[j][i] = std::min( pic_data[j][i] , ValueType( 1020 ) );
  275.             pic_data[j][i] = std::max( pic_data[j][i] , ValueType( 0 ) );
  276.         }// i        
  277.     }// j
  278. }
  279. void Frame::Clip()
  280. {
  281.     //just clips the straight picture data, not the upconverted data
  282.     ClipComponent( *m_Y_data );
  283.     if (m_fparams.CFormat() != Yonly)
  284.     {
  285.         ClipComponent( *m_U_data );
  286.         ClipComponent( *m_V_data );    
  287.     }    
  288. }
  289. void Frame::ClearData()
  290. {
  291.     if (m_Y_data != 0)
  292.     {
  293.         delete m_Y_data;
  294.         m_Y_data = 0;
  295.     }
  296.     if (m_U_data!=0)
  297.     {
  298.         delete m_U_data;
  299.         m_U_data = 0;
  300.     }
  301.     if (m_V_data!=0)
  302.     {
  303.         delete m_V_data;
  304.         m_V_data = 0;
  305.     }
  306.     if (m_upY_data != 0)
  307.     {
  308.         delete m_upY_data;
  309.         m_upY_data = 0;
  310.     }
  311.     if (m_upU_data!=0)
  312.     {
  313.         delete m_upU_data;
  314.         m_upU_data = 0;
  315.     }
  316.     if (m_upV_data != 0)
  317.     {
  318.         delete m_upV_data;
  319.         m_upV_data = 0;
  320.     }
  321. }