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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: mot_comp.h,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): Richard Felton (Original Author), Thomas Davies
  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. //  Motion Compensation routines.
  38. //  Supports different sizes of blocks as long as the parameters
  39. //     describing them are 'legal'. Blocks overlap the edge of the image
  40. //     being written to but blocks in the reference image are forced to
  41. //     lie completely within the image bounds.
  42. #ifndef _INCLUDED_MOT_COMP
  43. #define _INCLUDED_MOT_COMP
  44. #include <cstdlib>
  45. #include <ctime>
  46. #include <iostream>
  47. #include <libdirac_common/common.h>
  48. #include <libdirac_common/upconvert.h>
  49. #include <libdirac_common/motion.h>
  50. namespace dirac
  51. {
  52.     class FrameBuffer;
  53.     class Frame;
  54.     //! Motion compensator class. 
  55.     /*!
  56.         Motion compensator class, for doing motion compensation with two 
  57.         references and overlapped blocks, using raised-cosine roll-off.
  58.      */
  59.     class MotionCompensator
  60.     {
  61.     public:
  62.         //! Constructor.
  63.         /*!
  64.             Constructor initialises using codec parameters.
  65.          */
  66.         MotionCompensator( const CodecParams &cp , const AddOrSub direction  );
  67.         //! Destructor
  68.         ~MotionCompensator();
  69.         //! Compensate a frame
  70.         /*!
  71.             Perform motion compensated addition/subtraction on a frame using 
  72.             parameters
  73.             param    fnum    number of frame in the frame buffer to be compensated
  74.             param    my_buffer    the FrameBuffer object containing the frame and the reference frames
  75.     `       param    mv_data    the motion vector data
  76.          */
  77.         void CompensateFrame( FrameBuffer& my_buffer , int fnum , const MvData& mv_data );
  78.     private:
  79.         //private, body-less copy constructor: this class should not be copied
  80.         MotionCompensator( const MotionCompensator& cpy );
  81.         //private, body-less assignment=: this class should not be assigned
  82.         MotionCompensator& operator=( const MotionCompensator& rhs );
  83.         //functions
  84.         //! Motion-compensate a component
  85.         void CompensateComponent( Frame& picframe , const Frame& ref1frame , 
  86.             const Frame& ref2frame ,
  87.             const MvData& mv_data , const CompSort cs);
  88.         //! Motion-compensate an individual block
  89.         void CompensateBlock( TwoDArray<CalcValueType>& pic_data , 
  90.             const PicArray& refup_data , const MVector& Vec ,
  91.             const ImageCoords& Pos , const TwoDArray<CalcValueType>& Weights );
  92.         //! DC-compensate an individual block
  93.         void DCBlock( TwoDArray<CalcValueType> &pic_data , const ValueType dc ,
  94.             const ImageCoords& Pos , const TwoDArray<CalcValueType>& Weights);
  95.         //! Recalculate the weight matrix and store other key block related parameters.
  96.         void ReConfig();
  97.         // Overlapping blocks are acheived by applying a 2D raised cosine shape
  98.         // to them. This function facilitates the calculations
  99.         float RaisedCosine(float t, float B);
  100.         //! Calculates a weighting block.
  101.         /*! 
  102.             Params defines the block parameters so the relevant weighting 
  103.             arrays can be created.  FullX and FullY refer to whether the 
  104.             weight should be adjusted for the edge of an image.  eg. 1D 
  105.             Weighting shapes in x direction
  106.               FullX true        FullX false
  107.                 ***           ********
  108.               *     *                  *
  109.              *       *                  *
  110.            *           *                  *
  111.         */
  112.         void CreateBlock(const OLBParams &bparams, bool FullX, bool FullY, TwoDArray<CalcValueType>& WeightArray);
  113.         //! Flips the values in an array in the x direction
  114.         void FlipX(const TwoDArray<CalcValueType>& Original, const OLBParams &bparams, TwoDArray<CalcValueType>& Flipped);
  115.         //! Flips the values in an array in the y direction.
  116.         void FlipY(const TwoDArray<CalcValueType>& Original, const OLBParams &bparams, TwoDArray<CalcValueType>& Flipped);
  117.     private:
  118.         //variables    
  119.         //! The codec parameters
  120.         CodecParams m_cparams;
  121.         //! The chroma format
  122.         ChromaFormat m_cformat;
  123.         bool luma_or_chroma;    //true if we're doing luma, false if we're coding chroma  
  124.         
  125.         // A marker saying whether we're doing MC addition or subtraction
  126.         AddOrSub m_add_or_sub;                    
  127.         // Block information
  128.         OLBParams m_bparams;
  129.         TwoDArray<CalcValueType>* m_block_weights;
  130.         TwoDArray<CalcValueType>* m_half_block_weights;
  131.     };
  132. } // namespace dirac
  133. #endif