source: SHVCSoftware/branches/SHM-5.0-dev/source/Lib/TLibEncoder/NALwrite.cpp @ 558

Last change on this file since 558 was 555, checked in by qualcomm, 11 years ago

P0130 EOB NALU. Fixing creation of NAL unit without any payload. See macro P0130. Provided by Hendry <fhendry@…>

  • Property svn:eol-style set to native
File size: 5.4 KB
RevLine 
[313]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-2013, 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 SVC_EXTENSION
56  bsNALUHeader.write(nalu.m_layerId, 6); // reserved_one_5bits
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
[555]93#if P0130_EOB
94  if (rbsp.size() == 0) return;
95#endif
96
[313]97  for (vector<uint8_t>::iterator it = rbsp.begin(); it != rbsp.end();)
98  {
99    /* 1) find the next emulated 00 00 {00,01,02,03}
100     * 2a) if not found, write all remaining bytes out, stop.
101     * 2b) otherwise, write all non-emulated bytes out
102     * 3) insert emulation_prevention_three_byte
103     */
104    vector<uint8_t>::iterator found = it;
105    do
106    {
107      /* NB, end()-1, prevents finding a trailing two byte sequence */
108      found = search_n(found, rbsp.end()-1, 2, 0);
109      found++;
110      /* if not found, found == end, otherwise found = second zero byte */
111      if (found == rbsp.end())
112        break;
113      if (*(++found) <= 3)
114        break;
115    } while (true);
116
117    it = found;
118    if (found != rbsp.end())
119    {
120      it = rbsp.insert(found, emulation_prevention_three_byte[0]);
121    }
122  }
123
124  out.write((Char*)&(*rbsp.begin()), rbsp.end() - rbsp.begin());
125
126  /* 7.4.1.1
127   * ... when the last byte of the RBSP data is equal to 0x00 (which can
128   * only occur when the RBSP ends in a cabac_zero_word), a final byte equal
129   * to 0x03 is appended to the end of the data.
130   */
131  if (rbsp.back() == 0x00)
132  {
133    out.write(emulation_prevention_three_byte, 1);
134  }
135}
136
137/**
138 * Write rbsp_trailing_bits to bs causing it to become byte-aligned
139 */
140void writeRBSPTrailingBits(TComOutputBitstream& bs)
141{
142  bs.write( 1, 1 );
143  bs.writeAlignZero();
144}
145
146/**
147 * Copy NALU from naluSrc to naluDest
148 */
149void copyNaluData(OutputNALUnit& naluDest, const OutputNALUnit& naluSrc)
150{
151  naluDest.m_nalUnitType = naluSrc.m_nalUnitType;
152  naluDest.m_reservedZero6Bits  = naluSrc.m_reservedZero6Bits;
153  naluDest.m_temporalId  = naluSrc.m_temporalId;
154  naluDest.m_Bitstream   = naluSrc.m_Bitstream;
155#if SVC_EXTENSION
156  naluDest.m_layerId   = naluSrc.m_layerId;
157#endif
158}
159
160//! \}
Note: See TracBrowser for help on using the repository browser.