]> git.sesse.net Git - nageru/blobdiff - mixer.cpp
Yet more readback fixes.
[nageru] / mixer.cpp
index 39bae192c5bda7722f2aa527da80e62b990ba7fe..b3950a1c829f7f7ebfd7ab355af8488597a56350 100644 (file)
--- a/mixer.cpp
+++ b/mixer.cpp
@@ -4,11 +4,11 @@
 
 #include <assert.h>
 #include <epoxy/egl.h>
-#include <init.h>
 #include <movit/effect_chain.h>
 #include <movit/effect_util.h>
 #include <movit/flat_input.h>
 #include <movit/image_format.h>
+#include <movit/init.h>
 #include <movit/resource_pool.h>
 #include <movit/util.h>
 #include <stdint.h>
@@ -30,6 +30,7 @@
 #include "bmusb/bmusb.h"
 #include "context.h"
 #include "defs.h"
+#include "flags.h"
 #include "h264encode.h"
 #include "pbo_frame_allocator.h"
 #include "ref_counted_gl_sync.h"
@@ -132,7 +133,7 @@ Mixer::Mixer(const QSurfaceFormat &format, unsigned num_cards)
        display_chain->set_dither_bits(0);  // Don't bother.
        display_chain->finalize();
 
-       h264_encoder.reset(new H264Encoder(h264_encoder_surface, WIDTH, HEIGHT, &httpd));
+       h264_encoder.reset(new H264Encoder(h264_encoder_surface, global_flags.va_display, WIDTH, HEIGHT, &httpd));
 
        for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
                printf("Configuring card %d...\n", card_index);
@@ -167,13 +168,33 @@ Mixer::Mixer(const QSurfaceFormat &format, unsigned num_cards)
        // Set up stuff for NV12 conversion.
 
        // Cb/Cr shader.
-       string cbcr_vert_shader = read_file("vs-cbcr.130.vert");
+       string cbcr_vert_shader =
+               "#version 130 \n"
+               " \n"
+               "in vec2 position; \n"
+               "in vec2 texcoord; \n"
+               "out vec2 tc0; \n"
+               "uniform vec2 foo_chroma_offset_0; \n"
+               " \n"
+               "void main() \n"
+               "{ \n"
+               "    // The result of glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0) is: \n"
+               "    // \n"
+               "    //   2.000  0.000  0.000 -1.000 \n"
+               "    //   0.000  2.000  0.000 -1.000 \n"
+               "    //   0.000  0.000 -2.000 -1.000 \n"
+               "    //   0.000  0.000  0.000  1.000 \n"
+               "    gl_Position = vec4(2.0 * position.x - 1.0, 2.0 * position.y - 1.0, -1.0, 1.0); \n"
+               "    vec2 flipped_tc = texcoord; \n"
+               "    tc0 = flipped_tc + foo_chroma_offset_0; \n"
+               "} \n";
        string cbcr_frag_shader =
                "#version 130 \n"
                "in vec2 tc0; \n"
                "uniform sampler2D cbcr_tex; \n"
+               "out vec4 FragColor; \n"
                "void main() { \n"
-               "    gl_FragColor = texture2D(cbcr_tex, tc0); \n"
+               "    FragColor = texture(cbcr_tex, tc0); \n"
                "} \n";
        vector<string> frag_shader_outputs;
        cbcr_program_num = resource_pool->compile_glsl_program(cbcr_vert_shader, cbcr_frag_shader, frag_shader_outputs);
@@ -256,7 +277,7 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
 
        decode_video_format(video_format, &width, &height, &second_field_start, &extra_lines_top, &extra_lines_bottom,
                            &frame_rate_nom, &frame_rate_den, &interlaced);  // Ignore return value for now.
-       int64_t frame_length = TIMEBASE * frame_rate_den / frame_rate_nom;
+       int64_t frame_length = int64_t(TIMEBASE * frame_rate_den) / frame_rate_nom;
 
        size_t num_samples = (audio_frame.len >= audio_offset) ? (audio_frame.len - audio_offset) / 8 / 3 : 0;
        if (num_samples > OUTPUT_FREQUENCY / 10) {
@@ -420,6 +441,8 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
                check_error();
                glBindTexture(GL_TEXTURE_2D, 0);
                check_error();
+               glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
+               check_error();
                GLsync fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0);
                check_error();
                assert(fence != nullptr);
@@ -510,6 +533,7 @@ void Mixer::thread_func()
                }
 
                // Resample the audio as needed, including from previously dropped frames.
+               assert(num_cards > 0);
                for (unsigned frame_num = 0; frame_num < card_copy[0].dropped_frames + 1; ++frame_num) {
                        {
                                // Signal to the audio thread to process this frame.
@@ -652,7 +676,7 @@ void Mixer::thread_func()
                        h264_encoder->shutdown();
                        httpd.close_output_file();
                        httpd.open_output_file(filename.c_str());
-                       h264_encoder.reset(new H264Encoder(h264_encoder_surface, WIDTH, HEIGHT, &httpd));
+                       h264_encoder.reset(new H264Encoder(h264_encoder_surface, global_flags.va_display, WIDTH, HEIGHT, &httpd));
                }
 
 #if 0
@@ -691,6 +715,11 @@ void Mixer::process_audio_one_frame(int64_t frame_pts_int, int num_samples)
 {
        vector<float> samples_card;
        vector<float> samples_out;
+
+       // TODO: Allow mixing audio from several sources.
+       unsigned selected_audio_card = theme->map_signal(audio_source_channel);
+       assert(selected_audio_card < num_cards);
+
        for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
                samples_card.resize(num_samples * 2);
                {
@@ -699,8 +728,7 @@ void Mixer::process_audio_one_frame(int64_t frame_pts_int, int num_samples)
                                printf("Card %d reported previous underrun.\n", card_index);
                        }
                }
-               // TODO: Allow using audio from the other card(s) as well.
-               if (card_index == 0) {
+               if (card_index == selected_audio_card) {
                        samples_out = move(samples_card);
                }
        }
@@ -709,7 +737,9 @@ void Mixer::process_audio_one_frame(int64_t frame_pts_int, int num_samples)
        // we don't need it for voice, and it will reduce headroom
        // and confuse the compressor. (In particular, any hums at 50 or 60 Hz
        // should be dampened.)
-       locut.render(samples_out.data(), samples_out.size() / 2, locut_cutoff_hz * 2.0 * M_PI / OUTPUT_FREQUENCY, 0.5f);
+       if (locut_enabled) {
+               locut.render(samples_out.data(), samples_out.size() / 2, locut_cutoff_hz * 2.0 * M_PI / OUTPUT_FREQUENCY, 0.5f);
+       }
 
        // Apply a level compressor to get the general level right.
        // Basically, if it's over about -40 dBFS, we squeeze it down to that level
@@ -782,6 +812,7 @@ void Mixer::process_audio_one_frame(int64_t frame_pts_int, int num_samples)
                peak_resampler.process();
                size_t out_stereo_samples = interpolated_samples_out.size() / 2 - peak_resampler.out_count;
                peak = max<float>(peak, find_peak(interpolated_samples_out.data(), out_stereo_samples * 2));
+               peak_resampler.out_data = nullptr;
        }
 
        // At this point, we are most likely close to +0 LU, but all of our