Render to TextureView on Android

This commit is contained in:
Florian Märkl 2019-09-16 16:00:18 +02:00
commit d1fe315220
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
4 changed files with 30 additions and 16 deletions

View file

@ -25,6 +25,8 @@
#include <string.h> #include <string.h>
#define INPUT_BUFFER_TIMEOUT_MS 10
static void *android_chiaki_video_decoder_output_thread_func(void *user); static void *android_chiaki_video_decoder_output_thread_func(void *user);
ChiakiErrorCode android_chiaki_video_decoder_init(AndroidChiakiVideoDecoder *decoder, ChiakiLog *log) 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) 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) if(codec_buf_index < 0)
{ {
// TODO: handle better
CHIAKI_LOGE(decoder->log, "Failed to get input buffer"); CHIAKI_LOGE(decoder->log, "Failed to get input buffer");
// TODO: report corrupt
goto beach; goto beach;
} }

View file

@ -1,8 +1,11 @@
package com.metallic.chiaki.stream package com.metallic.chiaki.stream
import android.graphics.SurfaceTexture
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.Surface
import android.view.SurfaceHolder import android.view.SurfaceHolder
import android.view.TextureView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@ -39,23 +42,28 @@ class StreamActivity : AppCompatActivity()
viewModel.init(connectInfo) viewModel.init(connectInfo)
} }
surfaceView.holder.addCallback(object: SurfaceHolder.Callback { textureView.surfaceTextureListener = object: TextureView.SurfaceTextureListener {
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) 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) override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {}
{ override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {}
Log.i("StreamActivity", "surfaceCreated") }
viewModel.session?.setSurface(holder.surface)
} val surfaceTexture = viewModel.surfaceTexture
}) if(surfaceTexture != null)
textureView.surfaceTexture = surfaceTexture
viewModel.state.observe(this, Observer { viewModel.state.observe(this, Observer {
stateTextView.text = "$it" stateTextView.text = "$it"

View file

@ -1,5 +1,6 @@
package com.metallic.chiaki.stream package com.metallic.chiaki.stream
import android.graphics.SurfaceTexture
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
@ -22,6 +23,8 @@ class StreamViewModel: ViewModel()
private val _state = MutableLiveData<StreamState>(StreamStateIdle) private val _state = MutableLiveData<StreamState>(StreamStateIdle)
val state: LiveData<StreamState> get() = _state val state: LiveData<StreamState> get() = _state
var surfaceTexture: SurfaceTexture? = null
fun init(connectInfo: ConnectInfo) fun init(connectInfo: ConnectInfo)
{ {
if(isInitialized) if(isInitialized)
@ -54,5 +57,6 @@ class StreamViewModel: ViewModel()
super.onCleared() super.onCleared()
session?.stop() session?.stop()
session?.dispose() session?.dispose()
surfaceTexture?.release()
} }
} }

View file

@ -6,8 +6,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".stream.StreamActivity"> tools:context=".stream.StreamActivity">
<SurfaceView <TextureView
android:id="@+id/surfaceView" android:id="@+id/textureView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/stateTextView" app:layout_constraintBottom_toTopOf="@id/stateTextView"
@ -17,7 +17,7 @@
android:id="@+id/stateTextView" android:id="@+id/stateTextView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/surfaceView" app:layout_constraintTop_toBottomOf="@id/textureView"
app:layout_constraintBottom_toBottomOf="parent"/> app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>