source: 3DVCSoftware/branches/HTM-13.1-dev0/source/Lib/TLibEncoder/NALwrite.cpp @ 1314

Last change on this file since 1314 was 1175, checked in by tech, 10 years ago

Added direct dependency type for qtl.
Updated cfg files.
updated copy right headers.

File size: 5.6 KB
Line 
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-2015, 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
34#include <vector>
35#include <algorithm>
36#include <ostream>
37
38#include "TLibCommon/NAL.h"
39#include "TLibCommon/TComBitStream.h"
40#include "NALwrite.h"
41
42using namespace std;
43
44//! \ingroup TLibEncoder
45//! \{
46
47static const Char emulation_prevention_three_byte[] = {3};
48
49Void writeNalUnitHeader(ostream& out, OutputNALUnit& nalu)       // nal_unit_header()
50{
51TComOutputBitstream bsNALUHeader;
52
53  bsNALUHeader.write(0,1);                    // forbidden_zero_bit
54  bsNALUHeader.write(nalu.m_nalUnitType, 6);  // nal_unit_type
55#if H_MV
56  bsNALUHeader.write(nalu.m_layerId, 6);      // layerId       
57#else
58  bsNALUHeader.write(nalu.m_reservedZero6Bits, 6);                   // nuh_reserved_zero_6bits
59#endif
60  bsNALUHeader.write(nalu.m_temporalId+1, 3); // nuh_temporal_id_plus1
61
62  out.write(bsNALUHeader.getByteStream(), bsNALUHeader.getByteStreamLength());
63}
64/**
65 * write nalu to bytestream out, performing RBSP anti startcode
66 * emulation as required.  nalu.m_RBSPayload must be byte aligned.
67 */
68void write(ostream& out, OutputNALUnit& nalu)
69{
70  writeNalUnitHeader(out, nalu);
71  /* write out rsbp_byte's, inserting any required
72   * emulation_prevention_three_byte's */
73  /* 7.4.1 ...
74   * emulation_prevention_three_byte is a byte equal to 0x03. When an
75   * emulation_prevention_three_byte is present in the NAL unit, it shall be
76   * discarded by the decoding process.
77   * The last byte of the NAL unit shall not be equal to 0x00.
78   * Within the NAL unit, the following three-byte sequences shall not occur at
79   * any byte-aligned position:
80   *  - 0x000000
81   *  - 0x000001
82   *  - 0x000002
83   * Within the NAL unit, any four-byte sequence that starts with 0x000003
84   * other than the following sequences shall not occur at any byte-aligned
85   * position:
86   *  - 0x00000300
87   *  - 0x00000301
88   *  - 0x00000302
89   *  - 0x00000303
90   */
91  vector<uint8_t>& rbsp   = nalu.m_Bitstream.getFIFO();
92
93  if (rbsp.size() == 0)
94  {
95    return;
96  }
97
98  for (vector<uint8_t>::iterator it = rbsp.begin(); it != rbsp.end();)
99  {
100    /* 1) find the next emulated 00 00 {00,01,02,03}
101     * 2a) if not found, write all remaining bytes out, stop.
102     * 2b) otherwise, write all non-emulated bytes out
103     * 3) insert emulation_prevention_three_byte
104     */
105    vector<uint8_t>::iterator found = it;
106    do
107    {
108      /* NB, end()-1, prevents finding a trailing two byte sequence */
109      found = search_n(found, rbsp.end()-1, 2, 0);
110      found++;
111      /* if not found, found == end, otherwise found = second zero byte */
112      if (found == rbsp.end())
113        break;
114      if (*(++found) <= 3)
115        break;
116    } while (true);
117
118    it = found;
119    if (found != rbsp.end())
120    {
121      it = rbsp.insert(found, emulation_prevention_three_byte[0]);
122    }
123  }
124
125  out.write((Char*)&(*rbsp.begin()), rbsp.end() - rbsp.begin());
126
127  /* 7.4.1.1
128   * ... when the last byte of the RBSP data is equal to 0x00 (which can
129   * only occur when the RBSP ends in a cabac_zero_word), a final byte equal
130   * to 0x03 is appended to the end of the data.
131   */
132  if (rbsp.back() == 0x00)
133  {
134    out.write(emulation_prevention_three_byte, 1);
135  }
136}
137
138/**
139 * Write rbsp_trailing_bits to bs causing it to become byte-aligned
140 */
141void writeRBSPTrailingBits(TComOutputBitstream& bs)
142{
143  bs.write( 1, 1 );
144  bs.writeAlignZero();
145}
146
147/**
148 * Copy NALU from naluSrc to naluDest
149 */
150void copyNaluData(OutputNALUnit& naluDest, const OutputNALUnit& naluSrc)
151{
152  naluDest.m_nalUnitType = naluSrc.m_nalUnitType;
153#if H_MV
154  naluDest.m_layerId  = naluSrc.m_layerId;
155#else
156  naluDest.m_reservedZero6Bits  = naluSrc.m_reservedZero6Bits;
157#endif
158  naluDest.m_temporalId  = naluSrc.m_temporalId;
159  naluDest.m_Bitstream   = naluSrc.m_Bitstream;
160}
161
162//! \}
Note: See TracBrowser for help on using the repository browser.