shaka-packager/docs/d5/d41/hevc__decoder__configuratio...

265 lines
31 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.6"/>
<title>DASH Media Packaging SDK: media/filters/hevc_decoder_configuration.cc Source File</title>
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript" src="../../dynsections.js"></script>
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">DASH Media Packaging SDK
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="../../index.html"><span>Main&#160;Page</span></a></li>
<li><a href="../../namespaces.html"><span>Namespaces</span></a></li>
<li><a href="../../annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="../../files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="../../search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="../../search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="../../files.html"><span>File&#160;List</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="../../dir_39dc0668bd5a501998f94e8b4e546c71.html">media</a></li><li class="navelem"><a class="el" href="../../dir_5eb2e460866db0ed29e32d64402e5c22.html">filters</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">hevc_decoder_configuration.cc</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">// Copyright 2015 Google Inc. All rights reserved.</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// Use of this source code is governed by a BSD-style</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// license that can be found in the LICENSE file or at</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// https://developers.google.com/open-source/licenses/bsd</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &quot;packager/media/filters/hevc_decoder_configuration.h&quot;</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &quot;packager/base/strings/string_number_conversions.h&quot;</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &quot;packager/base/strings/string_util.h&quot;</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;packager/media/base/buffer_reader.h&quot;</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &quot;packager/media/base/rcheck.h&quot;</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="keyword">namespace </span>edash_packager {</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="keyword">namespace </span>media {</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="keyword">namespace </span>{</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// ISO/IEC 14496-15:2014 Annex E.</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;std::string GeneralProfileSpaceAsString(uint8_t general_profile_space) {</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keywordflow">switch</span> (general_profile_space) {</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; <span class="keywordflow">case</span> 0:</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <span class="keywordflow">case</span> 1:</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;A&quot;</span>;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="keywordflow">case</span> 2:</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;B&quot;</span>;</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <span class="keywordflow">case</span> 3:</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;C&quot;</span>;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; LOG(WARNING) &lt;&lt; <span class="stringliteral">&quot;Unexpected general_profile_space &quot;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; &lt;&lt; general_profile_space;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; }</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;}</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;std::string TrimLeadingZeros(<span class="keyword">const</span> std::string&amp; str) {</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; DCHECK_GT(str.size(), 0u);</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; str.size(); ++i) {</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keywordflow">if</span> (str[i] == <span class="charliteral">&#39;0&#39;</span>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordflow">return</span> str.substr(i);</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; }</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;0&quot;</span>;</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;}</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment">// Encode the 32 bits input, but in reverse bit order, i.e. bit [31] as the most</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment">// significant bit, followed by, bit [30], and down to bit [0] as the least</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment">// significant bit, where bits [i] for i in the range of 0 to 31, inclusive, are</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment">// specified in ISO/IEC 230082, encoded in hexadecimal (leading zeroes may be</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="comment">// omitted).</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;std::string ReverseBitsAndHexEncode(uint32_t x) {</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; x = ((x &amp; 0x55555555) &lt;&lt; 1) | ((x &amp; 0xAAAAAAAA) &gt;&gt; 1);</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; x = ((x &amp; 0x33333333) &lt;&lt; 2) | ((x &amp; 0xCCCCCCCC) &gt;&gt; 2);</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; x = ((x &amp; 0x0F0F0F0F) &lt;&lt; 4) | ((x &amp; 0xF0F0F0F0) &gt;&gt; 4);</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keyword">const</span> uint8_t bytes[] = {<span class="keyword">static_cast&lt;</span>uint8_t<span class="keyword">&gt;</span>(x &amp; 0xFF),</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; static_cast&lt;uint8_t&gt;((x &gt;&gt; 8) &amp; 0xFF),</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; static_cast&lt;uint8_t&gt;((x &gt;&gt; 16) &amp; 0xFF),</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; static_cast&lt;uint8_t&gt;((x &gt;&gt; 24) &amp; 0xFF)};</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordflow">return</span> TrimLeadingZeros(base::HexEncode(bytes, arraysize(bytes)));</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;}</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;std::string CodecAsString(VideoCodec codec) {</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">switch</span> (codec) {</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">case</span> kCodecHEV1:</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;hev1&quot;</span>;</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">case</span> kCodecHVC1:</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;hvc1&quot;</span>;</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; LOG(WARNING) &lt;&lt; <span class="stringliteral">&quot;Unknown codec: &quot;</span> &lt;&lt; codec;</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">return</span> std::string();</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; }</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;}</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;} <span class="comment">// namespace</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;HEVCDecoderConfiguration::HEVCDecoderConfiguration()</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; : version_(0),</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; general_profile_space_(0),</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; general_tier_flag_(false),</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; general_profile_idc_(0),</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; general_profile_compatibility_flags_(0),</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; general_level_idc_(0) {}</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;HEVCDecoderConfiguration::~HEVCDecoderConfiguration() {}</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="keywordtype">bool</span> HEVCDecoderConfiguration::ParseInternal() {</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; BufferReader reader(<a class="code" href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#ae2c11d7dc33c3f90535218797ca6b4d2">data</a>(), <a class="code" href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#a5233b5e870d55f0487ee0387ad69921f">data_size</a>());</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; uint8_t profile_indication = 0;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; uint8_t length_size_minus_one = 0;</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; uint8_t num_of_arrays = 0;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; RCHECK(reader.Read1(&amp;version_) &amp;&amp; version_ == 1 &amp;&amp;</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; reader.Read1(&amp;profile_indication) &amp;&amp;</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; reader.Read4(&amp;general_profile_compatibility_flags_) &amp;&amp;</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; reader.ReadToVector(&amp;general_constraint_indicator_flags_, 6) &amp;&amp;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; reader.Read1(&amp;general_level_idc_) &amp;&amp;</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; reader.SkipBytes(8) &amp;&amp; <span class="comment">// Skip uninterested fields.</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; reader.Read1(&amp;length_size_minus_one) &amp;&amp;</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; reader.Read1(&amp;num_of_arrays));</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; general_profile_space_ = profile_indication &gt;&gt; 6;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; RCHECK(general_profile_space_ &lt;= 3u);</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; general_tier_flag_ = ((profile_indication &gt;&gt; 5) &amp; 1) == 1;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; general_profile_idc_ = profile_indication &amp; 0x1f;</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">if</span> ((length_size_minus_one &amp; 0x3) == 2) {</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; LOG(ERROR) &lt;&lt; <span class="stringliteral">&quot;Invalid NALU length size.&quot;</span>;</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; }</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <a class="code" href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#a7f93b527e9c1bd1034f98861ca4f57f7">set_nalu_length_size</a>((length_size_minus_one &amp; 0x3) + 1);</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_of_arrays; i++) {</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; uint8_t nal_unit_type;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; uint16_t num_nalus;</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; RCHECK(reader.Read1(&amp;nal_unit_type));</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; nal_unit_type &amp;= 0x3f;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; RCHECK(reader.Read2(&amp;num_nalus));</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; num_nalus; j++) {</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; uint16_t nalu_length;</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; RCHECK(reader.Read2(&amp;nalu_length));</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; uint64_t nalu_offset = reader.pos();</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; RCHECK(reader.SkipBytes(nalu_length));</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; Nalu <a class="code" href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#a7e8ebb71676d606bc8690c3ede399629">nalu</a>;</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; RCHECK(nalu.Initialize(Nalu::kH265, <a class="code" href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#ae2c11d7dc33c3f90535218797ca6b4d2">data</a>() + nalu_offset, nalu_length));</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; RCHECK(nalu.type() == nal_unit_type);</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <a class="code" href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#a9e094293bce0ea72b2546088f6c250d8">AddNalu</a>(nalu);</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; }</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; }</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="comment">// TODO(kqyang): Parse SPS to get resolutions.</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;}</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;</div>
<div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="../../d6/d5d/classedash__packager_1_1media_1_1HEVCDecoderConfiguration.html#abe707416639b9382c680647d6970eda5"> 135</a></span>&#160;std::string <a class="code" href="../../d6/d5d/classedash__packager_1_1media_1_1HEVCDecoderConfiguration.html#abe707416639b9382c680647d6970eda5">HEVCDecoderConfiguration::GetCodecString</a>(VideoCodec codec)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// ISO/IEC 14496-15:2014 Annex E.</span></div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; std::vector&lt;std::string&gt; fields;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; fields.push_back(CodecAsString(codec));</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; fields.push_back(GeneralProfileSpaceAsString(general_profile_space_) +</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; base::IntToString(general_profile_idc_));</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; fields.push_back(</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; ReverseBitsAndHexEncode(general_profile_compatibility_flags_));</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; fields.push_back((general_tier_flag_ ? <span class="stringliteral">&quot;H&quot;</span> : <span class="stringliteral">&quot;L&quot;</span>) +</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; base::IntToString(general_level_idc_));</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="comment">// Remove trailing bytes that are zero.</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; std::vector&lt;uint8_t&gt; constraints = general_constraint_indicator_flags_;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordtype">size_t</span> size = constraints.size();</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordflow">for</span> (; size &gt; 0; --size) {</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">if</span> (constraints[size - 1] != 0) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; constraints.resize(size);</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordflow">for</span> (uint8_t constraint : constraints)</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; fields.push_back(TrimLeadingZeros(base::HexEncode(&amp;constraint, 1)));</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">return</span> base::JoinString(fields, <span class="stringliteral">&quot;.&quot;</span>);</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;}</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;} <span class="comment">// namespace media</span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;} <span class="comment">// namespace edash_packager</span></div>
<div class="ttc" id="classedash__packager_1_1media_1_1DecoderConfiguration_html_a7e8ebb71676d606bc8690c3ede399629"><div class="ttname"><a href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#a7e8ebb71676d606bc8690c3ede399629">edash_packager::media::DecoderConfiguration::nalu</a></div><div class="ttdeci">const Nalu &amp; nalu(size_t i) const </div><div class="ttdef"><b>Definition:</b> <a href="../../d2/d09/decoder__configuration_8h_source.html#l00044">decoder_configuration.h:44</a></div></div>
<div class="ttc" id="classedash__packager_1_1media_1_1DecoderConfiguration_html_ae2c11d7dc33c3f90535218797ca6b4d2"><div class="ttname"><a href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#ae2c11d7dc33c3f90535218797ca6b4d2">edash_packager::media::DecoderConfiguration::data</a></div><div class="ttdeci">const uint8_t * data() const </div><div class="ttdef"><b>Definition:</b> <a href="../../d2/d09/decoder__configuration_8h_source.html#l00053">decoder_configuration.h:53</a></div></div>
<div class="ttc" id="classedash__packager_1_1media_1_1HEVCDecoderConfiguration_html_abe707416639b9382c680647d6970eda5"><div class="ttname"><a href="../../d6/d5d/classedash__packager_1_1media_1_1HEVCDecoderConfiguration.html#abe707416639b9382c680647d6970eda5">edash_packager::media::HEVCDecoderConfiguration::GetCodecString</a></div><div class="ttdeci">std::string GetCodecString(VideoCodec codec) const </div><div class="ttdef"><b>Definition:</b> <a href="../../d5/d41/hevc__decoder__configuration_8cc_source.html#l00135">hevc_decoder_configuration.cc:135</a></div></div>
<div class="ttc" id="classedash__packager_1_1media_1_1DecoderConfiguration_html_a9e094293bce0ea72b2546088f6c250d8"><div class="ttname"><a href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#a9e094293bce0ea72b2546088f6c250d8">edash_packager::media::DecoderConfiguration::AddNalu</a></div><div class="ttdeci">void AddNalu(const Nalu &amp;nalu)</div><div class="ttdoc">Adds the given Nalu to the configuration. </div><div class="ttdef"><b>Definition:</b> <a href="../../da/d2c/decoder__configuration_8cc_source.html#l00021">decoder_configuration.cc:21</a></div></div>
<div class="ttc" id="classedash__packager_1_1media_1_1DecoderConfiguration_html_a5233b5e870d55f0487ee0387ad69921f"><div class="ttname"><a href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#a5233b5e870d55f0487ee0387ad69921f">edash_packager::media::DecoderConfiguration::data_size</a></div><div class="ttdeci">size_t data_size() const </div><div class="ttdef"><b>Definition:</b> <a href="../../d2/d09/decoder__configuration_8h_source.html#l00056">decoder_configuration.h:56</a></div></div>
<div class="ttc" id="classedash__packager_1_1media_1_1DecoderConfiguration_html_a7f93b527e9c1bd1034f98861ca4f57f7"><div class="ttname"><a href="../../d8/dfb/classedash__packager_1_1media_1_1DecoderConfiguration.html#a7f93b527e9c1bd1034f98861ca4f57f7">edash_packager::media::DecoderConfiguration::set_nalu_length_size</a></div><div class="ttdeci">void set_nalu_length_size(uint8_t nalu_length_size)</div><div class="ttdoc">Sets the size of the NAL unit length field. </div><div class="ttdef"><b>Definition:</b> <a href="../../d2/d09/decoder__configuration_8h_source.html#l00059">decoder_configuration.h:59</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri May 13 2016 19:37:57 for DASH Media Packaging SDK by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="../../doxygen.png" alt="doxygen"/>
</a> 1.8.6
</small></address>
</body>
</html>