@@ -63,6 +63,11 @@ public class DefaultAudioTrackBufferSizeProvider
6363 */
6464 private static final int AC3_BUFFER_MULTIPLICATION_FACTOR = 2 ;
6565
66+ /**
67+ * Default multiplication factor to apply to DTS Express passthrough buffer to avoid underruns.
68+ */
69+ private static final int DTSHD_BUFFER_MULTIPLICATION_FACTOR = 4 ;
70+
6671 /** A builder to create {@link DefaultAudioTrackBufferSizeProvider} instances. */
6772 public static class Builder {
6873
@@ -72,6 +77,7 @@ public static class Builder {
7277 private int passthroughBufferDurationUs ;
7378 private int offloadBufferDurationUs ;
7479 private int ac3BufferMultiplicationFactor ;
80+ private int dtshdBufferMultiplicationFactor ;
7581
7682 /** Creates a new builder. */
7783 public Builder () {
@@ -81,6 +87,7 @@ public Builder() {
8187 passthroughBufferDurationUs = PASSTHROUGH_BUFFER_DURATION_US ;
8288 offloadBufferDurationUs = OFFLOAD_BUFFER_DURATION_US ;
8389 ac3BufferMultiplicationFactor = AC3_BUFFER_MULTIPLICATION_FACTOR ;
90+ dtshdBufferMultiplicationFactor = DTSHD_BUFFER_MULTIPLICATION_FACTOR ;
8491 }
8592
8693 /**
@@ -143,6 +150,16 @@ public Builder setAc3BufferMultiplicationFactor(int ac3BufferMultiplicationFacto
143150 return this ;
144151 }
145152
153+ /**
154+ * Sets the multiplication factor to apply to the passthrough buffer for DTS-HD (DTS Express) to
155+ * avoid underruns. Default is {@link #DTSHD_BUFFER_MULTIPLICATION_FACTOR}.
156+ */
157+ @ CanIgnoreReturnValue
158+ public Builder setDtshdBufferMultiplicationFactor (int dtshdBufferMultiplicationFactor ) {
159+ this .dtshdBufferMultiplicationFactor = dtshdBufferMultiplicationFactor ;
160+ return this ;
161+ }
162+
146163 /** Build the {@link DefaultAudioTrackBufferSizeProvider}. */
147164 public DefaultAudioTrackBufferSizeProvider build () {
148165 return new DefaultAudioTrackBufferSizeProvider (this );
@@ -170,13 +187,20 @@ public DefaultAudioTrackBufferSizeProvider build() {
170187 */
171188 public final int ac3BufferMultiplicationFactor ;
172189
190+ /**
191+ * The multiplication factor to apply to DTS-HD (DTS Express) passthrough buffer to avoid
192+ * underruns.
193+ */
194+ public final int dtshdBufferMultiplicationFactor ;
195+
173196 protected DefaultAudioTrackBufferSizeProvider (Builder builder ) {
174197 minPcmBufferDurationUs = builder .minPcmBufferDurationUs ;
175198 maxPcmBufferDurationUs = builder .maxPcmBufferDurationUs ;
176199 pcmBufferMultiplicationFactor = builder .pcmBufferMultiplicationFactor ;
177200 passthroughBufferDurationUs = builder .passthroughBufferDurationUs ;
178201 offloadBufferDurationUs = builder .offloadBufferDurationUs ;
179202 ac3BufferMultiplicationFactor = builder .ac3BufferMultiplicationFactor ;
203+ dtshdBufferMultiplicationFactor = builder .dtshdBufferMultiplicationFactor ;
180204 }
181205
182206 @ Override
@@ -232,7 +256,13 @@ protected int getPassthroughBufferSizeInBytes(@C.Encoding int encoding, int bitr
232256 int bufferSizeUs = passthroughBufferDurationUs ;
233257 if (encoding == C .ENCODING_AC3 ) {
234258 bufferSizeUs *= ac3BufferMultiplicationFactor ;
259+ } else if (encoding == C .ENCODING_DTS_HD ) {
260+ // DTS-HD (DTS Express) for streaming uses a frame size (number of audio samples per channel
261+ // per frame) of 4096. This requires a higher multiple for the buffersize computation.
262+ // Otherwise, there will be buffer underflow during DASH playback.
263+ bufferSizeUs *= dtshdBufferMultiplicationFactor ;
235264 }
265+
236266 int byteRate =
237267 bitrate != Format .NO_VALUE
238268 ? divide (bitrate , 8 , RoundingMode .CEILING )
0 commit comments