]> git.sesse.net Git - nageru/blob - mixer.cpp
Implement basic support for CEF.
[nageru] / mixer.cpp
1 #undef Success
2
3 #include "mixer.h"
4
5 #include <assert.h>
6 #include <epoxy/egl.h>
7 #include <movit/effect_chain.h>
8 #include <movit/effect_util.h>
9 #include <movit/flat_input.h>
10 #include <movit/image_format.h>
11 #include <movit/init.h>
12 #include <movit/resource_pool.h>
13 #include <pthread.h>
14 #include <stdint.h>
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <algorithm>
18 #include <chrono>
19 #include <condition_variable>
20 #include <cstddef>
21 #include <cstdint>
22 #include <memory>
23 #include <mutex>
24 #include <ratio>
25 #include <string>
26 #include <thread>
27 #include <utility>
28 #include <vector>
29
30 #include "DeckLinkAPI.h"
31 #include "LinuxCOM.h"
32 #include "alsa_output.h"
33 #include "basic_stats.h"
34 #include "bmusb/bmusb.h"
35 #include "bmusb/fake_capture.h"
36 #include "cef_capture.h"
37 #include "chroma_subsampler.h"
38 #include "context.h"
39 #include "decklink_capture.h"
40 #include "decklink_output.h"
41 #include "defs.h"
42 #include "disk_space_estimator.h"
43 #include "ffmpeg_capture.h"
44 #include "flags.h"
45 #include "input_mapping.h"
46 #include "metrics.h"
47 #include "pbo_frame_allocator.h"
48 #include "ref_counted_gl_sync.h"
49 #include "resampling_queue.h"
50 #include "timebase.h"
51 #include "timecode_renderer.h"
52 #include "v210_converter.h"
53 #include "video_encoder.h"
54
55 #undef Status
56 #include <google/protobuf/util/json_util.h>
57 #include "json.pb.h"
58
59 class IDeckLink;
60 class QOpenGLContext;
61
62 using namespace movit;
63 using namespace std;
64 using namespace std::chrono;
65 using namespace std::placeholders;
66 using namespace bmusb;
67
68 Mixer *global_mixer = nullptr;
69
70 namespace {
71
72 void insert_new_frame(RefCountedFrame frame, unsigned field_num, bool interlaced, unsigned card_index, InputState *input_state)
73 {
74         if (interlaced) {
75                 for (unsigned frame_num = FRAME_HISTORY_LENGTH; frame_num --> 1; ) {  // :-)
76                         input_state->buffered_frames[card_index][frame_num] =
77                                 input_state->buffered_frames[card_index][frame_num - 1];
78                 }
79                 input_state->buffered_frames[card_index][0] = { frame, field_num };
80         } else {
81                 for (unsigned frame_num = 0; frame_num < FRAME_HISTORY_LENGTH; ++frame_num) {
82                         input_state->buffered_frames[card_index][frame_num] = { frame, field_num };
83                 }
84         }
85 }
86
87 void ensure_texture_resolution(PBOFrameAllocator::Userdata *userdata, unsigned field, unsigned width, unsigned height, unsigned cbcr_width, unsigned cbcr_height, unsigned v210_width)
88 {
89         bool first;
90         switch (userdata->pixel_format) {
91         case PixelFormat_10BitYCbCr:
92                 first = userdata->tex_v210[field] == 0 || userdata->tex_444[field] == 0;
93                 break;
94         case PixelFormat_8BitYCbCr:
95                 first = userdata->tex_y[field] == 0 || userdata->tex_cbcr[field] == 0;
96                 break;
97         case PixelFormat_8BitBGRA:
98                 first = userdata->tex_rgba[field] == 0;
99                 break;
100         case PixelFormat_8BitYCbCrPlanar:
101                 first = userdata->tex_y[field] == 0 || userdata->tex_cb[field] == 0 || userdata->tex_cr[field] == 0;
102                 break;
103         default:
104                 assert(false);
105         }
106
107         if (first ||
108             width != userdata->last_width[field] ||
109             height != userdata->last_height[field] ||
110             cbcr_width != userdata->last_cbcr_width[field] ||
111             cbcr_height != userdata->last_cbcr_height[field]) {
112                 // We changed resolution since last use of this texture, so we need to create
113                 // a new object. Note that this each card has its own PBOFrameAllocator,
114                 // we don't need to worry about these flip-flopping between resolutions.
115                 switch (userdata->pixel_format) {
116                 case PixelFormat_10BitYCbCr:
117                         glBindTexture(GL_TEXTURE_2D, userdata->tex_444[field]);
118                         check_error();
119                         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB10_A2, width, height, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, nullptr);
120                         check_error();
121                         break;
122                 case PixelFormat_8BitYCbCr: {
123                         glBindTexture(GL_TEXTURE_2D, userdata->tex_cbcr[field]);
124                         check_error();
125                         glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, cbcr_width, height, 0, GL_RG, GL_UNSIGNED_BYTE, nullptr);
126                         check_error();
127                         glBindTexture(GL_TEXTURE_2D, userdata->tex_y[field]);
128                         check_error();
129                         glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
130                         check_error();
131                         break;
132                 }
133                 case PixelFormat_8BitYCbCrPlanar: {
134                         glBindTexture(GL_TEXTURE_2D, userdata->tex_y[field]);
135                         check_error();
136                         glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
137                         check_error();
138                         glBindTexture(GL_TEXTURE_2D, userdata->tex_cb[field]);
139                         check_error();
140                         glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, cbcr_width, cbcr_height, 0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
141                         check_error();
142                         glBindTexture(GL_TEXTURE_2D, userdata->tex_cr[field]);
143                         check_error();
144                         glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, cbcr_width, cbcr_height, 0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
145                         check_error();
146                         break;
147                 }
148                 case PixelFormat_8BitBGRA:
149                         glBindTexture(GL_TEXTURE_2D, userdata->tex_rgba[field]);
150                         check_error();
151                         if (global_flags.can_disable_srgb_decoder) {  // See the comments in tweaked_inputs.h.
152                                 glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, width, height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, nullptr);
153                         } else {
154                                 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, nullptr);
155                         }
156                         check_error();
157                         break;
158                 }
159                 userdata->last_width[field] = width;
160                 userdata->last_height[field] = height;
161                 userdata->last_cbcr_width[field] = cbcr_width;
162                 userdata->last_cbcr_height[field] = cbcr_height;
163         }
164         if (global_flags.ten_bit_input &&
165             (first || v210_width != userdata->last_v210_width[field])) {
166                 // Same as above; we need to recreate the texture.
167                 glBindTexture(GL_TEXTURE_2D, userdata->tex_v210[field]);
168                 check_error();
169                 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB10_A2, v210_width, height, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, nullptr);
170                 check_error();
171                 userdata->last_v210_width[field] = v210_width;
172         }
173 }
174
175 void upload_texture(GLuint tex, GLuint width, GLuint height, GLuint stride, bool interlaced_stride, GLenum format, GLenum type, GLintptr offset)
176 {
177         if (interlaced_stride) {
178                 stride *= 2;
179         }
180         if (global_flags.flush_pbos) {
181                 glFlushMappedBufferRange(GL_PIXEL_UNPACK_BUFFER, offset, stride * height);
182                 check_error();
183         }
184
185         glBindTexture(GL_TEXTURE_2D, tex);
186         check_error();
187         if (interlaced_stride) {
188                 glPixelStorei(GL_UNPACK_ROW_LENGTH, width * 2);
189                 check_error();
190         } else {
191                 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
192                 check_error();
193         }
194
195         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, format, type, BUFFER_OFFSET(offset));
196         check_error();
197         glBindTexture(GL_TEXTURE_2D, 0);
198         check_error();
199         glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
200         check_error();
201 }
202
203 }  // namespace
204
205 void JitterHistory::register_metrics(const vector<pair<string, string>> &labels)
206 {
207         global_metrics.add("input_underestimated_jitter_frames", labels, &metric_input_underestimated_jitter_frames);
208         global_metrics.add("input_estimated_max_jitter_seconds", labels, &metric_input_estimated_max_jitter_seconds, Metrics::TYPE_GAUGE);
209 }
210
211 void JitterHistory::unregister_metrics(const vector<pair<string, string>> &labels)
212 {
213         global_metrics.remove("input_underestimated_jitter_frames", labels);
214         global_metrics.remove("input_estimated_max_jitter_seconds", labels);
215 }
216
217 void JitterHistory::frame_arrived(steady_clock::time_point now, int64_t frame_duration, size_t dropped_frames)
218 {
219         if (expected_timestamp > steady_clock::time_point::min()) {
220                 expected_timestamp += dropped_frames * nanoseconds(frame_duration * 1000000000 / TIMEBASE);
221                 double jitter_seconds = fabs(duration<double>(expected_timestamp - now).count());
222                 history.push_back(orders.insert(jitter_seconds));
223                 if (jitter_seconds > estimate_max_jitter()) {
224                         ++metric_input_underestimated_jitter_frames;
225                 }
226
227                 metric_input_estimated_max_jitter_seconds = estimate_max_jitter();
228
229                 if (history.size() > history_length) {
230                         orders.erase(history.front());
231                         history.pop_front();
232                 }
233                 assert(history.size() <= history_length);
234         }
235         expected_timestamp = now + nanoseconds(frame_duration * 1000000000 / TIMEBASE);
236 }
237
238 double JitterHistory::estimate_max_jitter() const
239 {
240         if (orders.empty()) {
241                 return 0.0;
242         }
243         size_t elem_idx = lrint((orders.size() - 1) * percentile);
244         if (percentile <= 0.5) {
245                 return *next(orders.begin(), elem_idx) * multiplier;
246         } else {
247                 return *prev(orders.end(), orders.size() - elem_idx) * multiplier;
248         }
249 }
250
251 void QueueLengthPolicy::register_metrics(const vector<pair<string, string>> &labels)
252 {
253         global_metrics.add("input_queue_safe_length_frames", labels, &metric_input_queue_safe_length_frames, Metrics::TYPE_GAUGE);
254 }
255
256 void QueueLengthPolicy::unregister_metrics(const vector<pair<string, string>> &labels)
257 {
258         global_metrics.remove("input_queue_safe_length_frames", labels);
259 }
260
261 void QueueLengthPolicy::update_policy(steady_clock::time_point now,
262                                       steady_clock::time_point expected_next_frame,
263                                       int64_t input_frame_duration,
264                                       int64_t master_frame_duration,
265                                       double max_input_card_jitter_seconds,
266                                       double max_master_card_jitter_seconds)
267 {
268         double input_frame_duration_seconds = input_frame_duration / double(TIMEBASE);
269         double master_frame_duration_seconds = master_frame_duration / double(TIMEBASE);
270
271         // Figure out when we can expect the next frame for this card, assuming
272         // worst-case jitter (ie., the frame is maximally late).
273         double seconds_until_next_frame = max(duration<double>(expected_next_frame - now).count() + max_input_card_jitter_seconds, 0.0);
274
275         // How many times are the master card expected to tick in that time?
276         // We assume the master clock has worst-case jitter but not any rate
277         // discrepancy, ie., it ticks as early as possible every time, but not
278         // cumulatively.
279         double frames_needed = (seconds_until_next_frame + max_master_card_jitter_seconds) / master_frame_duration_seconds;
280
281         // As a special case, if the master card ticks faster than the input card,
282         // we expect the queue to drain by itself even without dropping. But if
283         // the difference is small (e.g. 60 Hz master and 59.94 input), it would
284         // go slowly enough that the effect wouldn't really be appreciable.
285         // We account for this by looking at the situation five frames ahead,
286         // assuming everything else is the same.
287         double frames_allowed;
288         if (master_frame_duration < input_frame_duration) {
289                 frames_allowed = frames_needed + 5 * (input_frame_duration_seconds - master_frame_duration_seconds) / master_frame_duration_seconds;
290         } else {
291                 frames_allowed = frames_needed;
292         }
293
294         safe_queue_length = max<int>(floor(frames_allowed), 0);
295         metric_input_queue_safe_length_frames = safe_queue_length;
296 }
297
298 Mixer::Mixer(const QSurfaceFormat &format, unsigned num_cards)
299         : httpd(),
300           num_cards(num_cards),
301           mixer_surface(create_surface(format)),
302           h264_encoder_surface(create_surface(format)),
303           decklink_output_surface(create_surface(format)),
304           audio_mixer(num_cards)
305 {
306         memcpy(ycbcr_interpretation, global_flags.ycbcr_interpretation, sizeof(ycbcr_interpretation));
307         CHECK(init_movit(MOVIT_SHADER_DIR, MOVIT_DEBUG_OFF));
308         check_error();
309
310         // This nearly always should be true.
311         global_flags.can_disable_srgb_decoder =
312                 epoxy_has_gl_extension("GL_EXT_texture_sRGB_decode") &&
313                 epoxy_has_gl_extension("GL_ARB_sampler_objects");
314
315         // Since we allow non-bouncing 4:2:2 YCbCrInputs, effective subpixel precision
316         // will be halved when sampling them, and we need to compensate here.
317         movit_texel_subpixel_precision /= 2.0;
318
319         resource_pool.reset(new ResourcePool);
320         for (unsigned i = 0; i < NUM_OUTPUTS; ++i) {
321                 output_channel[i].parent = this;
322                 output_channel[i].channel = i;
323         }
324
325         ImageFormat inout_format;
326         inout_format.color_space = COLORSPACE_sRGB;
327         inout_format.gamma_curve = GAMMA_sRGB;
328
329         // Matches the 4:2:0 format created by the main chain.
330         YCbCrFormat ycbcr_format;
331         ycbcr_format.chroma_subsampling_x = 2;
332         ycbcr_format.chroma_subsampling_y = 2;
333         if (global_flags.ycbcr_rec709_coefficients) {
334                 ycbcr_format.luma_coefficients = YCBCR_REC_709;
335         } else {
336                 ycbcr_format.luma_coefficients = YCBCR_REC_601;
337         }
338         ycbcr_format.full_range = false;
339         ycbcr_format.num_levels = 1 << global_flags.x264_bit_depth;
340         ycbcr_format.cb_x_position = 0.0f;
341         ycbcr_format.cr_x_position = 0.0f;
342         ycbcr_format.cb_y_position = 0.5f;
343         ycbcr_format.cr_y_position = 0.5f;
344
345         // Display chain; shows the live output produced by the main chain (or rather, a copy of it).
346         display_chain.reset(new EffectChain(global_flags.width, global_flags.height, resource_pool.get()));
347         check_error();
348         GLenum type = global_flags.x264_bit_depth > 8 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE;
349         display_input = new YCbCrInput(inout_format, ycbcr_format, global_flags.width, global_flags.height, YCBCR_INPUT_SPLIT_Y_AND_CBCR, type);
350         display_chain->add_input(display_input);
351         display_chain->add_output(inout_format, OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED);
352         display_chain->set_dither_bits(0);  // Don't bother.
353         display_chain->finalize();
354
355         video_encoder.reset(new VideoEncoder(resource_pool.get(), h264_encoder_surface, global_flags.va_display, global_flags.width, global_flags.height, &httpd, global_disk_space_estimator));
356
357         // Must be instantiated after VideoEncoder has initialized global_flags.use_zerocopy.
358         theme.reset(new Theme(global_flags.theme_filename, global_flags.theme_dirs, resource_pool.get(), num_cards));
359
360         httpd.add_endpoint("/channels", bind(&Mixer::get_channels_json, this), HTTPD::ALLOW_ALL_ORIGINS);
361         for (int channel_idx = 2; channel_idx < theme->get_num_channels(); ++channel_idx) {
362                 char url[256];
363                 snprintf(url, sizeof(url), "/channels/%d/color", channel_idx);
364                 httpd.add_endpoint(url, bind(&Mixer::get_channel_color_http, this, unsigned(channel_idx)), HTTPD::ALLOW_ALL_ORIGINS);
365         }
366
367         // Start listening for clients only once VideoEncoder has written its header, if any.
368         httpd.start(global_flags.http_port);
369
370         // First try initializing the then PCI devices, then USB, then
371         // fill up with fake cards until we have the desired number of cards.
372         unsigned num_pci_devices = 0;
373         unsigned card_index = 0;
374
375         {
376                 IDeckLinkIterator *decklink_iterator = CreateDeckLinkIteratorInstance();
377                 if (decklink_iterator != nullptr) {
378                         for ( ; card_index < num_cards; ++card_index) {
379                                 IDeckLink *decklink;
380                                 if (decklink_iterator->Next(&decklink) != S_OK) {
381                                         break;
382                                 }
383
384                                 DeckLinkCapture *capture = new DeckLinkCapture(decklink, card_index);
385                                 DeckLinkOutput *output = new DeckLinkOutput(resource_pool.get(), decklink_output_surface, global_flags.width, global_flags.height, card_index);
386                                 if (!output->set_device(decklink)) {
387                                         delete output;
388                                         output = nullptr;
389                                 }
390                                 configure_card(card_index, capture, CardType::LIVE_CARD, output);
391                                 ++num_pci_devices;
392                         }
393                         decklink_iterator->Release();
394                         fprintf(stderr, "Found %u DeckLink PCI card(s).\n", num_pci_devices);
395                 } else {
396                         fprintf(stderr, "DeckLink drivers not found. Probing for USB cards only.\n");
397                 }
398         }
399
400         unsigned num_usb_devices = BMUSBCapture::num_cards();
401         for (unsigned usb_card_index = 0; usb_card_index < num_usb_devices && card_index < num_cards; ++usb_card_index, ++card_index) {
402                 BMUSBCapture *capture = new BMUSBCapture(usb_card_index);
403                 capture->set_card_disconnected_callback(bind(&Mixer::bm_hotplug_remove, this, card_index));
404                 configure_card(card_index, capture, CardType::LIVE_CARD, /*output=*/nullptr);
405         }
406         fprintf(stderr, "Found %u USB card(s).\n", num_usb_devices);
407
408         unsigned num_fake_cards = 0;
409         for ( ; card_index < num_cards; ++card_index, ++num_fake_cards) {
410                 FakeCapture *capture = new FakeCapture(global_flags.width, global_flags.height, FAKE_FPS, OUTPUT_FREQUENCY, card_index, global_flags.fake_cards_audio);
411                 configure_card(card_index, capture, CardType::FAKE_CAPTURE, /*output=*/nullptr);
412         }
413
414         if (num_fake_cards > 0) {
415                 fprintf(stderr, "Initialized %u fake cards.\n", num_fake_cards);
416         }
417
418         // Initialize all video inputs the theme asked for. Note that these are
419         // all put _after_ the regular cards, which stop at <num_cards> - 1.
420         std::vector<FFmpegCapture *> video_inputs = theme->get_video_inputs();
421         for (unsigned video_card_index = 0; video_card_index < video_inputs.size(); ++card_index, ++video_card_index) {
422                 if (card_index >= MAX_VIDEO_CARDS) {
423                         fprintf(stderr, "ERROR: Not enough card slots available for the videos the theme requested.\n");
424                         exit(1);
425                 }
426                 configure_card(card_index, video_inputs[video_card_index], CardType::FFMPEG_INPUT, /*output=*/nullptr);
427                 video_inputs[video_card_index]->set_card_index(card_index);
428         }
429         num_video_inputs = video_inputs.size();
430
431         // Same, for HTML inputs.
432         std::vector<CEFCapture *> html_inputs = theme->get_html_inputs();
433         for (unsigned html_card_index = 0; html_card_index < html_inputs.size(); ++card_index, ++html_card_index) {
434                 if (card_index >= MAX_VIDEO_CARDS) {
435                         fprintf(stderr, "ERROR: Not enough card slots available for the HTML inputs the theme requested.\n");
436                         exit(1);
437                 }
438                 configure_card(card_index, html_inputs[html_card_index], CardType::CEF_INPUT, /*output=*/nullptr);
439                 html_inputs[html_card_index]->set_card_index(card_index);
440         }
441         num_html_inputs = html_inputs.size();
442
443         BMUSBCapture::set_card_connected_callback(bind(&Mixer::bm_hotplug_add, this, _1));
444         BMUSBCapture::start_bm_thread();
445
446         for (unsigned card_index = 0; card_index < num_cards + num_video_inputs + num_html_inputs; ++card_index) {
447                 cards[card_index].queue_length_policy.reset(card_index);
448         }
449
450         chroma_subsampler.reset(new ChromaSubsampler(resource_pool.get()));
451
452         if (global_flags.ten_bit_input) {
453                 if (!v210Converter::has_hardware_support()) {
454                         fprintf(stderr, "ERROR: --ten-bit-input requires support for OpenGL compute shaders\n");
455                         fprintf(stderr, "       (OpenGL 4.3, or GL_ARB_compute_shader + GL_ARB_shader_image_load_store).\n");
456                         exit(1);
457                 }
458                 v210_converter.reset(new v210Converter());
459
460                 // These are all the widths listed in the Blackmagic SDK documentation
461                 // (section 2.7.3, “Display Modes”).
462                 v210_converter->precompile_shader(720);
463                 v210_converter->precompile_shader(1280);
464                 v210_converter->precompile_shader(1920);
465                 v210_converter->precompile_shader(2048);
466                 v210_converter->precompile_shader(3840);
467                 v210_converter->precompile_shader(4096);
468         }
469         if (global_flags.ten_bit_output) {
470                 if (!v210Converter::has_hardware_support()) {
471                         fprintf(stderr, "ERROR: --ten-bit-output requires support for OpenGL compute shaders\n");
472                         fprintf(stderr, "       (OpenGL 4.3, or GL_ARB_compute_shader + GL_ARB_shader_image_load_store).\n");
473                         exit(1);
474                 }
475         }
476
477         timecode_renderer.reset(new TimecodeRenderer(resource_pool.get(), global_flags.width, global_flags.height));
478         display_timecode_in_stream = global_flags.display_timecode_in_stream;
479         display_timecode_on_stdout = global_flags.display_timecode_on_stdout;
480
481         if (global_flags.enable_alsa_output) {
482                 alsa.reset(new ALSAOutput(OUTPUT_FREQUENCY, /*num_channels=*/2));
483         }
484         if (global_flags.output_card != -1) {
485                 desired_output_card_index = global_flags.output_card;
486                 set_output_card_internal(global_flags.output_card);
487         }
488
489         output_jitter_history.register_metrics({{ "card", "output" }});
490 }
491
492 Mixer::~Mixer()
493 {
494         BMUSBCapture::stop_bm_thread();
495
496         for (unsigned card_index = 0; card_index < num_cards + num_video_inputs + num_html_inputs; ++card_index) {
497                 {
498                         unique_lock<mutex> lock(card_mutex);
499                         cards[card_index].should_quit = true;  // Unblock thread.
500                         cards[card_index].new_frames_changed.notify_all();
501                 }
502                 cards[card_index].capture->stop_dequeue_thread();
503                 if (cards[card_index].output) {
504                         cards[card_index].output->end_output();
505                         cards[card_index].output.reset();
506                 }
507         }
508
509         video_encoder.reset(nullptr);
510 }
511
512 void Mixer::configure_card(unsigned card_index, CaptureInterface *capture, CardType card_type, DeckLinkOutput *output)
513 {
514         printf("Configuring card %d...\n", card_index);
515
516         CaptureCard *card = &cards[card_index];
517         if (card->capture != nullptr) {
518                 card->capture->stop_dequeue_thread();
519         }
520         card->capture.reset(capture);
521         card->is_fake_capture = (card_type == CardType::FAKE_CAPTURE);
522         card->type = card_type;
523         if (card->output.get() != output) {
524                 card->output.reset(output);
525         }
526
527         PixelFormat pixel_format;
528         if (card_type == CardType::FFMPEG_INPUT) {
529                 pixel_format = capture->get_current_pixel_format();
530         } else if (card_type == CardType::CEF_INPUT) {
531                 pixel_format = PixelFormat_8BitBGRA;
532         } else if (global_flags.ten_bit_input) {
533                 pixel_format = PixelFormat_10BitYCbCr;
534         } else {
535                 pixel_format = PixelFormat_8BitYCbCr;
536         }
537
538         card->capture->set_frame_callback(bind(&Mixer::bm_frame, this, card_index, _1, _2, _3, _4, _5, _6, _7));
539         if (card->frame_allocator == nullptr) {
540                 card->frame_allocator.reset(new PBOFrameAllocator(pixel_format, 8 << 20, global_flags.width, global_flags.height));  // 8 MB.
541         }
542         card->capture->set_video_frame_allocator(card->frame_allocator.get());
543         if (card->surface == nullptr) {
544                 card->surface = create_surface_with_same_format(mixer_surface);
545         }
546         while (!card->new_frames.empty()) card->new_frames.pop_front();
547         card->last_timecode = -1;
548         card->capture->set_pixel_format(pixel_format);
549         card->capture->configure_card();
550
551         // NOTE: start_bm_capture() happens in thread_func().
552
553         DeviceSpec device{InputSourceType::CAPTURE_CARD, card_index};
554         audio_mixer.reset_resampler(device);
555         audio_mixer.set_display_name(device, card->capture->get_description());
556         audio_mixer.trigger_state_changed_callback();
557
558         // Unregister old metrics, if any.
559         if (!card->labels.empty()) {
560                 const vector<pair<string, string>> &labels = card->labels;
561                 card->jitter_history.unregister_metrics(labels);
562                 card->queue_length_policy.unregister_metrics(labels);
563                 global_metrics.remove("input_received_frames", labels);
564                 global_metrics.remove("input_dropped_frames_jitter", labels);
565                 global_metrics.remove("input_dropped_frames_error", labels);
566                 global_metrics.remove("input_dropped_frames_resets", labels);
567                 global_metrics.remove("input_queue_length_frames", labels);
568                 global_metrics.remove("input_queue_duped_frames", labels);
569
570                 global_metrics.remove("input_has_signal_bool", labels);
571                 global_metrics.remove("input_is_connected_bool", labels);
572                 global_metrics.remove("input_interlaced_bool", labels);
573                 global_metrics.remove("input_width_pixels", labels);
574                 global_metrics.remove("input_height_pixels", labels);
575                 global_metrics.remove("input_frame_rate_nom", labels);
576                 global_metrics.remove("input_frame_rate_den", labels);
577                 global_metrics.remove("input_sample_rate_hz", labels);
578         }
579
580         // Register metrics.
581         vector<pair<string, string>> labels;
582         char card_name[64];
583         snprintf(card_name, sizeof(card_name), "%d", card_index);
584         labels.emplace_back("card", card_name);
585
586         switch (card_type) {
587         case CardType::LIVE_CARD:
588                 labels.emplace_back("cardtype", "live");
589                 break;
590         case CardType::FAKE_CAPTURE:
591                 labels.emplace_back("cardtype", "fake");
592                 break;
593         case CardType::FFMPEG_INPUT:
594                 labels.emplace_back("cardtype", "ffmpeg");
595                 break;
596         case CardType::CEF_INPUT:
597                 labels.emplace_back("cardtype", "cef");
598                 break;
599         default:
600                 assert(false);
601         }
602         card->jitter_history.register_metrics(labels);
603         card->queue_length_policy.register_metrics(labels);
604         global_metrics.add("input_received_frames", labels, &card->metric_input_received_frames);
605         global_metrics.add("input_dropped_frames_jitter", labels, &card->metric_input_dropped_frames_jitter);
606         global_metrics.add("input_dropped_frames_error", labels, &card->metric_input_dropped_frames_error);
607         global_metrics.add("input_dropped_frames_resets", labels, &card->metric_input_resets);
608         global_metrics.add("input_queue_length_frames", labels, &card->metric_input_queue_length_frames, Metrics::TYPE_GAUGE);
609         global_metrics.add("input_queue_duped_frames", labels, &card->metric_input_duped_frames);
610
611         global_metrics.add("input_has_signal_bool", labels, &card->metric_input_has_signal_bool, Metrics::TYPE_GAUGE);
612         global_metrics.add("input_is_connected_bool", labels, &card->metric_input_is_connected_bool, Metrics::TYPE_GAUGE);
613         global_metrics.add("input_interlaced_bool", labels, &card->metric_input_interlaced_bool, Metrics::TYPE_GAUGE);
614         global_metrics.add("input_width_pixels", labels, &card->metric_input_width_pixels, Metrics::TYPE_GAUGE);
615         global_metrics.add("input_height_pixels", labels, &card->metric_input_height_pixels, Metrics::TYPE_GAUGE);
616         global_metrics.add("input_frame_rate_nom", labels, &card->metric_input_frame_rate_nom, Metrics::TYPE_GAUGE);
617         global_metrics.add("input_frame_rate_den", labels, &card->metric_input_frame_rate_den, Metrics::TYPE_GAUGE);
618         global_metrics.add("input_sample_rate_hz", labels, &card->metric_input_sample_rate_hz, Metrics::TYPE_GAUGE);
619         card->labels = labels;
620 }
621
622 void Mixer::set_output_card_internal(int card_index)
623 {
624         // We don't really need to take card_mutex, since we're in the mixer
625         // thread and don't mess with any queues (which is the only thing that happens
626         // from other threads), but it's probably the safest in the long run.
627         unique_lock<mutex> lock(card_mutex);
628         if (output_card_index != -1) {
629                 // Switch the old card from output to input.
630                 CaptureCard *old_card = &cards[output_card_index];
631                 old_card->output->end_output();
632
633                 // Stop the fake card that we put into place.
634                 // This needs to _not_ happen under the mutex, to avoid deadlock
635                 // (delivering the last frame needs to take the mutex).
636                 CaptureInterface *fake_capture = old_card->capture.get();
637                 lock.unlock();
638                 fake_capture->stop_dequeue_thread();
639                 lock.lock();
640                 old_card->capture = move(old_card->parked_capture);  // TODO: reset the metrics
641                 old_card->is_fake_capture = false;
642                 old_card->capture->start_bm_capture();
643         }
644         if (card_index != -1) {
645                 CaptureCard *card = &cards[card_index];
646                 CaptureInterface *capture = card->capture.get();
647                 // TODO: DeckLinkCapture::stop_dequeue_thread can actually take
648                 // several seconds to complete (blocking on DisableVideoInput);
649                 // see if we can maybe do it asynchronously.
650                 lock.unlock();
651                 capture->stop_dequeue_thread();
652                 lock.lock();
653                 card->parked_capture = move(card->capture);
654                 CaptureInterface *fake_capture = new FakeCapture(global_flags.width, global_flags.height, FAKE_FPS, OUTPUT_FREQUENCY, card_index, global_flags.fake_cards_audio);
655                 configure_card(card_index, fake_capture, CardType::FAKE_CAPTURE, card->output.release());
656                 card->queue_length_policy.reset(card_index);
657                 card->capture->start_bm_capture();
658                 desired_output_video_mode = output_video_mode = card->output->pick_video_mode(desired_output_video_mode);
659                 card->output->start_output(desired_output_video_mode, pts_int);
660         }
661         output_card_index = card_index;
662         output_jitter_history.clear();
663 }
664
665 namespace {
666
667 int unwrap_timecode(uint16_t current_wrapped, int last)
668 {
669         uint16_t last_wrapped = last & 0xffff;
670         if (current_wrapped > last_wrapped) {
671                 return (last & ~0xffff) | current_wrapped;
672         } else {
673                 return 0x10000 + ((last & ~0xffff) | current_wrapped);
674         }
675 }
676
677 }  // namespace
678
679 void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
680                      FrameAllocator::Frame video_frame, size_t video_offset, VideoFormat video_format,
681                      FrameAllocator::Frame audio_frame, size_t audio_offset, AudioFormat audio_format)
682 {
683         DeviceSpec device{InputSourceType::CAPTURE_CARD, card_index};
684         CaptureCard *card = &cards[card_index];
685
686         ++card->metric_input_received_frames;
687         card->metric_input_has_signal_bool = video_format.has_signal;
688         card->metric_input_is_connected_bool = video_format.is_connected;
689         card->metric_input_interlaced_bool = video_format.interlaced;
690         card->metric_input_width_pixels = video_format.width;
691         card->metric_input_height_pixels = video_format.height;
692         card->metric_input_frame_rate_nom = video_format.frame_rate_nom;
693         card->metric_input_frame_rate_den = video_format.frame_rate_den;
694         card->metric_input_sample_rate_hz = audio_format.sample_rate;
695
696         if (is_mode_scanning[card_index]) {
697                 if (video_format.has_signal) {
698                         // Found a stable signal, so stop scanning.
699                         is_mode_scanning[card_index] = false;
700                 } else {
701                         static constexpr double switch_time_s = 0.1;  // Should be enough time for the signal to stabilize.
702                         steady_clock::time_point now = steady_clock::now();
703                         double sec_since_last_switch = duration<double>(steady_clock::now() - last_mode_scan_change[card_index]).count();
704                         if (sec_since_last_switch > switch_time_s) {
705                                 // It isn't this mode; try the next one.
706                                 mode_scanlist_index[card_index]++;
707                                 mode_scanlist_index[card_index] %= mode_scanlist[card_index].size();
708                                 cards[card_index].capture->set_video_mode(mode_scanlist[card_index][mode_scanlist_index[card_index]]);
709                                 last_mode_scan_change[card_index] = now;
710                         }
711                 }
712         }
713
714         int64_t frame_length = int64_t(TIMEBASE) * video_format.frame_rate_den / video_format.frame_rate_nom;
715         assert(frame_length > 0);
716
717         size_t num_samples = (audio_frame.len > audio_offset) ? (audio_frame.len - audio_offset) / audio_format.num_channels / (audio_format.bits_per_sample / 8) : 0;
718         if (num_samples > OUTPUT_FREQUENCY / 10) {
719                 printf("Card %d: Dropping frame with implausible audio length (len=%d, offset=%d) [timecode=0x%04x video_len=%d video_offset=%d video_format=%x)\n",
720                         card_index, int(audio_frame.len), int(audio_offset),
721                         timecode, int(video_frame.len), int(video_offset), video_format.id);
722                 if (video_frame.owner) {
723                         video_frame.owner->release_frame(video_frame);
724                 }
725                 if (audio_frame.owner) {
726                         audio_frame.owner->release_frame(audio_frame);
727                 }
728                 return;
729         }
730
731         int dropped_frames = 0;
732         if (card->last_timecode != -1) {
733                 dropped_frames = unwrap_timecode(timecode, card->last_timecode) - card->last_timecode - 1;
734         }
735
736         // Number of samples per frame if we need to insert silence.
737         // (Could be nonintegral, but resampling will save us then.)
738         const int silence_samples = OUTPUT_FREQUENCY * video_format.frame_rate_den / video_format.frame_rate_nom;
739
740         if (dropped_frames > MAX_FPS * 2) {
741                 fprintf(stderr, "Card %d lost more than two seconds (or time code jumping around; from 0x%04x to 0x%04x), resetting resampler\n",
742                         card_index, card->last_timecode, timecode);
743                 audio_mixer.reset_resampler(device);
744                 dropped_frames = 0;
745                 ++card->metric_input_resets;
746         } else if (dropped_frames > 0) {
747                 // Insert silence as needed.
748                 fprintf(stderr, "Card %d dropped %d frame(s) (before timecode 0x%04x), inserting silence.\n",
749                         card_index, dropped_frames, timecode);
750                 card->metric_input_dropped_frames_error += dropped_frames;
751
752                 bool success;
753                 do {
754                         success = audio_mixer.add_silence(device, silence_samples, dropped_frames, frame_length);
755                 } while (!success);
756         }
757
758         if (num_samples > 0) {
759                 audio_mixer.add_audio(device, audio_frame.data + audio_offset, num_samples, audio_format, frame_length, audio_frame.received_timestamp);
760         }
761
762         // Done with the audio, so release it.
763         if (audio_frame.owner) {
764                 audio_frame.owner->release_frame(audio_frame);
765         }
766
767         card->last_timecode = timecode;
768
769         PBOFrameAllocator::Userdata *userdata = (PBOFrameAllocator::Userdata *)video_frame.userdata;
770
771         size_t cbcr_width, cbcr_height, cbcr_offset, y_offset;
772         size_t expected_length = video_format.stride * (video_format.height + video_format.extra_lines_top + video_format.extra_lines_bottom);
773         if (userdata != nullptr && userdata->pixel_format == PixelFormat_8BitYCbCrPlanar) {
774                 // The calculation above is wrong for planar Y'CbCr, so just override it.
775                 assert(card->type == CardType::FFMPEG_INPUT);
776                 assert(video_offset == 0);
777                 expected_length = video_frame.len;
778
779                 userdata->ycbcr_format = (static_cast<FFmpegCapture *>(card->capture.get()))->get_current_frame_ycbcr_format();
780                 cbcr_width = video_format.width / userdata->ycbcr_format.chroma_subsampling_x;
781                 cbcr_height = video_format.height / userdata->ycbcr_format.chroma_subsampling_y;
782                 cbcr_offset = video_format.width * video_format.height;
783                 y_offset = 0;
784         } else {
785                 // All the other Y'CbCr formats are 4:2:2.
786                 cbcr_width = video_format.width / 2;
787                 cbcr_height = video_format.height;
788                 cbcr_offset = video_offset / 2;
789                 y_offset = video_frame.size / 2 + video_offset / 2;
790         }
791         if (video_frame.len - video_offset == 0 ||
792             video_frame.len - video_offset != expected_length) {
793                 if (video_frame.len != 0) {
794                         printf("Card %d: Dropping video frame with wrong length (%ld; expected %ld)\n",
795                                 card_index, video_frame.len - video_offset, expected_length);
796                 }
797                 if (video_frame.owner) {
798                         video_frame.owner->release_frame(video_frame);
799                 }
800
801                 // Still send on the information that we _had_ a frame, even though it's corrupted,
802                 // so that pts can go up accordingly.
803                 {
804                         unique_lock<mutex> lock(card_mutex);
805                         CaptureCard::NewFrame new_frame;
806                         new_frame.frame = RefCountedFrame(FrameAllocator::Frame());
807                         new_frame.length = frame_length;
808                         new_frame.interlaced = false;
809                         new_frame.dropped_frames = dropped_frames;
810                         new_frame.received_timestamp = video_frame.received_timestamp;
811                         card->new_frames.push_back(move(new_frame));
812                         card->jitter_history.frame_arrived(video_frame.received_timestamp, frame_length, dropped_frames);
813                 }
814                 card->new_frames_changed.notify_all();
815                 return;
816         }
817
818         unsigned num_fields = video_format.interlaced ? 2 : 1;
819         steady_clock::time_point frame_upload_start;
820         bool interlaced_stride = false;
821         if (video_format.interlaced) {
822                 // Send the two fields along as separate frames; the other side will need to add
823                 // a deinterlacer to actually get this right.
824                 assert(video_format.height % 2 == 0);
825                 video_format.height /= 2;
826                 cbcr_height /= 2;
827                 assert(frame_length % 2 == 0);
828                 frame_length /= 2;
829                 num_fields = 2;
830                 if (video_format.second_field_start == 1) {
831                         interlaced_stride = true;
832                 }
833                 frame_upload_start = steady_clock::now();
834         }
835         userdata->last_interlaced = video_format.interlaced;
836         userdata->last_has_signal = video_format.has_signal;
837         userdata->last_is_connected = video_format.is_connected;
838         userdata->last_frame_rate_nom = video_format.frame_rate_nom;
839         userdata->last_frame_rate_den = video_format.frame_rate_den;
840         RefCountedFrame frame(video_frame);
841
842         // Upload the textures.
843         for (unsigned field = 0; field < num_fields; ++field) {
844                 // Put the actual texture upload in a lambda that is executed in the main thread.
845                 // It is entirely possible to do this in the same thread (and it might even be
846                 // faster, depending on the GPU and driver), but it appears to be trickling
847                 // driver bugs very easily.
848                 //
849                 // Note that this means we must hold on to the actual frame data in <userdata>
850                 // until the upload command is run, but we hold on to <frame> much longer than that
851                 // (in fact, all the way until we no longer use the texture in rendering).
852                 auto upload_func = [this, field, video_format, y_offset, video_offset, cbcr_offset, cbcr_width, cbcr_height, interlaced_stride, userdata]() {
853                         unsigned field_start_line;
854                         if (field == 1) {
855                                 field_start_line = video_format.second_field_start;
856                         } else {
857                                 field_start_line = video_format.extra_lines_top;
858                         }
859
860                         // For anything not FRAME_FORMAT_YCBCR_10BIT, v210_width will be nonsensical but not used.
861                         size_t v210_width = video_format.stride / sizeof(uint32_t);
862                         ensure_texture_resolution(userdata, field, video_format.width, video_format.height, cbcr_width, cbcr_height, v210_width);
863
864                         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, userdata->pbo);
865                         check_error();
866
867                         switch (userdata->pixel_format) {
868                         case PixelFormat_10BitYCbCr: {
869                                 size_t field_start = video_offset + video_format.stride * field_start_line;
870                                 upload_texture(userdata->tex_v210[field], v210_width, video_format.height, video_format.stride, interlaced_stride, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, field_start);
871                                 v210_converter->convert(userdata->tex_v210[field], userdata->tex_444[field], video_format.width, video_format.height);
872                                 break;
873                         }
874                         case PixelFormat_8BitYCbCr: {
875                                 size_t field_y_start = y_offset + video_format.width * field_start_line;
876                                 size_t field_cbcr_start = cbcr_offset + cbcr_width * field_start_line * sizeof(uint16_t);
877
878                                 // Make up our own strides, since we are interleaving.
879                                 upload_texture(userdata->tex_y[field], video_format.width, video_format.height, video_format.width, interlaced_stride, GL_RED, GL_UNSIGNED_BYTE, field_y_start);
880                                 upload_texture(userdata->tex_cbcr[field], cbcr_width, cbcr_height, cbcr_width * sizeof(uint16_t), interlaced_stride, GL_RG, GL_UNSIGNED_BYTE, field_cbcr_start);
881                                 break;
882                         }
883                         case PixelFormat_8BitYCbCrPlanar: {
884                                 assert(field_start_line == 0);  // We don't really support interlaced here.
885                                 size_t field_y_start = y_offset;
886                                 size_t field_cb_start = cbcr_offset;
887                                 size_t field_cr_start = cbcr_offset + cbcr_width * cbcr_height;
888
889                                 // Make up our own strides, since we are interleaving.
890                                 upload_texture(userdata->tex_y[field], video_format.width, video_format.height, video_format.width, interlaced_stride, GL_RED, GL_UNSIGNED_BYTE, field_y_start);
891                                 upload_texture(userdata->tex_cb[field], cbcr_width, cbcr_height, cbcr_width, interlaced_stride, GL_RED, GL_UNSIGNED_BYTE, field_cb_start);
892                                 upload_texture(userdata->tex_cr[field], cbcr_width, cbcr_height, cbcr_width, interlaced_stride, GL_RED, GL_UNSIGNED_BYTE, field_cr_start);
893                                 break;
894                         }
895                         case PixelFormat_8BitBGRA: {
896                                 size_t field_start = video_offset + video_format.stride * field_start_line;
897                                 upload_texture(userdata->tex_rgba[field], video_format.width, video_format.height, video_format.stride, interlaced_stride, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, field_start);
898                                 // These could be asked to deliver mipmaps at any time.
899                                 glBindTexture(GL_TEXTURE_2D, userdata->tex_rgba[field]);
900                                 check_error();
901                                 glGenerateMipmap(GL_TEXTURE_2D);
902                                 check_error();
903                                 glBindTexture(GL_TEXTURE_2D, 0);
904                                 check_error();
905                                 break;
906                         }
907                         default:
908                                 assert(false);
909                         }
910
911                         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
912                         check_error();
913                 };
914
915                 if (field == 1) {
916                         // Don't upload the second field as fast as we can; wait until
917                         // the field time has approximately passed. (Otherwise, we could
918                         // get timing jitter against the other sources, and possibly also
919                         // against the video display, although the latter is not as critical.)
920                         // This requires our system clock to be reasonably close to the
921                         // video clock, but that's not an unreasonable assumption.
922                         steady_clock::time_point second_field_start = frame_upload_start +
923                                 nanoseconds(frame_length * 1000000000 / TIMEBASE);
924                         this_thread::sleep_until(second_field_start);
925                 }
926
927                 {
928                         unique_lock<mutex> lock(card_mutex);
929                         CaptureCard::NewFrame new_frame;
930                         new_frame.frame = frame;
931                         new_frame.length = frame_length;
932                         new_frame.field = field;
933                         new_frame.interlaced = video_format.interlaced;
934                         new_frame.upload_func = upload_func;
935                         new_frame.dropped_frames = dropped_frames;
936                         new_frame.received_timestamp = video_frame.received_timestamp;  // Ignore the audio timestamp.
937                         card->new_frames.push_back(move(new_frame));
938                         card->jitter_history.frame_arrived(video_frame.received_timestamp, frame_length, dropped_frames);
939                 }
940                 card->new_frames_changed.notify_all();
941         }
942 }
943
944 void Mixer::bm_hotplug_add(libusb_device *dev)
945 {
946         lock_guard<mutex> lock(hotplug_mutex);
947         hotplugged_cards.push_back(dev);
948 }
949
950 void Mixer::bm_hotplug_remove(unsigned card_index)
951 {
952         cards[card_index].new_frames_changed.notify_all();
953 }
954
955 void Mixer::thread_func()
956 {
957         pthread_setname_np(pthread_self(), "Mixer_OpenGL");
958
959         eglBindAPI(EGL_OPENGL_API);
960         QOpenGLContext *context = create_context(mixer_surface);
961         if (!make_current(context, mixer_surface)) {
962                 printf("oops\n");
963                 exit(1);
964         }
965
966         // Start the actual capture. (We don't want to do it before we're actually ready
967         // to process output frames.)
968         for (unsigned card_index = 0; card_index < num_cards + num_video_inputs + num_html_inputs; ++card_index) {
969                 if (int(card_index) != output_card_index) {
970                         cards[card_index].capture->start_bm_capture();
971                 }
972         }
973
974         BasicStats basic_stats(/*verbose=*/true);
975         int stats_dropped_frames = 0;
976
977         while (!should_quit) {
978                 if (desired_output_card_index != output_card_index) {
979                         set_output_card_internal(desired_output_card_index);
980                 }
981                 if (output_card_index != -1 &&
982                     desired_output_video_mode != output_video_mode) {
983                         DeckLinkOutput *output = cards[output_card_index].output.get();
984                         output->end_output();
985                         desired_output_video_mode = output_video_mode = output->pick_video_mode(desired_output_video_mode);
986                         output->start_output(desired_output_video_mode, pts_int);
987                 }
988
989                 CaptureCard::NewFrame new_frames[MAX_VIDEO_CARDS];
990                 bool has_new_frame[MAX_VIDEO_CARDS] = { false };
991
992                 bool master_card_is_output;
993                 unsigned master_card_index;
994                 if (output_card_index != -1) {
995                         master_card_is_output = true;
996                         master_card_index = output_card_index;
997                 } else {
998                         master_card_is_output = false;
999                         master_card_index = theme->map_signal(master_clock_channel);
1000                         assert(master_card_index < num_cards);
1001                 }
1002
1003                 OutputFrameInfo output_frame_info = get_one_frame_from_each_card(master_card_index, master_card_is_output, new_frames, has_new_frame);
1004                 schedule_audio_resampling_tasks(output_frame_info.dropped_frames, output_frame_info.num_samples, output_frame_info.frame_duration, output_frame_info.is_preroll, output_frame_info.frame_timestamp);
1005                 stats_dropped_frames += output_frame_info.dropped_frames;
1006
1007                 handle_hotplugged_cards();
1008
1009                 for (unsigned card_index = 0; card_index < num_cards + num_video_inputs + num_html_inputs; ++card_index) {
1010                         if (card_index == master_card_index || !has_new_frame[card_index]) {
1011                                 continue;
1012                         }
1013                         if (new_frames[card_index].frame->len == 0) {
1014                                 ++new_frames[card_index].dropped_frames;
1015                         }
1016                         if (new_frames[card_index].dropped_frames > 0) {
1017                                 printf("Card %u dropped %d frames before this\n",
1018                                         card_index, int(new_frames[card_index].dropped_frames));
1019                         }
1020                 }
1021
1022                 // If the first card is reporting a corrupted or otherwise dropped frame,
1023                 // just increase the pts (skipping over this frame) and don't try to compute anything new.
1024                 if (!master_card_is_output && new_frames[master_card_index].frame->len == 0) {
1025                         ++stats_dropped_frames;
1026                         pts_int += new_frames[master_card_index].length;
1027                         continue;
1028                 }
1029
1030                 for (unsigned card_index = 0; card_index < num_cards + num_video_inputs + num_html_inputs; ++card_index) {
1031                         if (!has_new_frame[card_index] || new_frames[card_index].frame->len == 0)
1032                                 continue;
1033
1034                         CaptureCard::NewFrame *new_frame = &new_frames[card_index];
1035                         assert(new_frame->frame != nullptr);
1036                         insert_new_frame(new_frame->frame, new_frame->field, new_frame->interlaced, card_index, &input_state);
1037                         check_error();
1038
1039                         // The new texture might need uploading before use.
1040                         if (new_frame->upload_func) {
1041                                 new_frame->upload_func();
1042                                 new_frame->upload_func = nullptr;
1043                         }
1044                 }
1045
1046                 int64_t frame_duration = output_frame_info.frame_duration;
1047                 render_one_frame(frame_duration);
1048                 ++frame_num;
1049                 pts_int += frame_duration;
1050
1051                 basic_stats.update(frame_num, stats_dropped_frames);
1052                 // if (frame_num % 100 == 0) chain->print_phase_timing();
1053
1054                 if (should_cut.exchange(false)) {  // Test and clear.
1055                         video_encoder->do_cut(frame_num);
1056                 }
1057
1058 #if 0
1059                 // Reset every 100 frames, so that local variations in frame times
1060                 // (especially for the first few frames, when the shaders are
1061                 // compiled etc.) don't make it hard to measure for the entire
1062                 // remaining duration of the program.
1063                 if (frame == 10000) {
1064                         frame = 0;
1065                         start = now;
1066                 }
1067 #endif
1068                 check_error();
1069         }
1070
1071         resource_pool->clean_context();
1072 }
1073
1074 bool Mixer::input_card_is_master_clock(unsigned card_index, unsigned master_card_index) const
1075 {
1076         if (output_card_index != -1) {
1077                 // The output card (ie., cards[output_card_index].output) is the master clock,
1078                 // so no input card (ie., cards[card_index].capture) is.
1079                 return false;
1080         }
1081         return (card_index == master_card_index);
1082 }
1083
1084 void Mixer::trim_queue(CaptureCard *card, size_t safe_queue_length)
1085 {
1086         // Count the number of frames in the queue, including any frames
1087         // we dropped. It's hard to know exactly how we should deal with
1088         // dropped (corrupted) input frames; they don't help our goal of
1089         // avoiding starvation, but they still add to the problem of latency.
1090         // Since dropped frames is going to mean a bump in the signal anyway,
1091         // we err on the side of having more stable latency instead.
1092         unsigned queue_length = 0;
1093         for (const CaptureCard::NewFrame &frame : card->new_frames) {
1094                 queue_length += frame.dropped_frames + 1;
1095         }
1096
1097         // If needed, drop frames until the queue is below the safe limit.
1098         // We prefer to drop from the head, because all else being equal,
1099         // we'd like more recent frames (less latency).
1100         unsigned dropped_frames = 0;
1101         while (queue_length > safe_queue_length) {
1102                 assert(!card->new_frames.empty());
1103                 assert(queue_length > card->new_frames.front().dropped_frames);
1104                 queue_length -= card->new_frames.front().dropped_frames;
1105
1106                 if (queue_length <= safe_queue_length) {
1107                         // No need to drop anything.
1108                         break;
1109                 }
1110
1111                 card->new_frames.pop_front();
1112                 card->new_frames_changed.notify_all();
1113                 --queue_length;
1114                 ++dropped_frames;
1115         }
1116
1117         card->metric_input_dropped_frames_jitter += dropped_frames;
1118         card->metric_input_queue_length_frames = queue_length;
1119
1120 #if 0
1121         if (dropped_frames > 0) {
1122                 fprintf(stderr, "Card %u dropped %u frame(s) to keep latency down.\n",
1123                         card_index, dropped_frames);
1124         }
1125 #endif
1126 }
1127
1128 pair<string, string> Mixer::get_channels_json()
1129 {
1130         Channels ret;
1131         for (int channel_idx = 2; channel_idx < theme->get_num_channels(); ++channel_idx) {
1132                 Channel *channel = ret.add_channel();
1133                 channel->set_index(channel_idx);
1134                 channel->set_name(theme->get_channel_name(channel_idx));
1135                 channel->set_color(theme->get_channel_color(channel_idx));
1136         }
1137         string contents;
1138         google::protobuf::util::MessageToJsonString(ret, &contents);  // Ignore any errors.
1139         return make_pair(contents, "text/json");
1140 }
1141
1142 pair<string, string> Mixer::get_channel_color_http(unsigned channel_idx)
1143 {
1144         return make_pair(theme->get_channel_color(channel_idx), "text/plain");
1145 }
1146
1147 Mixer::OutputFrameInfo Mixer::get_one_frame_from_each_card(unsigned master_card_index, bool master_card_is_output, CaptureCard::NewFrame new_frames[MAX_VIDEO_CARDS], bool has_new_frame[MAX_VIDEO_CARDS])
1148 {
1149         OutputFrameInfo output_frame_info;
1150 start:
1151         unique_lock<mutex> lock(card_mutex, defer_lock);
1152         if (master_card_is_output) {
1153                 // Clocked to the output, so wait for it to be ready for the next frame.
1154                 cards[master_card_index].output->wait_for_frame(pts_int, &output_frame_info.dropped_frames, &output_frame_info.frame_duration, &output_frame_info.is_preroll, &output_frame_info.frame_timestamp);
1155                 lock.lock();
1156         } else {
1157                 // Wait for the master card to have a new frame.
1158                 // TODO: Add a timeout.
1159                 output_frame_info.is_preroll = false;
1160                 lock.lock();
1161                 cards[master_card_index].new_frames_changed.wait(lock, [this, master_card_index]{ return !cards[master_card_index].new_frames.empty() || cards[master_card_index].capture->get_disconnected(); });
1162         }
1163
1164         if (master_card_is_output) {
1165                 handle_hotplugged_cards();
1166         } else if (cards[master_card_index].new_frames.empty()) {
1167                 // We were woken up, but not due to a new frame. Deal with it
1168                 // and then restart.
1169                 assert(cards[master_card_index].capture->get_disconnected());
1170                 handle_hotplugged_cards();
1171                 lock.unlock();
1172                 goto start;
1173         }
1174
1175         for (unsigned card_index = 0; card_index < num_cards + num_video_inputs + num_html_inputs; ++card_index) {
1176                 CaptureCard *card = &cards[card_index];
1177                 if (card->new_frames.empty()) {  // Starvation.
1178                         ++card->metric_input_duped_frames;
1179                 } else {
1180                         new_frames[card_index] = move(card->new_frames.front());
1181                         has_new_frame[card_index] = true;
1182                         card->new_frames.pop_front();
1183                         card->new_frames_changed.notify_all();
1184                 }
1185         }
1186
1187         if (!master_card_is_output) {
1188                 output_frame_info.frame_timestamp = new_frames[master_card_index].received_timestamp;
1189                 output_frame_info.dropped_frames = new_frames[master_card_index].dropped_frames;
1190                 output_frame_info.frame_duration = new_frames[master_card_index].length;
1191         }
1192
1193         if (!output_frame_info.is_preroll) {
1194                 output_jitter_history.frame_arrived(output_frame_info.frame_timestamp, output_frame_info.frame_duration, output_frame_info.dropped_frames);
1195         }
1196
1197         for (unsigned card_index = 0; card_index < num_cards + num_video_inputs + num_html_inputs; ++card_index) {
1198                 CaptureCard *card = &cards[card_index];
1199                 if (has_new_frame[card_index] &&
1200                     !input_card_is_master_clock(card_index, master_card_index) &&
1201                     !output_frame_info.is_preroll) {
1202                         card->queue_length_policy.update_policy(
1203                                 output_frame_info.frame_timestamp,
1204                                 card->jitter_history.get_expected_next_frame(),
1205                                 new_frames[master_card_index].length,
1206                                 output_frame_info.frame_duration,
1207                                 card->jitter_history.estimate_max_jitter(),
1208                                 output_jitter_history.estimate_max_jitter());
1209                         trim_queue(card, min<int>(global_flags.max_input_queue_frames,
1210                                                   card->queue_length_policy.get_safe_queue_length()));
1211                 }
1212         }
1213
1214         // This might get off by a fractional sample when changing master card
1215         // between ones with different frame rates, but that's fine.
1216         int num_samples_times_timebase = OUTPUT_FREQUENCY * output_frame_info.frame_duration + fractional_samples;
1217         output_frame_info.num_samples = num_samples_times_timebase / TIMEBASE;
1218         fractional_samples = num_samples_times_timebase % TIMEBASE;
1219         assert(output_frame_info.num_samples >= 0);
1220
1221         return output_frame_info;
1222 }
1223
1224 void Mixer::handle_hotplugged_cards()
1225 {
1226         // Check for cards that have been disconnected since last frame.
1227         for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
1228                 CaptureCard *card = &cards[card_index];
1229                 if (card->capture->get_disconnected()) {
1230                         fprintf(stderr, "Card %u went away, replacing with a fake card.\n", card_index);
1231                         FakeCapture *capture = new FakeCapture(global_flags.width, global_flags.height, FAKE_FPS, OUTPUT_FREQUENCY, card_index, global_flags.fake_cards_audio);
1232                         configure_card(card_index, capture, CardType::FAKE_CAPTURE, /*output=*/nullptr);
1233                         card->queue_length_policy.reset(card_index);
1234                         card->capture->start_bm_capture();
1235                 }
1236         }
1237
1238         // Check for cards that have been connected since last frame.
1239         vector<libusb_device *> hotplugged_cards_copy;
1240         {
1241                 lock_guard<mutex> lock(hotplug_mutex);
1242                 swap(hotplugged_cards, hotplugged_cards_copy);
1243         }
1244         for (libusb_device *new_dev : hotplugged_cards_copy) {
1245                 // Look for a fake capture card where we can stick this in.
1246                 int free_card_index = -1;
1247                 for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
1248                         if (cards[card_index].is_fake_capture) {
1249                                 free_card_index = card_index;
1250                                 break;
1251                         }
1252                 }
1253
1254                 if (free_card_index == -1) {
1255                         fprintf(stderr, "New card plugged in, but no free slots -- ignoring.\n");
1256                         libusb_unref_device(new_dev);
1257                 } else {
1258                         // BMUSBCapture takes ownership.
1259                         fprintf(stderr, "New card plugged in, choosing slot %d.\n", free_card_index);
1260                         CaptureCard *card = &cards[free_card_index];
1261                         BMUSBCapture *capture = new BMUSBCapture(free_card_index, new_dev);
1262                         configure_card(free_card_index, capture, CardType::LIVE_CARD, /*output=*/nullptr);
1263                         card->queue_length_policy.reset(free_card_index);
1264                         capture->set_card_disconnected_callback(bind(&Mixer::bm_hotplug_remove, this, free_card_index));
1265                         capture->start_bm_capture();
1266                 }
1267         }
1268 }
1269
1270
1271 void Mixer::schedule_audio_resampling_tasks(unsigned dropped_frames, int num_samples_per_frame, int length_per_frame, bool is_preroll, steady_clock::time_point frame_timestamp)
1272 {
1273         // Resample the audio as needed, including from previously dropped frames.
1274         assert(num_cards > 0);
1275         for (unsigned frame_num = 0; frame_num < dropped_frames + 1; ++frame_num) {
1276                 const bool dropped_frame = (frame_num != dropped_frames);
1277                 {
1278                         // Signal to the audio thread to process this frame.
1279                         // Note that if the frame is a dropped frame, we signal that
1280                         // we don't want to use this frame as base for adjusting
1281                         // the resampler rate. The reason for this is that the timing
1282                         // of these frames is often way too late; they typically don't
1283                         // “arrive” before we synthesize them. Thus, we could end up
1284                         // in a situation where we have inserted e.g. five audio frames
1285                         // into the queue before we then start pulling five of them
1286                         // back out. This makes ResamplingQueue overestimate the delay,
1287                         // causing undue resampler changes. (We _do_ use the last,
1288                         // non-dropped frame; perhaps we should just discard that as well,
1289                         // since dropped frames are expected to be rare, and it might be
1290                         // better to just wait until we have a slightly more normal situation).
1291                         unique_lock<mutex> lock(audio_mutex);
1292                         bool adjust_rate = !dropped_frame && !is_preroll;
1293                         audio_task_queue.push(AudioTask{pts_int, num_samples_per_frame, adjust_rate, frame_timestamp});
1294                         audio_task_queue_changed.notify_one();
1295                 }
1296                 if (dropped_frame) {
1297                         // For dropped frames, increase the pts. Note that if the format changed
1298                         // in the meantime, we have no way of detecting that; we just have to
1299                         // assume the frame length is always the same.
1300                         pts_int += length_per_frame;
1301                 }
1302         }
1303 }
1304
1305 void Mixer::render_one_frame(int64_t duration)
1306 {
1307         // Determine the time code for this frame before we start rendering.
1308         string timecode_text = timecode_renderer->get_timecode_text(double(pts_int) / TIMEBASE, frame_num);
1309         if (display_timecode_on_stdout) {
1310                 printf("Timecode: '%s'\n", timecode_text.c_str());
1311         }
1312
1313         // Update Y'CbCr settings for all cards.
1314         {
1315                 unique_lock<mutex> lock(card_mutex);
1316                 for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
1317                         YCbCrInterpretation *interpretation = &ycbcr_interpretation[card_index];
1318                         input_state.ycbcr_coefficients_auto[card_index] = interpretation->ycbcr_coefficients_auto;
1319                         input_state.ycbcr_coefficients[card_index] = interpretation->ycbcr_coefficients;
1320                         input_state.full_range[card_index] = interpretation->full_range;
1321                 }
1322         }
1323
1324         // Get the main chain from the theme, and set its state immediately.
1325         Theme::Chain theme_main_chain = theme->get_chain(0, pts(), global_flags.width, global_flags.height, input_state);
1326         EffectChain *chain = theme_main_chain.chain;
1327         theme_main_chain.setup_chain();
1328         //theme_main_chain.chain->enable_phase_timing(true);
1329
1330         // The theme can't (or at least shouldn't!) call connect_signal() on
1331         // each FFmpeg or CEF input, so we'll do it here.
1332         for (const pair<LiveInputWrapper *, FFmpegCapture *> &conn : theme->get_video_signal_connections()) {
1333                 conn.first->connect_signal_raw(conn.second->get_card_index(), input_state);
1334         }
1335         for (const pair<LiveInputWrapper *, CEFCapture *> &conn : theme->get_html_signal_connections()) {
1336                 conn.first->connect_signal_raw(conn.second->get_card_index(), input_state);
1337         }
1338
1339         // If HDMI/SDI output is active and the user has requested auto mode,
1340         // its mode overrides the existing Y'CbCr setting for the chain.
1341         YCbCrLumaCoefficients ycbcr_output_coefficients;
1342         if (global_flags.ycbcr_auto_coefficients && output_card_index != -1) {
1343                 ycbcr_output_coefficients = cards[output_card_index].output->preferred_ycbcr_coefficients();
1344         } else {
1345                 ycbcr_output_coefficients = global_flags.ycbcr_rec709_coefficients ? YCBCR_REC_709 : YCBCR_REC_601;
1346         }
1347
1348         // TODO: Reduce the duplication against theme.cpp.
1349         YCbCrFormat output_ycbcr_format;
1350         output_ycbcr_format.chroma_subsampling_x = 1;
1351         output_ycbcr_format.chroma_subsampling_y = 1;
1352         output_ycbcr_format.luma_coefficients = ycbcr_output_coefficients;
1353         output_ycbcr_format.full_range = false;
1354         output_ycbcr_format.num_levels = 1 << global_flags.x264_bit_depth;
1355         chain->change_ycbcr_output_format(output_ycbcr_format);
1356
1357         // Render main chain. If we're using zerocopy Quick Sync encoding
1358         // (the default case), we take an extra copy of the created outputs,
1359         // so that we can display it back to the screen later (it's less memory
1360         // bandwidth than writing and reading back an RGBA texture, even at 16-bit).
1361         // Ideally, we'd like to avoid taking copies and just use the main textures
1362         // for display as well, but they're just views into VA-API memory and must be
1363         // unmapped during encoding, so we can't use them for display, unfortunately.
1364         GLuint y_tex, cbcr_full_tex, cbcr_tex;
1365         GLuint y_copy_tex, cbcr_copy_tex = 0;
1366         GLuint y_display_tex, cbcr_display_tex;
1367         GLenum y_type = (global_flags.x264_bit_depth > 8) ? GL_R16 : GL_R8;
1368         GLenum cbcr_type = (global_flags.x264_bit_depth > 8) ? GL_RG16 : GL_RG8;
1369         const bool is_zerocopy = video_encoder->is_zerocopy();
1370         if (is_zerocopy) {
1371                 cbcr_full_tex = resource_pool->create_2d_texture(cbcr_type, global_flags.width, global_flags.height);
1372                 y_copy_tex = resource_pool->create_2d_texture(y_type, global_flags.width, global_flags.height);
1373                 cbcr_copy_tex = resource_pool->create_2d_texture(cbcr_type, global_flags.width / 2, global_flags.height / 2);
1374
1375                 y_display_tex = y_copy_tex;
1376                 cbcr_display_tex = cbcr_copy_tex;
1377
1378                 // y_tex and cbcr_tex will be given by VideoEncoder.
1379         } else {
1380                 cbcr_full_tex = resource_pool->create_2d_texture(cbcr_type, global_flags.width, global_flags.height);
1381                 y_tex = resource_pool->create_2d_texture(y_type, global_flags.width, global_flags.height);
1382                 cbcr_tex = resource_pool->create_2d_texture(cbcr_type, global_flags.width / 2, global_flags.height / 2);
1383
1384                 y_display_tex = y_tex;
1385                 cbcr_display_tex = cbcr_tex;
1386         }
1387
1388         const int64_t av_delay = lrint(global_flags.audio_queue_length_ms * 0.001 * TIMEBASE);  // Corresponds to the delay in ResamplingQueue.
1389         bool got_frame = video_encoder->begin_frame(pts_int + av_delay, duration, ycbcr_output_coefficients, theme_main_chain.input_frames, &y_tex, &cbcr_tex);
1390         assert(got_frame);
1391
1392         GLuint fbo;
1393         if (is_zerocopy) {
1394                 fbo = resource_pool->create_fbo(y_tex, cbcr_full_tex, y_copy_tex);
1395         } else {
1396                 fbo = resource_pool->create_fbo(y_tex, cbcr_full_tex);
1397         }
1398         check_error();
1399         chain->render_to_fbo(fbo, global_flags.width, global_flags.height);
1400
1401         if (display_timecode_in_stream) {
1402                 // Render the timecode on top.
1403                 timecode_renderer->render_timecode(fbo, timecode_text);
1404         }
1405
1406         resource_pool->release_fbo(fbo);
1407
1408         if (is_zerocopy) {
1409                 chroma_subsampler->subsample_chroma(cbcr_full_tex, global_flags.width, global_flags.height, cbcr_tex, cbcr_copy_tex);
1410         } else {
1411                 chroma_subsampler->subsample_chroma(cbcr_full_tex, global_flags.width, global_flags.height, cbcr_tex);
1412         }
1413         if (output_card_index != -1) {
1414                 cards[output_card_index].output->send_frame(y_tex, cbcr_full_tex, ycbcr_output_coefficients, theme_main_chain.input_frames, pts_int, duration);
1415         }
1416         resource_pool->release_2d_texture(cbcr_full_tex);
1417
1418         // Set the right state for the Y' and CbCr textures we use for display.
1419         glBindFramebuffer(GL_FRAMEBUFFER, 0);
1420         glBindTexture(GL_TEXTURE_2D, y_display_tex);
1421         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1422         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1423         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1424
1425         glBindTexture(GL_TEXTURE_2D, cbcr_display_tex);
1426         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1427         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1428         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1429
1430         RefCountedGLsync fence = video_encoder->end_frame();
1431
1432         // The live frame pieces the Y'CbCr texture copies back into RGB and displays them.
1433         // It owns y_display_tex and cbcr_display_tex now (whichever textures they are).
1434         DisplayFrame live_frame;
1435         live_frame.chain = display_chain.get();
1436         live_frame.setup_chain = [this, y_display_tex, cbcr_display_tex]{
1437                 display_input->set_texture_num(0, y_display_tex);
1438                 display_input->set_texture_num(1, cbcr_display_tex);
1439         };
1440         live_frame.ready_fence = fence;
1441         live_frame.input_frames = {};
1442         live_frame.temp_textures = { y_display_tex, cbcr_display_tex };
1443         output_channel[OUTPUT_LIVE].output_frame(move(live_frame));
1444
1445         // Set up preview and any additional channels.
1446         for (int i = 1; i < theme->get_num_channels() + 2; ++i) {
1447                 DisplayFrame display_frame;
1448                 Theme::Chain chain = theme->get_chain(i, pts(), global_flags.width, global_flags.height, input_state);  // FIXME: dimensions
1449                 display_frame.chain = move(chain.chain);
1450                 display_frame.setup_chain = move(chain.setup_chain);
1451                 display_frame.ready_fence = fence;
1452                 display_frame.input_frames = move(chain.input_frames);
1453                 display_frame.temp_textures = {};
1454                 output_channel[i].output_frame(move(display_frame));
1455         }
1456 }
1457
1458 void Mixer::audio_thread_func()
1459 {
1460         pthread_setname_np(pthread_self(), "Mixer_Audio");
1461
1462         while (!should_quit) {
1463                 AudioTask task;
1464
1465                 {
1466                         unique_lock<mutex> lock(audio_mutex);
1467                         audio_task_queue_changed.wait(lock, [this]{ return should_quit || !audio_task_queue.empty(); });
1468                         if (should_quit) {
1469                                 return;
1470                         }
1471                         task = audio_task_queue.front();
1472                         audio_task_queue.pop();
1473                 }
1474
1475                 ResamplingQueue::RateAdjustmentPolicy rate_adjustment_policy =
1476                         task.adjust_rate ? ResamplingQueue::ADJUST_RATE : ResamplingQueue::DO_NOT_ADJUST_RATE;
1477                 vector<float> samples_out = audio_mixer.get_output(
1478                         task.frame_timestamp,
1479                         task.num_samples,
1480                         rate_adjustment_policy);
1481
1482                 // Send the samples to the sound card, then add them to the output.
1483                 if (alsa) {
1484                         alsa->write(samples_out);
1485                 }
1486                 if (output_card_index != -1) {
1487                         const int64_t av_delay = lrint(global_flags.audio_queue_length_ms * 0.001 * TIMEBASE);  // Corresponds to the delay in ResamplingQueue.
1488                         cards[output_card_index].output->send_audio(task.pts_int + av_delay, samples_out);
1489                 }
1490                 video_encoder->add_audio(task.pts_int, move(samples_out));
1491         }
1492 }
1493
1494 void Mixer::release_display_frame(DisplayFrame *frame)
1495 {
1496         for (GLuint texnum : frame->temp_textures) {
1497                 resource_pool->release_2d_texture(texnum);
1498         }
1499         frame->temp_textures.clear();
1500         frame->ready_fence.reset();
1501         frame->input_frames.clear();
1502 }
1503
1504 void Mixer::start()
1505 {
1506         mixer_thread = thread(&Mixer::thread_func, this);
1507         audio_thread = thread(&Mixer::audio_thread_func, this);
1508 }
1509
1510 void Mixer::quit()
1511 {
1512         should_quit = true;
1513         audio_task_queue_changed.notify_one();
1514         mixer_thread.join();
1515         audio_thread.join();
1516 }
1517
1518 void Mixer::transition_clicked(int transition_num)
1519 {
1520         theme->transition_clicked(transition_num, pts());
1521 }
1522
1523 void Mixer::channel_clicked(int preview_num)
1524 {
1525         theme->channel_clicked(preview_num);
1526 }
1527
1528 YCbCrInterpretation Mixer::get_input_ycbcr_interpretation(unsigned card_index) const
1529 {
1530         unique_lock<mutex> lock(card_mutex);
1531         return ycbcr_interpretation[card_index];
1532 }
1533
1534 void Mixer::set_input_ycbcr_interpretation(unsigned card_index, const YCbCrInterpretation &interpretation)
1535 {
1536         unique_lock<mutex> lock(card_mutex);
1537         ycbcr_interpretation[card_index] = interpretation;
1538 }
1539
1540 void Mixer::start_mode_scanning(unsigned card_index)
1541 {
1542         assert(card_index < num_cards);
1543         if (is_mode_scanning[card_index]) {
1544                 return;
1545         }
1546         is_mode_scanning[card_index] = true;
1547         mode_scanlist[card_index].clear();
1548         for (const auto &mode : cards[card_index].capture->get_available_video_modes()) {
1549                 mode_scanlist[card_index].push_back(mode.first);
1550         }
1551         assert(!mode_scanlist[card_index].empty());
1552         mode_scanlist_index[card_index] = 0;
1553         cards[card_index].capture->set_video_mode(mode_scanlist[card_index][0]);
1554         last_mode_scan_change[card_index] = steady_clock::now();
1555 }
1556
1557 map<uint32_t, VideoMode> Mixer::get_available_output_video_modes() const
1558 {
1559         assert(desired_output_card_index != -1);
1560         unique_lock<mutex> lock(card_mutex);
1561         return cards[desired_output_card_index].output->get_available_video_modes();
1562 }
1563
1564 Mixer::OutputChannel::~OutputChannel()
1565 {
1566         if (has_current_frame) {
1567                 parent->release_display_frame(&current_frame);
1568         }
1569         if (has_ready_frame) {
1570                 parent->release_display_frame(&ready_frame);
1571         }
1572 }
1573
1574 void Mixer::OutputChannel::output_frame(DisplayFrame &&frame)
1575 {
1576         // Store this frame for display. Remove the ready frame if any
1577         // (it was seemingly never used).
1578         {
1579                 unique_lock<mutex> lock(frame_mutex);
1580                 if (has_ready_frame) {
1581                         parent->release_display_frame(&ready_frame);
1582                 }
1583                 ready_frame = move(frame);
1584                 has_ready_frame = true;
1585
1586                 // Call the callbacks under the mutex (they should be short),
1587                 // so that we don't race against a callback removal.
1588                 for (const auto &key_and_callback : new_frame_ready_callbacks) {
1589                         key_and_callback.second();
1590                 }
1591         }
1592
1593         // Reduce the number of callbacks by filtering duplicates. The reason
1594         // why we bother doing this is that Qt seemingly can get into a state
1595         // where its builds up an essentially unbounded queue of signals,
1596         // consuming more and more memory, and there's no good way of collapsing
1597         // user-defined signals or limiting the length of the queue.
1598         if (transition_names_updated_callback) {
1599                 vector<string> transition_names = global_mixer->get_transition_names();
1600                 bool changed = false;
1601                 if (transition_names.size() != last_transition_names.size()) {
1602                         changed = true;
1603                 } else {
1604                         for (unsigned i = 0; i < transition_names.size(); ++i) {
1605                                 if (transition_names[i] != last_transition_names[i]) {
1606                                         changed = true;
1607                                         break;
1608                                 }
1609                         }
1610                 }
1611                 if (changed) {
1612                         transition_names_updated_callback(transition_names);
1613                         last_transition_names = transition_names;
1614                 }
1615         }
1616         if (name_updated_callback) {
1617                 string name = global_mixer->get_channel_name(channel);
1618                 if (name != last_name) {
1619                         name_updated_callback(name);
1620                         last_name = name;
1621                 }
1622         }
1623         if (color_updated_callback) {
1624                 string color = global_mixer->get_channel_color(channel);
1625                 if (color != last_color) {
1626                         color_updated_callback(color);
1627                         last_color = color;
1628                 }
1629         }
1630 }
1631
1632 bool Mixer::OutputChannel::get_display_frame(DisplayFrame *frame)
1633 {
1634         unique_lock<mutex> lock(frame_mutex);
1635         if (!has_current_frame && !has_ready_frame) {
1636                 return false;
1637         }
1638
1639         if (has_current_frame && has_ready_frame) {
1640                 // We have a new ready frame. Toss the current one.
1641                 parent->release_display_frame(&current_frame);
1642                 has_current_frame = false;
1643         }
1644         if (has_ready_frame) {
1645                 assert(!has_current_frame);
1646                 current_frame = move(ready_frame);
1647                 ready_frame.ready_fence.reset();  // Drop the refcount.
1648                 ready_frame.input_frames.clear();  // Drop the refcounts.
1649                 has_current_frame = true;
1650                 has_ready_frame = false;
1651         }
1652
1653         *frame = current_frame;
1654         return true;
1655 }
1656
1657 void Mixer::OutputChannel::add_frame_ready_callback(void *key, Mixer::new_frame_ready_callback_t callback)
1658 {
1659         unique_lock<mutex> lock(frame_mutex);
1660         new_frame_ready_callbacks[key] = callback;
1661 }
1662
1663 void Mixer::OutputChannel::remove_frame_ready_callback(void *key)
1664 {
1665         unique_lock<mutex> lock(frame_mutex);
1666         new_frame_ready_callbacks.erase(key);
1667 }
1668
1669 void Mixer::OutputChannel::set_transition_names_updated_callback(Mixer::transition_names_updated_callback_t callback)
1670 {
1671         transition_names_updated_callback = callback;
1672 }
1673
1674 void Mixer::OutputChannel::set_name_updated_callback(Mixer::name_updated_callback_t callback)
1675 {
1676         name_updated_callback = callback;
1677 }
1678
1679 void Mixer::OutputChannel::set_color_updated_callback(Mixer::color_updated_callback_t callback)
1680 {
1681         color_updated_callback = callback;
1682 }
1683
1684 mutex RefCountedGLsync::fence_lock;