]> git.sesse.net Git - nageru/blobdiff - theme.cpp
Make the default input mapping ignore the output card.
[nageru] / theme.cpp
index ef635763515ee854a9bbca8c5be8f956396871ec..84f37ba0002d07db95983828944c66bc6777d7c7 100644 (file)
--- a/theme.cpp
+++ b/theme.cpp
@@ -261,17 +261,15 @@ int EffectChain_finalize(lua_State* L)
 
        if (is_main_chain) {
                YCbCrFormat output_ycbcr_format;
-               // We actually output 4:2:0 in the end, but chroma subsampling
+               // 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;
 
@@ -965,12 +963,28 @@ int Theme::map_signal(int signal_num)
        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)