HEVC Test Model (HM)  HM-16.18
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TComBitStream.h
Go to the documentation of this file.
1 /* The copyright in this software is being made available under the BSD
2  * License, included below. This software may be subject to other third party
3  * and contributor rights, including patent rights, and no such rights are
4  * granted under this license.
5  *
6  * Copyright (c) 2010-2017, ITU/ISO/IEC
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * * Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  * * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18  * be used to endorse or promote products derived from this software without
19  * specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31  * THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
38 #ifndef __TCOMBITSTREAM__
39 #define __TCOMBITSTREAM__
40 
41 #if _MSC_VER > 1000
42 #pragma once
43 #endif // _MSC_VER > 1000
44 
45 #include <stdint.h>
46 #include <vector>
47 #include <stdio.h>
48 #include "CommonDef.h"
49 
52 
53 // ====================================================================================================================
54 // Class definition
55 // ====================================================================================================================
56 
58 class TComBitIf
59 {
60 public:
61  virtual Void writeAlignOne () {};
62  virtual Void writeAlignZero () {};
63  virtual Void write ( UInt uiBits, UInt uiNumberOfBits ) = 0;
64  virtual Void resetBits () = 0;
65  virtual UInt getNumberOfWrittenBits() const = 0;
66  virtual Int getNumBitsUntilByteAligned() const = 0;
67  virtual ~TComBitIf() {}
68 };
69 
75 {
83  std::vector<uint8_t> m_fifo;
84 
87 public:
89  // create / destroy
92 
93  // interface for encoding
98  Void write ( UInt uiBits, UInt uiNumberOfBits );
99 
101  Void writeAlignOne ();
102 
104  Void writeAlignZero ();
105 
107  Void resetBits() { assert(0); }
108 
109  // utility functions
110 
117  UChar* getByteStream() const;
118 
123 
127  Void clear();
128 
133  Int getNumBitsUntilByteAligned() const { return (8 - m_num_held_bits) & 0x7; }
134 
138  UInt getNumberOfWrittenBits() const { return UInt(m_fifo.size()) * 8 + m_num_held_bits; }
139 
140  Void insertAt(const TComOutputBitstream& src, UInt pos);
141 
145  std::vector<uint8_t>& getFIFO() { return m_fifo; }
146 
148 
149  //TComOutputBitstream& operator= (const TComOutputBitstream& src);
151  const std::vector<uint8_t>& getFIFO() const { return m_fifo; }
152 
153  Void addSubstream ( TComOutputBitstream* pcSubstream );
155 
158 };
159 
165 {
166 protected:
167  std::vector<uint8_t> m_fifo;
169 
171 
175 
176 public:
181  virtual ~TComInputBitstream() { }
183 
184  Void resetToStart();
185 
186  // interface for decoding
187  Void pseudoRead ( UInt uiNumberOfBits, UInt& ruiBits );
188  Void read ( UInt uiNumberOfBits, UInt& ruiBits );
189  Void readByte ( UInt &ruiBits )
190  {
191  assert(m_fifo_idx < m_fifo.size());
192  ruiBits = m_fifo[m_fifo_idx++];
193  }
194 
196  {
197  assert(m_fifo_idx > 0);
198  byte = m_fifo[m_fifo_idx - 1];
199  }
200 
204  UInt getByteLocation ( ) { return m_fifo_idx ; }
205 
206  // Peek at bits in word-storage. Used in determining if we have completed reading of current bitstream and therefore slice in LCEC.
207  UInt peekBits (UInt uiBits) { UInt tmp; pseudoRead(uiBits, tmp); return tmp; }
208 
209  // utility functions
210  UInt read(UInt numberOfBits) { UInt tmp; read(numberOfBits, tmp); return tmp; }
211  UInt readByte() { UInt tmp; readByte( tmp ); return tmp; }
213  UInt getNumBitsLeft() { return 8*((UInt)m_fifo.size() - m_fifo_idx) + m_num_held_bits; }
214  TComInputBitstream *extractSubstream( UInt uiNumBits ); // Read the nominated number of bits, and return as a bitstream.
217 
220  const std::vector<UInt> &getEmulationPreventionByteLocation () const { return m_emulationPreventionByteLocation; }
224 
225  const std::vector<uint8_t> &getFifo() const { return m_fifo; }
226  std::vector<uint8_t> &getFifo() { return m_fifo; }
227 };
228 
230 
231 #endif
virtual Int getNumBitsUntilByteAligned() const =0
Void setEmulationPreventionByteLocation(const std::vector< UInt > &vec)
const std::vector< UInt > & getEmulationPreventionByteLocation() const
Void insertAt(const TComOutputBitstream &src, UInt pos)
UInt getNumBitsUntilByteAligned()
UInt getEmulationPreventionByteLocation(UInt idx)
virtual Void resetBits()=0
virtual Void write(UInt uiBits, UInt uiNumberOfBits)=0
Defines version information, constants and small in-line functions.
void Void
Definition: TypeDef.h:203
TComInputBitstream * extractSubstream(UInt uiNumBits)
pure virtual class for basic bit handling
Definition: TComBitStream.h:58
const std::vector< uint8_t > & getFifo() const
unsigned int UInt
Definition: TypeDef.h:212
Int getNumBitsUntilByteAligned() const
TComOutputBitstream & operator=(const TComOutputBitstream &src)
virtual ~TComBitIf()
Definition: TComBitStream.h:67
Void pushEmulationPreventionByteLocation(UInt pos)
UInt numEmulationPreventionBytesRead()
Int countStartCodeEmulations()
returns the number of start code emulations contained in the current buffer
std::vector< uint8_t > & getFIFO()
const std::vector< uint8_t > & getFIFO() const
Void peekPreviousByte(UInt &byte)
UChar m_held_bits
number of bits not flushed to bytestream.
Definition: TComBitStream.h:86
std::vector< uint8_t > m_fifo
UInt getNumberOfWrittenBits() const
std::vector< uint8_t > & getFifo()
std::vector< uint8_t > m_fifo
Definition: TComBitStream.h:83
unsigned char UChar
Definition: TypeDef.h:208
Void pseudoRead(UInt uiNumberOfBits, UInt &ruiBits)
UInt read(UInt numberOfBits)
std::vector< UInt > m_emulationPreventionByteLocation
FIFO for storage of complete bytes.
Void read(UInt uiNumberOfBits, UInt &ruiBits)
Void readByte(UInt &ruiBits)
virtual Void writeAlignZero()
Definition: TComBitStream.h:62
UChar * getByteStream() const
TComOutputBitstream()
this value is always msb-aligned, bigendian.
virtual ~TComInputBitstream()
UInt m_num_held_bits
Read index into m_fifo.
int Int
Definition: TypeDef.h:211
Void write(UInt uiBits, UInt uiNumberOfBits)
UInt peekBits(UInt uiBits)
virtual Void writeAlignOne()
Definition: TComBitStream.h:61
Void addSubstream(TComOutputBitstream *pcSubstream)
virtual UInt getNumberOfWrittenBits() const =0
Void clearEmulationPreventionByteLocation()