Allow passthrough of E-AC3-JOC streams
PiperOrigin-RevId: 250517338
This commit is contained in:
parent
41ab7ef7c0
commit
082aee692b
@ -146,8 +146,8 @@ public final class C {
|
|||||||
* {@link #ENCODING_INVALID}, {@link #ENCODING_PCM_8BIT}, {@link #ENCODING_PCM_16BIT}, {@link
|
* {@link #ENCODING_INVALID}, {@link #ENCODING_PCM_8BIT}, {@link #ENCODING_PCM_16BIT}, {@link
|
||||||
* #ENCODING_PCM_24BIT}, {@link #ENCODING_PCM_32BIT}, {@link #ENCODING_PCM_FLOAT}, {@link
|
* #ENCODING_PCM_24BIT}, {@link #ENCODING_PCM_32BIT}, {@link #ENCODING_PCM_FLOAT}, {@link
|
||||||
* #ENCODING_PCM_MU_LAW}, {@link #ENCODING_PCM_A_LAW}, {@link #ENCODING_AC3}, {@link
|
* #ENCODING_PCM_MU_LAW}, {@link #ENCODING_PCM_A_LAW}, {@link #ENCODING_AC3}, {@link
|
||||||
* #ENCODING_E_AC3}, {@link #ENCODING_AC4}, {@link #ENCODING_DTS}, {@link #ENCODING_DTS_HD} or
|
* #ENCODING_E_AC3}, {@link #ENCODING_E_AC3_JOC}, {@link #ENCODING_AC4}, {@link #ENCODING_DTS},
|
||||||
* {@link #ENCODING_DOLBY_TRUEHD}.
|
* {@link #ENCODING_DTS_HD} or {@link #ENCODING_DOLBY_TRUEHD}.
|
||||||
*/
|
*/
|
||||||
@Documented
|
@Documented
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@ -163,6 +163,7 @@ public final class C {
|
|||||||
ENCODING_PCM_A_LAW,
|
ENCODING_PCM_A_LAW,
|
||||||
ENCODING_AC3,
|
ENCODING_AC3,
|
||||||
ENCODING_E_AC3,
|
ENCODING_E_AC3,
|
||||||
|
ENCODING_E_AC3_JOC,
|
||||||
ENCODING_AC4,
|
ENCODING_AC4,
|
||||||
ENCODING_DTS,
|
ENCODING_DTS,
|
||||||
ENCODING_DTS_HD,
|
ENCODING_DTS_HD,
|
||||||
@ -210,6 +211,8 @@ public final class C {
|
|||||||
public static final int ENCODING_AC3 = AudioFormat.ENCODING_AC3;
|
public static final int ENCODING_AC3 = AudioFormat.ENCODING_AC3;
|
||||||
/** @see AudioFormat#ENCODING_E_AC3 */
|
/** @see AudioFormat#ENCODING_E_AC3 */
|
||||||
public static final int ENCODING_E_AC3 = AudioFormat.ENCODING_E_AC3;
|
public static final int ENCODING_E_AC3 = AudioFormat.ENCODING_E_AC3;
|
||||||
|
/** @see AudioFormat#ENCODING_E_AC3_JOC */
|
||||||
|
public static final int ENCODING_E_AC3_JOC = AudioFormat.ENCODING_E_AC3_JOC;
|
||||||
/** @see AudioFormat#ENCODING_AC4 */
|
/** @see AudioFormat#ENCODING_AC4 */
|
||||||
public static final int ENCODING_AC4 = AudioFormat.ENCODING_AC4;
|
public static final int ENCODING_AC4 = AudioFormat.ENCODING_AC4;
|
||||||
/** @see AudioFormat#ENCODING_DTS */
|
/** @see AudioFormat#ENCODING_DTS */
|
||||||
|
@ -1125,6 +1125,7 @@ public final class DefaultAudioSink implements AudioSink {
|
|||||||
case C.ENCODING_AC3:
|
case C.ENCODING_AC3:
|
||||||
return 640 * 1000 / 8;
|
return 640 * 1000 / 8;
|
||||||
case C.ENCODING_E_AC3:
|
case C.ENCODING_E_AC3:
|
||||||
|
case C.ENCODING_E_AC3_JOC:
|
||||||
return 6144 * 1000 / 8;
|
return 6144 * 1000 / 8;
|
||||||
case C.ENCODING_AC4:
|
case C.ENCODING_AC4:
|
||||||
return 2688 * 1000 / 8;
|
return 2688 * 1000 / 8;
|
||||||
@ -1154,7 +1155,7 @@ public final class DefaultAudioSink implements AudioSink {
|
|||||||
return DtsUtil.parseDtsAudioSampleCount(buffer);
|
return DtsUtil.parseDtsAudioSampleCount(buffer);
|
||||||
} else if (encoding == C.ENCODING_AC3) {
|
} else if (encoding == C.ENCODING_AC3) {
|
||||||
return Ac3Util.getAc3SyncframeAudioSampleCount();
|
return Ac3Util.getAc3SyncframeAudioSampleCount();
|
||||||
} else if (encoding == C.ENCODING_E_AC3) {
|
} else if (encoding == C.ENCODING_E_AC3 || encoding == C.ENCODING_E_AC3_JOC) {
|
||||||
return Ac3Util.parseEAc3SyncframeAudioSampleCount(buffer);
|
return Ac3Util.parseEAc3SyncframeAudioSampleCount(buffer);
|
||||||
} else if (encoding == C.ENCODING_AC4) {
|
} else if (encoding == C.ENCODING_AC4) {
|
||||||
return Ac4Util.parseAc4SyncframeAudioSampleCount(buffer);
|
return Ac4Util.parseAc4SyncframeAudioSampleCount(buffer);
|
||||||
|
@ -379,7 +379,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
* @return Whether passthrough playback is supported.
|
* @return Whether passthrough playback is supported.
|
||||||
*/
|
*/
|
||||||
protected boolean allowPassthrough(int channelCount, String mimeType) {
|
protected boolean allowPassthrough(int channelCount, String mimeType) {
|
||||||
return audioSink.supportsOutput(channelCount, MimeTypes.getEncoding(mimeType));
|
return getPassthroughEncoding(channelCount, mimeType) != C.ENCODING_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -475,11 +475,14 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
@C.Encoding int encoding;
|
@C.Encoding int encoding;
|
||||||
MediaFormat format;
|
MediaFormat format;
|
||||||
if (passthroughMediaFormat != null) {
|
if (passthroughMediaFormat != null) {
|
||||||
encoding = MimeTypes.getEncoding(passthroughMediaFormat.getString(MediaFormat.KEY_MIME));
|
|
||||||
format = passthroughMediaFormat;
|
format = passthroughMediaFormat;
|
||||||
|
encoding =
|
||||||
|
getPassthroughEncoding(
|
||||||
|
format.getInteger(MediaFormat.KEY_CHANNEL_COUNT),
|
||||||
|
format.getString(MediaFormat.KEY_MIME));
|
||||||
} else {
|
} else {
|
||||||
encoding = pcmEncoding;
|
|
||||||
format = outputFormat;
|
format = outputFormat;
|
||||||
|
encoding = pcmEncoding;
|
||||||
}
|
}
|
||||||
int channelCount = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
|
int channelCount = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
|
||||||
int sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
|
int sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
|
||||||
@ -501,6 +504,28 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link C.Encoding} constant to use for passthrough of the given format, or {@link
|
||||||
|
* C#ENCODING_INVALID} if passthrough is not possible.
|
||||||
|
*/
|
||||||
|
@C.Encoding
|
||||||
|
protected int getPassthroughEncoding(int channelCount, String mimeType) {
|
||||||
|
if (MimeTypes.AUDIO_E_AC3_JOC.equals(mimeType)) {
|
||||||
|
if (audioSink.supportsOutput(channelCount, C.ENCODING_E_AC3_JOC)) {
|
||||||
|
return MimeTypes.getEncoding(MimeTypes.AUDIO_E_AC3_JOC);
|
||||||
|
}
|
||||||
|
// E-AC3 receivers can decode JOC streams, but in 2-D rather than 3-D, so try to fall back.
|
||||||
|
mimeType = MimeTypes.AUDIO_E_AC3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@C.Encoding int encoding = MimeTypes.getEncoding(mimeType);
|
||||||
|
if (audioSink.supportsOutput(channelCount, encoding)) {
|
||||||
|
return encoding;
|
||||||
|
} else {
|
||||||
|
return C.ENCODING_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the audio session id becomes known. The default implementation is a no-op. One
|
* Called when the audio session id becomes known. The default implementation is a no-op. One
|
||||||
* reason for overriding this method would be to instantiate and enable a {@link Virtualizer} in
|
* reason for overriding this method would be to instantiate and enable a {@link Virtualizer} in
|
||||||
|
@ -348,8 +348,9 @@ public final class MimeTypes {
|
|||||||
case MimeTypes.AUDIO_AC3:
|
case MimeTypes.AUDIO_AC3:
|
||||||
return C.ENCODING_AC3;
|
return C.ENCODING_AC3;
|
||||||
case MimeTypes.AUDIO_E_AC3:
|
case MimeTypes.AUDIO_E_AC3:
|
||||||
case MimeTypes.AUDIO_E_AC3_JOC:
|
|
||||||
return C.ENCODING_E_AC3;
|
return C.ENCODING_E_AC3;
|
||||||
|
case MimeTypes.AUDIO_E_AC3_JOC:
|
||||||
|
return C.ENCODING_E_AC3_JOC;
|
||||||
case MimeTypes.AUDIO_AC4:
|
case MimeTypes.AUDIO_AC4:
|
||||||
return C.ENCODING_AC4;
|
return C.ENCODING_AC4;
|
||||||
case MimeTypes.AUDIO_DTS:
|
case MimeTypes.AUDIO_DTS:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user