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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: bit_manager.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. *                 Robert Scott Ladd,
  25. *                 Tim Borer
  26. *                 Anuradha Suraparaju
  27. *
  28. * Alternatively, the contents of this file may be used under the terms of
  29. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  30. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  31. * the GPL or the LGPL are applicable instead of those above. If you wish to
  32. * allow use of your version of this file only under the terms of the either
  33. * the GPL or LGPL and not to allow others to use your version of this file
  34. * under the MPL, indicate your decision by deleting the provisions above
  35. * and replace them with the notice and other provisions required by the GPL
  36. * or LGPL. If you do not delete the provisions above, a recipient may use
  37. * your version of this file under the terms of any one of the MPL, the GPL
  38. * or the LGPL.
  39. * ***** END LICENSE BLOCK ***** */
  40. #ifndef _BIT_MANAGER_H_
  41. #define _BIT_MANAGER_H_
  42. #include <libdirac_common/arrays.h>
  43. #include <cstring>
  44. #include <vector>
  45. #include <iostream>
  46. namespace dirac
  47. {
  48.     //!  Prefix for all start codes
  49.     const unsigned int START_CODE_PREFIX = 0x42424344; //BBCD
  50.     const unsigned int START_CODE_PREFIX_BYTE0 = 
  51.                                         (START_CODE_PREFIX >> 24) & 0xFF;
  52.     const unsigned int START_CODE_PREFIX_BYTE1 = 
  53.                                         (START_CODE_PREFIX >> 16) & 0xFF;
  54.     const unsigned int START_CODE_PREFIX_BYTE2 = 
  55.                                         (START_CODE_PREFIX >>  8) & 0xFF;
  56.     const unsigned int START_CODE_PREFIX_BYTE3 = 
  57.                                         START_CODE_PREFIX & 0xFF;
  58.     //! Random Access Point (RAP) Intra Frame start Code
  59.     const unsigned char RAP_START_CODE = 0xD7;
  60.     //! Non-RAP Intra Frame start code
  61.     const unsigned char IFRAME_START_CODE = 0xD6;
  62.     //! L1 Frame start code
  63.     const unsigned char L1FRAME_START_CODE = 0xD4;
  64.     //! L2 Frame start code
  65.     const unsigned char L2FRAME_START_CODE = 0xD5;
  66.     //! Sequence end code
  67.     const unsigned char SEQ_END_CODE = 0xD0;
  68.     //! Not a start code but part of data
  69.     const unsigned char NOT_START_CODE = 0xFF;
  70.     //! Bitstream version
  71.     const unsigned char BITSTREAM_VERSION = 0x02;  //0.2
  72.     ////////////////////////////////////////////////
  73.     //--------------Bit output stuff--------------//
  74.     ////////////////////////////////////////////////
  75.     class UnitOutputManager;
  76.     class FrameOutputManager;
  77.     class SequenceOutputManager;
  78.     //! Class for managing bit- and byte-oriented output.
  79.     /*!
  80.         A class for managing bit- and byte-oriented output. Wraps around 
  81.         an ostream object but stores data in memory until told told to 
  82.         write out in order to support data re-ordering - for example
  83.         writing a header once the subsequent data has been obtained. 
  84.         Implementation to be reviewed in future. TJD 13 April 2004.
  85.     */
  86.     class BasicOutputManager
  87.     {
  88.         // Data cannot be written to file directly, only by other o/p classes
  89.         friend class UnitOutputManager;
  90.         friend class FrameOutputManager;
  91.         friend class SequenceOutputManager;
  92.         public:
  93.             //! Constructor
  94.             /*!
  95.             Constructor requires an ostream object pointer.
  96.             param out_data the output stream object pointer
  97.             */
  98.             BasicOutputManager(std::ostream* out_data );
  99.             //Copy constructor is default shallow copy
  100.             //Operator= is default shallow=
  101.             //! Destructor
  102.             ~BasicOutputManager(){}
  103.             //! Write a bit out. 
  104.             /*!
  105.             Write a bit out to the internal data cache.
  106.             */ 
  107.             void OutputBit(const bool& bit);
  108.             //! Write a bit out and increment count 
  109.             /*!
  110.             Write a bit out to the internal data cache and increment the 
  111.             count of bits written.
  112.             */
  113.             void OutputBit(const bool& bit,int& count);
  114.             //! Write a byte out.
  115.             /*!
  116.             Write a byte out to the internal data cache.
  117.             */
  118.             void OutputByte(const char& byte);
  119.             //! Write a null-terminated set of bytes out.
  120.             /*!
  121.             Write a null-terminated set of bytes out to the internal data cache.
  122.             */   
  123.             void OutputBytes(char* str_array);
  124.             //! Write a number of bytes out.
  125.             /*!
  126.             Write a number of bytes out to the internal data cache.
  127.             */   
  128.             void OutputBytes(char* str_array,int num);
  129.             //! Return the number of bytes last output to file.
  130.             /*!
  131.             Return the number of bytes last output to file.
  132.             */   
  133.             size_t GetNumBytes() const {return m_num_out_bytes;}
  134.             //! Size of the internal data cache in bytes.
  135.             /*!
  136.             Size of the internal data cache in bytes.
  137.             */   
  138.             size_t Size() const {return m_buffer.size();}
  139.         private:
  140.             // Number of output bytes written
  141.             size_t m_num_out_bytes;
  142.             std::ostream* m_op_ptr;
  143.             // Buffer used to store output prior to saving to file
  144.             std::vector<char> m_buffer;
  145.             // Char used for temporary storage of op data bits
  146.             char m_current_byte;
  147.             // Used to set individual bit within the current header byte
  148.             int m_output_mask;
  149.             //functions  
  150.             //! Write all data to file.
  151.             /*!
  152.             Dump the internal data cache to the internal ostream object.
  153.             */   
  154.             void WriteToFile();
  155.             //Initialise the output stream.
  156.             void InitOutputStream();
  157.             //Clean out any remaining output bits to the buffer
  158.             void FlushOutput();
  159.             
  160.             //! Write an ignore code
  161.             /*!
  162.             Write a skip interpret start prefix  byte out to the internal data 
  163.             cache.
  164.             */
  165.             void OutputSkipInterpretStartPrefixByte();
  166.     };
  167.     //! A class for handling data output, including headers.
  168.     /*!
  169.     A class for handling data output, including headers and reordering.
  170.     */
  171.     class UnitOutputManager
  172.     {
  173.         // Only the FrameOutputManager can make this class write data to file
  174.         friend class FrameOutputManager;
  175.         public:
  176.             //! Constructor.
  177.             /*!
  178.             Constructor wraps around a pointer to an ostream object, and 
  179.             initialises two BasicOutputManager objects for header and data
  180.             */
  181.             UnitOutputManager(std::ostream* out_data ); 
  182.             //Copy constructor is default shallow copy
  183.             //Operator= is default shallow=
  184.             //! Destructor
  185.             ~UnitOutputManager(){}
  186.             //! Handles the header bits.
  187.             /*!
  188.             A BasicOutputManager object for handling the header bits.
  189.             */
  190.             BasicOutputManager& Header(){return m_header;}
  191.             //! Handles the data bits.
  192.             /*!
  193.             A BasicOutputManager object for handling the data bits.
  194.             */
  195.             BasicOutputManager& Data(){return m_data;}
  196.             //! Returns the total number of bytes written in the last unit coded.
  197.             /*!
  198.             Returns the total number of bytes written in the last unit coded - header + data.
  199.             */
  200.             const size_t GetUnitBytes() const {return m_unit_bytes;}
  201.             //! Returns the total number of header bytes written in the last unit coded. 
  202.             const size_t GetUnitHeaderBytes() const {return m_unit_head_bytes;}
  203.         private:
  204.             // basic output managers for the header and data
  205.             BasicOutputManager m_header,m_data;
  206.      
  207.             // total number of bytes written in the last unit coded 
  208.             size_t m_unit_bytes;
  209.             // number of data bytes for the last unit coded
  210.             size_t m_unit_data_bytes;
  211.             // number of data bytes for the last unit coded
  212.             size_t m_unit_head_bytes;
  213.             // functions
  214.             //! Writes the bit caches to file.
  215.             /*!
  216.             Writes the header bits to the ostream, followed by the data bits.
  217.             */
  218.             void WriteToFile();
  219.     };
  220.     class FrameOutputManager
  221.     {
  222.     public:
  223.         // Only the SequenceOutputManager can make this class write data to file
  224.         friend class SequenceOutputManager;
  225.         //! Constructor
  226.         /*
  227.             Constructs a class which manages output for an entire frame.
  228.             param  out_data  pointer to the output stream 
  229.             param  num_bands  the number of subbands per component
  230.         */
  231.         FrameOutputManager( std::ostream* out_data , const int num_bands=13 ); 
  232.         //! Destructor
  233.         ~FrameOutputManager();
  234.         //! Set the number of bands there will be in a component
  235.         void SetNumBands( const int num_bands );
  236.         //! Get an output manager for a subband
  237.         /*!
  238.             Get an output manager for a subband.
  239.             param  csort  the component (Y, U or V)
  240.             param  band_num  the number of the subband
  241.         */
  242.         UnitOutputManager& BandOutput( const int csort , const int band_num );
  243.         //! Get an output manager for a subband
  244.         /*!
  245.             Get an output manager for a subband.
  246.             param  csort  the component (Y, U or V)
  247.             param  band_num  the number of the subband
  248.         */
  249.         const UnitOutputManager& BandOutput( const int csort , const int band_num ) const;
  250.         //! Get an output manager for MV data
  251.         /*!
  252.             Get an output manager for MV data
  253.         */
  254.         UnitOutputManager& MVOutput(){ return *m_mv_data; }
  255.         //! Get an output manager for MV data
  256.         /*!
  257.             Get an output manager for MV data
  258.         */
  259.         const UnitOutputManager& MVOutput() const { return *m_mv_data; }
  260.         //! Get an output manager for the frame header
  261.         BasicOutputManager& HeaderOutput(){ return *m_frame_header; }
  262.         //! Return the number of bytes used for each component
  263.         const size_t ComponentBytes( const int comp_num ) const { return m_comp_bytes[comp_num];}
  264.         //! Return the number of header bytes used for each component
  265.         const size_t ComponentHeadBytes( const int comp_num ) const { return m_comp_hdr_bytes[comp_num];}
  266.         //! Return the number of motion vector bytes used
  267.         const size_t MVBytes() const { return m_mv_bytes;}
  268.         //! Return the number of motion vector header bytes used
  269.         const size_t MVHeadBytes() const { return m_mv_hdr_bytes;}
  270.         //! Return the number of bytes used for the whole frame
  271.         const size_t FrameBytes() const { return m_total_bytes;}
  272.         //! Return the number of header bytes used throughout the frame
  273.         const size_t FrameHeadBytes() const { return m_header_bytes;}
  274.     private:
  275.         // Array of subband outputs, 1 for each component and subband
  276.         TwoDArray< UnitOutputManager* > m_data_array;
  277.         // Motion vector output
  278.         UnitOutputManager* m_mv_data;
  279.         // Frame header output
  280.         BasicOutputManager* m_frame_header;
  281.         // The total number of frame bytes
  282.         size_t m_total_bytes;
  283.         // The total number of header bytes
  284.         size_t m_header_bytes;
  285.         // The total number of MV header bytes
  286.         size_t m_mv_hdr_bytes; 
  287.         // The total number of MV bytes
  288.         size_t m_mv_bytes; 
  289.         // The total number of bytes in each component
  290.         OneDArray< size_t > m_comp_bytes;
  291.         // The total number of header bytes in each component
  292.         OneDArray< size_t > m_comp_hdr_bytes;
  293.         // A copy of a pointer to the output stream
  294.         std::ostream* m_out_stream;
  295.         // Functions
  296.         //! Initialise the band data
  297.         void Init( const int num_bands );
  298.         //! Reset all the data
  299.         void Reset();
  300.         //! Delete all the data
  301.         void DeleteAll();
  302.         //! Write all the frame data to file
  303.         void WriteToFile();
  304.     };
  305.     class SequenceOutputManager
  306.     {
  307.     public:
  308.         //! Constructor
  309.         SequenceOutputManager( std::ostream* out_data );
  310.         //! Return a reference to the output for a single frame
  311.         FrameOutputManager& FrameOutput(){ return m_frame_op_mgr; }
  312.         //! Return a reference to the output for a single frame
  313.         BasicOutputManager& HeaderOutput(){ return m_seq_header; }
  314.         //! Return a reference to the output for the sequence trailer
  315.         BasicOutputManager& TrailerOutput(){ return m_seq_end; }
  316.         //! Reset the frame data without outputting
  317.         void ResetFrame(){ m_frame_op_mgr.Reset(); }
  318.         //! Write the sequence header
  319.         void WriteSeqHeaderToFile();
  320.         //! Write all the frame data to file
  321.         void WriteFrameData();
  322.         //! Write the sequence trailer
  323.         void WriteSeqTrailerToFile();
  324.         //! Return the total number of bytes used for the sequence
  325.         const size_t SequenceBytes() { return m_total_bytes; } 
  326.         //! Return the total number of header bytes used throughout the sequence
  327.         const size_t SequenceHeadBytes() { return m_header_bytes; } 
  328.         //! Return the total number bytes used for MVs
  329.         const size_t MVBytes() { return m_mv_bytes; }
  330.         //! Return the total number bytes used for a component
  331.         const size_t ComponentBytes( const int comp_num ) { return m_comp_bytes[comp_num]; }
  332.         //! Reset the frame data
  333.         void ResetFrameData();
  334.     private:
  335.         // The frame output manager
  336.         FrameOutputManager m_frame_op_mgr;
  337.         // Output manager for the sequence header
  338.         BasicOutputManager m_seq_header;
  339.         // Output manager for the sequence end
  340.         BasicOutputManager m_seq_end;
  341.         // The total number of bytes in each component
  342.         OneDArray< size_t > m_comp_bytes;
  343.         // The total number of header bits in each component
  344.         OneDArray< size_t > m_comp_hdr_bytes;
  345.         // The number of MV header bytes
  346.         size_t m_mv_hdr_bytes;
  347.         // The total number of MV bytes
  348.         size_t m_mv_bytes;
  349.         // The total number of bytes written so far
  350.         size_t m_total_bytes;
  351.         // The total number of header bytes written so far
  352.         size_t m_header_bytes;
  353.         // The total number of trailer bytes written so far
  354.         size_t m_trailer_bytes;
  355.     };
  356.     ///////////////////////////////////////////////
  357.     //--------------Bit input stuff--------------//
  358.     ///////////////////////////////////////////////
  359.     //! A class for managing bit-wise and byte-wise input. 
  360.     class BitInputManager
  361.     {
  362.         public:
  363.             //! Constructor. 
  364.             /*!
  365.             Constructor. Wraps around an istream object.
  366.             */
  367.             BitInputManager(std::istream* in_data );
  368.             //Copy constructor is default shallow copy
  369.             //Operator= is default shallow=
  370.             //! Destructor
  371.             ~BitInputManager(){}
  372.             //input functions
  373.             //! Obtain the next bit.
  374.             bool InputBit();
  375.             //! Obtain the next bit, incrementing count. 
  376.             bool InputBit(int& count);
  377.             //! Obtain the next bit, incrementing count, if count<max_count; else return 0 (false).
  378.             bool InputBit(int& count, const int max_count);
  379.             //! Obtain the next byte. 
  380.             char InputByte();
  381.             //! Obtain a number of bytes. 
  382.             void InputBytes(char* cptr,int num);
  383.             //! Move onto the next byte. Needed if a data unit is not an exact number of bytes.
  384.             void FlushInput();
  385.             //! Returns true if we're at the end of the input, false otherwise
  386.             bool End() const ;
  387.         private:
  388.             std::istream* m_ip_ptr;
  389.             // Char used for temporary storage of ip bits
  390.             char m_current_byte;     
  391.             // The number of bits left withint the current input byte being decoded
  392.             int m_input_bits_left;
  393.             //used to check if start code is detected
  394.             unsigned int m_shift;
  395.             //functions 
  396.             // Initialise the input stream
  397.             void InitInputStream(); 
  398.     };
  399. } // namespace dirac
  400. #endif