in amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserver.kt [135:186]
override fun didReceiveFrame(
client: VideoClient?,
frame: Any?,
profileId: String?,
displayId: Int,
pauseType: Int,
videoId: Int
) {
val pauseState: VideoPauseState = when (pauseType) {
VIDEO_CLIENT_NO_PAUSE -> VideoPauseState.Unpaused
VIDEO_CLIENT_REMOTE_PAUSED_BY_USER -> VideoPauseState.PausedByUserRequest
VIDEO_CLIENT_REMOTE_PAUSED_BY_LOCAL_BAD_NETWORK -> VideoPauseState.PausedForPoorConnection
else -> VideoPauseState.Unpaused
}
val sdkFrame = (frame as? com.xodee.client.video.VideoFrame)?.let {
val bufferAdapter: VideoFrameBuffer = when (frame.buffer) {
is com.xodee.client.video.VideoFrameTextureBuffer -> {
val buffer = frame.buffer as com.xodee.client.video.VideoFrameTextureBuffer
val type = when (buffer.type) {
com.xodee.client.video.VideoFrameTextureBuffer.Type.OES -> VideoFrameTextureBuffer.Type.TEXTURE_OES
com.xodee.client.video.VideoFrameTextureBuffer.Type.RGB -> VideoFrameTextureBuffer.Type.TEXTURE_2D
else -> throw InvalidParameterException("Unsupported texture buffer type")
}
// Retain this buffer and create a new buffer with same internals that releases the original buffer when released itself
buffer.retain()
VideoFrameTextureBuffer(buffer.width, buffer.height, buffer.textureId, buffer.transformMatrix, type, Runnable { buffer.release() })
}
is com.xodee.client.video.VideoFrameI420Buffer -> {
val buffer = frame.buffer as com.xodee.client.video.VideoFrameI420Buffer
// Retain this buffer and create a new buffer with same internals that releases the original buffer when released itself
buffer.retain()
VideoFrameI420Buffer(buffer.width, buffer.height, buffer.dataY, buffer.dataU, buffer.dataV, buffer.strideY, buffer.strideU, buffer.strideV, Runnable { buffer.release() })
}
else -> throw InvalidParameterException("Video frame must have non null I420 or texture buffer")
}
VideoFrame(frame.timestampNs, bufferAdapter, VideoRotation.from(frame.rotation) ?: VideoRotation.Rotation0)
}
notifyVideoTileObserver { observer ->
observer.onReceiveFrame(
sdkFrame,
videoId,
profileId,
pauseState
)
}
// Frames passed up have additional ref count added so we need to release when finished
// to not leak the frame/buffer
sdkFrame?.release()
}