davidliu
Committed by GitHub

Noisily log when a VideoRenderer is used without initializing it first (#478)

@@ -16,17 +16,45 @@ @@ -16,17 +16,45 @@
16 16
17 package io.livekit.android.renderer 17 package io.livekit.android.renderer
18 18
  19 +import android.annotation.SuppressLint
19 import android.content.Context 20 import android.content.Context
20 import android.util.AttributeSet 21 import android.util.AttributeSet
  22 +import android.util.Log
21 import android.view.View 23 import android.view.View
22 import io.livekit.android.room.track.video.ViewVisibility 24 import io.livekit.android.room.track.video.ViewVisibility
  25 +import io.livekit.android.util.LKLog
  26 +import livekit.org.webrtc.EglBase
  27 +import livekit.org.webrtc.RendererCommon
23 import livekit.org.webrtc.SurfaceViewRenderer 28 import livekit.org.webrtc.SurfaceViewRenderer
  29 +import livekit.org.webrtc.VideoFrame
24 30
25 open class SurfaceViewRenderer : SurfaceViewRenderer, ViewVisibility.Notifier { 31 open class SurfaceViewRenderer : SurfaceViewRenderer, ViewVisibility.Notifier {
26 constructor(context: Context) : super(context) 32 constructor(context: Context) : super(context)
27 constructor(context: Context, attrs: AttributeSet) : super(context, attrs) 33 constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
28 34
29 override var viewVisibility: ViewVisibility? = null 35 override var viewVisibility: ViewVisibility? = null
  36 + private var initialized = false
  37 +
  38 + override fun init(sharedContext: EglBase.Context?, rendererEvents: RendererCommon.RendererEvents?, configAttributes: IntArray?, drawer: RendererCommon.GlDrawer?) {
  39 + if (initialized) {
  40 + LKLog.w { "Reinitializing already initialized SurfaceViewRenderer." }
  41 + }
  42 + initialized = true
  43 + super.init(sharedContext, rendererEvents, configAttributes, drawer)
  44 + }
  45 +
  46 + override fun release() {
  47 + initialized = false
  48 + super.release()
  49 + }
  50 +
  51 + @SuppressLint("LogNotTimber")
  52 + override fun onFrame(frame: VideoFrame) {
  53 + if (!initialized) {
  54 + Log.e("SurfaceViewRenderer", "Received frame when not initialized! You must call Room.initVideoRenderer(view) before using this view!")
  55 + }
  56 + super.onFrame(frame)
  57 + }
30 58
31 override fun onVisibilityChanged(changedView: View, visibility: Int) { 59 override fun onVisibilityChanged(changedView: View, visibility: Int) {
32 super.onVisibilityChanged(changedView, visibility) 60 super.onVisibilityChanged(changedView, visibility)
@@ -9,16 +9,19 @@ @@ -9,16 +9,19 @@
9 */ 9 */
10 package io.livekit.android.renderer 10 package io.livekit.android.renderer
11 11
  12 +import android.annotation.SuppressLint
12 import android.content.Context 13 import android.content.Context
13 import android.content.res.Resources.NotFoundException 14 import android.content.res.Resources.NotFoundException
14 import android.graphics.Matrix 15 import android.graphics.Matrix
15 import android.graphics.SurfaceTexture 16 import android.graphics.SurfaceTexture
16 import android.os.Looper 17 import android.os.Looper
17 import android.util.AttributeSet 18 import android.util.AttributeSet
  19 +import android.util.Log
18 import android.view.SurfaceHolder 20 import android.view.SurfaceHolder
19 import android.view.TextureView 21 import android.view.TextureView
20 import android.view.View 22 import android.view.View
21 import io.livekit.android.room.track.video.ViewVisibility 23 import io.livekit.android.room.track.video.ViewVisibility
  24 +import io.livekit.android.util.LKLog
22 import livekit.org.webrtc.* 25 import livekit.org.webrtc.*
23 import livekit.org.webrtc.RendererCommon.* 26 import livekit.org.webrtc.RendererCommon.*
24 import java.util.concurrent.CountDownLatch 27 import java.util.concurrent.CountDownLatch
@@ -47,6 +50,7 @@ open class TextureViewRenderer : @@ -47,6 +50,7 @@ open class TextureViewRenderer :
47 private var enableFixedSize = false 50 private var enableFixedSize = false
48 private var surfaceWidth = 0 51 private var surfaceWidth = 0
49 private var surfaceHeight = 0 52 private var surfaceHeight = 0
  53 + private var initialized = false
50 54
51 /** 55 /**
52 * Standard View constructor. In order to render something, you must first call init(). 56 * Standard View constructor. In order to render something, you must first call init().
@@ -85,6 +89,12 @@ open class TextureViewRenderer : @@ -85,6 +89,12 @@ open class TextureViewRenderer :
85 drawer: GlDrawer? = GlRectDrawer(), 89 drawer: GlDrawer? = GlRectDrawer(),
86 ) { 90 ) {
87 ThreadUtils.checkIsOnMainThread() 91 ThreadUtils.checkIsOnMainThread()
  92 +
  93 + if (initialized) {
  94 + LKLog.w { "Reinitializing already initialized TextureViewRenderer." }
  95 + }
  96 + initialized = true
  97 +
88 this.rendererEvents = rendererEvents 98 this.rendererEvents = rendererEvents
89 rotatedFrameWidth = 0 99 rotatedFrameWidth = 0
90 rotatedFrameHeight = 0 100 rotatedFrameHeight = 0
@@ -98,6 +108,7 @@ open class TextureViewRenderer : @@ -98,6 +108,7 @@ open class TextureViewRenderer :
98 * don't call this function, the GL resources might leak. 108 * don't call this function, the GL resources might leak.
99 */ 109 */
100 fun release() { 110 fun release() {
  111 + initialized = false
101 eglRenderer.release() 112 eglRenderer.release()
102 } 113 }
103 114
@@ -192,7 +203,11 @@ open class TextureViewRenderer : @@ -192,7 +203,11 @@ open class TextureViewRenderer :
192 } 203 }
193 204
194 // VideoSink interface. 205 // VideoSink interface.
  206 + @SuppressLint("LogNotTimber")
195 override fun onFrame(frame: VideoFrame) { 207 override fun onFrame(frame: VideoFrame) {
  208 + if (!initialized) {
  209 + Log.e("TextureViewRenderer", "Received frame when not initialized! You must call Room.initVideoRenderer(view) before using this view!")
  210 + }
196 eglRenderer.onFrame(frame) 211 eglRenderer.onFrame(frame)
197 } 212 }
198 213
@@ -360,7 +375,7 @@ open class TextureViewRenderer : @@ -360,7 +375,7 @@ open class TextureViewRenderer :
360 } 375 }
361 376
362 companion object { 377 companion object {
363 - private const val TAG = "SurfaceViewRenderer" 378 + private const val TAG = "TextureViewRenderer"
364 } 379 }
365 380
366 override var viewVisibility: ViewVisibility? = null 381 override var viewVisibility: ViewVisibility? = null