From e773285c7862ee65b2574dcdd1a014b70f347062 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Wed, 31 Jul 2019 22:17:24 +0200 Subject: [PATCH] Request key frames when the first is lost --- .../video/encoding/VideoMediaEncoder.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/VideoMediaEncoder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/VideoMediaEncoder.java index e45ae177..06f416e7 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/VideoMediaEncoder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/VideoMediaEncoder.java @@ -7,6 +7,7 @@ import android.os.Build; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; +import android.os.Bundle; import android.view.Surface; import com.otaliastudios.cameraview.CameraLogger; @@ -62,7 +63,7 @@ abstract class VideoMediaEncoder extends MediaEncoder { format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); format.setInteger(MediaFormat.KEY_BIT_RATE, mConfig.bitRate); format.setInteger(MediaFormat.KEY_FRAME_RATE, mConfig.frameRate); - format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5); + format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); // seconds between key frames! format.setInteger("rotation-degrees", mConfig.rotation); try { @@ -105,17 +106,24 @@ abstract class VideoMediaEncoder extends MediaEncoder { * @param pool the buffer pool * @param buffer the buffer */ - @SuppressWarnings("StatementWithEmptyBody") @Override protected void onWriteOutput(@NonNull OutputBufferPool pool, @NonNull OutputBuffer buffer) { if (!mSyncFrameFound) { + LOG.w("onWriteOutput:", "sync frame not found yet. Checking."); int flag = MediaCodec.BUFFER_FLAG_SYNC_FRAME; - boolean hasFlag = (buffer.info.flags & flag) != 0; + boolean hasFlag = (buffer.info.flags & flag) == flag; if (hasFlag) { + LOG.w("onWriteOutput:", "sync frame found!"); mSyncFrameFound = true; super.onWriteOutput(pool, buffer); } else { // drop this. + LOG.w("onWriteOutput:", "DROPPING FRAME and requesting a sync frame soon."); + if (Build.VERSION.SDK_INT >= 19) { + Bundle params = new Bundle(); + params.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0); + mMediaCodec.setParameters(params); + } } } else { super.onWriteOutput(pool, buffer); @@ -127,7 +135,7 @@ abstract class VideoMediaEncoder extends MediaEncoder { return mConfig.bitRate; } - @SuppressWarnings("WeakerAccess") + @SuppressWarnings("BooleanMethodIsAlwaysInverted") protected boolean shouldRenderFrame(long timestampUs) { if (timestampUs == 0) return false; // grafika said so if (mFrameNumber < 0) return false; // We were asked to stop.