source: 3DVCSoftware/branches/HTM-13.1-dev0/source/Lib/TLibDecoder/NALread.cpp @ 1396

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

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

File size: 6.1 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/**
35 \file     NALread.cpp
36 \brief    reading funtionality for NAL units
37 */
38
39
40#include <vector>
41#include <algorithm>
42#include <ostream>
43
44#include "NALread.h"
45#include "TLibCommon/NAL.h"
46#include "TLibCommon/TComBitStream.h"
47
48using namespace std;
49
50//! \ingroup TLibDecoder
51//! \{
52static void convertPayloadToRBSP(vector<uint8_t>& nalUnitBuf, TComInputBitstream *bitstream, Bool isVclNalUnit)
53{
54  UInt zeroCount = 0;
55  vector<uint8_t>::iterator it_read, it_write;
56
57  UInt pos = 0;
58  bitstream->clearEmulationPreventionByteLocation();
59  for (it_read = it_write = nalUnitBuf.begin(); it_read != nalUnitBuf.end(); it_read++, it_write++, pos++)
60  {
61    assert(zeroCount < 2 || *it_read >= 0x03);
62    if (zeroCount == 2 && *it_read == 0x03)
63    {
64      bitstream->pushEmulationPreventionByteLocation( pos );
65      pos++;
66      it_read++;
67      zeroCount = 0;
68      if (it_read == nalUnitBuf.end())
69      {
70        break;
71      }
72      assert(*it_read <= 0x03);
73    }
74    zeroCount = (*it_read == 0x00) ? zeroCount+1 : 0;
75    *it_write = *it_read;
76  }
77  assert(zeroCount == 0);
78 
79  if (isVclNalUnit)
80  {
81    // Remove cabac_zero_word from payload if present
82    Int n = 0;
83   
84    while (it_write[-1] == 0x00)
85    {
86      it_write--;
87      n++;
88    }
89   
90    if (n > 0)
91    {
92      printf("\nDetected %d instances of cabac_zero_word", n/2);     
93    }
94  }
95
96  nalUnitBuf.resize(it_write - nalUnitBuf.begin());
97}
98
99Void readNalUnitHeader(InputNALUnit& nalu)
100{
101  TComInputBitstream& bs = *nalu.m_Bitstream;
102
103  Bool forbidden_zero_bit = bs.read(1);           // forbidden_zero_bit
104  assert(forbidden_zero_bit == 0);
105  nalu.m_nalUnitType = (NalUnitType) bs.read(6);  // nal_unit_type
106#if H_MV
107  nalu.m_layerId = bs.read(6);                 // layerId
108#else
109  nalu.m_reservedZero6Bits = bs.read(6);       // nuh_reserved_zero_6bits
110  assert(nalu.m_reservedZero6Bits == 0);
111#endif
112  nalu.m_temporalId = bs.read(3) - 1;             // nuh_temporal_id_plus1
113
114  if ( nalu.m_temporalId )
115  {
116    assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_BLA_W_LP
117         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_BLA_W_RADL
118         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_BLA_N_LP
119         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_IDR_W_RADL
120         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_IDR_N_LP
121         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_CRA
122         && nalu.m_nalUnitType != NAL_UNIT_VPS
123         && nalu.m_nalUnitType != NAL_UNIT_SPS
124         && nalu.m_nalUnitType != NAL_UNIT_EOS
125         && nalu.m_nalUnitType != NAL_UNIT_EOB );
126  }
127  else
128  {
129#if H_MV
130
131    // If nal_unit_type is in the range of BLA_W_LP to RSV_IRAP_VCL23, inclusive, i.e. the coded
132    // slice segment belongs to an IRAP picture, TemporalId shall be equal to 0.
133    // Otherwise, when nal_unit_type is equal to TSA_R, TSA_N, STSA_R, or STSA_N, TemporalId shall not be equal to 0.
134    // Otherwise, if nal_unit_type is equal to TSA or TSA_N, TemporalId shall not be equal to 0.
135    // Otherwise, when nuh_layer_id is equal to 0 and nal_unit_type is equal to STSA_R or STSA_N,
136    // TemporalId shall not be equal to 0.
137
138    assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_R
139         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_N    );
140
141    assert( nalu.m_layerId > 0 
142      || ( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_STSA_R
143        && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_STSA_N ) );
144#else
145    assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_R
146         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_N
147         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_STSA_R
148         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_STSA_N );
149#endif
150  }
151}
152/**
153 * create a NALunit structure with given header values and storage for
154 * a bitstream
155 */
156void read(InputNALUnit& nalu, vector<uint8_t>& nalUnitBuf)
157{
158  /* perform anti-emulation prevention */
159  TComInputBitstream *pcBitstream = new TComInputBitstream(NULL);
160  convertPayloadToRBSP(nalUnitBuf, pcBitstream, (nalUnitBuf[0] & 64) == 0);
161 
162  nalu.m_Bitstream = new TComInputBitstream(&nalUnitBuf);
163  nalu.m_Bitstream->setEmulationPreventionByteLocation(pcBitstream->getEmulationPreventionByteLocation());
164  delete pcBitstream;
165  readNalUnitHeader(nalu);
166}
167//! \}
Note: See TracBrowser for help on using the repository browser.