From d1fe315220d05f00cf1e12cc763f124c6efa81d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Mon, 16 Sep 2019 16:00:18 +0200 Subject: [PATCH] Render to TextureView on Android --- android/app/src/main/cpp/video-decoder.c | 6 ++-- .../metallic/chiaki/stream/StreamActivity.kt | 30 ++++++++++++------- .../metallic/chiaki/stream/StreamViewModel.kt | 4 +++ .../src/main/res/layout/activity_stream.xml | 6 ++-- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/android/app/src/main/cpp/video-decoder.c b/android/app/src/main/cpp/video-decoder.c index 6c20e75..505df31 100644 --- a/android/app/src/main/cpp/video-decoder.c +++ b/android/app/src/main/cpp/video-decoder.c @@ -25,6 +25,8 @@ #include +#define INPUT_BUFFER_TIMEOUT_MS 10 + static void *android_chiaki_video_decoder_output_thread_func(void *user); ChiakiErrorCode android_chiaki_video_decoder_init(AndroidChiakiVideoDecoder *decoder, ChiakiLog *log) @@ -105,11 +107,11 @@ void android_chiaki_video_decoder_video_sample(uint8_t *buf, size_t buf_size, vo while(buf_size > 0) { - ssize_t codec_buf_index = AMediaCodec_dequeueInputBuffer(decoder->codec, 100); // TODO: lower timeout? + ssize_t codec_buf_index = AMediaCodec_dequeueInputBuffer(decoder->codec, INPUT_BUFFER_TIMEOUT_MS * 1000); if(codec_buf_index < 0) { - // TODO: handle better CHIAKI_LOGE(decoder->log, "Failed to get input buffer"); + // TODO: report corrupt goto beach; } diff --git a/android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt b/android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt index d055821..94a830e 100644 --- a/android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt @@ -1,8 +1,11 @@ package com.metallic.chiaki.stream +import android.graphics.SurfaceTexture import android.os.Bundle import android.util.Log +import android.view.Surface import android.view.SurfaceHolder +import android.view.TextureView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -39,23 +42,28 @@ class StreamActivity : AppCompatActivity() viewModel.init(connectInfo) } - surfaceView.holder.addCallback(object: SurfaceHolder.Callback { - override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) + textureView.surfaceTextureListener = object: TextureView.SurfaceTextureListener { + override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) { - Log.i("StreamActivity", "surfaceChanged") + if(viewModel.surfaceTexture != null) + return + viewModel.surfaceTexture = surface + viewModel.session?.setSurface(Surface(surface)) } - override fun surfaceDestroyed(holder: SurfaceHolder) + override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean { - Log.i("StreamActivity", "surfaceDestroyed!!!!!") + // return false if we want to keep the surface texture + return viewModel.surfaceTexture == null } - override fun surfaceCreated(holder: SurfaceHolder) - { - Log.i("StreamActivity", "surfaceCreated") - viewModel.session?.setSurface(holder.surface) - } - }) + override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {} + override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {} + } + + val surfaceTexture = viewModel.surfaceTexture + if(surfaceTexture != null) + textureView.surfaceTexture = surfaceTexture viewModel.state.observe(this, Observer { stateTextView.text = "$it" diff --git a/android/app/src/main/java/com/metallic/chiaki/stream/StreamViewModel.kt b/android/app/src/main/java/com/metallic/chiaki/stream/StreamViewModel.kt index ac56fe2..dcc74f3 100644 --- a/android/app/src/main/java/com/metallic/chiaki/stream/StreamViewModel.kt +++ b/android/app/src/main/java/com/metallic/chiaki/stream/StreamViewModel.kt @@ -1,5 +1,6 @@ package com.metallic.chiaki.stream +import android.graphics.SurfaceTexture import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -22,6 +23,8 @@ class StreamViewModel: ViewModel() private val _state = MutableLiveData(StreamStateIdle) val state: LiveData get() = _state + var surfaceTexture: SurfaceTexture? = null + fun init(connectInfo: ConnectInfo) { if(isInitialized) @@ -54,5 +57,6 @@ class StreamViewModel: ViewModel() super.onCleared() session?.stop() session?.dispose() + surfaceTexture?.release() } } \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_stream.xml b/android/app/src/main/res/layout/activity_stream.xml index 2ff8f01..b3b4b37 100644 --- a/android/app/src/main/res/layout/activity_stream.xml +++ b/android/app/src/main/res/layout/activity_stream.xml @@ -6,8 +6,8 @@ android:layout_height="match_parent" tools:context=".stream.StreamActivity"> - \ No newline at end of file