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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: dirac_cppparser.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): Anuradha Suraparaju (Original Author)
  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 DIRAC_CPPPARSER_H
  38. #define DIRAC_CPPPARSER_H
  39. #include <istream>
  40. #include <streambuf>
  41. #include <libdirac_decoder/decoder_types.h> //for DecoderState
  42. #include <libdirac_common/common.h> 
  43. namespace dirac
  44. {
  45.     class SequenceDecompressor;
  46.     class Frame;
  47.     //! Input Stream Buffer Class. 
  48.     class InputStreamBuffer : public std::streambuf
  49.     {
  50.     public:
  51.         //! Constructor
  52.         InputStreamBuffer ();
  53.         //! Destructor
  54.         ~InputStreamBuffer();
  55.         //! Rewind buffer to start of data
  56.         std::ios::pos_type Rewind();
  57.         //! Seek to position specified by bytes offset from pos 
  58.         /*!
  59.             Seek takes
  60.             param bytes offset in bytes 
  61.             param pos   the position from which the offset is applied
  62.         */
  63.         std::ios::pos_type Seek(std::ios::pos_type bytes, 
  64.                                 std::ios::seekdir pos = std::ios::cur);
  65.         //! Return the current read position in the buffer
  66.         std::ios::pos_type Tell();
  67.         //! Copy data into buffer
  68.         /*!
  69.             Copy take
  70.             param start   memory area start
  71.             param bytes   number of bytes to copy starting from start
  72.         */
  73.         void Copy(char *start, int bytes);
  74.         //! Delete all processed data from buffer
  75.         void PurgeProcessedData();
  76.     private:
  77.         //! Private body-less copy constructor
  78.         InputStreamBuffer (const InputStreamBuffer& inbuf);
  79.         //! Private body-less assignment operator
  80.         InputStreamBuffer& operator = (const InputStreamBuffer& inbuf);
  81.         //! Buffer size
  82.         static const int m_buffer_size = 1232896;
  83.         //! Buffere
  84.         char *m_chunk_buffer;
  85.     };
  86.     //! Dirac Stream Parser Class
  87.     /*!
  88.         This class is a wrapper around the SequenceDecompressor class. The
  89.         Sequence Decompressor class needs a full frame of data to be available
  90.         to decompress a frame successfully.  So, the DiracParser class uses
  91.         the InputStreamBuffer class to store data until a chunk is available
  92.         to be processed and then invokes the SequenceDecompressor functions to
  93.         process data. A chunk of data can be a start of sequence, a frame or
  94.         end of sequence data.  The istream used to instantiate the
  95.         SequenceDecompressor object is created using an InputStreamBuffer
  96.         object which is manipulated the DiracParser. This ensures that data is
  97.         always available for processing by the  SequenceDecompressor object.
  98.     */
  99.     class DiracParser
  100.     {
  101.     public:
  102.         //! Constructor
  103.         /*!
  104.             Constructor takes
  105.             param verbose boolean flag. Set to true for verbose output
  106.         */
  107.         DiracParser(bool verbose = false );
  108.         //! Destructor
  109.         ~DiracParser();
  110.         
  111.         //! Copy data into the internal stream buffer
  112.         /*! SetBuffer takes
  113.             param start   Start of input buffer
  114.             param end     End of input buffer
  115.         */
  116.         void SetBuffer (char *start, char *end);
  117.         //! Parse the data in internal buffer
  118.         /*!
  119.             Parses the data in the input buffer. This function returns one 
  120.             of the following values
  121.             n STATE_BUFFER        : Not enough data in internal buffer to process 
  122.             n STATE_SEQUENCE      : Start of sequence detected
  123.             n STATE_PICTURE_START : Start of picture detected
  124.             n STATE_PICTURE_AVAIL : Decoded picture available
  125.             n STATE_SEQUENCE_END  : End of sequence detected
  126.             n STATE_INVALID       : Invalid stream. Stop further processing
  127.         */
  128.         DecoderState Parse();
  129.         //! Return the sequence parameters of the current sequence
  130.         const SeqParams& GetSeqParams() const;
  131.         //! Return the frame parameters of the next frame to be decoded
  132.         const FrameParams& GetNextFrameParams() const;
  133.         //! Return the decoded frame
  134.         const Frame& GetNextFrame() const;
  135.         //! Return the last frame in the sequence
  136.         const Frame& GetLastFrame() const;
  137.         //! Set the skip flag
  138.         /*! Set the skip flag to the value specified in skip. If skip is true,
  139.             the parser will skip decoding the next frame until the this
  140.             function is called again with skip set to false
  141.         */
  142.         void  SetSkip (bool skip);
  143.     private:
  144.         //! Determine if enough data is available in internal buffer to process
  145.         DecoderState SeekChunk();
  146.         //! Initialise the parser's internal state variables
  147.         void InitStateVars();
  148.     private:
  149.         //! private body-less copy constructor
  150.         DiracParser (const DiracParser &dp);
  151.         //! private body-less assignement constructor
  152.         DiracParser& operator = (const DiracParser &dp);
  153.         //! Current state of parser
  154.         DecoderState m_state;
  155.         //! Next state the parser will enter
  156.         DecoderState m_next_state;
  157.         //! frame number of last frame decoded in display order
  158.         int m_show_fnum;
  159.         //! Sequence decompressor object
  160.         SequenceDecompressor *m_decomp;
  161.         //! Input stream object. Initialised using the external input buffer InputStreamBuffer
  162.         std::istream *m_istr;
  163.         //! Internal Stream Buffer
  164.         InputStreamBuffer m_sbuf;
  165.         //! skip next frame flag
  166.         bool m_skip;
  167.         //! skip frame type
  168.         FrameSort m_skip_type;
  169.         //! verbose flag
  170.         bool m_verbose;
  171.         //! start of chunk flag
  172.         bool m_found_start;
  173.         //! end of chunk flag
  174.         bool m_found_end;
  175.         //! used to detect start and end of chunk
  176.         unsigned m_shift;
  177.     };
  178. } // namespace dirac
  179. #endif