if (is_main_chain) {
YCbCrFormat output_ycbcr_format;
- // We actually output 4:2:0 in the end, but chroma subsampling
- // happens in a pass not run by Movit (see Mixer::subsample_chroma()).
+ // We actually output 4:2:0 and/or 4:2:2 in the end, but chroma subsampling
+ // happens in a pass not run by Movit (see ChromaSubsampler::subsample_chroma()).
output_ycbcr_format.chroma_subsampling_x = 1;
output_ycbcr_format.chroma_subsampling_y = 1;
-
- // Rec. 709 would be the sane thing to do, but it seems many players
- // (e.g. MPlayer and VLC) just default to BT.601 coefficients no matter
- // what (see discussions in e.g. https://trac.ffmpeg.org/ticket/4978).
- // We _do_ set the right flags, though, so that a player that works
- // properly doesn't have to guess.
- output_ycbcr_format.luma_coefficients = YCBCR_REC_601;
+ if (global_flags.ycbcr_rec709_coefficients) {
+ output_ycbcr_format.luma_coefficients = YCBCR_REC_709;
+ } else {
+ output_ycbcr_format.luma_coefficients = YCBCR_REC_601;
+ }
output_ycbcr_format.full_range = false;
output_ycbcr_format.num_levels = 256;
}
for (unsigned i = 0; i < num_inputs; ++i) {
if (override_bounce) {
- inputs.push_back(new NonBouncingYCbCrInput(inout_format, input_ycbcr_format, WIDTH, HEIGHT, YCBCR_INPUT_SPLIT_Y_AND_CBCR));
+ inputs.push_back(new NonBouncingYCbCrInput(inout_format, input_ycbcr_format, global_flags.width, global_flags.height, YCBCR_INPUT_SPLIT_Y_AND_CBCR));
} else {
- inputs.push_back(new YCbCrInput(inout_format, input_ycbcr_format, WIDTH, HEIGHT, YCBCR_INPUT_SPLIT_Y_AND_CBCR));
+ inputs.push_back(new YCbCrInput(inout_format, input_ycbcr_format, global_flags.width, global_flags.height, YCBCR_INPUT_SPLIT_Y_AND_CBCR));
}
chain->add_input(inputs.back());
}
if (signal_to_card_mapping.count(signal_num)) {
return signal_to_card_mapping[signal_num];
}
- if (signal_num >= int(num_cards)) {
- fprintf(stderr, "WARNING: Theme asked for input %d, but we only have %u card(s).\n", signal_num, num_cards);
- fprintf(stderr, "Mapping to card %d instead.\n", signal_num % num_cards);
+
+ int card_index;
+ if (global_flags.output_card != -1 && num_cards > 1) {
+ // Try to exclude the output card from the default card_index.
+ card_index = signal_num % (num_cards - 1);
+ if (card_index >= global_flags.output_card) {
+ ++card_index;
+ }
+ if (signal_num >= int(num_cards - 1)) {
+ fprintf(stderr, "WARNING: Theme asked for input %d, but we only have %u input card(s) (card %d is busy with output).\n",
+ signal_num, num_cards - 1, global_flags.output_card);
+ fprintf(stderr, "Mapping to card %d instead.\n", card_index);
+ }
+ } else {
+ card_index = signal_num % num_cards;
+ if (signal_num >= int(num_cards)) {
+ fprintf(stderr, "WARNING: Theme asked for input %d, but we only have %u card(s).\n", signal_num, num_cards);
+ fprintf(stderr, "Mapping to card %d instead.\n", card_index);
+ }
}
- signal_to_card_mapping[signal_num] = signal_num % num_cards;
- return signal_num % num_cards;
+ signal_to_card_mapping[signal_num] = card_index;
+ return card_index;
}
void Theme::set_signal_mapping(int signal_num, int card_num)