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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: common.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): 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. #ifndef _COMMON_H_
  40. #define _COMMON_H_
  41. #include <libdirac_common/bit_manager.h>
  42. #include <libdirac_common/arrays.h>
  43. #include <libdirac_common/common_types.h>
  44. #include <vector>
  45. #include <cmath>
  46. namespace dirac
  47. {
  48.     /*! file
  49.         This file contains common classes used throughout the encoder and 
  50.         decoder.  The main classes are the encoder and decoder parameters for 
  51.         controlling the encode and decode processes. These are passed 
  52.         throughout the codec.  There are also parameter classes for sequences 
  53.         and frames.
  54.     */
  55.     //Some basic enumeration types used throughout the codec ...//
  56.     //////////////////////////////////////////////////////////////
  57.     //! Prediction modes for blocks
  58.     enum PredMode{ INTRA , REF1_ONLY , REF2_ONLY , REF1AND2 };
  59.     //! Types of picture component
  60.     enum CompSort{ Y_COMP , U_COMP , V_COMP , R_COMP , G_COMP , B_COMP };
  61.     //! Addition or subtraction
  62.     enum AddOrSub{ ADD , SUBTRACT };
  63.     //! Forward or backward
  64.     enum Direction { FORWARD , BACKWARD };
  65.     //! Currently only Daubechies (DAUB) implemented
  66.     enum WltFilter { DAUB , HAAR };
  67.     //! Contexts used for coefficient coding
  68.     enum CtxAliases
  69.     {//used for residual coding
  70.         SIGN0_CTX,          //0     -sign, previous symbol is 0
  71.         SIGN_POS_CTX,       //1     -sign, previous symbol is +ve
  72.         SIGN_NEG_CTX,       //2     -sign, previous symbol is -ve
  73.         
  74.         
  75.         Z_BIN1z_CTX,        //3     -bin 1, parent is zero, neighbours zero
  76.         Z_BIN1nz_CTX,       //4     -bin 1, parent is zero, neighbours non-zero
  77.         Z_BIN2_CTX,         //5     -bin 2, parent is zero
  78.         Z_BIN3_CTX,         //6     -bin 3, parent is zero
  79.         Z_BIN4_CTX,         //7     -bin 4, parent is zero
  80.         Z_BIN5plus_CTX,     //8     -bins 5 plus, parent is zero
  81.         
  82.         NZ_BIN1z_CTX,       //9     -bin 1, parent is non-zero, neighbours zero
  83.         NZ_BIN1a_CTX,       //10    -bin 1, parent is non-zero, neighbours small
  84.         NZ_BIN1b_CTX,       //11    -bin 1, parent is non-zero, neighbours large
  85.         NZ_BIN2_CTX,        //12    -bin 2, parent is non-zero
  86.         NZ_BIN3_CTX,        //13    -bin 3, parent is non-zero
  87.         NZ_BIN4_CTX,        //14    -bin 4, parent is non-zero
  88.         NZ_BIN5plus_CTX,    //15    -bins 5 plus, parent is non-zero
  89.         
  90.         ZTz_CTX,            //16    -zerotree, neighbouring symbols are zerotree elements
  91.         ZTnz_CTX,           //17    -zerotree, neighbouring symbols are not zerotree elements
  92.         ZTzb_CTX,           //16    -zerotree, neighbouring symbols are zerotree elements
  93.         ZTnzb_CTX           //17    -zerotree, neighbouring symbols are not zerotree elements
  94.     };
  95.     //! Contexts used for MV data coding
  96.     enum MvCtxAliases
  97.     {
  98.         
  99.         YDC_BIN1_CTX,       //0     -1st bin of DC value for Y
  100.         YDC_BIN2plus_CTX,   //1     -remaining DC bins
  101.         YDC_SIGN0_CTX,      //2     -sign of Y DC value, previous value 0
  102.         UDC_BIN1_CTX,       //3     --ditto
  103.         UDC_BIN2plus_CTX,   //4     --for
  104.         UDC_SIGN0_CTX,      //5     --U
  105.         VDC_BIN1_CTX,       //6     --and
  106.         VDC_BIN2plus_CTX,   //7     --V
  107.         VDC_SIGN0_CTX,      //8     --components
  108.         
  109.         REF1x_BIN1_CTX,     //9     -bin 1, REF1 x vals
  110.         REF1x_BIN2_CTX,     //10    -bin 2, REF1 x vals
  111.         REF1x_BIN3_CTX,     //11    -bin 3, REF1 x vals
  112.         REF1x_BIN4_CTX,     //12    -bin 4, REF1 x vals
  113.         REF1x_BIN5plus_CTX, //13    -bin 5, REF1 x vals
  114.         REF1x_SIGN0_CTX,    //14    -sign, REF1 x vals, previous value 0
  115.         REF1x_SIGNP_CTX,    //15    -sign, REF1 x vals, previous value +ve
  116.         REF1x_SIGNN_CTX,    //16    -sign, REF1 x vals, previous value -ve
  117.         
  118.         REF1y_BIN1_CTX,     //17    -bin 1, REF1 y vals
  119.         REF1y_BIN2_CTX,     //18    -bin 2, REF1 y vals
  120.         REF1y_BIN3_CTX,     //19    -bin 3, REF1 y vals
  121.         REF1y_BIN4_CTX,     //20    -bin 4, REF1 y vals
  122.         REF1y_BIN5plus_CTX, //21    -bin 5, REF1 y vals
  123.         REF1y_SIGN0_CTX,    //22    -sign, REF1 y vals, previous value 0
  124.         REF1y_SIGNP_CTX,    //23    -sign, REF1 y vals, previous value +ve
  125.         REF1y_SIGNN_CTX,    //24    -sign, REF1 y vals, previous value -ve
  126.         
  127.         REF2x_BIN1_CTX,     //25    -bin 1, REF2 x vals
  128.         REF2x_BIN2_CTX,     //26    -bin 2, REF2 x vals
  129.         REF2x_BIN3_CTX,     //27    -bin 3, REF2 x vals
  130.         REF2x_BIN4_CTX,     //28    -bin 4, REF2 x vals
  131.         REF2x_BIN5plus_CTX, //29    -bin 5, REF2 x vals
  132.         REF2x_SIGN0_CTX,    //30    -sign, REF2 x vals, previous value 0
  133.         REF2x_SIGNP_CTX,    //31    -sign, REF1 y vals, previous value +ve
  134.         REF2x_SIGNN_CTX,    //32    -sign, REF1 y vals, previous value -ve
  135.         
  136.         REF2y_BIN1_CTX,     //33    -bin 1, REF2 y vals
  137.         REF2y_BIN2_CTX,     //34    -bin 2, REF2 y vals
  138.         REF2y_BIN3_CTX,     //35    -bin 3, REF2 y vals
  139.         REF2y_BIN4_CTX,     //36    -bin 4, REF2 y vals
  140.         REF2y_BIN5plus_CTX, //37    -bin 5, REF2 y vals
  141.         REF2y_SIGN0_CTX,    //38    -sign, REF2 y vals, previous value 0
  142.         REF2y_SIGNP_CTX,    //39    -sign, REF2 y vals, previous value +ve
  143.         REF2y_SIGNN_CTX,    //40    -sign, REF2 y vals, previous value -ve
  144.         
  145.         PMODE_BIN1_CTX,     //41    -bin 1, prediction mode value
  146.         PMODE_BIN2_CTX,     //42    -bin 2, prediction mode value
  147.         PMODE_BIN3_CTX,     //43    -bin 3, prediction mode value. Bin 4 not required
  148.         
  149.         MB_CMODE_CTX,       //44    -context for MB common block mode
  150.         MB_SPLIT_BIN1_CTX,  //45    -bin1, MB split mode vals
  151.         MB_SPLIT_BIN2_CTX   //46    -bin2, MB split mode vals. Bin 3 not required
  152.         
  153.     };
  154.     //Classes used throughout the codec//
  155.     /////////////////////////////////////
  156.     //! A class for picture component data.
  157.     /*!
  158.         A class for encapsulating picture data, derived from TwoDArray. NB: 
  159.         in the future there will be separate classes for input/output picture 
  160.         data, difference picture data, and wavelet coefficient data. Currently 
  161.         PicArray is used for all of these. TJD 13 April 2004.
  162.      */
  163.     class PicArray: public TwoDArray<ValueType>
  164.     {
  165.     public:
  166.         //! Default constructor
  167.         /*!
  168.             Default constructor creates an empty array.
  169.         */
  170.         PicArray(): TwoDArray<ValueType>(){}
  171.         
  172.         //! Constructor.
  173.         /*!
  174.             Contructor creates a two-D array, with specified size and colour 
  175.             format.
  176.         */
  177.         PicArray(int height, int width, CompSort cs=Y_COMP);
  178.         
  179.         //copy constructor and assignment= derived by inheritance
  180.         
  181.         //! Destructor
  182.         ~PicArray(){}
  183.         
  184.         //! Return which component is stored
  185.         const CompSort& CSort() const;
  186.         
  187.         //! Set the type of component being stored
  188.         void SetCSort(const CompSort cs);
  189.         
  190.     private:
  191.         
  192.         CompSort m_csort;
  193.     };
  194.     //! A structure for recording costs, particularly in quantisation.
  195.     class CostType
  196.     {
  197.     public:
  198.         //! The Mean Square Error    
  199.         double MSE;
  200.         
  201.         //! The entropy in bits per symbol.
  202.         double ENTROPY;
  203.         
  204.         //! The Lagrangian combination of MSE+lambda*entropy
  205.         double TOTAL;
  206.     };
  207.     //! A class used for correcting estimates of entropy.
  208.     /*!
  209.         A class used by the encoder for correcting estimates of entropy. Used 
  210.         for selecting quantisers in subband coefficient coding. Factors can be 
  211.         adjusted in the light of previous experience.
  212.      */
  213.     class EntropyCorrector
  214.     {
  215.     public:
  216.         //! Constructor.
  217.         /*!
  218.         Constructs arrays of correction factors of size.
  219.         param    depth    the depth of the wavelet transform.
  220.         */
  221.         EntropyCorrector(int depth);
  222.         
  223.         ////////////////////////////////////////////////////////////////////
  224.         //NB: Assume default copy constructor, assignment = and destructor//
  225.         ////////////////////////////////////////////////////////////////////    
  226.         //! Returns the correction factor.
  227.         /*!
  228.         Returns the correction factor for the band given also the type of 
  229.         frame and component.
  230.         */
  231.         float Factor(const int bandnum, const FrameSort fsort,const CompSort c) const;
  232.         //! Update the correction factors.
  233.         /*!
  234.         Update the factors for a given subband, component and frame type.
  235.         param    bandnum    the number of the subband to update
  236.         param    fsort      frame type
  237.         param    c          component type
  238.         param    est_bits    the number of bits it was estimated would be used
  239.         param    actual_bits    the number of bits that actually were used
  240.          */    
  241.         void Update(int bandnum, FrameSort fsort, CompSort c,int est_bits,int actual_bits);
  242.         
  243.     private:
  244.         //! Initialises the correction factors
  245.         void Init();
  246.         TwoDArray<float> m_Yfctrs;
  247.         TwoDArray<float> m_Ufctrs;
  248.         TwoDArray<float> m_Vfctrs;
  249.     };
  250.     //! Parameters for overlapped block motion compensation
  251.     class OLBParams
  252.     {
  253.         
  254.     public:
  255.         
  256.         //! Default constructor does nothing
  257.         OLBParams(){}
  258.         
  259.         //! Constructor
  260.         /*
  261.             Constructor rationalises proposed parameters to allow suitable 
  262.             overlap and fit in with
  263.             chroma format
  264.             param    xblen    the horizontal block length    
  265.             param    yblen    the vertical block length
  266.             param    xblen    the horizontal block separation
  267.             param    yblen    the vertical block separation
  268.         */
  269.         OLBParams(const int xblen, int const yblen, int const xbsep, int const ybsep);
  270.         
  271.         // Gets ...
  272.         
  273.         //! Returns the horizontal block length
  274.         int Xblen() const {return m_xblen;}
  275.         
  276.         //! Returns the vertical block length
  277.         int Yblen() const {return m_yblen;}
  278.         
  279.         //! Returns the horizontal block separation
  280.         int Xbsep() const {return m_xbsep;}
  281.         
  282.         //! Returns the vertical block separation
  283.         int Ybsep() const {return m_ybsep;}
  284.         
  285.         //! The offset in the horizontal start of the block caused by overlap,=(XBLEN-XBSEP)/2
  286.         int Xoffset() const {return m_xoffset;}
  287.         
  288.         //! The offset in the vertical start of the block caused by overlap,=(YBLEN-YBSEP)/2
  289.         int Yoffset() const {return m_yoffset;}
  290.         
  291.         // ... and sets
  292.         
  293.         //! Sets the block width
  294.         void SetXblen( int xblen ){ m_xblen = xblen; m_xoffset = (m_xblen-m_xbsep)/2;}
  295.         
  296.         //! Sets the block height
  297.         void SetYblen( int yblen ){ m_yblen = yblen; m_yoffset = (m_yblen-m_ybsep)/2;}
  298.         
  299.         //! Sets the block horizontal separation
  300.         void SetXbsep( int xbsep ){ m_xbsep = xbsep; m_xoffset = (m_xblen-m_xbsep)/2;}
  301.         
  302.         //! Sets the block vertical separation
  303.         void SetYbsep( int ybsep ){ m_ybsep = ybsep; m_yoffset = (m_yblen-m_ybsep)/2;}
  304.         
  305.         // overloaded stream operators
  306.         friend std::ostream & operator<< (std::ostream &, OLBParams &);
  307.         friend std::istream & operator>> (std::istream &, OLBParams &);
  308.         
  309.         
  310.     private:
  311.         
  312.         int m_xblen;
  313.         int m_yblen;
  314.         int m_xbsep;
  315.         int m_ybsep;
  316.         int m_xoffset;
  317.         int m_yoffset;
  318.     };
  319.     //! Parameters relating to the video sequence being encoded/decoded
  320.     class SeqParams
  321.     {
  322.     public:        
  323.         //! Default Constructor 
  324.         SeqParams();
  325.         
  326.         ////////////////////////////////////////////////////////////////////
  327.         //NB: Assume default copy constructor, assignment = and destructor//
  328.         ////////////////////////////////////////////////////////////////////    
  329.         
  330.         //gets ...
  331.         //! Returns the picture width
  332.         int Xl() const {return m_xl;}
  333.         
  334.         //! Returns the picture height
  335.         int Yl() const {return m_yl;}
  336.         
  337.         //! Returns the chroma format of the sequence (Y only, 420, 422 etc)
  338.         ChromaFormat CFormat() const {return m_cformat;}
  339.         
  340.         //! Returns the chroma width
  341.         int ChromaWidth() const;
  342.         
  343.         //! Returns the chroma height
  344.         int ChromaHeight() const;
  345.         
  346.         //! Returns true if the sequence is interlaced
  347.         bool Interlace() const {return m_interlace;}
  348.         
  349.         //! Returns true if the top field comes first in time
  350.         bool TopFieldFirst() const {return m_topfieldfirst;}
  351.         
  352.         //! Returns the number of frames to be displayed per second
  353.         int FrameRate() const {return m_framerate;}
  354.         
  355.         //! Returns the bitstream version
  356.         int BitstreamVersion() const {return m_bs_ver;}
  357.         
  358.         // ... Sets
  359.         
  360.         //! Sets the picture width
  361.         void SetXl(int xlen) {m_xl = xlen;}
  362.         
  363.         //! Sets the picture height
  364.         void SetYl(int ylen) {m_yl = ylen;}
  365.         
  366.         //! Sets the chroma format (Y only, 420, 422 etc)
  367.         void SetCFormat(ChromaFormat cf) {m_cformat=cf;}
  368.         
  369.         //! Sets the interlace flag: true if the sequence is interlaced, false otherwise
  370.         void SetInterlace(bool ilace) {m_interlace=ilace;}
  371.         
  372.         //! Sets the 'top field first' flag: true if the top field comes first in time
  373.         void SetTopFieldFirst(bool tff) {m_topfieldfirst=tff;}
  374.         
  375.         //! Sets the number of frames to be displayed per second
  376.         void SetFrameRate(int fr){m_framerate=fr;}
  377.         
  378.         //! Sets the bitstream version
  379.         void SetBitstreamVersion(int bs_ver){m_bs_ver=bs_ver;}
  380.         
  381.     private:
  382.         //! Width of video
  383.         int m_xl;
  384.         
  385.         //! Height of video
  386.         int m_yl;
  387.         
  388.         //! Presence of chroma and/or chroma sampling structure 
  389.         ChromaFormat m_cformat;
  390.         
  391.         //! True if interlaced
  392.         bool m_interlace;
  393.         
  394.         //! If interlaced, true if the top field is first in temporal order
  395.         bool m_topfieldfirst;
  396.         
  397.         //! Frame rate, per second
  398.         int m_framerate;
  399.         
  400.         //! Bitsream version.
  401.         unsigned char  m_bs_ver;
  402.     };
  403.     //! Parameters for initialising frame class objects
  404.     class FrameParams 
  405.     {
  406.         
  407.     public:
  408.         //! Default constructor
  409.         FrameParams();
  410.         
  411.         //! Constructor 
  412.         /*!
  413.            Frame chroma format is set Frame sort defaults to I frame.
  414.         */    
  415.         FrameParams(const ChromaFormat& cf, int xlen, int ylen);
  416.         
  417.         //! Constructor
  418.         /*!
  419.            Frame chroma format and frame sort are set.
  420.         */    
  421.         FrameParams(const ChromaFormat& cf, const FrameSort& fs);
  422.         
  423.         //! Constructor
  424.         /*
  425.             All data is derived from the sequence parameters
  426.         */
  427.         FrameParams(const SeqParams& sparams);
  428.         
  429.         //! Constructor
  430.         /*
  431.            All data is derived from the sequence parameters
  432.         */
  433.         FrameParams(const SeqParams& sparams, const FrameSort& fs);
  434.         
  435.         ////////////////////////////////////////////////////////////////////
  436.         //NB: Assume default copy constructor, assignment = and destructor//
  437.         ////////////////////////////////////////////////////////////////////    
  438.         
  439.         // Gets ...
  440.         
  441.         //! Returns the chroma format of the frame
  442.         const ChromaFormat& CFormat() const{return m_cformat;}
  443.         
  444.         //! Returns the width of the frame
  445.         int Xl() const{return m_xl;}
  446.         
  447.         //! Returns the height of the frame
  448.         int Yl() const{return m_yl;}
  449.         
  450.         //! Returns the type of the frame (I, L1 or L2)
  451.         const FrameSort& FSort() const {return m_fsort;}
  452.         
  453.         //! Returns the number of the frame (in time order)
  454.         int FrameNum() const {return m_fnum;}
  455.         
  456.         //! Returns the number of frames after the current frame number after which the frame can be discarded
  457.         int ExpiryTime() const {return m_expiry_time;}
  458.         
  459.         //! Returns an indication of whether the frame has been output yet
  460.         bool Output() const {return m_output;}
  461.         
  462.         //! Returns a const C++ reference to the set of reference frame numbers (will be empty if the frame is an I frame)
  463.         const std::vector<int>& Refs() const {return m_refs;}
  464.         
  465.         //! Returns non-const C++ referece to the vector of reference frames, to allow them to be set
  466.         std::vector<int>& Refs(){return m_refs;}
  467.         
  468.         
  469.         // ... Sets
  470.         
  471.         //! Sets the type of frame to I, L1 or L2
  472.         void SetFSort( const FrameSort& fs ){ m_fsort=fs; }
  473.         
  474.         //! Sets the frame number
  475.         void SetFrameNum( const int fn ){ m_fnum=fn; }
  476.         
  477.         //! Sets how long the frame will stay in the buffer
  478.         void SetExpiryTime( const int expt ){ m_expiry_time=expt; }
  479.         
  480.         //! Sets a flag to indicate that the frame has been output
  481.         void SetAsOutput(){m_output=true;}
  482.         
  483.     private:
  484.         
  485.         //! The chroma format
  486.         ChromaFormat m_cformat;
  487.         
  488.         //! Frame width
  489.         int m_xl;
  490.         
  491.         //!    Frame height
  492.         int m_yl;
  493.         
  494.         //! The frame sort
  495.         FrameSort m_fsort;
  496.         
  497.         //! The set of frame numbers of reference frames
  498.         std::vector<int> m_refs;
  499.         
  500.         //! The number of frames, after the current frame number, after the (de)coding of which the frame can be deleted
  501.         int m_expiry_time;
  502.         
  503.         //! True if the frame has been output, false if not
  504.         bool m_output;
  505.         
  506.         //! The frame number, in temporal order
  507.         int m_fnum;        
  508.     };
  509.     //! Parameters common to coder and decoder operation
  510.     /*!
  511.         Parameters used throughout both the encoder and the decoder
  512.     */
  513.     class CodecParams
  514.     {
  515.     public:
  516.         
  517.         //! Default constructor 
  518.         CodecParams();
  519.         
  520.             ////////////////////////////////////////////////////////////////////
  521.             //NB: Assume default copy constructor, assignment = and destructor//
  522.             ////////////////////////////////////////////////////////////////////
  523.         
  524.         // Gets ...    
  525.         
  526.         //! Return the number of macroblocks horizontally
  527.         int XNumMB() const {return m_x_num_mb;}
  528.         
  529.         //! Return the number of macroblocks vertically
  530.         int YNumMB() const {return m_y_num_mb;}
  531.         
  532.         //! Return the number of blocks horizontally
  533.         int XNumBlocks() const {return m_x_num_blocks;}
  534.         
  535.         //! Returns the number of blocks vertically
  536.         int YNumBlocks() const {return m_y_num_blocks;}
  537.         
  538.         //! Returns true if we're operating verbosely, false otherwise
  539.         bool Verbose() const {return m_verbose;}
  540.         
  541.         //! Returns true if we're operatung using interlace tools [not currently defined]
  542.         bool Interlace() const {return m_interlace;}
  543.         
  544.         //! Returns true if the topmost field comes first in time [NB: TBD since this duplicates metadata in the sequence header]
  545.         bool TopFieldFirst() const {return m_topfieldfirst;}    
  546.         
  547.         //! Return the Luma block parameters for each macroblock splitting level
  548.         const OLBParams& LumaBParams(int n) const {return m_lbparams[n];}
  549.         
  550.         //! Return the Chroma block parameters for each macroblock splitting level
  551.         const OLBParams& ChromaBParams(int n) const {return m_cbparams[n];}    
  552.         //! Return the original frame width
  553.         int OrigXl() const {return m_orig_xl;}
  554.         //! Return the original frame height
  555.         int OrigYl() const {return m_orig_yl;}
  556.         
  557.         // ... and Sets
  558.         //! Set how many MBs there are horizontally
  559.         void SetXNumMB(const int xn){m_x_num_mb=xn;}    
  560.         
  561.         //! Set how many MBs there are vertically
  562.         void SetYNumMB(const int yn){m_y_num_mb=yn;}
  563.         
  564.         //! Set how many blocks there are horizontally
  565.         void SetXNumBlocks(const int xn){m_x_num_blocks=xn;}
  566.         
  567.         //! Set how many blocks there are vertically
  568.         void SetYNumBlocks(const int yn){m_y_num_blocks=yn;}
  569.         
  570.         //! Sets verbosity on or off
  571.         void SetVerbose(bool v){m_verbose=v;}
  572.         
  573.         //! Sets whether interlace tools are to be used
  574.         void SetInterlace(bool intlc){m_interlace=intlc;}
  575.         
  576.         //! Sets whether the topmost field comes first in time [NB: TBD since this duplicates metadata in the sequence header]
  577.         void SetTopFieldFirst(bool topf){m_topfieldfirst=topf;}
  578.         
  579.         //! Set the block sizes for all MB splitting levels given these prototype block sizes for level=2
  580.         void SetBlockSizes(const OLBParams& olbparams , const ChromaFormat cformat);
  581.         //! Set the original frame width
  582.         void SetOrigXl(const int x){m_orig_xl=x;}
  583.         //! Set the original frame height
  584.         void SetOrigYl(const int y){m_orig_yl=y;}
  585.     private:
  586.         
  587.         //! The number of macroblocks horizontally
  588.         int m_x_num_mb;
  589.         
  590.         //! The number of macroblocks verticaly
  591.         int m_y_num_mb;
  592.         
  593.         //! The number of blocks horizontally
  594.         int m_x_num_blocks;    
  595.         
  596.         //! The number of blocks vertically
  597.         int m_y_num_blocks;
  598.         
  599.         //! Code/decode with commentary if true    
  600.         bool m_verbose;
  601.         
  602.         //! True if input is interlaced, false otherwise
  603.         bool m_interlace;
  604.         
  605.         //! True if interlaced and top field is first in temporal order 
  606.         bool m_topfieldfirst;
  607.         
  608.         OneDArray<OLBParams> m_lbparams;
  609.         OneDArray<OLBParams> m_cbparams;
  610.         //! The original frame width
  611.         int m_orig_xl;
  612.         //! The original frame height
  613.         int m_orig_yl;
  614.     };
  615.     //! Parameters for the encoding process
  616.     /*!
  617.         Parameters for the encoding process, derived from CodecParams.
  618.      */
  619.     class EncoderParams: public CodecParams
  620.     {
  621.         //codec params plus parameters relating solely to the operation of the encoder
  622.         
  623.     public:
  624.         //! Default constructor    
  625.         EncoderParams();
  626.         
  627.             ////////////////////////////////////////////////////////////////////
  628.             //NB: Assume default copy constructor, assignment = and destructor//
  629.             //This means pointers are copied, not the objects they point to.////       
  630.             ////////////////////////////////////////////////////////////////////
  631.         
  632.          // Gets ...
  633.         //! Get the quality factor
  634.         float Qf() const {return m_qf;}
  635.         //! Return the nominal number of L1 frames before the next I frame
  636.         /*! 
  637.             Return the nominal number of L1 frames before the next I frame. Can be
  638.             overridden by I-frame insertion
  639.         */
  640.         int NumL1() const {return m_num_L1;}
  641.         //! Return the separation between L1 frames (and between L1 and I frames)
  642.         int L1Sep() const {return m_L1_sep;}
  643.         //! Return the amount we're weighting noise in the U component
  644.         float UFactor() const {return m_ufactor;}
  645.         //! Return the amount we're weighting noise in the V component
  646.         float VFactor() const {return m_vfactor;}
  647.         //! Return the number of cycles per degree at the nominal viewing distance for the raster
  648.         float CPD() const {return m_cpd;}
  649.         //! Return the Lagrangian parameter to be used for I frames
  650.         float ILambda() const {return m_I_lambda;}
  651.         //! Return the Lagrangian parameter to be used for L1 frames
  652.         float L1Lambda() const {return m_L1_lambda;}
  653.         //! Return the Lagrangian parameter to be used for L2 frames
  654.         float L2Lambda() const {return m_L2_lambda;}
  655.         //! Return the Lagrangian parameter to be used for frames
  656.         float Lambda(const FrameSort& fsort) const;
  657.         //! Return the Lagrangian ME parameter to be used for L1 frames
  658.         float L1MELambda() const {return m_L1_me_lambda;}
  659.         //! Return the Lagrangian ME parameter to be used for L2 frames
  660.         float L2MELambda() const {return m_L2_me_lambda;}
  661.         //! Return the output path to be used for storing diagnositic data
  662.         char * OutputPath() const {return ( char* ) m_output_path.c_str();}
  663.         
  664.         //! Return a reference to the entropy factors
  665.         const EntropyCorrector& EntropyFactors() const {return *m_ent_correct;}
  666.         
  667.         //! Return a reference to the entropy factors - we need to be able to change the values of the entropy factors in situ
  668.         EntropyCorrector& EntropyFactors() {return *m_ent_correct;}
  669.         
  670.         //!Return a reference to the bit output class
  671.         const SequenceOutputManager& BitsOut() const {return *m_bit_out;}
  672.         
  673.         //!Return a reference to the bit output class - we need to output, so non-const
  674.         SequenceOutputManager& BitsOut() {return *m_bit_out;}
  675.         
  676.         // ... and Sets
  677.         //! Set the quality factor
  678.         void SetQf(const float qfac){m_qf=qfac;}
  679.         //! Set the nominal number of L1 frames between I frames
  680.         void SetNumL1(const int nl){m_num_L1=nl;}
  681.         //! Set the separation between L1 frames
  682.         void SetL1Sep(const int lsep){m_L1_sep=lsep;}
  683.         //! Set the amount to weight noise in the U component
  684.         void SetUFactor(const float uf){m_ufactor=uf;}
  685.         //! Set the amount to weight noise in the V component
  686.         void SetVFactor(const float vf){m_vfactor=vf;}
  687.         //! Set the number of cycles per degree at the nominal viewing distance
  688.         void SetCPD(const float cpd){m_cpd=cpd;}
  689.         //! Set the Lagrangian parameter to be used for I frames
  690.         void SetILambda(const float l){m_I_lambda=l;}
  691.         //! Set the Lagrangian parameter to be used for L1 frames
  692.         void SetL1Lambda(const float l){m_L1_lambda=l;}
  693.         //! Set the Lagrangian parameter to be used for L2 frames
  694.         void SetL2Lambda(const float l){m_L2_lambda=l;}
  695.         //! Set the Lagrangian parameters to be used for frames
  696.         void SetLambda(const FrameSort& fsort, const float l);
  697.         //! Set the Lagrangian parameter to be used for L1 motion estimation
  698.         void SetL1MELambda(const float l){m_L1_me_lambda=l;}
  699.         //! Set the Lagrangian parameter to be used for L2 motion estimation
  700.         void SetL2MELambda(const float l){m_L2_me_lambda=l;}
  701.         //! Set the output path to be used for diagnostic data
  702.         void SetOutputPath(const char * op){ m_output_path = op; }
  703.         
  704.         //! Sets the entropy factors - TBD: set this up in a constructor and pass encoder params around entirely by reference
  705.         void SetEntropyFactors(EntropyCorrector* entcorrect){m_ent_correct=entcorrect;}
  706.         
  707.         //! Sets the bit output - TBD: set this up in a constructor and pass encoder params around entirely by reference
  708.         void SetBitsOut( SequenceOutputManager* so ){ m_bit_out=so; }
  709.         
  710.     private:
  711.         //! Quality factor (between 0 and 10)
  712.         float m_qf; 
  713.         
  714.         //! Number of L1 frames before next I frame
  715.         int m_num_L1;
  716.         
  717.         //! Separation between L1 frames
  718.         int m_L1_sep;    
  719.         
  720.         //! factor for weighting U component quantisation errors
  721.         float m_ufactor;
  722.         
  723.         //! factor for weighting V component quantisation errors
  724.         float m_vfactor;
  725.         
  726.         //! Cycles per degree assumed for viewing the video
  727.         float m_cpd;
  728.         
  729.         //! Lagrangian parameter for Intra frame coding
  730.         float m_I_lambda;
  731.         //! Lagrangian parameter for L1 frame coding
  732.         float m_L1_lambda;
  733.         //! Lagrangian parameter for L2 frame coding
  734.         float m_L2_lambda;
  735.         
  736.         //! Lagrangian param for L1 motion estimation
  737.         float m_L1_me_lambda;
  738.         //! Lagrangian param for L2 motion estimation
  739.         float m_L2_me_lambda; 
  740.         
  741.         //! Correction factors for quantiser selection 
  742.         EntropyCorrector* m_ent_correct;
  743.         
  744.         //! Pointer to object for managing bitstream output
  745.         SequenceOutputManager* m_bit_out;   
  746.         
  747.         //! Output file path
  748.         std::string m_output_path;
  749.     };
  750.     //! Parameters for the decoding process
  751.     /*!
  752.         Parameters for the decoding process. Derived from CodecParams.
  753.      */
  754.     class DecoderParams: public CodecParams
  755.     {
  756.     public:
  757.             //! Default constructor
  758.         DecoderParams():
  759.         CodecParams(),
  760.         m_bit_in(0){}
  761.         
  762.             ////////////////////////////////////////////////////////////////////
  763.             //NB: Assume default copy constructor, assignment = and destructor//
  764.             //This means pointers are copied, not the objects they point to.////       
  765.             ////////////////////////////////////////////////////////////////////
  766.         
  767.         //! Return a reference to the bit output class
  768.         const BitInputManager& BitsIn() const {return *m_bit_in;}
  769.         
  770.         //! Return a reference to the bit output class - we need to output, so non-const
  771.         BitInputManager& BitsIn() {return *m_bit_in;}
  772.         
  773.         //! Sets the bit input - TBD: set this up in a constructor and pass decoder params around entirely by reference
  774.         void SetBitsIn(BitInputManager* bi){m_bit_in=bi;}
  775.         
  776.     private:        
  777.         //! Pointer to the bitstream input manager
  778.         BitInputManager* m_bit_in;
  779.     };
  780.     //! A simple bounds checking function, very useful in a number of places
  781.     inline ValueType BChk(const ValueType &num, const ValueType &max)
  782.     {
  783.         if(num < 0) return 0;
  784.         else if(num >= max) return max-1;
  785.         else return num;
  786.     }
  787. } // namespace dirac
  788. #endif