From: Steinar H. Gunderson Date: Sun, 4 Oct 2015 22:52:23 +0000 (+0200) Subject: Clean up the surface stuff in Mixer, now that we have Qt/epoxy interop working. X-Git-Tag: 1.0.0~299 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=0fd0ee1749ec0830b6c44eadd29159bfb86fa9e9;hp=48fed84ea9ea2840bb50ee5bea5cd03e9dd08606;p=nageru Clean up the surface stuff in Mixer, now that we have Qt/epoxy interop working. --- diff --git a/glwidget.cpp b/glwidget.cpp index b754ddc..8949d08 100644 --- a/glwidget.cpp +++ b/glwidget.cpp @@ -38,12 +38,7 @@ void GLWidget::initializeGL() printf("egl context=%p\n", eglGetCurrentContext()); //printf("threads: %p %p\n", QThread::currentThread(), qGuiApp->thread()); - QSurfaceFormat fmt = QGLFormat::toSurfaceFormat(format()); - QSurface *surface = create_surface(fmt); - QSurface *surface2 = create_surface(fmt); - QSurface *surface3 = create_surface(fmt); - QSurface *surface4 = create_surface(fmt); - global_mixer = new Mixer(surface, surface2, surface3, surface4); + global_mixer = new Mixer(QGLFormat::toSurfaceFormat(format())); global_mixer->set_frame_ready_fallback([this]{ QMetaObject::invokeMethod(this, "update", Qt::AutoConnection); }); diff --git a/mixer.cpp b/mixer.cpp index 83f0b15..a68114b 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -50,8 +50,9 @@ using namespace std::placeholders; Mixer *global_mixer = nullptr; -Mixer::Mixer(QSurface *surface1, QSurface *surface2, QSurface *surface3, QSurface *surface4) - : surface1(surface1), surface2(surface2), surface3(surface3), surface4(surface4) +Mixer::Mixer(const QSurfaceFormat &format) + : mixer_surface(create_surface(format)), + h264_encoder_surface(create_surface(format)) { CHECK(init_movit(MOVIT_SHADER_DIR, MOVIT_DEBUG_OFF)); check_error(); @@ -99,7 +100,7 @@ Mixer::Mixer(QSurface *surface1, QSurface *surface2, QSurface *surface3, QSurfac chain->set_output_origin(OUTPUT_ORIGIN_TOP_LEFT); chain->finalize(); - h264_encoder.reset(new H264Encoder(surface2, WIDTH, HEIGHT, "test.mp4")); + h264_encoder.reset(new H264Encoder(h264_encoder_surface, WIDTH, HEIGHT, "test.mp4")); printf("Configuring first card...\n"); cards[0].usb = new BMUSBCapture(0x1edb, 0xbd3b); // 0xbd4f @@ -107,6 +108,10 @@ Mixer::Mixer(QSurface *surface1, QSurface *surface2, QSurface *surface3, QSurfac cards[0].frame_allocator.reset(new PBOFrameAllocator(1280 * 750 * 2 + 44)); cards[0].usb->set_video_frame_allocator(cards[0].frame_allocator.get()); cards[0].usb->configure_card(); + cards[0].surface = create_surface(format); +#if NUM_CARDS == 2 + cards[1].surface = create_surface(format); +#endif if (NUM_CARDS == 2) { printf("Configuring second card...\n"); @@ -266,14 +271,9 @@ void Mixer::place_rectangle(Effect *resample_effect, Effect *padding_effect, flo void Mixer::thread_func() { - cards[0].surface = surface3; -#if NUM_CARDS == 2 - cards[1].surface = surface4; -#endif - eglBindAPI(EGL_OPENGL_API); QOpenGLContext *context = create_context(); - if (!make_current(context, surface1)) { + if (!make_current(context, mixer_surface)) { printf("oops\n"); exit(1); } diff --git a/mixer.h b/mixer.h index 901b269..a04bafe 100644 --- a/mixer.h +++ b/mixer.h @@ -19,13 +19,12 @@ namespace movit { class YCbCrInput; } class QOpenGLContext; -class QSurface; +class QSurfaceFormat; class Mixer { public: - // The surfaces are used for offscreen destinations for OpenGL contexts we need. - // TODO: Figure out something slightly more generic. - Mixer(QSurface *surface1, QSurface *surface2, QSurface *surface3, QSurface *surface4); + // The surface format is used for offscreen destinations for OpenGL contexts we need. + Mixer(const QSurfaceFormat &format); ~Mixer(); void start(); void quit(); @@ -55,7 +54,7 @@ private: void thread_func(); void subsample_chroma(GLuint src_tex, GLuint dst_dst); - QSurface *surface1, *surface2, *surface3, *surface4; + QSurface *mixer_surface, *h264_encoder_surface; std::unique_ptr chain; movit::ResourcePool *resource_pool; // Owned by . GLuint cbcr_program_num; // Owned by .