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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: seq_decompress.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_DECOMPRESS_H_
  40. #define _SEQ_DECOMPRESS_H_
  41. ///////////////////////////////////////////
  42. //---------------------------------------//
  43. //Class to manage decompressing sequences//
  44. //---------------------------------------//
  45. ///////////////////////////////////////////
  46. #include "libdirac_common/common.h"
  47. #include <iostream>
  48. namespace dirac
  49. {
  50.     class FrameBuffer;
  51.     class Frame;
  52.     class FrameDecompressor;
  53.     //! Decompresses a sequence of frames from a stream.
  54.     /*!
  55.         This class decompresses a sequence of frames, frame by frame.
  56.     */
  57.     class SequenceDecompressor{
  58.     public:
  59.         //! Constructor
  60.         /*!
  61.             Initializes the decompressor with an input stream and level of
  62.             output detail.
  63.             param  ip          input data stream containing a sequence of compressed images
  64.             param  verbosity   when true, increases the amount of information displayed during decompression
  65.          */
  66.         SequenceDecompressor(std::istream * ip, bool verbosity);
  67.         //! Destructor
  68.         /*!
  69.             Closes files and releases resources. 
  70.         */
  71.         ~SequenceDecompressor();
  72.         //! Decompress the next frame in sequence
  73.         /*!
  74.             This function decodes the next frame in coding order and returns
  75.             the next frame in display order. In general these will differ, and
  76.             because of re-ordering there is a delay which needs to be imposed.
  77.             This creates problems at the start and at the end of the sequence
  78.             which must be dealt with. At the start we just keep outputting
  79.             frame 0. At the end you will need to loop for longer to get all
  80.             the frames out. It's up to the calling function to do something
  81.             with the decoded frames as they come out -- write them to screen
  82.             or to file, as required.
  83.             param  skip skip decoding next frame
  84.             return      reference to the next locally decoded frame available for display
  85.         */
  86.         Frame& DecompressNextFrame(bool skip = false);
  87.         //! Reads the header data associated with decompressing the frame
  88.         bool ReadNextFrameHeader();
  89.         //! Get the next frame available for display
  90.         Frame& GetNextFrame();
  91.         //! Get the next frame parameters
  92.         const FrameParams& GetNextFrameParams() const;
  93.         //! Determine if decompression is complete.
  94.         /*!
  95.             Indicates whether or not the last frame in the sequence has been
  96.             decompressed.
  97.             return     true if last frame has been compressed; false if not
  98.         */
  99.         bool Finished() { return m_all_done; }
  100.         //! Interrogates for decompression parameters.
  101.         /*!
  102.             Returns the parameters used for this decompression run.
  103.             return decompression parameters originally provide din the constructor.
  104.          */
  105.         SeqParams & GetSeqParams() { return m_sparams; }
  106.     private:
  107.         //! Copy constructor is private and body-less
  108.         /*!
  109.             Copy constructor is private and body-less. This class should not
  110.             be copied.
  111.         */
  112.         SequenceDecompressor(const SequenceDecompressor& cpy);
  113.         //! Assignment = is private and body-less
  114.         /*!
  115.             Assignment = is private and body-less. This class should not be
  116.             assigned.
  117.         */
  118.         SequenceDecompressor& operator=(const SequenceDecompressor& rhs);
  119.         //! Read a sequence header from bitstream
  120.         /*!
  121.             Reads the sequence data from the bitstream. This contains all the
  122.             block information. Temporal prediction information is contained in
  123.             the frame headers so that a simple GOP need not be used, or if so,
  124.             can be reset on the fly.
  125.          */
  126.         void ReadStreamHeader();    
  127.         //Member variables
  128.         //! Completion flag, returned via the Finished method
  129.         bool m_all_done;
  130.         //! Parameters for the decompression, as provided in constructor
  131.         DecoderParams m_decparams;
  132.         //! The sequence parameters obtained from the stream header
  133.         SeqParams m_sparams;
  134.         //! A picture buffer used for local storage of frames whilst pending re-ordering or being used for reference.
  135.         FrameBuffer* m_fbuffer;
  136.         //! Input file pointer, pointing at the bitstream
  137.         std::istream* m_infile;            
  138.         //! Number of the frame in coded order which is to be decoded
  139.         int m_current_code_fnum;        
  140.         //! A delay so that we don't display what we haven't decoded
  141.         int m_delay;                    
  142.         //! Index, in display order, of the last frame read
  143.         int m_last_frame_read;
  144.         //! Index, in display order of the frame to be displayed next - computed from delay and current_code_fnum
  145.         int m_show_fnum;
  146.         //! Frame decompressor object
  147.         FrameDecompressor *m_fdecoder;
  148.     };
  149. } // namespace dirac
  150. #endif