diff --git a/encoder/src/main/java/com/pedro/encoder/input/decoder/BaseDecoder.java b/encoder/src/main/java/com/pedro/encoder/input/decoder/BaseDecoder.java index 9c4bedfbc..11f3ace36 100644 --- a/encoder/src/main/java/com/pedro/encoder/input/decoder/BaseDecoder.java +++ b/encoder/src/main/java/com/pedro/encoder/input/decoder/BaseDecoder.java @@ -259,12 +259,11 @@ private void decode() { long ts = TimeUtils.getCurrentTimeMicro() - startTs; sleepTime = extractor.getSleepTime(ts); finished = !extractor.advance(); - if (finished) { - if (!loopMode) { - codec.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); - } + if (finished && !loopMode) { + codec.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); } else { - codec.queueInputBuffer(inIndex, 0, sampleSize, ts + sleepTime, 0); + codec.queueInputBuffer(inIndex, 0, Math.max(sampleSize, 0), ts + sleepTime, 0); + if (finished) extractor.seekTo(0); } } int outIndex = codec.dequeueOutputBuffer(bufferInfo, 10000); diff --git a/extra-sources/src/main/java/com/pedro/extrasources/CameraXSource.kt b/extra-sources/src/main/java/com/pedro/extrasources/CameraXSource.kt index fa80fcdd6..9f3fa5cd3 100644 --- a/extra-sources/src/main/java/com/pedro/extrasources/CameraXSource.kt +++ b/extra-sources/src/main/java/com/pedro/extrasources/CameraXSource.kt @@ -45,8 +45,10 @@ import com.pedro.encoder.input.sources.video.VideoSource import com.pedro.encoder.input.video.Camera2ApiManager.ImageCallback import com.pedro.encoder.input.video.Camera2ResolutionCalculator.getOptimalResolution import com.pedro.encoder.input.video.CameraHelper +import java.util.concurrent.CountDownLatch import java.util.concurrent.ExecutorService import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit /** * Created by pedro on 16/2/24. @@ -69,6 +71,7 @@ class CameraXSource( private var autoWhiteBalanceEnabled = false private var fingerSpacing = 0f private var requiredSize: Size? = null + private var surfaceReleased = CountDownLatch(0) override fun getLifecycle(): Lifecycle = lifecycleRegistry @@ -108,6 +111,7 @@ class CameraXSource( it.provideSurface(surface, executor) { surface.release() executor.shutdown() + surfaceReleased.countDown() } this.surface = surface this.executor = executor @@ -116,11 +120,15 @@ class CameraXSource( } override fun stop() { + val wasRunning = isRunning() + surfaceReleased = CountDownLatch(1) lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP) camera?.let { cameraProvider.unbindAll() camera = null } + preview.surfaceProvider = null + if (wasRunning) surfaceReleased.await(500L, TimeUnit.MILLISECONDS) surface?.release() surface = null executor?.shutdown()