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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: common.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.                   Scott R Ladd,
  25.                   Tim Borer
  26. *
  27. * Alternatively, the contents of this file may be used under the terms of
  28. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  29. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  30. * the GPL or the LGPL are applicable instead of those above. If you wish to
  31. * allow use of your version of this file only under the terms of the either
  32. * the GPL or LGPL and not to allow others to use your version of this file
  33. * under the MPL, indicate your decision by deleting the provisions above
  34. * and replace them with the notice and other provisions required by the GPL
  35. * or LGPL. If you do not delete the provisions above, a recipient may use
  36. * your version of this file under the terms of any one of the MPL, the GPL
  37. * or the LGPL.
  38. * ***** END LICENSE BLOCK ***** */
  39. #include <libdirac_common/common.h>
  40. #include <algorithm>
  41. using namespace dirac;
  42. //PicArray functions
  43. PicArray::PicArray(int height, int width, CompSort cs):
  44.     TwoDArray<ValueType>(height , width),
  45.     m_csort(cs)
  46. {
  47.          //Nothing
  48. }
  49. const CompSort& PicArray::CSort() const 
  50. {
  51.     return m_csort;
  52. }
  53. void PicArray::SetCSort(const CompSort cs)
  54. {
  55.     m_csort=cs;
  56. }    
  57. //EntropyCorrector functions
  58. EntropyCorrector::EntropyCorrector(int depth): 
  59.     m_Yfctrs( 3 , 3*depth+1 ),
  60.     m_Ufctrs( 3 , 3*depth+1 ),
  61.     m_Vfctrs( 3 , 3*depth+1 )
  62. {
  63.     Init();
  64. }
  65. float EntropyCorrector::Factor(const int bandnum , const FrameSort fsort ,const CompSort c) const
  66. {
  67.     
  68.     if (c == U_COMP)
  69.         return m_Ufctrs[fsort][bandnum-1];
  70.     else if (c == V_COMP)
  71.         return m_Vfctrs[fsort][bandnum-1];
  72.     else
  73.         return m_Yfctrs[fsort][bandnum-1];
  74. }
  75. void EntropyCorrector::Init()
  76. {
  77.     
  78.     //do I-frames
  79.     for (int  i=0 ; i<m_Yfctrs.LengthX() ; ++i )
  80.     {
  81.         if ( i == m_Yfctrs.LastX() )
  82.         {        
  83.             m_Yfctrs[I_frame][i] = 1.0;
  84.             m_Ufctrs[I_frame][i] = 1.0;
  85.             m_Vfctrs[I_frame][i] = 1.0;
  86.             m_Yfctrs[L1_frame][i] = 0.85;
  87.             m_Ufctrs[L1_frame][i] = 0.85;
  88.             m_Vfctrs[L1_frame][i] = 0.85;
  89.             m_Yfctrs[L2_frame][i] = 0.85;
  90.             m_Ufctrs[L2_frame][i] = 0.85;
  91.             m_Vfctrs[L2_frame][i] = 0.85;
  92.         }
  93.         else if ( i >= m_Yfctrs.LastX()-3 )
  94.         {
  95.             m_Yfctrs[I_frame][i] = 0.85;
  96.             m_Ufctrs[I_frame][i] = 0.85;
  97.             m_Vfctrs[I_frame][i] = 0.85;
  98.             m_Yfctrs[L1_frame][i] = 0.75;
  99.             m_Ufctrs[L1_frame][i] = 0.75;
  100.             m_Vfctrs[L1_frame][i] = 0.75;
  101.             m_Yfctrs[L2_frame][i] = 0.75;
  102.             m_Ufctrs[L2_frame][i] = 0.75;
  103.             m_Vfctrs[L2_frame][i] = 0.75;            
  104.         }
  105.         else
  106.         {
  107.             m_Yfctrs[I_frame][i] = 0.75;
  108.             m_Ufctrs[I_frame][i] = 0.75;
  109.             m_Vfctrs[I_frame][i] = 0.75;
  110.             m_Yfctrs[L1_frame][i] = 0.75;
  111.             m_Ufctrs[L1_frame][i] = 0.75;
  112.             m_Vfctrs[L1_frame][i] = 0.75;
  113.             m_Yfctrs[L2_frame][i] = 0.75;
  114.             m_Ufctrs[L2_frame][i] = 0.75;
  115.             m_Vfctrs[L2_frame][i] = 0.75;            
  116.         }
  117.     }//i
  118.     
  119. }
  120. void EntropyCorrector::Update(int bandnum , FrameSort fsort , CompSort c ,int est_bits , int actual_bits){
  121.     //updates the factors - note that the estimated bits are assumed to already include the correction factor
  122.     
  123.     float multiplier;
  124.     if (actual_bits != 0 && est_bits != 0)
  125.         multiplier = float(actual_bits)/float(est_bits);
  126.     else
  127.         multiplier=1.0;
  128.     if (c == U_COMP)
  129.         m_Ufctrs[fsort][bandnum-1] *= multiplier;
  130.     else if (c == V_COMP)
  131.         m_Vfctrs[fsort][bandnum-1] *= multiplier;
  132.     else
  133.         m_Yfctrs[fsort][bandnum-1] *= multiplier;
  134. }
  135. // Overlapped block parameter functions
  136. OLBParams::OLBParams(const int xblen, int const yblen, int const xbsep, int const ybsep):
  137.     m_xblen(xblen),
  138.     m_yblen(yblen),
  139.     m_xbsep(xbsep),
  140.     m_ybsep(ybsep),
  141.     m_xoffset( (xblen-xbsep)/2 ),
  142.     m_yoffset( (yblen-ybsep)/2 )
  143. {}
  144. namespace dirac
  145. {
  146. std::ostream & operator<< (std::ostream & stream, OLBParams & params)
  147. {
  148.     stream << params.Ybsep() << " " << params.Xbsep();
  149. //     stream << " " <<params.Yblen() << " " << params.Xblen();
  150.     
  151.     return stream;
  152. }
  153. std::istream & operator>> (std::istream & stream, OLBParams & params)
  154. {
  155.     int temp;
  156.     stream >> temp;
  157.     params.SetYbsep(temp);
  158.     stream >> temp;
  159.     params.SetXbsep(temp);
  160. //     stream >> temp;
  161. //     params.SetYblen(temp);
  162. //     stream >> temp;
  163. //     params.SetXblen(temp);
  164.     
  165.     return stream;
  166. }
  167. }
  168. // Codec params functions
  169. CodecParams::CodecParams():
  170.     m_x_num_mb(0),
  171.     m_y_num_mb(0),
  172.     m_x_num_blocks(0),
  173.     m_y_num_blocks(0),
  174.     m_verbose(false),
  175.     m_interlace(false),
  176.     m_topfieldfirst(false),
  177.     m_lbparams(3),
  178.     m_cbparams(3)
  179. {}
  180. void CodecParams::SetBlockSizes(const OLBParams& olbparams , const ChromaFormat cformat)
  181. {
  182.     //given the raw overlapped block parameters, set the modified internal parameters to
  183.     //take account of the chroma sampling format and overlapping requirements, as well
  184.     //as the equivalent parameters for sub-MBs and MBs.
  185.     //Does NOT set the number of blocks or macroblocks, as padding may be required.
  186.     // Factors for scaling chroma blocks
  187.     int xcfactor,ycfactor; 
  188.  
  189.     if (cformat == format420)
  190.     {
  191.         xcfactor = 2;
  192.         ycfactor = 2;
  193.     }
  194.     else if (cformat == format422)
  195.     {
  196.         xcfactor = 2;
  197.         ycfactor = 1;
  198.     }
  199.     else if (cformat==format411)
  200.     {
  201.         xcfactor = 4;
  202.         ycfactor = 1;
  203.     }
  204.     else
  205.     {// assume 444
  206.         xcfactor = 1;
  207.         ycfactor = 1;
  208.     }
  209.     m_lbparams[2] = olbparams;
  210.     
  211.     // Check the separations aren't too small
  212.     m_lbparams[2].SetXbsep( std::max(m_lbparams[2].Xbsep() , 4) );
  213.     m_lbparams[2].SetYbsep( std::max(m_lbparams[2].Ybsep() , 4) );
  214.     // Check the lengths aren't too big (100% is max roll-off)
  215.     m_lbparams[2].SetXblen( std::min(m_lbparams[2].Xbsep()*2 , m_lbparams[2].Xblen()) );
  216.     m_lbparams[2].SetYblen( std::min(m_lbparams[2].Ybsep()*2 , m_lbparams[2].Yblen()) );
  217.     
  218.     // Check overlap is divisible by 2
  219.     if (( m_lbparams[2].Xblen() - m_lbparams[2].Xbsep() )%2 != 0)
  220.         m_lbparams[2].SetXblen( m_lbparams[2].Xblen()-1 );
  221.     if (( m_lbparams[2].Yblen() - m_lbparams[2].Ybsep() )%2 != 0)
  222.         m_lbparams[2].SetYblen( m_lbparams[2].Yblen()-1 );
  223.     // Check there's now sufficient overlap  
  224.     m_lbparams[2].SetXblen( std::max(m_lbparams[2].Xbsep()+2 , m_lbparams[2].Xblen()) );
  225.     m_lbparams[2].SetYblen( std::max(m_lbparams[2].Ybsep()+2 , m_lbparams[2].Yblen()) );
  226.     // If the overlapped blocks don't work for the chroma format, we have to iterate
  227.     if ( (m_lbparams[2].Xbsep()%xcfactor != 0) || (m_lbparams[2].Ybsep()%ycfactor != 0) )
  228.     {
  229.         OLBParams new_olbparams( m_lbparams[2] );
  230.         if (m_lbparams[2].Xbsep()%xcfactor != 0)
  231.             new_olbparams.SetXbsep( ( (m_lbparams[2].Xbsep()/xcfactor) + 1 )*xcfactor );
  232.         if (m_lbparams[2].Ybsep()%ycfactor != 0)
  233.             new_olbparams.SetYbsep( ( (m_lbparams[2].Ybsep()/ycfactor) + 1 )*ycfactor );
  234.         new_olbparams.SetXblen( std::max( new_olbparams.Xbsep()+2 , olbparams.Xblen() ) );
  235.         new_olbparams.SetYblen( std::max( new_olbparams.Xbsep()+2 , olbparams.Xblen() ) );
  236.         
  237.         SetBlockSizes( new_olbparams , cformat );
  238.     }
  239.     
  240.     // Now compute the resulting chroma block params
  241.     m_cbparams[2].SetXbsep( m_lbparams[2].Xbsep()/xcfactor );
  242.     m_cbparams[2].SetYbsep( m_lbparams[2].Ybsep()/ycfactor );
  243.     m_cbparams[2].SetXblen( std::max(m_lbparams[2].Xblen()/xcfactor , m_cbparams[2].Xbsep()+2) );
  244.     m_cbparams[2].SetYblen( std::max(m_lbparams[2].Yblen()/ycfactor , m_cbparams[2].Ybsep()+2) );
  245.     
  246.     //check overlap is divisible by 2
  247.     if (( m_cbparams[2].Xblen() - m_cbparams[2].Xbsep() )%2 != 0)
  248.         m_cbparams[2].SetXblen( m_cbparams[2].Xblen()+1 );
  249.     if (( m_cbparams[2].Yblen() - m_cbparams[2].Ybsep() )%2 != 0)
  250.         m_cbparams[2].SetYblen( m_cbparams[2].Yblen()+1 );
  251.     
  252.     //Now work out the overlaps for splitting levels 1 and 0
  253.     m_lbparams[1].SetXbsep( m_lbparams[2].Xbsep()*2 );
  254.     m_lbparams[1].SetXblen( m_lbparams[2].Xblen() + m_lbparams[2].Xbsep() );
  255.     m_lbparams[1].SetYbsep( m_lbparams[2].Ybsep()*2 );
  256.     m_lbparams[1].SetYblen( m_lbparams[2].Yblen() + m_lbparams[2].Xbsep() );
  257.     
  258.     m_lbparams[0].SetXbsep( m_lbparams[1].Xbsep()*2 );
  259.     m_lbparams[0].SetXblen( m_lbparams[1].Xblen() + m_lbparams[1].Xbsep() );
  260.     m_lbparams[0].SetYbsep( m_lbparams[1].Ybsep()*2 );
  261.     m_lbparams[0].SetYblen( m_lbparams[1].Yblen() + m_lbparams[1].Xbsep() );        
  262.     
  263.     m_cbparams[1].SetXbsep( m_cbparams[2].Xbsep()*2 );
  264.     m_cbparams[1].SetXblen( m_cbparams[2].Xblen() + m_cbparams[2].Xbsep() );
  265.     m_cbparams[1].SetYbsep( m_cbparams[2].Ybsep()*2 );
  266.     m_cbparams[1].SetYblen( m_cbparams[2].Yblen() + m_cbparams[2].Xbsep() );    
  267.     
  268.     m_cbparams[0].SetXbsep( m_cbparams[1].Xbsep()*2 );
  269.     m_cbparams[0].SetXblen( m_cbparams[1].Xblen() + m_cbparams[1].Xbsep() );
  270.     m_cbparams[0].SetYbsep( m_cbparams[1].Ybsep()*2 );
  271.     m_cbparams[0].SetYblen( m_cbparams[1].Yblen() + m_cbparams[1].Xbsep() );        
  272.     
  273. }
  274. //EncoderParams functions
  275. //Default constructor    
  276. EncoderParams::EncoderParams():
  277.     CodecParams(),
  278.     m_qf(5.0),
  279.     m_num_L1(0),
  280.     m_L1_sep(0),
  281.     m_ufactor(1.0),
  282.     m_vfactor(1.0),
  283.     m_cpd(20.0),
  284.     m_I_lambda(0.f),
  285.     m_L1_lambda(0.0f),
  286.     m_L2_lambda(0.0f),
  287.     m_L1_me_lambda(0.0f),
  288.     m_L2_me_lambda(0.0f),
  289.     m_ent_correct(0),
  290.     m_bit_out(0)
  291. {}
  292. float EncoderParams::Lambda(const FrameSort& fsort) const
  293. {
  294.     if (fsort == I_frame)
  295.         return ILambda();
  296.     else if (fsort == L1_frame)
  297.         return L1Lambda();
  298.     else
  299.         return L2Lambda();
  300. }
  301. void EncoderParams::SetLambda(const FrameSort& fsort, const float l)
  302. {
  303.     if (fsort == I_frame)
  304.         SetILambda(l);
  305.     else if (fsort == L1_frame)
  306.         SetL1Lambda(l);
  307.     else
  308.         SetL2Lambda(l);
  309. }
  310. //SeqParams functions
  311. //constructor
  312. SeqParams::SeqParams():
  313.     m_xl(0),
  314.     m_yl(0),
  315.     m_cformat(format422),
  316.     m_interlace(false),
  317.     m_topfieldfirst(true),
  318.     m_framerate(12)
  319. {}
  320. int SeqParams::ChromaWidth() const
  321. {
  322.     switch (m_cformat)
  323.     {
  324.     case Yonly:
  325.         return 0;
  326.     case format411:
  327.         return m_xl/4;
  328.     case format420:
  329.     case format422:
  330.         return m_xl/2;
  331.     case format444:
  332.     default:
  333.         return m_xl;
  334.     }
  335. }
  336. int SeqParams::ChromaHeight() const
  337. {
  338.     switch (m_cformat)
  339.     {
  340.     case Yonly:
  341.         return 0;
  342.         return m_yl;
  343.     case format420:
  344.         return m_yl/2;
  345.     case format422:
  346.     case format444:
  347.     case format411:
  348.     default:
  349.         return m_yl;
  350.     }
  351. }
  352. //FrameParams functions
  353. // Default constructor
  354. FrameParams::FrameParams():
  355. m_fsort(I_frame),
  356. m_output(false)
  357. {}    
  358. // Constructor 
  359. FrameParams::FrameParams(const ChromaFormat& cf, int xlen, int ylen):
  360.     m_cformat(cf),
  361.     m_xl(xlen),
  362.     m_yl(ylen),
  363.     m_fsort(I_frame),
  364.     m_output(false)
  365. {}
  366. // Constructor
  367. FrameParams::FrameParams(const ChromaFormat& cf, const FrameSort& fs):
  368.     m_cformat(cf),
  369.     m_fsort(fs),
  370.     m_output(false)
  371. {}    
  372. // Constructor
  373. FrameParams::FrameParams(const SeqParams& sparams):
  374.     m_cformat(sparams.CFormat()),
  375.     m_xl(sparams.Xl()),
  376.     m_yl(sparams.Yl()),
  377.     m_fsort(I_frame),
  378.     m_output(false)
  379. {}
  380. // Constructor
  381. FrameParams::FrameParams(const SeqParams& sparams, const FrameSort& fs):
  382.     m_cformat(sparams.CFormat()),
  383.     m_xl(sparams.Xl()),
  384.     m_yl(sparams.Yl()),
  385.     m_fsort(fs),
  386.     m_output(false)
  387. {}