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>
#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;
}

View file

@ -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"

View file

@ -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<StreamState>(StreamStateIdle)
val state: LiveData<StreamState> 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()
}
}

View file

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