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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: bit_manager.cpp,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. #include <libdirac_common/bit_manager.h>
  41. #include <libdirac_common/common.h>
  42. using namespace dirac;
  43. using std::vector;
  44. ////////////////
  45. //Output stuff//
  46. ////////////////
  47. //Constructor
  48. BasicOutputManager::BasicOutputManager(std::ostream* out_data ):
  49.     m_num_out_bytes(0),
  50.     m_op_ptr(out_data)
  51. {
  52.     InitOutputStream();
  53. }
  54. void BasicOutputManager::InitOutputStream()
  55. {
  56.     // Set byte pointer to start of buffer
  57.     m_current_byte = 0;   
  58.     // Set output mask to MSB of byte 
  59.     m_output_mask = 0x80; 
  60.     // Reset the output buffer
  61.     m_buffer.clear();
  62. }
  63. void BasicOutputManager::OutputSkipInterpretStartPrefixByte()
  64. {
  65.     size_t buf_size = m_buffer.size();
  66.     if (buf_size >=4 && 
  67.         m_buffer[buf_size-1] == (char)START_CODE_PREFIX_BYTE3 &&
  68.         m_buffer[buf_size-2] == (char)START_CODE_PREFIX_BYTE2 && 
  69.         m_buffer[buf_size-3] == (char)START_CODE_PREFIX_BYTE1 &&
  70.         m_buffer[buf_size-4] == (char)START_CODE_PREFIX_BYTE0)
  71.     {
  72.         m_buffer.push_back((char)NOT_START_CODE);
  73.         std::cerr << "Wrote ignore code " << std::endl;
  74.     }
  75. }
  76. void BasicOutputManager::OutputBit(const bool& bit )
  77. {
  78.     m_current_byte |= (bit ? (m_output_mask):0);
  79.     // Shift mask to next bit in the output byte
  80.     m_output_mask >>= 1; 
  81.     if ( m_output_mask == 0 )
  82.     { 
  83.         // If a whole byte has been written, write out
  84.         m_output_mask = 0x80;
  85.         m_buffer.push_back(m_current_byte);
  86.         OutputSkipInterpretStartPrefixByte();
  87.         m_current_byte = 0;
  88.     }    
  89. }
  90. void BasicOutputManager::OutputBit(const bool& bit, int& count)
  91. {
  92.     OutputBit(bit);
  93.     count++;    
  94. }
  95. void BasicOutputManager::OutputByte(const char& byte)
  96. {
  97.     FlushOutput();
  98.     m_buffer.push_back( byte );
  99.     OutputSkipInterpretStartPrefixByte();
  100. }
  101. void BasicOutputManager::OutputBytes( char* str_array )
  102. {
  103.     FlushOutput();
  104.     while ( *str_array != 0 )
  105.     {
  106.         m_buffer.push_back( *str_array );
  107.         str_array++;
  108.     }
  109. }
  110. void BasicOutputManager::OutputBytes(char* str_array,int num)
  111. {
  112.     FlushOutput();
  113.     for ( int i=0 ; i<num ; ++i )
  114.         m_buffer.push_back( str_array[i] );
  115. }
  116. void BasicOutputManager::WriteToFile()
  117. {
  118.     FlushOutput();
  119.     for ( vector<char>::iterator it=m_buffer.begin() ; it!=m_buffer.end() ; ++it )
  120.     {
  121.         m_op_ptr->write( &( *it ) , 1 );        
  122.     }
  123.     m_num_out_bytes = m_buffer.size();
  124.     InitOutputStream();        
  125. }
  126. void BasicOutputManager::FlushOutput()
  127. {
  128.     // Flush the current byte to output buffer and reset
  129.     if ( m_output_mask != 0x80 )
  130.     {
  131.         m_buffer.push_back( m_current_byte );    
  132.         m_current_byte = 0;
  133.         m_output_mask = 0x80;
  134.     }
  135. }
  136. // Unit output - a subband or the MV data, for example //
  137. UnitOutputManager::UnitOutputManager(std::ostream* out_data ):
  138.     m_header(out_data),
  139.     m_data(out_data),
  140.     m_unit_bytes(0),
  141.     m_unit_data_bytes(0),
  142.     m_unit_head_bytes(0)
  143.     {}
  144. void UnitOutputManager::WriteToFile()
  145. {
  146.     m_header.WriteToFile();
  147.     m_data.WriteToFile();
  148.     
  149.     // after writing to file, get the number of unit bytes written
  150.     m_unit_data_bytes = m_data.GetNumBytes();
  151.     m_unit_head_bytes = m_header.GetNumBytes();
  152.     m_unit_bytes = m_unit_data_bytes + m_unit_head_bytes;
  153. }
  154. FrameOutputManager::FrameOutputManager( std::ostream* out_data , int num_bands ) :
  155.     m_data_array( 3 , num_bands ),
  156.     m_comp_bytes( 3 ),
  157.     m_comp_hdr_bytes( 3 ),
  158.     m_out_stream( out_data )
  159. {
  160.     Init( num_bands );
  161. }
  162. FrameOutputManager::~FrameOutputManager()
  163. {
  164.     DeleteAll();
  165. }
  166. void FrameOutputManager::WriteToFile()
  167. {
  168.     // Write out the frame header
  169.     m_frame_header->WriteToFile();
  170.     m_total_bytes = m_frame_header->GetNumBytes();
  171.     m_header_bytes = m_frame_header->GetNumBytes();
  172.     // Write out the motion vector data
  173.     m_mv_data->WriteToFile();
  174.     // after writing to file, get the number of bytes written
  175.     m_mv_hdr_bytes = m_mv_data->GetUnitHeaderBytes();
  176.     m_mv_bytes = m_mv_data->GetUnitBytes();
  177.     m_total_bytes += m_mv_bytes;
  178.     m_header_bytes += m_mv_hdr_bytes;
  179.     // Write out the component data
  180.     for ( int c=0 ; c<3 ; ++c)
  181.     {
  182.         m_comp_hdr_bytes[c] = 0;
  183.         m_comp_bytes[c] = 0;
  184.         for ( int b=m_data_array.LastX() ; b>=0 ; --b)
  185.         {
  186.             m_data_array[c][b]->WriteToFile();
  187.             // after writing to file, get the number of bytes written
  188.             m_comp_hdr_bytes[c] += m_data_array[c][b]->GetUnitHeaderBytes();
  189.             m_comp_bytes[c] += m_data_array[c][b]->GetUnitBytes();
  190.         }// b
  191.     }// c
  192.     for ( int c=0 ; c<m_data_array.LengthY() ; ++c)
  193.     {
  194.         m_total_bytes += m_comp_bytes[c];
  195.         m_header_bytes += m_comp_hdr_bytes[c];
  196.     }
  197. }
  198. UnitOutputManager& FrameOutputManager::BandOutput( const int csort , const int band_num)
  199. {
  200.     return *( m_data_array[csort][band_num-1] );
  201. }
  202. const UnitOutputManager& FrameOutputManager::BandOutput( const int csort , const int band_num) const
  203. {
  204.     return *( m_data_array[csort][band_num-1] );
  205. }
  206. // Frame stuff
  207. void FrameOutputManager::Init( int num_bands )
  208. {
  209.     // Initialise output for the frame header
  210.     m_frame_header = new BasicOutputManager( m_out_stream );
  211.     // Initialise output for the MV data
  212.     m_mv_data = new UnitOutputManager( m_out_stream );
  213.     // Initialise subband outputs
  214.     for ( int c=0 ; c<3 ; ++c)
  215.         for ( int b=0 ; b<num_bands ; ++b)
  216.             m_data_array[c][b] = new UnitOutputManager( m_out_stream );
  217. }
  218. void FrameOutputManager::Reset()
  219. {
  220.     const int num_bands = m_data_array.LengthX();
  221.     DeleteAll();
  222.     Init( num_bands );
  223. }   
  224. void FrameOutputManager::DeleteAll()
  225. {
  226.     // Delete subband outputs
  227.     for ( int c=0 ; c<3 ; ++c)
  228.         for ( int b=0 ; b<m_data_array.LengthX() ; ++b )
  229.             delete m_data_array[c][b];
  230.     // Delete MV data op
  231.     delete m_mv_data;
  232.     // Delete frame header op
  233.     delete m_frame_header;
  234. }   
  235. // Sequence stuff //
  236. SequenceOutputManager::SequenceOutputManager( std::ostream* out_data ):
  237.     m_frame_op_mgr( out_data ),
  238.     m_seq_header( out_data ),
  239.     m_seq_end( out_data ),
  240.     m_comp_bytes( 3 ),
  241.     m_comp_hdr_bytes( 3 ),
  242.     m_mv_hdr_bytes(0),
  243.     m_mv_bytes(0),
  244.     m_total_bytes(0),
  245.     m_header_bytes(0),
  246.     m_trailer_bytes(0)
  247. {
  248.     for (int c=0 ; c<3 ; ++c )
  249.     {
  250.         m_comp_hdr_bytes[c] = 0;
  251.         m_comp_bytes[c] = 0;
  252.     }
  253. }
  254. void SequenceOutputManager::WriteFrameData()
  255. {
  256.     m_frame_op_mgr.WriteToFile();
  257.     
  258.     // Keep up with count of component bytes
  259.     for (int c=0 ; c<m_comp_hdr_bytes.Length(); ++c)
  260.     {
  261.         m_comp_hdr_bytes[c] += m_frame_op_mgr.ComponentHeadBytes( c );
  262.         m_comp_bytes[c] += m_frame_op_mgr.ComponentBytes( c );
  263.     }// c
  264.     // Keep up with count of MV bytes
  265.     m_mv_hdr_bytes += m_frame_op_mgr.MVHeadBytes();
  266.     m_mv_bytes += m_frame_op_mgr.MVBytes();
  267.     // Keep up with overall totals
  268.     m_header_bytes += m_frame_op_mgr.FrameHeadBytes();
  269.     m_total_bytes += m_frame_op_mgr.FrameBytes();
  270. }
  271. void SequenceOutputManager::WriteSeqHeaderToFile()
  272. {
  273.     m_seq_header.WriteToFile();
  274.     m_header_bytes += m_seq_header.GetNumBytes();
  275.     m_total_bytes += m_seq_header.GetNumBytes();
  276. }
  277. void SequenceOutputManager::WriteSeqTrailerToFile()
  278. {
  279.     m_seq_end.WriteToFile();
  280.     m_trailer_bytes += m_seq_end.GetNumBytes();
  281.     m_total_bytes += m_seq_end.GetNumBytes();
  282. }
  283. ////////////////
  284. //Input stuff//
  285. ////////////////
  286. //Constructor
  287. BitInputManager::BitInputManager(std::istream* in_data ):
  288.     m_ip_ptr(in_data)
  289. {
  290.     InitInputStream();
  291. }
  292. void BitInputManager::InitInputStream()
  293. {
  294.     m_shift = 0xffffffff;
  295.     m_input_bits_left = 0;
  296. }
  297. bool BitInputManager::InputBit()
  298. {
  299.     //assumes mode errors will be caught by iostream class    
  300.     if (m_input_bits_left == 0)
  301.     {
  302.         m_ip_ptr->read(&m_current_byte,1);
  303.         m_input_bits_left = 8;
  304.         if (m_shift == START_CODE_PREFIX && (unsigned char)m_current_byte == NOT_START_CODE)
  305.         {
  306.             std::cerr << "Ignoring byte " << std::endl;
  307.             m_ip_ptr->read(&m_current_byte,1);
  308.             m_shift = 0xffffffff;
  309.         }
  310.         m_shift = (m_shift << 8) | m_current_byte;
  311.     }
  312.     m_input_bits_left--;
  313.     return bool( ( m_current_byte >> m_input_bits_left ) & 1 );
  314. }
  315. bool BitInputManager::InputBit(int& count)
  316. {
  317.     count++;
  318.     return InputBit();
  319. }
  320. bool BitInputManager::InputBit(int& count, const int max_count)
  321. {
  322.     if ( count<max_count )
  323.     {
  324.         count++;
  325.         return InputBit();
  326.     }
  327.     else
  328.         return false;
  329. }
  330. char BitInputManager::InputByte()
  331. {
  332.     // Forget about what's in the current byte    
  333.     FlushInput();
  334.     char byte;
  335.     m_ip_ptr->read(&byte,1);
  336.     return byte;    
  337. }
  338. void BitInputManager::InputBytes(char* cptr, int num)
  339. {
  340.     // Forget about what's in the current byte    
  341.     FlushInput();
  342.     m_ip_ptr->read(cptr,num);    
  343. }
  344. void BitInputManager::FlushInput()
  345. {
  346.     m_input_bits_left = 0;    
  347. }
  348. bool BitInputManager::End() const 
  349. {
  350.     return m_ip_ptr->eof();    
  351. }