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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: seq_compress.h,v 1.2 2005/01/30 05:11:41 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. *                 Anuradha Suraparaju
  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 _SEQ_COMPRESS_H_
  40. #define _SEQ_COMPRESS_H_
  41. /////////////////////////////////////////
  42. //-------------------------------------//
  43. //Class to manage compressing sequences//
  44. //-------------------------------------//
  45. /////////////////////////////////////////
  46. #include <libdirac_common/common.h>
  47. #include <libdirac_common/frame_buffer.h>
  48. #include <libdirac_common/pic_io.h>
  49. #include <libdirac_encoder/quality_monitor.h>
  50. #include <libdirac_encoder/frame_compress.h>
  51. #include <fstream>
  52. namespace dirac
  53. {
  54.     //! Compresses a sequence of frames from a stream.
  55.     /*!
  56.         This class compresses a sequence of frames, frame by frame. It
  57.         currently uses GOP parameters set in the encoder parameters in order
  58.         to define the temporal prediction structure. A version to incorporate
  59.         non-GOP structures is TBC.
  60.     */
  61.     class SequenceCompressor{
  62.     public:
  63.         //! Constructor
  64.         /*!
  65.             Creates a sequence compressor, and prepares to begin compressing
  66.             with the first frame.Sets up frame padding in the picture input if
  67.             necesary
  68.             param      pin     an input stream containing a sequence of frames
  69.             param        outfile    an output stream for the compressed output
  70.             param      encp    parameters for the encoding process
  71.         */
  72.         SequenceCompressor(StreamPicInput* pin, std::ostream* outfile, EncoderParams& encp);
  73.         //! Destructor
  74.         /*!
  75.             Destructor. Must delete IO objects created by constructor.
  76.         */
  77.         ~SequenceCompressor();
  78.         //! Load data
  79.         /*!
  80.             Load one frame of data into the Sequence Compressor. Sets
  81.             m_all_done to true if no more data is available to be loaded.
  82.             return             true - if frame load succeeded.
  83.                                 false - otherwise
  84.         */
  85.         bool LoadNextFrame();
  86.         //! Compress the next frame in sequence
  87.         /*!
  88.             This function codes the next frame in coding order and returns the
  89.             next frame in display order. In general these will differ, and
  90.             because of re-ordering there is a delay which needs to be imposed.
  91.             This creates problems at the start and at the end of the sequence
  92.             which must be dealt with. At the start we just keep outputting
  93.             frame 0. At the end you will need to loop for longer to get all
  94.             the frames out. It's up to the calling function to do something
  95.             with the decoded frames as they come out -- write them to screen
  96.             or to file, for example.  .
  97.             If coding is fast enough the compressed version could be watched
  98.             real-time (with suitable buffering in the calling function to
  99.             account for encode-time variations).
  100.             NOTE: LoadNextFrame must be called atleast once before invoking this
  101.             method.
  102.             return           reference to the next locally decoded frame available for display
  103.         */
  104.         Frame &CompressNextFrame();
  105.         //! Return a pointer to the most recent frame encoded
  106.         const Frame *GetFrameEncoded();
  107.         //! Return Motion estimation info related to the most recent frame encoded
  108.         const MEData *GetMEData();
  109.         void EndSequence();
  110.         //! Determine if compression is complete.
  111.         /*!
  112.             Indicates whether or not the last frame in the sequence has been
  113.             compressed.
  114.             return     true if last frame has been compressed; false if not
  115.         */
  116.         bool Finished(){return m_all_done;}
  117.     private:
  118.         //! Copy constructor is private and body-less
  119.         /*!
  120.             Copy constructor is private and body-less. This class should not
  121.             be copied.
  122.         */
  123.         SequenceCompressor(const SequenceCompressor& cpy);
  124.         //! Assignment = is private and body-less
  125.         /*!
  126.             Assignment = is private and body-less. This class should not be
  127.             assigned..
  128.         */
  129.         SequenceCompressor& operator=(const SequenceCompressor& rhs);
  130.         //! Writes the sequence header data to the bitstream.
  131.         /*!
  132.             This contains all the block information used for motion
  133.             compensation. However, temporal prediction structures are defined
  134.             via the frame headers, and so a simple GOP need not be used or, if
  135.             so, can be altered on the fly.
  136.         */
  137.         void WriteStreamHeader();    
  138.         //! Uses the GOP parameters to convert frame numbers in coded order to display order.
  139.         /*!
  140.              Uses the GOP parameters to convert frame numbers in coded order
  141.              to display order
  142.             param  fnum  the frame number in coded order
  143.         */
  144.         int CodedToDisplay(const int fnum);
  145.         //! Make a report to screen on the coding results for the whole sequence
  146.         void MakeSequenceReport(); 
  147.         //! Make a report to screen on the coding results for a single frame
  148.         void MakeFrameReport();
  149.         //! Completion flag, returned via the Finished method.
  150.         bool m_all_done;
  151.         //! Flag indicating whether we've just finished.
  152.         /*!
  153.             Flag which is false if we've been all-done for more than one
  154.             frame, true otherwise (so that we can take actions on finishing
  155.             once only).
  156.         */
  157.         bool m_just_finished;
  158.         //! The parameters used for encoding.
  159.         EncoderParams& m_encparams;
  160.         //! Pointer pointing at the picture input.
  161.         StreamPicInput* m_pic_in;
  162.         //! A picture buffer used for local storage of frames whilst pending re-ordering or being used for reference.
  163.         FrameBuffer* m_fbuffer;
  164.         //! A picture buffer of original frames
  165.         FrameBuffer* m_origbuffer;
  166.         //state variables for CompressNextFrame
  167.         //! The number of the current frame to be coded, in display order
  168.         int m_current_display_fnum;
  169.         //! The number of the current frame to be coded, in coded order
  170.         int m_current_code_fnum;
  171.         //! The number of the frame which should be output for concurrent display or storage
  172.         int m_show_fnum;
  173.         //! The index, in display order, of the last frame read
  174.         int m_last_frame_read;        
  175.         //! A delay so that we don't display what we haven't coded
  176.         int m_delay;
  177.         //! A class for monitoring the quality of pictures and adjusting parameters appropriately
  178.         QualityMonitor m_qmonitor;
  179.         //! A class to hold the frame compressor object
  180.         FrameCompressor m_fcoder;
  181.     };
  182. } // namespace dirac
  183. #endif