media/docs/doc/reference/com/google/android/exoplayer2/source/SampleQueue.html
olly a038f875f6 Update Javadoc for 2.14.0
#minor-release

PiperOrigin-RevId: 373351935
2021-05-12 13:55:32 +01:00

1283 lines
68 KiB
HTML

<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico"><meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml"><meta name="theme-color" content="#ffffff"><!-- end favicons snippet -->
<title>SampleQueue (ExoPlayer library)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../jquery/jquery-3.5.1.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-ui.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="SampleQueue (ExoPlayer library)";
}
}
catch(err) {
}
//-->
var data = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
var useModuleDirectories = false;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">com.google.android.exoplayer2.source</a></div>
<h2 title="Class SampleQueue" class="title">Class SampleQueue</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li><a href="https://developer.android.com/reference/java/lang/Object.html" title="class or interface in java.lang" class="externalLink" target="_top">java.lang.Object</a></li>
<li>
<ul class="inheritance">
<li>com.google.android.exoplayer2.source.SampleQueue</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Implemented Interfaces:</dt>
<dd><code><a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></code></dd>
</dl>
<hr>
<pre>public class <span class="typeNameLabel">SampleQueue</span>
extends <a href="https://developer.android.com/reference/java/lang/Object.html" title="class or interface in java.lang" class="externalLink" target="_top">Object</a>
implements <a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></pre>
<div class="block">A queue of media samples.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="nested.class.summary">
<!-- -->
</a>
<h3>Nested Class Summary</h3>
<table class="memberSummary">
<caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static interface&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="SampleQueue.UpstreamFormatChangedListener.html" title="interface in com.google.android.exoplayer2.source">SampleQueue.UpstreamFormatChangedListener</a></span></code></th>
<td class="colLast">
<div class="block">A listener for changes to the upstream format.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="nested.classes.inherited.from.class.com.google.android.exoplayer2.extractor.TrackOutput">
<!-- -->
</a>
<h3>Nested classes/interfaces inherited from interface&nbsp;com.google.android.exoplayer2.extractor.<a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></h3>
<code><a href="../extractor/TrackOutput.CryptoData.html" title="class in com.google.android.exoplayer2.extractor">TrackOutput.CryptoData</a>, <a href="../extractor/TrackOutput.SampleDataPart.html" title="annotation in com.google.android.exoplayer2.extractor">TrackOutput.SampleDataPart</a></code></li>
</ul>
</li>
</ul>
</section>
<!-- =========== FIELD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="field.summary">
<!-- -->
</a>
<h3>Field Summary</h3>
<ul class="blockList">
<li class="blockList"><a id="fields.inherited.from.class.com.google.android.exoplayer2.extractor.TrackOutput">
<!-- -->
</a>
<h3>Fields inherited from interface&nbsp;com.google.android.exoplayer2.extractor.<a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></h3>
<code><a href="../extractor/TrackOutput.html#SAMPLE_DATA_PART_ENCRYPTION">SAMPLE_DATA_PART_ENCRYPTION</a>, <a href="../extractor/TrackOutput.html#SAMPLE_DATA_PART_MAIN">SAMPLE_DATA_PART_MAIN</a>, <a href="../extractor/TrackOutput.html#SAMPLE_DATA_PART_SUPPLEMENTAL">SAMPLE_DATA_PART_SUPPLEMENTAL</a></code></li>
</ul>
</li>
</ul>
</section>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier</th>
<th class="colSecond" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>protected </code></td>
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)">SampleQueue</a></span>&#8203;(<a href="../upstream/Allocator.html" title="interface in com.google.android.exoplayer2.upstream">Allocator</a>&nbsp;allocator,
<a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top">Looper</a>&nbsp;playbackLooper,
<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager,
<a href="../drm/DrmSessionEventListener.EventDispatcher.html" title="class in com.google.android.exoplayer2.drm">DrmSessionEventListener.EventDispatcher</a>&nbsp;drmEventDispatcher)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>static <a href="SampleQueue.html" title="class in com.google.android.exoplayer2.source">SampleQueue</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#createWithDrm(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)">createWithDrm</a></span>&#8203;(<a href="../upstream/Allocator.html" title="interface in com.google.android.exoplayer2.upstream">Allocator</a>&nbsp;allocator,
<a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top">Looper</a>&nbsp;playbackLooper,
<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager,
<a href="../drm/DrmSessionEventListener.EventDispatcher.html" title="class in com.google.android.exoplayer2.drm">DrmSessionEventListener.EventDispatcher</a>&nbsp;drmEventDispatcher)</code></th>
<td class="colLast">
<div class="block">Creates a sample queue with DRM resource management.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>static <a href="SampleQueue.html" title="class in com.google.android.exoplayer2.source">SampleQueue</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#createWithoutDrm(com.google.android.exoplayer2.upstream.Allocator)">createWithoutDrm</a></span>&#8203;(<a href="../upstream/Allocator.html" title="interface in com.google.android.exoplayer2.upstream">Allocator</a>&nbsp;allocator)</code></th>
<td class="colLast">
<div class="block">Creates a sample queue without DRM resource management.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#discardSampleMetadataToRead()">discardSampleMetadataToRead</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#discardTo(long,boolean,boolean)">discardTo</a></span>&#8203;(long&nbsp;timeUs,
boolean&nbsp;toKeyframe,
boolean&nbsp;stopAtReadPosition)</code></th>
<td class="colLast">
<div class="block">Discards up to but not including the sample immediately before or at the specified time.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#discardToEnd()">discardToEnd</a></span>()</code></th>
<td class="colLast">
<div class="block">Discards all samples in the queue and advances the read position.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#discardToRead()">discardToRead</a></span>()</code></th>
<td class="colLast">
<div class="block">Discards up to but not including the read position.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#discardUpstreamFrom(long)">discardUpstreamFrom</a></span>&#8203;(long&nbsp;timeUs)</code></th>
<td class="colLast">
<div class="block">Discards samples from the write side of the queue.</div>
</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#discardUpstreamSamples(int)">discardUpstreamSamples</a></span>&#8203;(int&nbsp;discardFromIndex)</code></th>
<td class="colLast">
<div class="block">Discards samples from the write side of the queue.</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#format(com.google.android.exoplayer2.Format)">format</a></span>&#8203;(<a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;unadjustedUpstreamFormat)</code></th>
<td class="colLast">
<div class="block">Called when the <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> of the track has been extracted from the stream.</div>
</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>protected <a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)">getAdjustedUpstreamFormat</a></span>&#8203;(<a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format)</code></th>
<td class="colLast">
<div class="block">Adjusts the upstream <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> (i.e., the <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> that was most recently passed to
<a href="#format(com.google.android.exoplayer2.Format)"><code>format(Format)</code></a>).</div>
</td>
</tr>
<tr id="i10" class="altColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getFirstIndex()">getFirstIndex</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the current absolute start index.</div>
</td>
</tr>
<tr id="i11" class="rowColor">
<td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getFirstTimestampUs()">getFirstTimestampUs</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the timestamp of the first sample, or <a href="https://developer.android.com/reference/java/lang/Long.html#MIN_VALUE" title="class or interface in java.lang" class="externalLink" target="_top"><code>Long.MIN_VALUE</code></a> if the queue is empty.</div>
</td>
</tr>
<tr id="i12" class="altColor">
<td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getLargestQueuedTimestampUs()">getLargestQueuedTimestampUs</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the largest sample timestamp that has been queued since the last <a href="#reset()"><code>reset()</code></a>.</div>
</td>
</tr>
<tr id="i13" class="rowColor">
<td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getLargestReadTimestampUs()">getLargestReadTimestampUs</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the largest sample timestamp that has been read since the last <a href="#reset()"><code>reset()</code></a>.</div>
</td>
</tr>
<tr id="i14" class="altColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getReadIndex()">getReadIndex</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the current absolute read index.</div>
</td>
</tr>
<tr id="i15" class="rowColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getSkipCount(long,boolean)">getSkipCount</a></span>&#8203;(long&nbsp;timeUs,
boolean&nbsp;allowEndOfQueue)</code></th>
<td class="colLast">
<div class="block">Returns the number of samples that need to be <a href="#skip(int)"><code>skipped</code></a> to advance the read
position to the keyframe before or at the specified time.</div>
</td>
</tr>
<tr id="i16" class="altColor">
<td class="colFirst"><code><a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getUpstreamFormat()">getUpstreamFormat</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the upstream <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> in which samples are being queued.</div>
</td>
</tr>
<tr id="i17" class="rowColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getWriteIndex()">getWriteIndex</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the current absolute write index.</div>
</td>
</tr>
<tr id="i18" class="altColor">
<td class="colFirst"><code>protected void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#invalidateUpstreamFormatAdjustment()">invalidateUpstreamFormatAdjustment</a></span>()</code></th>
<td class="colLast">
<div class="block">Invalidates the last upstream format adjustment.</div>
</td>
</tr>
<tr id="i19" class="rowColor">
<td class="colFirst"><code>boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isLastSampleQueued()">isLastSampleQueued</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns whether the last sample of the stream has knowingly been queued.</div>
</td>
</tr>
<tr id="i20" class="altColor">
<td class="colFirst"><code>boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isReady(boolean)">isReady</a></span>&#8203;(boolean&nbsp;loadingFinished)</code></th>
<td class="colLast">
<div class="block">Returns whether there is data available for reading.</div>
</td>
</tr>
<tr id="i21" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#maybeThrowError()">maybeThrowError</a></span>()</code></th>
<td class="colLast">
<div class="block">Throws an error that's preventing data from being read.</div>
</td>
</tr>
<tr id="i22" class="altColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#peekSourceId()">peekSourceId</a></span>()</code></th>
<td class="colLast">
<div class="block">Peeks the source id of the next sample to be read, or the current upstream source id if the
queue is empty or if the read position is at the end of the queue.</div>
</td>
</tr>
<tr id="i23" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#preRelease()">preRelease</a></span>()</code></th>
<td class="colLast">
<div class="block">Calls <a href="#discardToEnd()"><code>discardToEnd()</code></a> and releases any resources owned by the queue.</div>
</td>
</tr>
<tr id="i24" class="altColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)">read</a></span>&#8203;(<a href="../FormatHolder.html" title="class in com.google.android.exoplayer2">FormatHolder</a>&nbsp;formatHolder,
<a href="../decoder/DecoderInputBuffer.html" title="class in com.google.android.exoplayer2.decoder">DecoderInputBuffer</a>&nbsp;buffer,
int&nbsp;readFlags,
boolean&nbsp;loadingFinished)</code></th>
<td class="colLast">
<div class="block">Attempts to read from the queue.</div>
</td>
</tr>
<tr id="i25" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#release()">release</a></span>()</code></th>
<td class="colLast">
<div class="block">Calls <a href="#reset(boolean)"><code>reset(true)</code></a> and releases any resources owned by the queue.</div>
</td>
</tr>
<tr id="i26" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#reset()">reset</a></span>()</code></th>
<td class="colLast">
<div class="block">Convenience method for <code>reset(false)</code>.</div>
</td>
</tr>
<tr id="i27" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#reset(boolean)">reset</a></span>&#8203;(boolean&nbsp;resetUpstreamFormat)</code></th>
<td class="colLast">
<div class="block">Clears all samples from the queue.</div>
</td>
</tr>
<tr id="i28" class="altColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)">sampleData</a></span>&#8203;(<a href="../upstream/DataReader.html" title="interface in com.google.android.exoplayer2.upstream">DataReader</a>&nbsp;input,
int&nbsp;length,
boolean&nbsp;allowEndOfInput,
int&nbsp;sampleDataPart)</code></th>
<td class="colLast">
<div class="block">Called to write sample data to the output.</div>
</td>
</tr>
<tr id="i29" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)">sampleData</a></span>&#8203;(<a href="../util/ParsableByteArray.html" title="class in com.google.android.exoplayer2.util">ParsableByteArray</a>&nbsp;buffer,
int&nbsp;length,
int&nbsp;sampleDataPart)</code></th>
<td class="colLast">
<div class="block">Called to write sample data to the output.</div>
</td>
</tr>
<tr id="i30" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)">sampleMetadata</a></span>&#8203;(long&nbsp;timeUs,
int&nbsp;flags,
int&nbsp;size,
int&nbsp;offset,
<a href="../extractor/TrackOutput.CryptoData.html" title="class in com.google.android.exoplayer2.extractor">TrackOutput.CryptoData</a>&nbsp;cryptoData)</code></th>
<td class="colLast">
<div class="block">Called when metadata associated with a sample has been extracted from the stream.</div>
</td>
</tr>
<tr id="i31" class="rowColor">
<td class="colFirst"><code>boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#seekTo(int)">seekTo</a></span>&#8203;(int&nbsp;sampleIndex)</code></th>
<td class="colLast">
<div class="block">Attempts to seek the read position to the specified sample index.</div>
</td>
</tr>
<tr id="i32" class="altColor">
<td class="colFirst"><code>boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#seekTo(long,boolean)">seekTo</a></span>&#8203;(long&nbsp;timeUs,
boolean&nbsp;allowTimeBeyondBuffer)</code></th>
<td class="colLast">
<div class="block">Attempts to seek the read position to the keyframe before or at the specified time.</div>
</td>
</tr>
<tr id="i33" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setSampleOffsetUs(long)">setSampleOffsetUs</a></span>&#8203;(long&nbsp;sampleOffsetUs)</code></th>
<td class="colLast">
<div class="block">Sets an offset that will be added to the timestamps (and sub-sample timestamps) of samples that
are subsequently queued.</div>
</td>
</tr>
<tr id="i34" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setStartTimeUs(long)">setStartTimeUs</a></span>&#8203;(long&nbsp;startTimeUs)</code></th>
<td class="colLast">
<div class="block">Sets the start time for the queue.</div>
</td>
</tr>
<tr id="i35" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setUpstreamFormatChangeListener(com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener)">setUpstreamFormatChangeListener</a></span>&#8203;(<a href="SampleQueue.UpstreamFormatChangedListener.html" title="interface in com.google.android.exoplayer2.source">SampleQueue.UpstreamFormatChangedListener</a>&nbsp;listener)</code></th>
<td class="colLast">
<div class="block">Sets a listener to be notified of changes to the upstream format.</div>
</td>
</tr>
<tr id="i36" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#skip(int)">skip</a></span>&#8203;(int&nbsp;count)</code></th>
<td class="colLast">
<div class="block">Advances the read position by the specified number of samples.</div>
</td>
</tr>
<tr id="i37" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#sourceId(int)">sourceId</a></span>&#8203;(int&nbsp;sourceId)</code></th>
<td class="colLast">
<div class="block">Sets a source identifier for subsequent samples.</div>
</td>
</tr>
<tr id="i38" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#splice()">splice</a></span>()</code></th>
<td class="colLast">
<div class="block">Indicates samples that are subsequently queued should be spliced into those already queued.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.<a href="https://developer.android.com/reference/java/lang/Object.html" title="class or interface in java.lang" class="externalLink" target="_top">Object</a></h3>
<code><a href="https://developer.android.com/reference/java/lang/Object.html#clone()" title="class or interface in java.lang" class="externalLink">clone</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang" class="externalLink">equals</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#finalize()" title="class or interface in java.lang" class="externalLink">finalize</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang" class="externalLink">getClass</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang" class="externalLink">hashCode</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang" class="externalLink">notify</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#notifyAll()" title="class or interface in java.lang" class="externalLink">notifyAll</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang" class="externalLink">toString</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#wait()" title="class or interface in java.lang" class="externalLink">wait</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#wait(long)" title="class or interface in java.lang" class="externalLink">wait</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#wait(long,int)" title="class or interface in java.lang" class="externalLink" target="_top">wait</a></code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.com.google.android.exoplayer2.extractor.TrackOutput">
<!-- -->
</a>
<h3>Methods inherited from interface&nbsp;com.google.android.exoplayer2.extractor.<a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></h3>
<code><a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)">sampleData</a>, <a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)">sampleData</a></code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>SampleQueue</h4>
<pre>protected&nbsp;SampleQueue&#8203;(<a href="../upstream/Allocator.html" title="interface in com.google.android.exoplayer2.upstream">Allocator</a>&nbsp;allocator,
@Nullable
<a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top">Looper</a>&nbsp;playbackLooper,
@Nullable
<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager,
@Nullable
<a href="../drm/DrmSessionEventListener.EventDispatcher.html" title="class in com.google.android.exoplayer2.drm">DrmSessionEventListener.EventDispatcher</a>&nbsp;drmEventDispatcher)</pre>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="createWithoutDrm(com.google.android.exoplayer2.upstream.Allocator)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>createWithoutDrm</h4>
<pre class="methodSignature">public static&nbsp;<a href="SampleQueue.html" title="class in com.google.android.exoplayer2.source">SampleQueue</a>&nbsp;createWithoutDrm&#8203;(<a href="../upstream/Allocator.html" title="interface in com.google.android.exoplayer2.upstream">Allocator</a>&nbsp;allocator)</pre>
<div class="block">Creates a sample queue without DRM resource management.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>allocator</code> - An <a href="../upstream/Allocator.html" title="interface in com.google.android.exoplayer2.upstream"><code>Allocator</code></a> from which allocations for sample data can be obtained.</dd>
</dl>
</li>
</ul>
<a id="createWithDrm(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>createWithDrm</h4>
<pre class="methodSignature">public static&nbsp;<a href="SampleQueue.html" title="class in com.google.android.exoplayer2.source">SampleQueue</a>&nbsp;createWithDrm&#8203;(<a href="../upstream/Allocator.html" title="interface in com.google.android.exoplayer2.upstream">Allocator</a>&nbsp;allocator,
<a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top">Looper</a>&nbsp;playbackLooper,
<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager,
<a href="../drm/DrmSessionEventListener.EventDispatcher.html" title="class in com.google.android.exoplayer2.drm">DrmSessionEventListener.EventDispatcher</a>&nbsp;drmEventDispatcher)</pre>
<div class="block">Creates a sample queue with DRM resource management.
<p>For each sample added to the queue, a <a href="../drm/DrmSession.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSession</code></a> will be attached containing the
keys needed to decrypt it.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>allocator</code> - An <a href="../upstream/Allocator.html" title="interface in com.google.android.exoplayer2.upstream"><code>Allocator</code></a> from which allocations for sample data can be obtained.</dd>
<dd><code>playbackLooper</code> - The looper associated with the media playback thread.</dd>
<dd><code>drmSessionManager</code> - The <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to obtain <a href="../drm/DrmSession.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessions</code></a>
from. The created instance does not take ownership of this <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a>.</dd>
<dd><code>drmEventDispatcher</code> - A <a href="../drm/DrmSessionEventListener.EventDispatcher.html" title="class in com.google.android.exoplayer2.drm"><code>DrmSessionEventListener.EventDispatcher</code></a> to notify of events
related to this SampleQueue.</dd>
</dl>
</li>
</ul>
<a id="release()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>release</h4>
<pre class="methodSignature">@CallSuper
public&nbsp;void&nbsp;release()</pre>
<div class="block">Calls <a href="#reset(boolean)"><code>reset(true)</code></a> and releases any resources owned by the queue.</div>
</li>
</ul>
<a id="reset()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>reset</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;reset()</pre>
<div class="block">Convenience method for <code>reset(false)</code>.</div>
</li>
</ul>
<a id="reset(boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>reset</h4>
<pre class="methodSignature">@CallSuper
public&nbsp;void&nbsp;reset&#8203;(boolean&nbsp;resetUpstreamFormat)</pre>
<div class="block">Clears all samples from the queue.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>resetUpstreamFormat</code> - Whether the upstream format should be cleared. If set to false,
samples queued after the reset (and before a subsequent call to <a href="#format(com.google.android.exoplayer2.Format)"><code>format(Format)</code></a>)
are assumed to have the current upstream format. If set to true, <a href="#format(com.google.android.exoplayer2.Format)"><code>format(Format)</code></a>
must be called after the reset before any more samples can be queued.</dd>
</dl>
</li>
</ul>
<a id="setStartTimeUs(long)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setStartTimeUs</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;setStartTimeUs&#8203;(long&nbsp;startTimeUs)</pre>
<div class="block">Sets the start time for the queue. Samples with earlier timestamps will be discarded or have
the <a href="../C.html#BUFFER_FLAG_DECODE_ONLY"><code>C.BUFFER_FLAG_DECODE_ONLY</code></a> flag set when read.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>startTimeUs</code> - The start time, in microseconds.</dd>
</dl>
</li>
</ul>
<a id="sourceId(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>sourceId</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;sourceId&#8203;(int&nbsp;sourceId)</pre>
<div class="block">Sets a source identifier for subsequent samples.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>sourceId</code> - The source identifier.</dd>
</dl>
</li>
</ul>
<a id="splice()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>splice</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;splice()</pre>
<div class="block">Indicates samples that are subsequently queued should be spliced into those already queued.</div>
</li>
</ul>
<a id="getWriteIndex()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getWriteIndex</h4>
<pre class="methodSignature">public final&nbsp;int&nbsp;getWriteIndex()</pre>
<div class="block">Returns the current absolute write index.</div>
</li>
</ul>
<a id="discardUpstreamSamples(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>discardUpstreamSamples</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;discardUpstreamSamples&#8203;(int&nbsp;discardFromIndex)</pre>
<div class="block">Discards samples from the write side of the queue.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>discardFromIndex</code> - The absolute index of the first sample to be discarded. Must be in the
range [<a href="#getReadIndex()"><code>getReadIndex()</code></a>, <a href="#getWriteIndex()"><code>getWriteIndex()</code></a>].</dd>
</dl>
</li>
</ul>
<a id="discardUpstreamFrom(long)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>discardUpstreamFrom</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;discardUpstreamFrom&#8203;(long&nbsp;timeUs)</pre>
<div class="block">Discards samples from the write side of the queue.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timeUs</code> - Samples will be discarded from the write end of the queue until a sample with a
timestamp smaller than timeUs is encountered (this sample is not discarded). Must be larger
than <a href="#getLargestReadTimestampUs()"><code>getLargestReadTimestampUs()</code></a>.</dd>
</dl>
</li>
</ul>
<a id="preRelease()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>preRelease</h4>
<pre class="methodSignature">@CallSuper
public&nbsp;void&nbsp;preRelease()</pre>
<div class="block">Calls <a href="#discardToEnd()"><code>discardToEnd()</code></a> and releases any resources owned by the queue.</div>
</li>
</ul>
<a id="maybeThrowError()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>maybeThrowError</h4>
<pre class="methodSignature">@CallSuper
public&nbsp;void&nbsp;maybeThrowError()
throws <a href="https://developer.android.com/reference/java/io/IOException.html" title="class or interface in java.io" class="externalLink" target="_top">IOException</a></pre>
<div class="block">Throws an error that's preventing data from being read. Does nothing if no such error exists.</div>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="https://developer.android.com/reference/java/io/IOException.html" title="class or interface in java.io" class="externalLink" target="_top">IOException</a></code> - The underlying error.</dd>
</dl>
</li>
</ul>
<a id="getFirstIndex()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getFirstIndex</h4>
<pre class="methodSignature">public final&nbsp;int&nbsp;getFirstIndex()</pre>
<div class="block">Returns the current absolute start index.</div>
</li>
</ul>
<a id="getReadIndex()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getReadIndex</h4>
<pre class="methodSignature">public final&nbsp;int&nbsp;getReadIndex()</pre>
<div class="block">Returns the current absolute read index.</div>
</li>
</ul>
<a id="peekSourceId()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>peekSourceId</h4>
<pre class="methodSignature">public final&nbsp;int&nbsp;peekSourceId()</pre>
<div class="block">Peeks the source id of the next sample to be read, or the current upstream source id if the
queue is empty or if the read position is at the end of the queue.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The source id.</dd>
</dl>
</li>
</ul>
<a id="getUpstreamFormat()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getUpstreamFormat</h4>
<pre class="methodSignature">@Nullable
public final&nbsp;<a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;getUpstreamFormat()</pre>
<div class="block">Returns the upstream <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> in which samples are being queued.</div>
</li>
</ul>
<a id="getLargestQueuedTimestampUs()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getLargestQueuedTimestampUs</h4>
<pre class="methodSignature">public final&nbsp;long&nbsp;getLargestQueuedTimestampUs()</pre>
<div class="block">Returns the largest sample timestamp that has been queued since the last <a href="#reset()"><code>reset()</code></a>.
<p>Samples that were discarded by calling <a href="#discardUpstreamSamples(int)"><code>discardUpstreamSamples(int)</code></a> are not
considered as having been queued. Samples that were dequeued from the front of the queue are
considered as having been queued.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The largest sample timestamp that has been queued, or <a href="https://developer.android.com/reference/java/lang/Long.html#MIN_VALUE" title="class or interface in java.lang" class="externalLink" target="_top"><code>Long.MIN_VALUE</code></a> if no
samples have been queued.</dd>
</dl>
</li>
</ul>
<a id="getLargestReadTimestampUs()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getLargestReadTimestampUs</h4>
<pre class="methodSignature">public final&nbsp;long&nbsp;getLargestReadTimestampUs()</pre>
<div class="block">Returns the largest sample timestamp that has been read since the last <a href="#reset()"><code>reset()</code></a>.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The largest sample timestamp that has been read, or <a href="https://developer.android.com/reference/java/lang/Long.html#MIN_VALUE" title="class or interface in java.lang" class="externalLink" target="_top"><code>Long.MIN_VALUE</code></a> if no
samples have been read.</dd>
</dl>
</li>
</ul>
<a id="isLastSampleQueued()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isLastSampleQueued</h4>
<pre class="methodSignature">public final&nbsp;boolean&nbsp;isLastSampleQueued()</pre>
<div class="block">Returns whether the last sample of the stream has knowingly been queued. A return value of
<code>false</code> means that the last sample had not been queued or that it's unknown whether the
last sample has been queued.
<p>Samples that were discarded by calling <a href="#discardUpstreamSamples(int)"><code>discardUpstreamSamples(int)</code></a> are not
considered as having been queued. Samples that were dequeued from the front of the queue are
considered as having been queued.</div>
</li>
</ul>
<a id="getFirstTimestampUs()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getFirstTimestampUs</h4>
<pre class="methodSignature">public final&nbsp;long&nbsp;getFirstTimestampUs()</pre>
<div class="block">Returns the timestamp of the first sample, or <a href="https://developer.android.com/reference/java/lang/Long.html#MIN_VALUE" title="class or interface in java.lang" class="externalLink" target="_top"><code>Long.MIN_VALUE</code></a> if the queue is empty.</div>
</li>
</ul>
<a id="isReady(boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isReady</h4>
<pre class="methodSignature">@CallSuper
public&nbsp;boolean&nbsp;isReady&#8203;(boolean&nbsp;loadingFinished)</pre>
<div class="block">Returns whether there is data available for reading.
<p>Note: If the stream has ended then a buffer with the end of stream flag can always be read
from <a href="#read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)"><code>read(com.google.android.exoplayer2.FormatHolder, com.google.android.exoplayer2.decoder.DecoderInputBuffer, int, boolean)</code></a>. Hence an ended stream is always ready.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>loadingFinished</code> - Whether no more samples will be written to the sample queue. When true,
this method returns true if the sample queue is empty, because an empty sample queue means
the end of stream has been reached. When false, this method returns false if the sample
queue is empty.</dd>
</dl>
</li>
</ul>
<a id="read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>read</h4>
<pre class="methodSignature">@CallSuper
public&nbsp;int&nbsp;read&#8203;(<a href="../FormatHolder.html" title="class in com.google.android.exoplayer2">FormatHolder</a>&nbsp;formatHolder,
<a href="../decoder/DecoderInputBuffer.html" title="class in com.google.android.exoplayer2.decoder">DecoderInputBuffer</a>&nbsp;buffer,
<a href="SampleStream.ReadFlags.html" title="annotation in com.google.android.exoplayer2.source">@ReadFlags</a>
int&nbsp;readFlags,
boolean&nbsp;loadingFinished)</pre>
<div class="block">Attempts to read from the queue.
<p><a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Formats</code></a> read from this method may be associated to a <a href="../drm/DrmSession.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSession</code></a>
through <a href="../FormatHolder.html#drmSession"><code>FormatHolder.drmSession</code></a>.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>formatHolder</code> - A <a href="../FormatHolder.html" title="class in com.google.android.exoplayer2"><code>FormatHolder</code></a> to populate in the case of reading a format.</dd>
<dd><code>buffer</code> - A <a href="../decoder/DecoderInputBuffer.html" title="class in com.google.android.exoplayer2.decoder"><code>DecoderInputBuffer</code></a> to populate in the case of reading a sample or the
end of the stream. If the end of the stream has been reached, the <a href="../C.html#BUFFER_FLAG_END_OF_STREAM"><code>C.BUFFER_FLAG_END_OF_STREAM</code></a> flag will be set on the buffer.</dd>
<dd><code>readFlags</code> - Flags controlling the behavior of this read operation.</dd>
<dd><code>loadingFinished</code> - True if an empty queue should be considered the end of the stream.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The result, which can be <a href="../C.html#RESULT_NOTHING_READ"><code>C.RESULT_NOTHING_READ</code></a>, <a href="../C.html#RESULT_FORMAT_READ"><code>C.RESULT_FORMAT_READ</code></a> or
<a href="../C.html#RESULT_BUFFER_READ"><code>C.RESULT_BUFFER_READ</code></a>.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../decoder/DecoderInputBuffer.InsufficientCapacityException.html" title="class in com.google.android.exoplayer2.decoder">DecoderInputBuffer.InsufficientCapacityException</a></code> - If the <code>buffer</code> has insufficient capacity to hold
the data of a sample being read. The buffer <a href="../decoder/DecoderInputBuffer.html#timeUs"><code>timestamp</code></a> and
flags are populated if this exception is thrown, but the read position is not advanced.</dd>
</dl>
</li>
</ul>
<a id="seekTo(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>seekTo</h4>
<pre class="methodSignature">public final&nbsp;boolean&nbsp;seekTo&#8203;(int&nbsp;sampleIndex)</pre>
<div class="block">Attempts to seek the read position to the specified sample index.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>sampleIndex</code> - The sample index.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>Whether the seek was successful.</dd>
</dl>
</li>
</ul>
<a id="seekTo(long,boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>seekTo</h4>
<pre class="methodSignature">public final&nbsp;boolean&nbsp;seekTo&#8203;(long&nbsp;timeUs,
boolean&nbsp;allowTimeBeyondBuffer)</pre>
<div class="block">Attempts to seek the read position to the keyframe before or at the specified time.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timeUs</code> - The time to seek to.</dd>
<dd><code>allowTimeBeyondBuffer</code> - Whether the operation can succeed if <code>timeUs</code> is beyond the
end of the queue, by seeking to the last sample (or keyframe).</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>Whether the seek was successful.</dd>
</dl>
</li>
</ul>
<a id="getSkipCount(long,boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getSkipCount</h4>
<pre class="methodSignature">public final&nbsp;int&nbsp;getSkipCount&#8203;(long&nbsp;timeUs,
boolean&nbsp;allowEndOfQueue)</pre>
<div class="block">Returns the number of samples that need to be <a href="#skip(int)"><code>skipped</code></a> to advance the read
position to the keyframe before or at the specified time.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timeUs</code> - The time to advance to.</dd>
<dd><code>allowEndOfQueue</code> - Whether the end of the queue is considered a keyframe when <code>
timeUs</code> is larger than the largest queued timestamp.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The number of samples that need to be skipped, which may be equal to 0.</dd>
</dl>
</li>
</ul>
<a id="skip(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>skip</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;skip&#8203;(int&nbsp;count)</pre>
<div class="block">Advances the read position by the specified number of samples.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>count</code> - The number of samples to advance the read position by. Must be at least 0 and at
most <a href="#getWriteIndex()"><code>getWriteIndex()</code></a> - <a href="#getReadIndex()"><code>getReadIndex()</code></a>.</dd>
</dl>
</li>
</ul>
<a id="discardTo(long,boolean,boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>discardTo</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;discardTo&#8203;(long&nbsp;timeUs,
boolean&nbsp;toKeyframe,
boolean&nbsp;stopAtReadPosition)</pre>
<div class="block">Discards up to but not including the sample immediately before or at the specified time.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timeUs</code> - The time to discard up to.</dd>
<dd><code>toKeyframe</code> - If true then discards samples up to the keyframe before or at the specified
time, rather than any sample before or at that time.</dd>
<dd><code>stopAtReadPosition</code> - If true then samples are only discarded if they're before the read
position. If false then samples at and beyond the read position may be discarded, in which
case the read position is advanced to the first remaining sample.</dd>
</dl>
</li>
</ul>
<a id="discardToRead()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>discardToRead</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;discardToRead()</pre>
<div class="block">Discards up to but not including the read position.</div>
</li>
</ul>
<a id="discardToEnd()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>discardToEnd</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;discardToEnd()</pre>
<div class="block">Discards all samples in the queue and advances the read position.</div>
</li>
</ul>
<a id="setSampleOffsetUs(long)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setSampleOffsetUs</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;setSampleOffsetUs&#8203;(long&nbsp;sampleOffsetUs)</pre>
<div class="block">Sets an offset that will be added to the timestamps (and sub-sample timestamps) of samples that
are subsequently queued.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>sampleOffsetUs</code> - The timestamp offset in microseconds.</dd>
</dl>
</li>
</ul>
<a id="setUpstreamFormatChangeListener(com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setUpstreamFormatChangeListener</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;setUpstreamFormatChangeListener&#8203;(@Nullable
<a href="SampleQueue.UpstreamFormatChangedListener.html" title="interface in com.google.android.exoplayer2.source">SampleQueue.UpstreamFormatChangedListener</a>&nbsp;listener)</pre>
<div class="block">Sets a listener to be notified of changes to the upstream format.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>listener</code> - The listener.</dd>
</dl>
</li>
</ul>
<a id="format(com.google.android.exoplayer2.Format)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>format</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;format&#8203;(<a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;unadjustedUpstreamFormat)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../extractor/TrackOutput.html#format(com.google.android.exoplayer2.Format)">TrackOutput</a></code></span></div>
<div class="block">Called when the <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> of the track has been extracted from the stream.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../extractor/TrackOutput.html#format(com.google.android.exoplayer2.Format)">format</a></code>&nbsp;in interface&nbsp;<code><a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>unadjustedUpstreamFormat</code> - The extracted <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a>.</dd>
</dl>
</li>
</ul>
<a id="sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>sampleData</h4>
<pre class="methodSignature">public final&nbsp;int&nbsp;sampleData&#8203;(<a href="../upstream/DataReader.html" title="interface in com.google.android.exoplayer2.upstream">DataReader</a>&nbsp;input,
int&nbsp;length,
boolean&nbsp;allowEndOfInput,
<a href="../extractor/TrackOutput.SampleDataPart.html" title="annotation in com.google.android.exoplayer2.extractor">@SampleDataPart</a>
int&nbsp;sampleDataPart)
throws <a href="https://developer.android.com/reference/java/io/IOException.html" title="class or interface in java.io" class="externalLink" target="_top">IOException</a></pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)">TrackOutput</a></code></span></div>
<div class="block">Called to write sample data to the output.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)">sampleData</a></code>&nbsp;in interface&nbsp;<code><a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>input</code> - A <a href="../upstream/DataReader.html" title="interface in com.google.android.exoplayer2.upstream"><code>DataReader</code></a> from which to read the sample data.</dd>
<dd><code>length</code> - The maximum length to read from the input.</dd>
<dd><code>allowEndOfInput</code> - True if encountering the end of the input having read no data is
allowed, and should result in <a href="../C.html#RESULT_END_OF_INPUT"><code>C.RESULT_END_OF_INPUT</code></a> being returned. False if it
should be considered an error, causing an <a href="https://developer.android.com/reference/java/io/EOFException.html" title="class or interface in java.io" class="externalLink" target="_top"><code>EOFException</code></a> to be thrown.</dd>
<dd><code>sampleDataPart</code> - The part of the sample data to which this call corresponds.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The number of bytes appended.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="https://developer.android.com/reference/java/io/IOException.html" title="class or interface in java.io" class="externalLink" target="_top">IOException</a></code> - If an error occurred reading from the input.</dd>
</dl>
</li>
</ul>
<a id="sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>sampleData</h4>
<pre class="methodSignature">public final&nbsp;void&nbsp;sampleData&#8203;(<a href="../util/ParsableByteArray.html" title="class in com.google.android.exoplayer2.util">ParsableByteArray</a>&nbsp;buffer,
int&nbsp;length,
<a href="../extractor/TrackOutput.SampleDataPart.html" title="annotation in com.google.android.exoplayer2.extractor">@SampleDataPart</a>
int&nbsp;sampleDataPart)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)">TrackOutput</a></code></span></div>
<div class="block">Called to write sample data to the output.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)">sampleData</a></code>&nbsp;in interface&nbsp;<code><a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>buffer</code> - A <a href="../util/ParsableByteArray.html" title="class in com.google.android.exoplayer2.util"><code>ParsableByteArray</code></a> from which to read the sample data.</dd>
<dd><code>length</code> - The number of bytes to read, starting from <code>data.getPosition()</code>.</dd>
<dd><code>sampleDataPart</code> - The part of the sample data to which this call corresponds.</dd>
</dl>
</li>
</ul>
<a id="sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>sampleMetadata</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;sampleMetadata&#8203;(long&nbsp;timeUs,
<a href="../C.BufferFlags.html" title="annotation in com.google.android.exoplayer2">@BufferFlags</a>
int&nbsp;flags,
int&nbsp;size,
int&nbsp;offset,
@Nullable
<a href="../extractor/TrackOutput.CryptoData.html" title="class in com.google.android.exoplayer2.extractor">TrackOutput.CryptoData</a>&nbsp;cryptoData)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../extractor/TrackOutput.html#sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)">TrackOutput</a></code></span></div>
<div class="block">Called when metadata associated with a sample has been extracted from the stream.
<p>The corresponding sample data will have already been passed to the output via calls to
<a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)"><code>TrackOutput.sampleData(DataReader, int, boolean)</code></a> or <a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)"><code>TrackOutput.sampleData(ParsableByteArray, int)</code></a>.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../extractor/TrackOutput.html#sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)">sampleMetadata</a></code>&nbsp;in interface&nbsp;<code><a href="../extractor/TrackOutput.html" title="interface in com.google.android.exoplayer2.extractor">TrackOutput</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timeUs</code> - The media timestamp associated with the sample, in microseconds.</dd>
<dd><code>flags</code> - Flags associated with the sample. See <code>C.BUFFER_FLAG_*</code>.</dd>
<dd><code>size</code> - The size of the sample data, in bytes.</dd>
<dd><code>offset</code> - The number of bytes that have been passed to <a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)"><code>TrackOutput.sampleData(DataReader, int,
boolean)</code></a> or <a href="../extractor/TrackOutput.html#sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)"><code>TrackOutput.sampleData(ParsableByteArray, int)</code></a> since the last byte belonging to
the sample whose metadata is being passed.</dd>
<dd><code>cryptoData</code> - The encryption data required to decrypt the sample. May be null.</dd>
</dl>
</li>
</ul>
<a id="invalidateUpstreamFormatAdjustment()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>invalidateUpstreamFormatAdjustment</h4>
<pre class="methodSignature">protected final&nbsp;void&nbsp;invalidateUpstreamFormatAdjustment()</pre>
<div class="block">Invalidates the last upstream format adjustment. <a href="#getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)"><code>getAdjustedUpstreamFormat(Format)</code></a>
will be called to adjust the upstream <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> again before the next sample is queued.</div>
</li>
</ul>
<a id="getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getAdjustedUpstreamFormat</h4>
<pre class="methodSignature">@CallSuper
protected&nbsp;<a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;getAdjustedUpstreamFormat&#8203;(<a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format)</pre>
<div class="block">Adjusts the upstream <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> (i.e., the <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> that was most recently passed to
<a href="#format(com.google.android.exoplayer2.Format)"><code>format(Format)</code></a>).
<p>The default implementation incorporates the sample offset passed to <a href="#setSampleOffsetUs(long)"><code>setSampleOffsetUs(long)</code></a> into <a href="../Format.html#subsampleOffsetUs"><code>Format.subsampleOffsetUs</code></a>.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>format</code> - The <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> to adjust.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The adjusted <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a>.</dd>
</dl>
</li>
</ul>
<a id="discardSampleMetadataToRead()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>discardSampleMetadataToRead</h4>
<pre class="methodSignature">public&nbsp;long&nbsp;discardSampleMetadataToRead()</pre>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
</footer>
</body>
</html>