📄 jmfapp-demux.html
字号:
</code><a name="90305"> </a><code> }
</code><a name="90306"> </a><code>
</code><a name="90307"> </a><code>
</code><a name="90308"> </a><code> public Time getStartTime() {
</code><a name="90309"> </a><code> return startTime;
</code><a name="90310"> </a><code> }
</code><a name="90311"> </a><code>
</code><a name="90312"> </a><code>
</code><a name="90313"> </a><code> public int getNumberOfBuffers() {
</code><a name="90314"> </a><code> return numBuffers;
</code><a name="90315"> </a><code> }
</code><a name="90316"> </a><code>
</code><a name="90317"> </a><code>
</code><a name="90318"> </a><code> public void setTrackListener(TrackListener l) {
</code><a name="90319"> </a><code> listener = l;
</code><a name="90320"> </a><code> }
</code><a name="90321"> </a><code>
</code><a name="90322"> </a><code> public synchronized void setSeekLocation(long location) {
</code><a name="90323"> </a><code> seekLocation = location;
</code><a name="90324"> </a><code> }
</code><a name="90330"> </a><code> public synchronized long getSeekLocation() {
</code><a name="90331"> </a><code> return seekLocation;
</code><a name="90332"> </a><code> }
</code><a name="90333"> </a><code>
</code><a name="90334"> </a><code> public void readFrame(Buffer buffer) {
</code><a name="90335"> </a><code> if (buffer == null)
</code><a name="90336"> </a><code> return;</code>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90344"> </a><code> if (!enabled) {
</code><a name="90345"> </a><code> buffer.setDiscard(true);
</code><a name="90346"> </a><code> return;
</code><a name="90347"> </a><code> }
</code><a name="90348"> </a><code>
</code><a name="90349"> </a><code> buffer.setFormat(format);
</code><a name="90350"> </a><code> Object obj = buffer.getData();
</code><a name="90351"> </a><code> byte[] data;
</code><a name="90352"> </a><code> long location;
</code><a name="90353"> </a><code> boolean needToSeek;
</code><a name="90354"> </a><code>
</code><a name="90355"> </a><code> synchronized(this) {
</code><a name="90356"> </a><code> if (seekLocation != -1) {
</code><a name="90357"> </a><code> location = seekLocation;
</code><a name="90358"> </a><code> seekLocation = -1;
</code><a name="90359"> </a><code> needToSeek = true;
</code><a name="90360"> </a><code> } else {
</code><a name="90361"> </a><code> location = parser.getLocation(stream);
</code><a name="90362"> </a><code> needToSeek = false;
</code><a name="90363"> </a><code> }
</code><a name="90364"> </a><code> }
</code><a name="90365"> </a><code>
</code><a name="90366"> </a><code> int needDataSize;
</code><a name="90367"> </a><code>
</code><a name="90368"> </a><code> if (location < minLocation) {
</code><a name="90369"> </a><code> buffer.setDiscard(true);
</code><a name="90370"> </a><code> return;
</code><a name="90371"> </a><code> } else if (location >= maxLocation) {
</code><a name="90372"> </a><code> buffer.setLength(0);
</code><a name="90373"> </a><code> buffer.setEOM(true);
</code><a name="90374"> </a><code> return;
</code><a name="90375"> </a><code> } else if (location > maxStartLocation) {
</code><a name="90376"> </a><code> needDataSize = dataSize - (int) (location -
maxStartLocation);
</code><a name="90377"> </a><code> } else {
</code><a name="90378"> </a><code> needDataSize = dataSize;
</code><a name="90379"> </a><code> }
</code><a name="90380"> </a><code>
</code><a name="90381"> </a><code> if ( (obj == null) ||
</code><a name="90382"> </a><code> (! (obj instanceof byte[]) ) ||
</code><a name="90383"> </a><code> ( ((byte[])obj).length < needDataSize) ) {
</code><a name="90384"> </a><code> data = new byte[needDataSize];
</code><a name="90390"> </a><code> buffer.setData(data);
</code><a name="90391"> </a><code> } else {
</code><a name="90392"> </a><code> data = (byte[]) obj;
</code><a name="90393"> </a><code> }
</code><a name="90394"> </a><code> try {
</code><a name="90395"> </a><code> if (needToSeek) {
</code><a name="90396"> </a><code> long pos =
((javax.media.protocol.Seekable)stream).seek(location);</code>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90406"> </a><code> if ( pos ==
com.sun.media.protocol.BasicSourceStream.LENGTH_DISCARD) {
</code><a name="90407"> </a><code> buffer.setDiscard(true);
</code><a name="90408"> </a><code> return;
</code><a name="90409"> </a><code> }
</code><a name="90410"> </a><code> }
</code><a name="90411"> </a><code> int actualBytesRead = parser.readBytes(stream,
data, needDataSize);
</code><a name="90412"> </a><code> buffer.setOffset(0);
</code><a name="90413"> </a><code> buffer.setLength(actualBytesRead);
</code><a name="90414"> </a><code> buffer.setSequenceNumber(++sequenceNumber);
</code><a name="90415"> </a><code> buffer.setTimeStamp(parser.getMediaTime().getNanoseconds());
</code><a name="90416"> </a><code> } catch (IOException e) {
</code><a name="90417"> </a><code> if (maxLocation != Long.MAX_VALUE) {
</code><a name="90418"> </a><code> // Known maxLocation. So, this is a case of
</code><a name="90419"> </a><code> // deliberately reading past EOM
</code><a name="90420"> </a><code> System.err.println("readFrame: EOM " + e);
</code><a name="90421"> </a><code> buffer.setLength(0); // Need this??
</code><a name="90422"> </a><code> buffer.setEOM(true);
</code><a name="90423"> </a><code> } else {
</code><a name="90424"> </a><code> // Unknown maxLocation, due to unknown content length
</code><a name="90425"> </a><code> // EOM reached before the required bytes could be read.
</code><a name="90426"> </a><code> long length = parser.streams[0].getContentLength();
</code><a name="90427"> </a><code> if ( length != SourceStream.LENGTH_UNKNOWN ) {
</code><a name="90428"> </a><code> // If content-length is known, discard this buffer,
</code><a name="90429"> </a><code> // updatemaxLocation, maxStartLocation and
</code><a name="90430"> </a><code> // mediaSizeAtEOM. The next readFrame will read
// the remaining data till EOM.
</code><a name="90431"> </a><code> maxLocation = length;
</code><a name="90432"> </a><code> maxStartLocation = maxLocation - dataSize;
</code><a name="90433"> </a><code> mediaSizeAtEOM = maxLocation - minLocation;
</code><a name="90434"> </a><code> buffer.setLength(0); // Need this??
</code><a name="90435"> </a><code> buffer.setDiscard(true);
</code><a name="90436"> </a><code> } else {
</code><a name="90437"> </a><code> // Content Length is still unknown after an
// IOException.
</code><a name="90438"> </a><code> // We can still discard this buffer and keep discarding
</code><a name="90439"> </a><code> // until content length is known. But this may go into
</code><a name="90440"> </a><code> // into an infinite loop, if there are real IO errors
</code><a name="90441"> </a><code> // So, return EOM
</code><a name="90442"> </a><code> maxLocation = parser.getLocation(stream);
</code><a name="90443"> </a><code> maxStartLocation = maxLocation - dataSize;
</code><a name="90444"> </a><code> mediaSizeAtEOM = maxLocation - minLocation;
</code><a name="90445"> </a><code> buffer.setLength(0); // Need this??
</code><a name="90446"> </a><code> buffer.setEOM(true);
</code><a name="90447"> </a><code> }
</code><a name="90448"> </a><code> }
</code><a name="90449"> </a><code> }
</code><a name="90450"> </a><code> }
</code><a name="90456"> </a><code>
</code><a name="90457"> </a><code> public void readKeyFrame(Buffer buffer) {
</code><a name="90458"> </a><code> readFrame(buffer);
</code><a name="90459"> </a><code> }</code>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90473"> </a><code> public boolean willReadFrameBlock() {
</code><a name="90474"> </a><code> return false;
</code><a name="90475"> </a><code> }
</code><a name="90476"> </a><code>
</code><a name="90477"> </a><code>
</code><a name="90478"> </a><code> public long getMediaSizeAtEOM() {
</code><a name="90479"> </a><code> return mediaSizeAtEOM; // updated when EOM implied by
// IOException occurs
</code><a name="90480"> </a><code> }
</code><a name="90481"> </a><code> }
</code><a name="90482"> </a><code>
</code><a name="90483"> </a><code> private class GsmTrack extends BasicTrack {
</code><a name="90484"> </a><code> private double sampleRate;
</code><a name="90485"> </a><code> private float timePerFrame = 0.020F; // 20 milliseconds
</code><a name="90486"> </a><code>
</code><a name="90487"> </a><code> GsmTrack(AudioFormat format, boolean enabled, Time startTime,
</code><a name="90488"> </a><code> int numBuffers, int bufferSize,
</code><a name="90489"> </a><code> long minLocation, long maxLocation) {
</code><a name="90490"> </a><code> super(SampleDeMux.this,
</code><a name="90491"> </a><code> format, enabled, SampleDeMux.this.duration,
</code><a name="90492"> </a><code> startTime, numBuffers, bufferSize,
</code><a name="90493"> </a><code> SampleDeMux.this.stream, minLocation, maxLocation);
</code><a name="90494"> </a><code>
</code><a name="90495"> </a><code> double sampleRate = format.getSampleRate();
</code><a name="90496"> </a><code> int channels = format.getChannels();
</code><a name="90497"> </a><code> int sampleSizeInBits = format.getSampleSizeInBits();
</code><a name="90498"> </a><code>
</code><a name="90499"> </a><code> float bytesPerSecond;
</code><a name="90500"> </a><code> float bytesPerFrame;
</code><a name="90501"> </a><code> float samplesPerFrame;
</code><a name="90502"> </a><code>
</code><a name="90503"> </a><code> long durationNano = this.duration.getNanoseconds();
</code><a name="90504"> </a><code> if (!( (durationNano ==
Duration.DURATION_UNKNOWN.getNanoseconds()) ||
</code><a name="90505"> </a><code> (durationNano ==
Duration.DURATION_UNBOUNDED.getNanoseconds()) )) {
</code><a name="90506"> </a><code> maxFrame = mapTimeToFrame(this.duration.getSeconds());
</code><a name="90507"> </a><code> }
</code><a name="90508"> </a><code> }
</code><a name="90509"> </a><code>
</code><a name="90510"> </a><code> GsmTrack(AudioFormat format, boolean enabled, Time startTime,
</code><a name="90511"> </a><code> int numBuffers, int bufferSize) {
</code><a name="90512"> </a><code> this(format, enabled,
</code><a name="90513"> </a><code> startTime, numBuffers, bufferSize,
</code><a name="90514"> </a><code> 0L, Long.MAX_VALUE);
</code><a name="90515"> </a><code>
</code><a name="90516"> </a><code> }
</code><a name="90522"> </a><code>
</code><a name="90523"> </a><code> // Frame numbers start from 0
</code><a name="90524"> </a><code> private int mapTimeToFrame(double time) {
</code><a name="90525"> </a><code> double frameNumber = time / timePerFrame;
</code><a name="90526"> </a><code> return (int) frameNumber;
</code><a name="90527"> </a><code> }</code>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90536"> </a><code> // Frame numbers start from 0
</code><a name="90537"> </a><code> // 0-1 ==> 0, 1-2 ==> 1
</code><a name="90538"> </a><code> public int mapTimeToFrame(Time t) {
</code><a name="90539"> </a><code> double time = t.getSeconds();
</code><a name="90540"> </a><code> int frameNumber = mapTimeToFrame(time);
</code><a name="90541"> </a><code>
</code><a name="90542"> </a><code> if ( frameNumber > maxFrame)
</code><a name="90543"> </a><code> frameNumber = maxFrame; // Do we clamp it or return error
</code><a name="90544"> </a><code> System.out.println("mapTimeToFrame: " + (int) time + " ==> " +
</code><a name="90545"> </a><code> frameNumber + " ( " + frameNumber + " )");
</code><a name="90546"> </a><code> return frameNumber;
</code><a name="90547"> </a><code> }
</code><a name="90548"> </a><code> public Time mapFrameToTime(int frameNumber) {
</code><a name="90549"> </a><code> if (frameNumber > maxFrame)
</code><a name="90550"> </a><code> frameNumber = maxFrame; // Do we clamp it or return error
</code><a name="90551"> </a><code> double time = timePerFrame * frameNumber;
</code><a name="90552"> </a><code> System.out.println("mapFrameToTime: " + frameNumber + " ==> " +
</code><a name="90553"> </a><code> time);
</code><a name="90554"> </a><code> return new Time(time);
</code><a name="90555"> </a><code> }
</code><a name="90556"> </a><code> }
</code><a name="90557"> </a><code>}</code>
</pre>
</font></td>
</tr>
</table>
<code></code><br></font>
<p>
<a name="86639"> </a><font face="Palatino, Times New Roman, Times, serif"><code></code></font>
</p>
</blockquote>
<br clear="all">
<hr>
<a href="JMFTOC.html">CONTENTS</a> |
<a href="JMFApp-StateHelper.html">PREV </a> |
<a href="JMFApp-DataSource.html">NEXT</a> |
<a href="JMFIX.html">INDEX</a></td>
<br>
<hr>
<em>
<a href="copyright.html">Copyright</a> ©
1998-1999 Sun Microsystems, Inc. All Rights Reserved.
</em>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -