override fun drawFrame()

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
                )
            }
        }
    }