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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: frame_buffer.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):
  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 _FRAME_BUFFER_H_
  38. #define _FRAME_BUFFER_H_
  39. #include <vector>
  40. #include <map>
  41. #include <libdirac_common/frame.h>
  42. #include <libdirac_common/common.h>
  43. #include <libdirac_common/pic_io.h>
  44. namespace dirac
  45. {
  46.     //! Holds frames both for reference and to overcome reordering delay
  47.     /*!
  48.         The buffer holds frames in a stack to overcome both reordering due to 
  49.         bi-directional prediction and use as references for subsequence motion 
  50.         estimation. Frames, and components of frames, can be accessed by their 
  51.         frame numbers. GOP parameters can be included in the constructors so 
  52.         that frames can be given types (I frame, L1 frame or L2 frame) on 
  53.         being pushed onto the stack; alternatively, these parameters can be 
  54.         overridden.
  55.     */
  56.     class FrameBuffer{
  57.     public:
  58.         //! Constructor
  59.         /*!
  60.             Creates a FrameBuffer using the chroma format. Suitable for 
  61.             compressing when there are no L2 frames, or when the temporal 
  62.             prediction structure is to be determined on the fly. 
  63.             param    cf    the Chroma format of frames in the buffer
  64.             param    xlen    the width of frames in the buffer
  65.             param    ylen    the hieght of frames in the buffer
  66.         */
  67.         FrameBuffer(ChromaFormat cf,int xlen,int ylen);
  68.         //! Constructor
  69.         /*!
  70.             Creates a FrameBuffer using the chroma format and the separation 
  71.             in frames between L1 frames. Suitable for compressing when there
  72.             is no GOP structure, only an initial I-frame, or when the temporal 
  73.             prediction structure is to be determined on the fly. 
  74.             param    cf    the Chroma format of frames in the buffer
  75.             param    L1sep    the number of Layer 2 frames between Layer 1 frames
  76.             param    xlen    the width of frames in the buffer
  77.             param    ylen    the hieght of frames in the buffer
  78.         */
  79.         FrameBuffer(ChromaFormat cf,int L1sep,int xlen, int ylen);
  80.         //! Constructor
  81.         /*!
  82.             Creates a FrameBuffer using the chroma format, the number of L1 
  83.             frames between I frames and the separation in frames between L1 
  84.             frames. Suitable for compressing when there is a full GOP structure
  85.             or when the temporal prediction structure is to be determined on 
  86.             the fly. 
  87.             param    cf    the Chroma format of frames in the buffer
  88.             param    numL1    the number of Layer 1 frames before the next I frame. 0 means that there is only one I frame.
  89.             param    L1sep    the number of Layer 2 frames between Layer 1 frames
  90.             param    xlen    the width of frames in the buffer
  91.             param    ylen    the hieght of frames in the buffer
  92.         */    
  93.         FrameBuffer(ChromaFormat cf,int numL1,int L1sep,int xlen,int ylen);
  94.         //! Copy constructor
  95.         /*!
  96.             Copy constructor. Removes the current contents of the frame buffer 
  97.             and copies in the contents of the initialising buffer.
  98.         */
  99.         FrameBuffer(const FrameBuffer& cpy);
  100.         //! Operator=. 
  101.         /*!
  102.             Operator=. Assigns all elements of the rhs to the lhs.
  103.         */
  104.         FrameBuffer& operator=(const FrameBuffer& rhs);
  105.         //! Destructor
  106.         ~FrameBuffer();
  107.         //! Get frame with a given frame number (NOT with a given position in the buffer)
  108.         Frame& GetFrame(unsigned int fnum);
  109.         //! Get frame with a given frame number (NOT with a given position in the buffer)
  110.         const Frame& GetFrame(unsigned int fnum) const;
  111.         //! Get component with a given component sort and frame number (NOT with a given position in the buffer)
  112.         PicArray& GetComponent(unsigned int frame_num, CompSort c);
  113.         //! Get component with a given component sort and frame number (NOT with a given position in the buffer)
  114.         const PicArray& GetComponent(unsigned int frame_num, CompSort c) const;    
  115.         //! Get upconverted component with a given component sort and frame number (NOT with a given position in the buffer)
  116.         PicArray& GetUpComponent(unsigned int frame_num, CompSort c);
  117.         //! Get upconverted component with a given component sort and frame number (NOT with a given position in the buffer)
  118.         const PicArray& GetUpComponent(unsigned int frame_num, CompSort c) const;
  119.         //! Return the number of frames in the buffer
  120.         size_t Size() const {return m_frame_data.size();}
  121.         //! Put a new frame into the top of the buffer
  122.         /*! 
  123.             Put a new frame into the top of the buffer. Frame parameters 
  124.             associated with the frame will be the built-in parameters for the 
  125.             buffer.
  126.             param    frame_num    the number of the frame being inserted
  127.         */
  128.         void PushFrame(unsigned int frame_num);    
  129.         //! Put a new frame into the top of the buffer
  130.         /*! 
  131.             Put a new frame into the top of the buffer. Frame parameters 
  132.             associated with the frame will be as given by the frame parameter 
  133.             object.
  134.         */
  135.         void PushFrame(const FrameParams& fp);
  136.         //! Put a copy of a new frame into the top of the buffer
  137.         /*! 
  138.             Put a copy of a new frame into the top of the buffer. 
  139.         */
  140.         void PushFrame( const Frame& frame );
  141.         //! Read a new frame into the buffer.
  142.         /*! 
  143.             Read a new frame into the buffer. Frame parameters associated with 
  144.             the frame will be as given by the frame parameter object.
  145.             param    picin    the picture input
  146.             param    fp        the frame parameters to apply to the frame
  147.         */    
  148.         void PushFrame(StreamPicInput* picin,const FrameParams& fp);
  149.         //! Read a new frame into the buffer.
  150.         /*! 
  151.             Read a new frame into the buffer. Frame parameters associated with 
  152.             the frame will be derived from the frame number and the internal 
  153.             GOP parameters in the frame buffer.
  154.             param    picin    the picture input
  155.             param    fnum    the frame number
  156.         */    
  157.         void PushFrame(StreamPicInput* picin,unsigned int fnum);
  158.         //! Delete expired frames
  159.         /*! 
  160.             Delete frames which have been output and which are no longer 
  161.             required for reference. Expiry times are set in each frame's 
  162.             frame parameters.
  163.         */
  164.         void Clean(int fnum);
  165.         //! Return the default frame parameters
  166.         const FrameParams& GetFParams() const{return m_fparams;}
  167.     private:
  168.         //! the buffer storing all the values
  169.         std::vector<Frame*> m_frame_data;
  170.         //!the map from frame numbers to position in the buffer
  171.         std::map<unsigned int,unsigned int> m_fnum_map;
  172.         //! The frame parameters to use as a default if none are supplied with the frame
  173.         FrameParams m_fparams;
  174.         //! The number of L1 frames before next I frame
  175.         unsigned int m_num_L1;
  176.         //! The distance, in frames, between L1 frames
  177.         unsigned int m_L1_sep;
  178.         //! The length of the group of pictures (GOP)
  179.         unsigned int m_gop_len;
  180.         //! Set the frame parameters based on the frame number in display order and internal GOP parameters
  181.         void SetFrameParams(unsigned int fnum);
  182.         //! Remove a frame with a given frame number from the buffer
  183.         /*!
  184.             Remove a frame with a given frame number (in display order) from 
  185.             the buffer. Searches through the buffer and removes frame(s) with 
  186.             that number.
  187.         */
  188.         void Remove(unsigned int fnum);
  189.     };
  190. } // namespace dirac
  191. #endif