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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: me_utils.h,v 1.2 2005/01/30 05:11:42 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. #ifndef _ME_UTILS_H_
  38. #define _ME_UTILS_H_
  39. #include <algorithm>
  40. #include <libdirac_common/motion.h>
  41. #include <libdirac_common/common.h>
  42. namespace dirac
  43. {
  44.     ///////////////////////////////////
  45.     //Utilities for motion estimation//
  46.     //-------------------------------//
  47.     ///////////////////////////////////
  48.     //! A class encapsulating parameters for calculating a block difference value (a single instance of matching)
  49.     class BlockDiffParams
  50.     {
  51.     public:
  52.         //! Constructor
  53.         BlockDiffParams(){}
  54.         //! Constructor
  55.         BlockDiffParams( const int x_p , const int y_p , const int x_l , const int y_l):
  56.             m_xp(x_p),
  57.             m_yp(y_p),
  58.             m_xl(x_l),
  59.             m_yl(y_l)
  60.         {}
  61.         ////////////////////////////////////////////////////////////////////
  62.         //NB: Assume default copy constructor, assignment = and destructor//
  63.         ////////////////////////////////////////////////////////////////////
  64.         // Sets ...
  65.         //! Set the limits of the block to fit in a picture
  66.         
  67.         void SetBlockLimits( const OLBParams& bparams ,
  68.                              const PicArray& pic_data , 
  69.                              const int xbpos , const int ybpos);
  70.         // ... and gets
  71.         //! Return the x-position of the top-left block corner
  72.         const int Xp() const {return m_xp;}
  73.         //! Return the y-position of the top-left block corner
  74.         const int Yp() const {return m_yp;}
  75.         //! Return the block width
  76.         const int Xl() const {return m_xl;}
  77.         //! Return the block height
  78.         const int Yl() const {return m_yl;}
  79.     private: 
  80.         int m_xp;
  81.         int m_yp;
  82.         int m_xl;
  83.         int m_yl;
  84.     };
  85.     //////////////////////////////////////////////////
  86.     //----Different difference classes, so that-----//
  87.     //bounds-checking need only be done as necessary//
  88.     //////////////////////////////////////////////////
  89.     //! An abstract class for doing block difference calculations
  90.     class BlockDiff
  91.     {
  92.     public:
  93.         //! Constructor, initialising the reference and picture data
  94.         /*
  95.              Constructor, initialising the reference and picture data
  96.              param  ref  the reference picture
  97.              param  pic  the picture being matched
  98.         */
  99.         BlockDiff( const PicArray& ref , const PicArray& pic );
  100.         //! Destructor    
  101.         virtual ~BlockDiff(){}
  102.         //! Do the actual difference - virtual function must be overridden
  103.         /*!
  104.             Do the actual difference
  105.             param    dparams    the parameters in which costs, block parameters etc are stored
  106.             param    mv    the motion vector being used 
  107.         */
  108.         virtual float Diff(  const BlockDiffParams& dparams , const MVector& mv )=0;
  109.     protected:
  110.         const PicArray& pic_data;
  111.         const PicArray& ref_data;
  112.     private:
  113.         //! Private, bodyless copy-constructor: class should not be copied
  114.         BlockDiff( const BlockDiff& cpy );            
  115.        //! Private, bodyless assignment=: class should not be assigned
  116.         BlockDiff& operator=( const BlockDiff& rhs );    
  117.     };
  118.     //! A class for doing block differences without bounds-checking, inherited from BlockDiff
  119.     class SimpleBlockDiff: public BlockDiff
  120.     {
  121.     public:
  122.         //! Constructor, initialising the reference and picture data
  123.         /*
  124.              Constructor, initialising the reference and picture data
  125.              param  ref  the reference picture
  126.              param  pic  the picture being matched
  127.         */
  128.         SimpleBlockDiff( const PicArray& ref , const PicArray& pic );
  129.         //! Do the actual difference without bounds checking
  130.         /*!
  131.             Do the actual difference without bounds checking
  132.             param    dparams    the parameters in which costs, block parameters etc are stored
  133.             param    mv    the motion vector being used 
  134.         */
  135.         float Diff(  const BlockDiffParams& dparams , const MVector& mv );
  136.     private:
  137.         //! Private, bodyless copy-constructor: class should not be copied
  138.         SimpleBlockDiff(const SimpleBlockDiff& cpy);
  139.        //! Private, bodyless assignment=: class should not be assigned
  140.         SimpleBlockDiff& operator=(const SimpleBlockDiff& rhs);
  141.     };
  142.     //! A class for doing block differences with bounds-checking, inherited from BlockDiff
  143.     class BChkBlockDiff: public BlockDiff
  144.     {
  145.     public:
  146.         //! Constructor, initialising the reference and picture data
  147.         /*
  148.              Constructor, initialising the reference and picture data
  149.              param  ref  the reference picture
  150.              param  pic  the picture being matched
  151.         */
  152.         BChkBlockDiff( const PicArray& ref , const PicArray& pic );
  153.         //! Do the actual difference with bounds checking
  154.         /*!
  155.             Do the actual difference with bounds checking
  156.             param    dparams    the parameters in which costs, block parameters etc are stored
  157.             param    mv    the motion vector being used 
  158.         */    
  159.         float Diff(  const BlockDiffParams& dparams , const MVector& mv );
  160.     private:
  161.         //! Private, bodyless copy-constructor: class should not be copied
  162.         BChkBlockDiff(const BChkBlockDiff& cpy); 
  163.        //! Private, bodyless assignment=: class should not be assigned
  164.         BChkBlockDiff& operator=(const BChkBlockDiff& rhs);
  165.     };
  166.     //! A class for calculating the difference between a block and its DC value (average)
  167.     class IntraBlockDiff
  168.     {
  169.     public:
  170.         //! Constructor, initialising the picture data
  171.         /*
  172.              Constructor, initialising the picture data
  173.              param  pic  the picture being matched
  174.         */
  175.         IntraBlockDiff( const PicArray& pic );
  176.         //! Do the actual difference
  177.         /*!
  178.             Do the actual difference
  179.             param    dparams    the parameters in which costs, block parameters etc are stored
  180.             param    dc_val     DC value
  181.         */        
  182.         float Diff( const BlockDiffParams& dparams , ValueType& dc_val );
  183.     private:
  184.         //! Private, bodyless copy-constructor: class should not be copied
  185.         IntraBlockDiff(const IntraBlockDiff& cpy);
  186.         //! Private, bodyless assignment=: class should not be assigned
  187.         IntraBlockDiff& operator=(const IntraBlockDiff& rhs);
  188.         const PicArray& pic_data;
  189.     };
  190.     //! A virtual class for bi-directional differences
  191.     class BiBlockDiff
  192.     {
  193.     public:
  194.         //! Constructor, initialising the references and picture data
  195.         /*
  196.              Constructor, initialising the references and picture data
  197.              param  ref1  the first reference picture
  198.              param  ref2  the second reference picture
  199.              param  pic  the picture being matched
  200.         */
  201.         BiBlockDiff( const PicArray& ref1 , const PicArray& ref2 , const PicArray& pic);
  202.         //! Do the actual difference
  203.         /*!
  204.             Do the actual difference
  205.             param    dparams    the parameters in which costs, block parameters etc are stored
  206.             param    mv1    the motion vector being used for reference 1
  207.             param    mv2    the motion vector being used for reference 2
  208.         */        
  209.         virtual float Diff(  const BlockDiffParams& dparams , const MVector& mv1 , const MVector& mv2 )=0;
  210.     protected:
  211.         const PicArray& pic_data;
  212.         const PicArray& ref_data1;
  213.         const PicArray& ref_data2;
  214.     private:
  215.         //! Private, bodyless copy-constructor: class should not be copied
  216.         BiBlockDiff(const BiBlockDiff& cpy);             
  217.                                                                     
  218.         //! Private, bodyless assignment=: class should not be assigned
  219.         BiBlockDiff& operator=(const BiBlockDiff& rhs);
  220.     };
  221.     //! A class for bi-directional differences with two references, and no bounds checking
  222.     class BiSimpleBlockDiff: public BiBlockDiff
  223.     {
  224.     public:
  225.         //! Constructor, initialising the references and picture data
  226.         /*
  227.              Constructor, initialising the references and picture data
  228.              param  ref1  the first reference picture
  229.              param  ref2  the second reference picture
  230.              param  pic  the picture being matched
  231.         */
  232.         BiSimpleBlockDiff( const PicArray& ref1 , const PicArray& ref2 , const PicArray& pic);
  233.         //! Do the actual difference without bounds checking
  234.         /*!
  235.             Do the actual difference without bounds checking
  236.             param    dparams    the parameters in which costs, block parameters etc are stored
  237.             param    mv1    the motion vector being used for reference 1
  238.             param    mv2    the motion vector being used for reference 2
  239.         */        
  240.         float Diff(  const BlockDiffParams& dparams , const MVector& mv1 , const MVector& mv2 );
  241.     private:
  242.         //! Private, bodyless copy-constructor: class should not be copied
  243.         BiSimpleBlockDiff(const BiSimpleBlockDiff& cpy);
  244.         //! Private, bodyless assignment=: class should not be assigned
  245.         BiSimpleBlockDiff& operator=(const BiSimpleBlockDiff& rhs);    
  246.                                                                     
  247.     };
  248.     //! A class for bi-directional differences with two references, with bounds checking
  249.     class BiBChkBlockDiff: public BiBlockDiff
  250.     {
  251.     public:
  252.         //! Constructor, initialising the references and picture data
  253.         BiBChkBlockDiff( const PicArray& ref1 , const PicArray& ref2 , const PicArray& pic );
  254.         //! Do the actual difference with bounds checking
  255.         /*!
  256.             Do the actual difference with bounds checking
  257.             param    dparams    the parameters in which costs, block parameters etc are stored
  258.             param    mv1    the motion vector being used for reference 1
  259.             param    mv2    the motion vector being used for reference 2
  260.         */        
  261.         float Diff(  const BlockDiffParams& dparams , const MVector& mv1 , const MVector& mv2 );
  262.     private:
  263.         //! Private, bodyless copy-constructor: class should not be copied
  264.         BiBChkBlockDiff(const BiBChkBlockDiff& cpy);             
  265.         //! Private, bodyless assignment=: class should not be assigned
  266.         BiBChkBlockDiff& operator=(const BiBChkBlockDiff& rhs);     
  267.                                                                 
  268.     };
  269.     // Classes where the reference is upconverted
  270.     //! An abstract class for doing block differences with an upconverted reference
  271.     class BlockDiffUp: public BlockDiff
  272.     {
  273.     public:    
  274.         //! Constructor, initialising the reference and picture data
  275.         /*
  276.              Constructor, initialising the reference and picture data
  277.              param  ref  the reference picture
  278.              param  pic  the picture being matched
  279.         */
  280.         BlockDiffUp( const PicArray& ref , const PicArray& pic);
  281.         //! Destructor
  282.         virtual ~BlockDiffUp(){}
  283.         //! Do the actual difference
  284.         /*!
  285.             Do the actual difference
  286.             param    dparams    the parameters in which costs, block parameters etc are stored
  287.             param    mv    the motion vector being used 
  288.         */     
  289.         virtual float Diff(  const BlockDiffParams& dparams , const MVector& mv )=0;
  290.     protected:
  291.          //! A lookup table to simplify the 1/8 pixel accuracy code
  292.         int InterpLookup[9][4];
  293.     private:
  294.         //! Private, bodyless copy-constructor: class should not be copied
  295.         BlockDiffUp(const BlockDiffUp& cpy); 
  296.                                                         
  297.         //! Private, bodyless assignment=: class should not be assigned
  298.         BlockDiffUp& operator=(const BlockDiffUp& rhs);
  299.                                                         
  300.     };
  301.     //! A class for doing block differences without bounds-checking with upconverted references, inherited from BlockDiffUp
  302.     class SimpleBlockDiffUp: public BlockDiffUp
  303.     {
  304.     public:
  305.         //! Constructor, initialising the reference and picture data
  306.         /*
  307.              Constructor, initialising the reference and picture data
  308.              param  ref  the reference picture
  309.              param  pic  the picture being matched
  310.         */
  311.         SimpleBlockDiffUp( const PicArray& ref , const PicArray& pic );
  312.         //! Destructor
  313.         ~SimpleBlockDiffUp(){}
  314.         //! Do the actual difference without bounds checking
  315.         /*!
  316.             Do the actual difference without bounds checking
  317.             param    dparams    the parameters in which costs, block parameters etc are stored
  318.             param    mv    the motion vector being used 
  319.         */        
  320.         float Diff(  const BlockDiffParams& dparams , const MVector& mv );
  321.     private:
  322.         //! Private, bodyless copy-constructor: class should not be copied
  323.         SimpleBlockDiffUp(const SimpleBlockDiffUp& cpy);
  324.         //! Private, bodyless assignment=: class should not be assigned
  325.         SimpleBlockDiffUp& operator=(const SimpleBlockDiffUp& rhs);
  326.     };
  327.     //! A class for doing block differences with bounds-checking with upconverted references, inherited from BlockDiffUp
  328.     class BChkBlockDiffUp: public BlockDiffUp{
  329.     public:
  330.         //! Constructor, initialising the reference and picture data
  331.         /*
  332.              Constructor, initialising the reference and picture data
  333.              param  ref  the reference picture
  334.              param  pic  the picture being matched
  335.         */
  336.         BChkBlockDiffUp(const PicArray& ref,const PicArray& pic);
  337.         //! Destructor
  338.         ~BChkBlockDiffUp(){}
  339.         //! Do the actual difference with bounds checking
  340.         /*!
  341.             Do the actual difference with bounds checking
  342.             param    dparams    the parameters in which costs, block parameters etc are stored
  343.             param    mv    the motion vector being used 
  344.         */        
  345.         float Diff(  const BlockDiffParams& dparams , const MVector& mv );
  346.     private:
  347.         //! Private, bodyless copy-constructor: class should not be copied
  348.         BChkBlockDiffUp(const BChkBlockDiffUp& cpy);
  349.         //! Private, bodyless assignment=: class should not be assigned
  350.         BChkBlockDiffUp& operator=(const BChkBlockDiffUp& rhs);    
  351.     };
  352.     //! An abstract class for doing block differences with two upconverted references
  353.     class BiBlockDiffUp: public BiBlockDiff
  354.     {
  355.     public:    
  356.         //! Constructor, initialising the references and picture data
  357.         /*
  358.              Constructor, initialising the reference and picture data
  359.              param  ref1  the first reference picture
  360.              param  ref2  the second reference picture
  361.              param  pic  the picture being matched
  362.         */
  363.         BiBlockDiffUp( const PicArray& ref1 , const PicArray& ref2 , const PicArray& pic);
  364.         //! Destructor
  365.         virtual ~BiBlockDiffUp(){}
  366.         //! Do the actual difference
  367.         /*!
  368.             Do the actual difference
  369.             param    dparams    the block parameters
  370.             param    mv1    the motion vector being used for reference 1
  371.             param    mv2    the motion vector being used for reference 2
  372.         */ 
  373.         virtual float Diff(  const BlockDiffParams& dparams , const MVector& mv1 , const MVector& mv2 )=0;
  374.     protected:
  375.          //! A lookup table to simplify the 1/8 pixel accuracy code
  376.         int InterpLookup[9][4];
  377.     private:
  378.         //! Private, bodyless copy-constructor: class should not be copied
  379.         BiBlockDiffUp(const BlockDiffUp& cpy); 
  380.                                                         
  381.         //! Private, bodyless assignment=: class should not be assigned
  382.         BiBlockDiffUp& operator=(const BlockDiffUp& rhs);
  383.                                                         
  384.     };
  385.     //! A class for doing bi-directional block differences without bounds checking
  386.     class BiSimpleBlockDiffUp: public BiBlockDiffUp
  387.     {
  388.     public:
  389.         //! Constructor, initialising the references and picture data
  390.         /*
  391.              Constructor, initialising the reference and picture data
  392.              param  ref1  the first reference picture
  393.              param  ref2  the second reference picture
  394.              param  pic  the picture being matched
  395.         */
  396.         BiSimpleBlockDiffUp( const PicArray& ref1 , const PicArray& ref2 , const PicArray& pic );
  397.         //! Do the actual difference without bounds checking
  398.         /*!
  399.             Do the actual difference without bounds checking
  400.             param    dparams    the parameters in which costs, block parameters etc are stored
  401.             param    mv1    the motion vector being used for reference 1
  402.             param    mv2    the motion vector being used for reference 2
  403.         */        
  404.         float Diff(  const BlockDiffParams& dparams , const MVector& mv1 , const MVector& mv2 );
  405.     private:
  406.         //! Private, bodyless copy-constructor: class should not be copied
  407.         BiSimpleBlockDiffUp(const BiSimpleBlockDiffUp& cpy);
  408.         //! Private, bodyless assignment=: class should not be assigned
  409.         BiSimpleBlockDiffUp& operator=(const BiSimpleBlockDiffUp& rhs);
  410.     };
  411.     //! A class for doing  bi-directional block differences with bounds checking
  412.     class BiBChkBlockDiffUp: public BiBlockDiffUp
  413.     {
  414.     public:
  415.         //! Constructor, initialising the references and picture data
  416.         /*
  417.              Constructor, initialising the reference and picture data
  418.              param  ref1  the first reference picture
  419.              param  ref2  the second reference picture
  420.              param  pic  the picture being matched
  421.         */
  422.         BiBChkBlockDiffUp( const PicArray& ref , const PicArray& ref2 , const PicArray& pic );
  423.         //! Do the actual difference with bounds checking
  424.         /*!
  425.             Do the actual difference with bounds checking
  426.             param    dparams    the parameters in which costs, block parameters etc are stored
  427.             param    mv1    the motion vector being used for reference 1
  428.             param    mv2    the motion vector being used for reference 2
  429.         */    
  430.         float Diff(  const BlockDiffParams& dparams , const MVector& mv1 , const MVector& mv2 );
  431.     private:
  432.         //! Private, bodyless copy-constructor: class should not be copied
  433.         BiBChkBlockDiffUp(const BiBChkBlockDiffUp& cpy);
  434.         //! Private, bodyless assignment=: class should not be assigned
  435.         BiBChkBlockDiffUp& operator=(const BiBChkBlockDiffUp& rhs);    
  436.     };
  437. } // namespace dirac
  438. #endif