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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: me_mode_decn.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_MODE_DECN_H_
  38. #define _ME_MODE_DECN_H_
  39. #include <libdirac_common/motion.h>
  40. #include <libdirac_motionest/block_match.h>
  41. namespace dirac
  42. {
  43.     class FrameBuffer;
  44.     //! Decides between macroblock and block prediction modes.
  45.     /*!
  46.         Loops over all the macroblocks and decides on the best modes. A
  47.         macroblock is a square of 16 blocks. There are three possible
  48.         splitting levels: 
  49.             level 0 means the macroblock is considered as a single block; 
  50.             level 1 means the macroblock is considered as 4 larger blocks,
  51.             termed sub-macroblocks; 
  52.            level 0 means the macroblock is split right down to blocks. 
  53.         In addition there is a common_ref mode which if true means the
  54.         prediction mode of all units within the MB are the same (e.g. all
  55.         sub-MBs are predicted only from reference 1). In deciding which modes
  56.         to adopt, the ModeDecider object calculates costs for all
  57.         permutations, doing motion estimation for the level 1 and level 0
  58.         modes as these have not been calculated before.
  59.         The process of decision for each is as follows. For each MB, we loop
  60.         over the levels, and call DoLevelDecn. DoLevelDecn does motion
  61.         estimation if it's necessary. Then it assumes that we don't have a
  62.         common block mode and calls DoUnitDecn which finds the best mode for
  63.         each unit in the MB at that level, individually. Then we consider the
  64.         case where we say that all the modes will be the same, and call
  65.         DoCommonMode to see if we'll get a lower cost. Then when we've got a
  66.         best cost for that level we go up to the next one.
  67.      */
  68.     class ModeDecider
  69.     {
  70.     public:
  71.         //! Constructor
  72.         /*!
  73.             The constructor creates arrays for handling the motion vector data 
  74.             at splitting levels 0 and 1, as motion
  75.             estimation must be performed for these levels.
  76.          */
  77.         ModeDecider(const EncoderParams& encp );    
  78.         //! Destructor
  79.         /*!
  80.             The destructor destroys the classes created in the constructor
  81.          */    
  82.         ~ModeDecider();
  83.         //! Does the actual mode decision
  84.         /*!
  85.             Does the mode decision
  86.             param    my_buffer    the buffer of all the relevant frames
  87.             param    frame_num    the frame number for which motion estimation is being done
  88.             param    me_data    the motion vector data into which decisions will be written
  89.          */
  90.         void DoModeDecn( const FrameBuffer& my_buffer , int frame_num , MEData& me_data);
  91.     private:
  92.         ModeDecider( const ModeDecider& cpy );//private, body-less copy constructor: this class should not be copied
  93.         ModeDecider& operator=( const ModeDecider& rhs );//private, body-less assignment=: this class should not be assigned
  94.          //functions
  95.         void DoMBDecn();    //called by do_mode_decn for each MB
  96.         //! Make a mode decision given a particular level of decomposition
  97.         void DoLevelDecn( int level );
  98.         //! Decide on a mode for a given prediction unit (block, sub-MB or MB)
  99.         float DoUnitDecn( const int xpos , const int ypos , const int level );
  100.         //! Choose a common mode for all units in a MB assuming a particular level of decomposition
  101.         float DoCommonMode( PredMode& predmode , const int level);
  102.         //! Do motion estimation for a prediction unit at a given level
  103.         void DoME( const int xpos , const int ypos , const int level );
  104.      
  105.         //! Return a measure of the cost of coding a given mode
  106.         float ModeCost( const int xindex , const int yindex , const PredMode predmode );
  107.         //! Get a prediction for the dc value of a block
  108.         ValueType GetDCPred( int xblock , int yblock );
  109.         //! Get a measure of DC value variance
  110.         float GetDCVar( const ValueType dc_val , const ValueType dc_pred);
  111.          // Member data
  112.         FrameSort fsort;
  113.         //! A local reference to the encoder params
  114.         const EncoderParams& m_encparams;
  115.         //! The Lagrangian parameter for motion estimation
  116.         float m_lambda;
  117.         //! Correction factor for comparing SAD costs for different MB splittings
  118.         OneDArray<float> m_level_factor;
  119.         //! Correction factor for comparing mode costs for different MB splittings
  120.         OneDArray<float> m_mode_factor;
  121.         //! Motion vector data for each level of splitting
  122.         OneDArray< MEData* > m_me_data_set;
  123.         const PicArray* m_pic_data;
  124.         const PicArray* m_ref1_updata;
  125.         const PicArray* m_ref2_updata;
  126.         int num_refs;
  127.         IntraBlockDiff* m_intradiff;
  128.         BiBChkBlockDiffUp* m_bicheckdiff;
  129.         //position variables, used in all the mode decisions
  130.         int m_xmb_loc,m_ymb_loc;    //coords of the current MB
  131.     };
  132. } // namespace dirac
  133. #endif