@@ -62,8 +62,10 @@ class MediaCodecBridge {
6262 private static final String KEY_CROP_TOP = "crop-top" ;
6363
6464 private final Object mNativeBridgeLock = new Object ();
65+
6566 @ GuardedBy ("mNativeBridgeLock" )
6667 private long mNativeMediaCodecBridge ;
68+
6769 private final SynchronizedHolder <MediaCodec , IllegalStateException > mMediaCodec =
6870 new SynchronizedHolder <>(() -> new IllegalStateException ("MediaCodec was destroyed" ));
6971
@@ -290,9 +292,7 @@ private String errorMessage() {
290292 }
291293
292294 public MediaCodecBridge (
293- long nativeMediaCodecBridge ,
294- MediaCodec mediaCodec ,
295- int tunnelModeAudioSessionId ) {
295+ long nativeMediaCodecBridge , MediaCodec mediaCodec , int tunnelModeAudioSessionId ) {
296296 if (mediaCodec == null ) {
297297 throw new IllegalArgumentException ();
298298 }
@@ -400,6 +400,15 @@ public static boolean isFrameRenderedCallbackEnabled() {
400400 return Build .VERSION .SDK_INT >= 34 ;
401401 }
402402
403+ private boolean isDecodeOnlyFlagEnabled () {
404+ // Right now, we only enable BUFFER_FLAG_DECODE_ONLY for tunneling playback.
405+ if (!mIsTunnelingPlayback ) {
406+ return false ;
407+ }
408+ // BUFFER_FLAG_DECODE_ONLY is added in Android 14.
409+ return Build .VERSION .SDK_INT >= 34 ;
410+ }
411+
403412 @ CalledByNative
404413 public static void createVideoMediaCodecBridge (
405414 long nativeMediaCodecBridge ,
@@ -466,10 +475,7 @@ public static void createVideoMediaCodecBridge(
466475 }
467476
468477 MediaCodecBridge bridge =
469- new MediaCodecBridge (
470- nativeMediaCodecBridge ,
471- mediaCodec ,
472- tunnelModeAudioSessionId );
478+ new MediaCodecBridge (nativeMediaCodecBridge , mediaCodec , tunnelModeAudioSessionId );
473479 MediaFormat mediaFormat =
474480 createVideoDecoderFormat (mime , widthHint , heightHint , videoCapabilities );
475481
@@ -739,9 +745,14 @@ private ByteBuffer getOutputBuffer(int index) {
739745
740746 @ CalledByNative
741747 private int queueInputBuffer (
742- int index , int offset , int size , long presentationTimeUs , int flags ) {
748+ int index , int offset , int size , long presentationTimeUs , int flags , boolean is_decode_only ) {
743749 resetLastPresentationTimeIfNeeded (presentationTimeUs );
744750 try {
751+ if (isDecodeOnlyFlagEnabled ()
752+ && is_decode_only
753+ && (flags & MediaCodec .BUFFER_FLAG_END_OF_STREAM ) == 0 ) {
754+ flags |= MediaCodec .BUFFER_FLAG_DECODE_ONLY ;
755+ }
745756 mMediaCodec .get ().queueInputBuffer (index , offset , size , presentationTimeUs , flags );
746757 } catch (Exception e ) {
747758 Log .e (TAG , "Failed to queue input buffer" , e );
@@ -762,7 +773,8 @@ private int queueSecureInputBuffer(
762773 int cipherMode ,
763774 int blocksToEncrypt ,
764775 int blocksToSkip ,
765- long presentationTimeUs ) {
776+ long presentationTimeUs ,
777+ boolean is_decode_only ) {
766778 resetLastPresentationTimeIfNeeded (presentationTimeUs );
767779 try {
768780 CryptoInfo cryptoInfo = new CryptoInfo ();
@@ -776,7 +788,14 @@ private int queueSecureInputBuffer(
776788 return MediaCodecStatus .ERROR ;
777789 }
778790
779- mMediaCodec .get ().queueSecureInputBuffer (index , offset , cryptoInfo , presentationTimeUs , 0 );
791+ int flags = 0 ;
792+ if (isDecodeOnlyFlagEnabled () && is_decode_only ) {
793+ flags |= MediaCodec .BUFFER_FLAG_DECODE_ONLY ;
794+ }
795+
796+ mMediaCodec
797+ .get ()
798+ .queueSecureInputBuffer (index , offset , cryptoInfo , presentationTimeUs , flags );
780799 } catch (MediaCodec .CryptoException e ) {
781800 int errorCode = e .getErrorCode ();
782801 if (errorCode == MediaCodec .CryptoException .ERROR_NO_KEY ) {
@@ -1043,7 +1062,10 @@ private int getAudioFormat(int channelCount) {
10431062 @ NativeMethods
10441063 interface Natives {
10451064 void onMediaCodecError (
1046- long nativeMediaCodecBridge , boolean isRecoverable , boolean isTransient , String diagnosticInfo );
1065+ long nativeMediaCodecBridge ,
1066+ boolean isRecoverable ,
1067+ boolean isTransient ,
1068+ String diagnosticInfo );
10471069
10481070 void onMediaCodecInputBufferAvailable (long nativeMediaCodecBridge , int bufferIndex );
10491071
0 commit comments