in amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/gl/DefaultGlVideoFrameDrawer.kt [191:264]
override fun drawFrame(
frame: VideoFrame,
viewportX: Int,
viewportY: Int,
viewportWidth: Int,
viewportHeight: Int,
additionalRenderMatrix: Matrix?
) {
val isTextureFrame = frame.buffer is VideoFrameTextureBuffer
// Set up and account for transformation
val width: Int = frame.getRotatedWidth()
val height: Int = frame.getRotatedHeight()
calculateTransformedRenderSize(width, height, additionalRenderMatrix)
if (renderWidth <= 0 || renderHeight <= 0) {
return
}
renderMatrix.reset()
// Perform mirror and rotation around (0.5, 0.5) since that is the center of the texture.
renderMatrix.preTranslate(0.5f, 0.5f)
if (frame.buffer is VideoFrameI420Buffer) {
renderMatrix.preScale(1f, -1f) // I420-frames are upside down
}
renderMatrix.preRotate(frame.rotation.degrees.toFloat())
renderMatrix.preTranslate(-0.5f, -0.5f)
if (additionalRenderMatrix != null) {
renderMatrix.preConcat(additionalRenderMatrix)
}
// Render supported frames
if (isTextureFrame) {
val textureBuffer = frame.buffer as VideoFrameTextureBuffer
val finalMatrix = Matrix(textureBuffer.transformMatrix)
finalMatrix.preConcat(renderMatrix)
val finalGlMatrix = GlUtil.convertToGlTransformMatrix(finalMatrix)
when (textureBuffer.type) {
VideoFrameTextureBuffer.Type.TEXTURE_OES -> drawTextureOes(
textureBuffer.textureId, finalGlMatrix,
viewportX, viewportY,
viewportWidth, viewportHeight
)
VideoFrameTextureBuffer.Type.TEXTURE_2D -> drawTexture2d(
textureBuffer.textureId, finalGlMatrix,
viewportX, viewportY,
viewportWidth, viewportHeight
)
}
} else if (frame.buffer is VideoFrameI420Buffer) {
if (i420Uploader == null) {
i420Uploader = I420BufferTextureUploader()
}
i420Uploader?.let {
it.uploadFromBuffer(frame.buffer)
drawYuv(
it.yuvTextures,
GlUtil.convertToGlTransformMatrix(renderMatrix),
viewportX, viewportY, viewportWidth, viewportHeight
)
}
} else if (frame.buffer is VideoFrameRGBABuffer) {
val textureId = rgbaUploader?.uploadFromBuffer(frame.buffer)
if (textureId != null) {
drawTexture2d(
textureId,
GlUtil.convertToGlTransformMatrix(renderMatrix),
viewportX,
viewportY,
viewportWidth,
viewportHeight
)
}
}
}