2022-02-16 20:23:11 +00:00
|
|
|
import GLKit
|
2022-03-27 11:42:20 +00:00
|
|
|
import Logging
|
2022-02-16 20:23:11 +00:00
|
|
|
import OpenGLES
|
|
|
|
|
|
|
|
final class MPVOGLView: GLKView {
|
2022-03-27 11:42:20 +00:00
|
|
|
private var logger = Logger(label: "stream.yattee.mpv.oglview")
|
2022-02-16 20:23:11 +00:00
|
|
|
private var defaultFBO: GLint?
|
|
|
|
|
|
|
|
var mpvGL: UnsafeMutableRawPointer?
|
2022-12-26 18:41:37 +00:00
|
|
|
var queue = DispatchQueue(label: "stream.yattee.opengl")
|
2022-02-16 20:23:11 +00:00
|
|
|
var needsDrawing = true
|
|
|
|
|
|
|
|
override init(frame: CGRect) {
|
2022-06-18 12:39:49 +00:00
|
|
|
guard let context = EAGLContext(api: .openGLES2) else {
|
2022-02-16 20:23:11 +00:00
|
|
|
print("Failed to initialize OpenGLES 2.0 context")
|
|
|
|
exit(1)
|
|
|
|
}
|
|
|
|
|
2022-03-27 11:42:20 +00:00
|
|
|
logger.info("frame size: \(frame.width) x \(frame.height)")
|
|
|
|
|
2022-02-16 20:23:11 +00:00
|
|
|
super.init(frame: frame, context: context)
|
|
|
|
|
2022-06-18 12:39:49 +00:00
|
|
|
self.context = context
|
|
|
|
bindDrawable()
|
2022-02-16 20:23:11 +00:00
|
|
|
|
|
|
|
defaultFBO = -1
|
2022-06-18 12:39:49 +00:00
|
|
|
isOpaque = true
|
|
|
|
enableSetNeedsDisplay = false
|
2022-02-16 20:23:11 +00:00
|
|
|
|
|
|
|
fillBlack()
|
|
|
|
}
|
|
|
|
|
|
|
|
func fillBlack() {
|
|
|
|
glClearColor(0, 0, 0, 0)
|
|
|
|
glClear(UInt32(GL_COLOR_BUFFER_BIT))
|
|
|
|
}
|
|
|
|
|
2022-03-27 11:42:20 +00:00
|
|
|
override func draw(_: CGRect) {
|
2022-09-28 14:27:01 +00:00
|
|
|
guard needsDrawing, let mpvGL else {
|
2022-06-16 00:03:15 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-02-16 20:23:11 +00:00
|
|
|
glGetIntegerv(UInt32(GL_FRAMEBUFFER_BINDING), &defaultFBO!)
|
|
|
|
|
2022-03-27 11:42:20 +00:00
|
|
|
var dims: [GLint] = [0, 0, 0, 0]
|
|
|
|
glGetIntegerv(GLenum(GL_VIEWPORT), &dims)
|
|
|
|
|
2022-06-16 00:03:15 +00:00
|
|
|
var data = mpv_opengl_fbo(
|
|
|
|
fbo: Int32(defaultFBO!),
|
|
|
|
w: Int32(dims[2]),
|
|
|
|
h: Int32(dims[3]),
|
|
|
|
internal_format: 0
|
|
|
|
)
|
|
|
|
var flip: CInt = 1
|
|
|
|
withUnsafeMutablePointer(to: &flip) { flip in
|
|
|
|
withUnsafeMutablePointer(to: &data) { data in
|
|
|
|
var params = [
|
|
|
|
mpv_render_param(type: MPV_RENDER_PARAM_OPENGL_FBO, data: data),
|
|
|
|
mpv_render_param(type: MPV_RENDER_PARAM_FLIP_Y, data: flip),
|
|
|
|
mpv_render_param()
|
|
|
|
]
|
|
|
|
mpv_render_context_render(OpaquePointer(mpvGL), ¶ms)
|
2022-02-16 20:23:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
required init?(coder aDecoder: NSCoder) {
|
|
|
|
super.init(coder: aDecoder)
|
|
|
|
}
|
|
|
|
}
|