X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fmixer.cpp;h=9d3b12cfd90d4bbad29f1d1bae3f54b2446a5fb6;hb=f34a3e1bbc207541842e0b54d5418d95bafc8e5b;hp=3a137d68a9b0d39b2a52388f699be0b9fa004c4b;hpb=ccc2b89c9cf879ccbd948e169a029917cc16f0ee;p=nageru diff --git a/nageru/mixer.cpp b/nageru/mixer.cpp index 3a137d6..9d3b12c 100644 --- a/nageru/mixer.cpp +++ b/nageru/mixer.cpp @@ -124,7 +124,7 @@ void ensure_texture_resolution(PBOFrameAllocator::Userdata *userdata, unsigned f cbcr_width != userdata->last_cbcr_width[field] || cbcr_height != userdata->last_cbcr_height[field]; const bool recreate_v210_texture = - global_flags.ten_bit_input && + global_flags.bit_depth > 8 && (first || v210_width != userdata->last_v210_width[field] || height != userdata->last_height[field]); if (recreate_main_texture) { @@ -364,7 +364,7 @@ Mixer::Mixer(const QSurfaceFormat &format) ycbcr_format.luma_coefficients = YCBCR_REC_601; } ycbcr_format.full_range = false; - ycbcr_format.num_levels = 1 << global_flags.x264_bit_depth; + ycbcr_format.num_levels = 1 << global_flags.bit_depth; ycbcr_format.cb_x_position = 0.0f; ycbcr_format.cr_x_position = 0.0f; ycbcr_format.cb_y_position = 0.5f; @@ -378,7 +378,7 @@ Mixer::Mixer(const QSurfaceFormat &format) // Display chain; shows the live output produced by the main chain (or rather, a copy of it). display_chain.reset(new EffectChain(global_flags.width, global_flags.height, resource_pool.get())); check_error(); - GLenum type = global_flags.x264_bit_depth > 8 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE; + GLenum type = global_flags.bit_depth > 8 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE; display_input = new YCbCrInput(inout_format, ycbcr_format, global_flags.width, global_flags.height, YCBCR_INPUT_SPLIT_Y_AND_CBCR, type); display_chain->add_input(display_input); display_chain->add_output(inout_format, OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED); @@ -511,7 +511,7 @@ Mixer::Mixer(const QSurfaceFormat &format) chroma_subsampler.reset(new ChromaSubsampler(resource_pool.get())); - if (global_flags.ten_bit_input) { + if (global_flags.bit_depth > 8) { if (!v210Converter::has_hardware_support()) { fprintf(stderr, "ERROR: --ten-bit-input requires support for OpenGL compute shaders\n"); fprintf(stderr, " (OpenGL 4.3, or GL_ARB_compute_shader + GL_ARB_shader_image_load_store).\n"); @@ -528,7 +528,7 @@ Mixer::Mixer(const QSurfaceFormat &format) v210_converter->precompile_shader(3840); v210_converter->precompile_shader(4096); } - if (global_flags.ten_bit_output) { + if (global_flags.bit_depth > 8) { if (!v210Converter::has_hardware_support()) { fprintf(stderr, "ERROR: --ten-bit-output requires support for OpenGL compute shaders\n"); fprintf(stderr, " (OpenGL 4.3, or GL_ARB_compute_shader + GL_ARB_shader_image_load_store).\n"); @@ -543,6 +543,7 @@ Mixer::Mixer(const QSurfaceFormat &format) if (global_flags.enable_alsa_output) { alsa.reset(new ALSAOutput(OUTPUT_FREQUENCY, /*num_channels=*/2)); } + output_card_is_master = global_flags.output_card_is_master; if (global_flags.output_card != -1) { desired_output_card_index = global_flags.output_card; set_output_card_internal(global_flags.output_card); @@ -608,7 +609,7 @@ void Mixer::configure_card(unsigned card_index, CaptureInterface *capture, CardT pixel_format = capture->get_current_pixel_format(); } else if (card_type == CardType::CEF_INPUT) { pixel_format = PixelFormat_8BitBGRA; - } else if (global_flags.ten_bit_input) { + } else if (global_flags.bit_depth > 8) { pixel_format = PixelFormat_10BitYCbCr; } else { pixel_format = PixelFormat_8BitYCbCr; @@ -899,7 +900,7 @@ void Mixer::set_output_card_internal(int card_index) card->jitter_history.clear(); card->capture->start_bm_capture(); desired_output_video_mode = output_video_mode = card->output->pick_video_mode(desired_output_video_mode); - card->output->start_output(desired_output_video_mode, pts_int); + card->output->start_output(desired_output_video_mode, pts_int, /*is_master_card=*/output_card_is_master); } output_card_index = card_index; output_jitter_history.clear(); @@ -1286,7 +1287,7 @@ void Mixer::thread_func() DeckLinkOutput *output = cards[output_card_index].output.get(); output->end_output(); desired_output_video_mode = output_video_mode = output->pick_video_mode(desired_output_video_mode); - output->start_output(desired_output_video_mode, pts_int); + output->start_output(desired_output_video_mode, pts_int, /*is_master_card=*/output_card_is_master); } { @@ -1299,7 +1300,7 @@ void Mixer::thread_func() bool master_card_is_output; unsigned master_card_index; - if (output_card_index != -1) { + if (output_card_index != -1 && output_card_is_master) { master_card_is_output = true; master_card_index = output_card_index; } else { @@ -1406,7 +1407,7 @@ void Mixer::thread_func() bool Mixer::input_card_is_master_clock(unsigned card_index, unsigned master_card_index) const { - if (output_card_index != -1) { + if (output_card_index != -1 && output_card_is_master) { // The output card (ie., cards[output_card_index].output) is the master clock, // so no input card (ie., cards[card_index].capture) is. return false; @@ -1820,7 +1821,7 @@ void Mixer::render_one_frame(int64_t duration) output_ycbcr_format.chroma_subsampling_y = 1; output_ycbcr_format.luma_coefficients = ycbcr_output_coefficients; output_ycbcr_format.full_range = false; - output_ycbcr_format.num_levels = 1 << global_flags.x264_bit_depth; + output_ycbcr_format.num_levels = 1 << global_flags.bit_depth; chain->change_ycbcr_output_format(output_ycbcr_format); // Render main chain. If we're using zerocopy Quick Sync encoding @@ -1833,8 +1834,8 @@ void Mixer::render_one_frame(int64_t duration) GLuint y_tex, cbcr_full_tex, cbcr_tex; GLuint y_copy_tex, cbcr_copy_tex = 0; GLuint y_display_tex, cbcr_display_tex; - GLenum y_type = (global_flags.x264_bit_depth > 8) ? GL_R16 : GL_R8; - GLenum cbcr_type = (global_flags.x264_bit_depth > 8) ? GL_RG16 : GL_RG8; + GLenum y_type = (global_flags.bit_depth > 8) ? GL_R16 : GL_R8; + GLenum cbcr_type = (global_flags.bit_depth > 8) ? GL_RG16 : GL_RG8; const bool is_zerocopy = video_encoder->is_zerocopy(); if (is_zerocopy) { cbcr_full_tex = resource_pool->create_2d_texture(cbcr_type, global_flags.width, global_flags.height); @@ -2026,7 +2027,7 @@ void Mixer::set_input_ycbcr_interpretation(unsigned card_index, const YCbCrInter void Mixer::start_mode_scanning(unsigned card_index) { assert(card_index < MAX_VIDEO_CARDS); - if (cards[card_index].capture != nullptr) { + if (cards[card_index].capture == nullptr) { // Inactive card. Should never happen. return; }