Commit 6b9a1b16 by olly Committed by Oliver Woodman

Fix issues playing FLV content.

* AudioTagPayloadReader was strangely parsing an audioSpecificConfig
  itself, using the parsed values to build a new audioSpecificConfig,
  then passing the newly constructed instance to be parsed by
  CodecSpecificDataUtil. Unfortunately the translation was lossy ;).
* Treat Duration=0 as an unknown duration.

Issue #1137
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=112143569
parent bc1d76a3
...@@ -20,7 +20,6 @@ import com.google.android.exoplayer.MediaFormat; ...@@ -20,7 +20,6 @@ import com.google.android.exoplayer.MediaFormat;
import com.google.android.exoplayer.extractor.TrackOutput; import com.google.android.exoplayer.extractor.TrackOutput;
import com.google.android.exoplayer.util.CodecSpecificDataUtil; import com.google.android.exoplayer.util.CodecSpecificDataUtil;
import com.google.android.exoplayer.util.MimeTypes; import com.google.android.exoplayer.util.MimeTypes;
import com.google.android.exoplayer.util.ParsableBitArray;
import com.google.android.exoplayer.util.ParsableByteArray; import com.google.android.exoplayer.util.ParsableByteArray;
import android.util.Pair; import android.util.Pair;
...@@ -83,21 +82,13 @@ import java.util.Collections; ...@@ -83,21 +82,13 @@ import java.util.Collections;
int packetType = data.readUnsignedByte(); int packetType = data.readUnsignedByte();
// Parse sequence header just in case it was not done before. // Parse sequence header just in case it was not done before.
if (packetType == AAC_PACKET_TYPE_SEQUENCE_HEADER && !hasOutputFormat) { if (packetType == AAC_PACKET_TYPE_SEQUENCE_HEADER && !hasOutputFormat) {
ParsableBitArray adtsScratch = new ParsableBitArray(new byte[data.bytesLeft()]); byte[] audioSpecifiConfig = new byte[data.bytesLeft()];
data.readBytes(adtsScratch.data, 0, data.bytesLeft()); data.readBytes(audioSpecifiConfig, 0, audioSpecifiConfig.length);
int audioObjectType = adtsScratch.readBits(5);
int sampleRateIndex = adtsScratch.readBits(4);
int channelConfig = adtsScratch.readBits(4);
byte[] audioSpecificConfig = CodecSpecificDataUtil.buildAacAudioSpecificConfig(
audioObjectType, sampleRateIndex, channelConfig);
Pair<Integer, Integer> audioParams = CodecSpecificDataUtil.parseAacAudioSpecificConfig( Pair<Integer, Integer> audioParams = CodecSpecificDataUtil.parseAacAudioSpecificConfig(
audioSpecificConfig); audioSpecifiConfig);
MediaFormat mediaFormat = MediaFormat.createAudioFormat(null, MimeTypes.AUDIO_AAC, MediaFormat mediaFormat = MediaFormat.createAudioFormat(null, MimeTypes.AUDIO_AAC,
MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, getDurationUs(), audioParams.second, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, getDurationUs(), audioParams.second,
audioParams.first, Collections.singletonList(audioSpecificConfig), null); audioParams.first, Collections.singletonList(audioSpecifiConfig), null);
output.format(mediaFormat); output.format(mediaFormat);
hasOutputFormat = true; hasOutputFormat = true;
} else if (packetType == AAC_PACKET_TYPE_AAC_RAW) { } else if (packetType == AAC_PACKET_TYPE_AAC_RAW) {
......
...@@ -81,7 +81,9 @@ import java.util.Map; ...@@ -81,7 +81,9 @@ import java.util.Map;
Map<String, Object> metadata = readAmfEcmaArray(data); Map<String, Object> metadata = readAmfEcmaArray(data);
if (metadata.containsKey(KEY_DURATION)) { if (metadata.containsKey(KEY_DURATION)) {
double durationSeconds = (double) metadata.get(KEY_DURATION); double durationSeconds = (double) metadata.get(KEY_DURATION);
setDurationUs((long) (durationSeconds * C.MICROS_PER_SECOND)); if (durationSeconds > 0.0) {
setDurationUs((long) (durationSeconds * C.MICROS_PER_SECOND));
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment