📄 jmfapp-demux.html
字号:
</code><a name="89699"> </a>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90004"> </a><code> duration = new Time(durationSeconds);
</code><a name="90005"> </a><code> maxLocation = contentLength;
</code><a name="90006"> </a>
<a name="90012"> </a><code> } else {
</code><a name="90013"> </a><code> maxLocation = Long.MAX_VALUE;
</code><a name="90014"> </a><code> }
</code><a name="90015"> </a><code>
</code><a name="90016"> </a><code> boolean signed = true;
</code><a name="90017"> </a><code> boolean bigEndian = false;
</code><a name="90018"> </a><code> format = new AudioFormat(AudioFormat.GSM,
</code><a name="90019"> </a><code> 8000, // sampleRate,
</code><a name="90020"> </a><code> 16, // sampleSizeInBits,
</code><a name="90021"> </a><code> 1, // channels,
</code><a name="90022"> </a><code> bigEndian ? AudioFormat.BIG_ENDIAN :
AudioFormat.LITTLE_ENDIAN,
</code><a name="90023"> </a><code> signed ? AudioFormat.SIGNED :
AudioFormat.UNSIGNED,
</code><a name="90024"> </a><code> (blockSize * 8), // frameSizeInBits
</code><a name="90025"> </a><code> Format.NOT_SPECIFIED,
</code><a name="90026"> </a><code> Format.byteArray);
</code><a name="90027"> </a><code> }
</code><a name="90028"> </a><code>
</code><a name="90029"> </a><code> // Contains 1 audio track
</code><a name="90030"> </a><code> public String getTrackLayout() {
</code><a name="90031"> </a><code> return "A";
</code><a name="90032"> </a><code> }
</code><a name="90033"> </a><code>
</code><a name="90034"> </a><code> public Time setPosition(Time where, int rounding) {
</code><a name="90035"> </a><code> if (! seekable ) {
</code><a name="90036"> </a><code> return getMediaTime();
</code><a name="90037"> </a><code> }
</code><a name="90038"> </a><code>
</code><a name="90039"> </a><code> long time = where.getNanoseconds();
</code><a name="90040"> </a><code> long newPos;
</code><a name="90041"> </a><code>
</code><a name="90042"> </a><code> if (time < 0)
</code><a name="90043"> </a><code> time = 0;
</code><a name="90044"> </a><code>
</code><a name="90045"> </a><code> double newPosd = time * bytesPerSecond / 1000000000.0;
</code><a name="90046"> </a><code> double remainder = (newPosd % blockSize);
</code><a name="90047"> </a><code>
</code><a name="90048"> </a><code> newPos = (long) (newPosd - remainder);
</code><a name="90049"> </a><code>
</code><a name="90050"> </a><code> if (remainder > 0) {
</code><a name="90051"> </a><code> switch (rounding) {
</code><a name="90052"> </a><code> case Positionable.RoundUp:
</code><a name="90053"> </a><code> newPos += blockSize;
</code><a name="90059"> </a><code> break;
</code><a name="90060"> </a><code> case Positionable.RoundNearest:
</code><a name="90061"> </a><code> if (remainder > (blockSize / 2.0))
</code><a name="90062"> </a><code> newPos += blockSize;</code>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90076"> </a><code> break;
</code><a name="90077"> </a><code> }
</code><a name="90078"> </a><code> }
</code><a name="90079"> </a><code>
</code><a name="90080"> </a><code> if ( newPos > maxLocation )
</code><a name="90081"> </a><code> newPos = maxLocation;
</code><a name="90082"> </a><code>
</code><a name="90083"> </a><code> newPos += minLocation;
</code><a name="90084"> </a><code> ((BasicTrack) tracks[0]).setSeekLocation(newPos);
</code><a name="90085"> </a><code> return where;
</code><a name="90086"> </a><code> }
</code><a name="90087"> </a><code>
</code><a name="90088"> </a><code> public Time getMediaTime() {
</code><a name="90089"> </a><code> long location;
</code><a name="90090"> </a><code> long seekLocation = ((BasicTrack) tracks[0]).getSeekLocation();
</code><a name="90091"> </a><code> if (seekLocation != -1)
</code><a name="90092"> </a><code> location = seekLocation - minLocation;
</code><a name="90093"> </a><code> else
</code><a name="90094"> </a><code> location = getLocation(stream) - minLocation;
</code><a name="90095"> </a><code>
</code><a name="90096"> </a><code> return new Time( location / (double) bytesPerSecond );
</code><a name="90097"> </a><code> }
</code><a name="90098"> </a><code>
</code><a name="90099"> </a><code> public Time getDuration() {
</code><a name="90100"> </a><code> if ( duration.equals(Duration.DURATION_UNKNOWN) &&
</code><a name="90101"> </a><code> ( tracks[0] != null ) ) {
</code><a name="90102"> </a><code> long mediaSizeAtEOM = ((BasicTrack)
tracks[0]).getMediaSizeAtEOM();
</code><a name="90103"> </a><code> if (mediaSizeAtEOM > 0) {
</code><a name="90104"> </a><code> double durationSeconds = mediaSizeAtEOM / bytesPerSecond;
</code><a name="90105"> </a><code> duration = new Time(durationSeconds);
</code><a name="90106"> </a><code> }
</code><a name="90107"> </a><code> }
</code><a name="90108"> </a><code> return duration;
</code><a name="90109"> </a><code> }
</code><a name="90110"> </a><code>
</code><a name="90111"> </a><code> /**
</code><a name="90112"> </a><code> * Returns a descriptive name for the plug-in.
</code><a name="90113"> </a><code> * This is a user readable string.
</code><a name="90114"> </a><code> */
</code><a name="90115"> </a><code> public String getName() {
</code><a name="90116"> </a><code> return "Parser for raw GSM";
</code><a name="90122"> </a><code> }
</code><a name="90123"> </a><code>
</code><a name="90124"> </a><code> /**
</code><a name="90125"> </a><code> * Read numBytes from offset 0
</code><a name="90126"> </a><code> */
</code><a name="90127"> </a><code> public int readBytes(PullSourceStream pss, byte[] array,
</code><a name="90128"> </a><code> int numBytes) throws IOException {
</code><a name="90129"> </a><code>
</code><a name="90130"> </a><code> return readBytes(pss, array, 0, numBytes);
</code><a name="90131"> </a><code> }</code>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90139"> </a><code> public int readBytes(PullSourceStream pss, byte[] array,
</code><a name="90140"> </a><code> int offset,
</code><a name="90141"> </a><code> int numBytes) throws IOException {
</code><a name="90142"> </a><code> if (array == null) {
</code><a name="90143"> </a><code> throw new NullPointerException();
</code><a name="90144"> </a><code> } else if ((offset < 0) || (offset > array.length) ||
(numBytes < 0) ||
</code><a name="90145"> </a><code> ((offset + numBytes) > array.length) ||
((offset + numBytes) < 0)) {
</code><a name="90146"> </a><code> throw new IndexOutOfBoundsException();
</code><a name="90147"> </a><code> } else if (numBytes == 0) {
</code><a name="90148"> </a><code> return 0;
</code><a name="90149"> </a><code> }
</code><a name="90150"> </a><code>
</code><a name="90151"> </a><code> int remainingLength = numBytes;
</code><a name="90152"> </a><code> int actualRead = 0;
</code><a name="90153"> </a><code>
</code><a name="90154"> </a><code> remainingLength = numBytes;
</code><a name="90155"> </a><code> while (remainingLength > 0) {
</code><a name="90156"> </a><code>
</code><a name="90157"> </a><code> actualRead = pss.read(array, offset, remainingLength);
</code><a name="90158"> </a><code> if (actualRead == -1) {// End of stream
</code><a name="90159"> </a><code> if (offset == 0) {
</code><a name="90160"> </a><code> throw new IOException("SampleDeMux: readBytes():
Reached end of stream while trying to read " +
numBytes + " bytes");
</code><a name="90161"> </a><code> } else {
</code><a name="90162"> </a><code> return offset;
</code><a name="90163"> </a><code> }
</code><a name="90164"> </a><code> } else if (actualRead ==
com.sun.media.protocol.BasicSourceStream.LENGTH_DISCARD) {
</code><a name="90165"> </a><code> return
com.sun.media.protocol.BasicSourceStream.LENGTH_DISCARD;
</code><a name="90166"> </a><code> } else if (actualRead < 0) {
</code><a name="90167"> </a><code> throw new IOException("SampleDeMux: readBytes()
read returned " + actualRead);
</code><a name="90168"> </a><code> }
</code><a name="90169"> </a><code> remainingLength -= actualRead;
</code><a name="90170"> </a><code> offset += actualRead;
</code><a name="90171"> </a><code> synchronized(sync) {
</code><a name="90172"> </a><code> currentLocation += actualRead;
</code><a name="90173"> </a><code> }
</code><a name="90174"> </a><code> }
</code><a name="90175"> </a><code> return numBytes;
</code><a name="90194"> </a><code> }
</code><a name="90195"> </a><code>
</code><a name="90196"> </a><code> protected final long getLocation(PullSourceStream pss) {
</code><a name="90197"> </a><code> synchronized(sync) {
</code><a name="90198"> </a><code> if ( (pss instanceof Seekable) )
</code><a name="90199"> </a><code> return ((Seekable)pss).tell();</code>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90211"> </a><code> else
</code><a name="90212"> </a><code> return currentLocation;
</code><a name="90213"> </a><code> }
</code><a name="90214"> </a><code> }
</code><a name="90220"> </a><code>
</code><a name="90221"> </a><code> ////////////////////////////////////////////////////////////
</code><a name="90222"> </a><code> // Inner classes begin
</code><a name="90223"> </a><code> abstract private class BasicTrack implements Track {
</code><a name="90224"> </a><code>
</code><a name="90225"> </a><code> private Format format;
</code><a name="90226"> </a><code> private boolean enabled = true;
</code><a name="90227"> </a><code> protected Time duration;
</code><a name="90228"> </a><code> private Time startTime;
</code><a name="90229"> </a><code> private int numBuffers;
</code><a name="90230"> </a><code> private int dataSize;
</code><a name="90231"> </a><code> private PullSourceStream stream;
</code><a name="90232"> </a><code> private long minLocation;
</code><a name="90233"> </a><code> private long maxLocation;
</code><a name="90234"> </a><code> private long maxStartLocation;
</code><a name="90235"> </a><code> private SampleDeMux parser;
</code><a name="90236"> </a><code> private long sequenceNumber = 0;
</code><a name="90237"> </a><code> private TrackListener listener;
</code><a name="90238"> </a><code> private long seekLocation = -1L;
</code><a name="90239"> </a><code> private long mediaSizeAtEOM = -1L; // update when EOM
// implied by IOException occurs
</code><a name="90240"> </a><code>
</code><a name="90241"> </a><code> BasicTrack(SampleDeMux parser,
</code><a name="90242"> </a><code> Format format, boolean enabled,
Time duration, Time startTime,
</code><a name="90243"> </a><code> int numBuffers, int dataSize,
PullSourceStream stream) {
</code><a name="90244"> </a><code> this(parser, format, enabled, duration, startTime,
</code><a name="90245"> </a><code> numBuffers, dataSize, stream,
</code><a name="90246"> </a><code> 0L, Long.MAX_VALUE);
</code><a name="90247"> </a><code> }
</code><a name="90248"> </a><code>
</code><a name="90249"> </a><code>
</code><a name="90250"> </a><code> /**
</code><a name="90251"> </a><code> * Note to implementors who want to use this class.
</code><a name="90252"> </a><code> * If the maxLocation is not known, then
</code><a name="90253"> </a><code> * specify Long.MAX_VALUE for this parameter
</code><a name="90254"> </a><code> */
</code><a name="90255"> </a><code> public BasicTrack(SampleDeMux parser,
</code><a name="90256"> </a><code> Format format, boolean enabled,
Time duration, Time startTime,
</code><a name="90257"> </a><code> int numBuffers, int dataSize,
PullSourceStream stream,
</code><a name="90258"> </a><code> long minLocation, long maxLocation) {
</code><a name="90264"> </a><code>
</code><a name="90265"> </a><code> this.parser = parser;</code>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90279"> </a><code> this.format = format;
</code><a name="90280"> </a><code> this.enabled = enabled;
</code><a name="90281"> </a><code> this.duration = duration;
</code><a name="90282"> </a><code> this.startTime = startTime;
</code><a name="90283"> </a><code> this.numBuffers = numBuffers;
</code><a name="90284"> </a><code> this.dataSize = dataSize;
</code><a name="90285"> </a><code> this.stream = stream;
</code><a name="90286"> </a><code> this.minLocation = minLocation;
</code><a name="90287"> </a><code> this.maxLocation = maxLocation;
</code><a name="90288"> </a><code> maxStartLocation = maxLocation - dataSize;
</code><a name="90289"> </a><code> }
</code><a name="90290"> </a><code>
</code><a name="90291"> </a><code> public Format getFormat() {
</code><a name="90292"> </a><code> return format;
</code><a name="90293"> </a><code> }
</code><a name="90294"> </a><code>
</code><a name="90295"> </a><code> public void setEnabled(boolean t) {
</code><a name="90296"> </a><code> enabled = t;
</code><a name="90297"> </a><code> }
</code><a name="90298"> </a><code>
</code><a name="90299"> </a><code> public boolean isEnabled() {
</code><a name="90300"> </a><code> return enabled;
</code><a name="90301"> </a><code> }
</code><a name="90302"> </a><code>
</code><a name="90303"> </a><code> public Time getDuration() {
</code><a name="90304"> </a><code> return duration;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -