In the long run, it would be ideal if we could add these to the avfilter negotiation as well, but for now, this is a good start.
Unified · Split
| @@ -21189,6 +21189,62 @@ is used by default. Possible values: · 21188 unmodified lines | ||
| 21189 | 21189 | @item bottom |
| 21190 | 21190 | @end table |
| 21191 | 21191 | |
| 21192 | +@item in_primaries | |
| 21193 | +@item out_primaries | |
| 21194 | +Set in/output RGB primaries. | |
| 21195 | + | |
| 21196 | +This allows the autodetected value to be overridden as well as allows forcing | |
| 21197 | +a specific value used for the output and encoder. Possible values: | |
| 21198 | + | |
| 21199 | +@table @samp | |
| 21200 | +@item auto | |
| 21201 | +Choose automatically. This is the default. | |
| 21202 | + | |
| 21203 | +@item bt709 | |
| 21204 | +@item bt470m | |
| 21205 | +@item bt470bg | |
| 21206 | +@item smpte170m | |
| 21207 | +@item smpte240m | |
| 21208 | +@item film | |
| 21209 | +@item bt2020 | |
| 21210 | +@item smpte428 | |
| 21211 | +@item smpte431 | |
| 21212 | +@item smpte432 | |
| 21213 | +@item jedec-p22 | |
| 21214 | +@item ebu3213 | |
| 21215 | +@end table | |
| 21216 | + | |
| 21217 | +@item in_transfer | |
| 21218 | +@item out_transfer | |
| 21219 | +Set in/output transfer response curve (TRC). | |
| 21220 | + | |
| 21221 | +This allows the autodetected value to be overridden as well as allows forcing | |
| 21222 | +a specific value used for the output and encoder. Possible values: | |
| 21223 | + | |
| 21224 | +@table @samp | |
| 21225 | +@item auto | |
| 21226 | +Choose automatically. This is the default. | |
| 21227 | + | |
| 21228 | +@item bt709 | |
| 21229 | +@item bt470m | |
| 21230 | +@item gamma22 | |
| 21231 | +@item bt470bg | |
| 21232 | +@item gamma28 | |
| 21233 | +@item smpte170m | |
| 21234 | +@item smpte240m | |
| 21235 | +@item linear | |
| 21236 | +@item iec61966-2-1 | |
| 21237 | +@item srgb | |
| 21238 | +@item iec61966-2-4 | |
| 21239 | +@item xvycc | |
| 21240 | +@item bt1361e | |
| 21241 | +@item bt2020-10 | |
| 21242 | +@item bt2020-12 | |
| 21243 | +@item smpte2084 | |
| 21244 | +@item smpte428 | |
| 21245 | +@item arib-std-b67 | |
| 21246 | +@end table | |
| 21247 | + | |
| 21192 | 21248 | @item force_original_aspect_ratio |
| 21193 | 21249 | Enable decreasing or increasing output video width or height if necessary to |
| 21194 | 21250 | keep the original aspect ratio. Possible values: |
| @@ -160,7 +160,10 @@ typedef struct ScaleContext { · 159 unmodified lines | ||
| 160 | 160 | |
| 161 | 161 | int in_color_matrix; |
| 162 | 162 | int out_color_matrix; |
| 163 | − | |
| 163 | + int in_primaries; | |
| 164 | + int out_primaries; | |
| 165 | + int in_transfer; | |
| 166 | + int out_transfer; | |
| 164 | 167 | int in_range; |
| 165 | 168 | int out_range; |
| 166 | 169 | |
| @@ -387,6 +390,30 @@ static av_cold int init(AVFilterContext *ctx) · 220 unmodified lines | ||
| 387 | 390 | if (ret < 0) |
| 388 | 391 | return ret; |
| 389 | 392 | |
| 393 | + if (scale->in_primaries != -1 && !sws_test_primaries(scale->in_primaries, 0)) { | |
| 394 | + av_log(ctx, AV_LOG_ERROR, "Unsupported input primaries '%s'\n", | |
| 395 | + av_color_primaries_name(scale->in_primaries)); | |
| 396 | + return AVERROR(EINVAL); | |
| 397 | + } | |
| 398 | + | |
| 399 | + if (scale->out_primaries != -1 && !sws_test_primaries(scale->out_primaries, 1)) { | |
| 400 | + av_log(ctx, AV_LOG_ERROR, "Unsupported output primaries '%s'\n", | |
| 401 | + av_color_primaries_name(scale->out_primaries)); | |
| 402 | + return AVERROR(EINVAL); | |
| 403 | + } | |
| 404 | + | |
| 405 | + if (scale->in_transfer != -1 && !sws_test_transfer(scale->in_transfer, 0)) { | |
| 406 | + av_log(ctx, AV_LOG_ERROR, "Unsupported input transfer '%s'\n", | |
| 407 | + av_color_transfer_name(scale->in_transfer)); | |
| 408 | + return AVERROR(EINVAL); | |
| 409 | + } | |
| 410 | + | |
| 411 | + if (scale->out_transfer != -1 && !sws_test_transfer(scale->out_transfer, 1)) { | |
| 412 | + av_log(ctx, AV_LOG_ERROR, "Unsupported output transfer '%s'\n", | |
| 413 | + av_color_transfer_name(scale->out_transfer)); | |
| 414 | + return AVERROR(EINVAL); | |
| 415 | + } | |
| 416 | + | |
| 390 | 417 | if (scale->in_color_matrix != -1 && !sws_test_colorspace(scale->in_color_matrix, 0)) { |
| 391 | 418 | av_log(ctx, AV_LOG_ERROR, "Unsupported input color matrix '%s'\n", |
| 392 | 419 | av_color_space_name(scale->in_color_matrix)); |
| @@ -815,6 +842,10 @@ scale: · 422 unmodified lines | ||
| 815 | 842 | |
| 816 | 843 | if (scale->in_color_matrix != -1) |
| 817 | 844 | in->colorspace = scale->in_color_matrix; |
| 845 | + if (scale->in_primaries != -1) | |
| 846 | + in->color_primaries = scale->in_primaries; | |
| 847 | + if (scale->in_transfer != -1) | |
| 848 | + in->color_trc = scale->in_transfer; | |
| 818 | 849 | if (scale->in_range != AVCOL_RANGE_UNSPECIFIED) |
| 819 | 850 | in->color_range = scale->in_range; |
| 820 | 851 | in->chroma_location = scale->in_chroma_loc; |
| @@ -832,6 +863,10 @@ scale: · 11 unmodified lines | ||
| 832 | 863 | out->colorspace = outlink->colorspace; |
| 833 | 864 | if (scale->out_chroma_loc != AVCHROMA_LOC_UNSPECIFIED) |
| 834 | 865 | out->chroma_location = scale->out_chroma_loc; |
| 866 | + if (scale->out_primaries != -1) | |
| 867 | + out->color_primaries = scale->out_primaries; | |
| 868 | + if (scale->out_transfer != -1) | |
| 869 | + out->color_trc = scale->out_transfer; | |
| 835 | 870 | |
| 836 | 871 | av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, |
| 837 | 872 | (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w, |
| @@ -1084,6 +1119,42 @@ static const AVOption scale_options[] = { · 246 unmodified lines | ||
| 1084 | 1119 | {"top", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_TOP}, 0, 0, FLAGS, .unit = "chroma_loc"}, |
| 1085 | 1120 | {"bottomleft", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_BOTTOMLEFT}, 0, 0, FLAGS, .unit = "chroma_loc"}, |
| 1086 | 1121 | {"bottom", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_BOTTOM}, 0, 0, FLAGS, .unit = "chroma_loc"}, |
| 1122 | + { "in_primaries", "set input primaries", OFFSET(in_primaries), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_PRI_NB-1, .flags = FLAGS, .unit = "primaries" }, | |
| 1123 | + { "out_primaries", "set output primaries", OFFSET(out_primaries), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_PRI_NB-1, .flags = FLAGS, .unit = "primaries"}, | |
| 1124 | + {"auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1125 | + {"bt709", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT709}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1126 | + {"bt470m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT470M}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1127 | + {"bt470bg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT470BG}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1128 | + {"smpte170m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE170M}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1129 | + {"smpte240m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE240M}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1130 | + {"film", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_FILM}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1131 | + {"bt2020", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT2020}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1132 | + {"smpte428", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE428}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1133 | + {"smpte431", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE431}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1134 | + {"smpte432", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE432}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1135 | + {"jedec-p22", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_JEDEC_P22}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1136 | + {"ebu3213", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_EBU3213}, 0, 0, FLAGS, .unit = "primaries"}, | |
| 1137 | + { "in_transfer", "set output color transfer", OFFSET(in_transfer), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_TRC_NB-1, .flags = FLAGS, .unit = "transfer"}, | |
| 1138 | + {"out_transfer", "set output color transfer", OFFSET(out_transfer), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_TRC_NB-1, .flags = FLAGS, .unit = "transfer"}, | |
| 1139 | + {"auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1140 | + {"bt709", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT709}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1141 | + {"bt470m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA22}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1142 | + {"gamma22", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA22}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1143 | + {"bt470bg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA28}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1144 | + {"gamma28", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA28}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1145 | + {"smpte170m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE170M}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1146 | + {"smpte240m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE240M}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1147 | + {"linear", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_LINEAR}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1148 | + {"iec61966-2-1", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_1}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1149 | + {"srgb", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_1}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1150 | + {"iec61966-2-4", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_4}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1151 | + {"xvycc", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_4}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1152 | + {"bt1361e", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT1361_ECG}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1153 | + {"bt2020-10", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT2020_10}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1154 | + {"bt2020-12", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT2020_12}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1155 | + {"smpte2084", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE2084}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1156 | + {"smpte428", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE428}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1157 | + {"arib-std-b67", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_ARIB_STD_B67}, 0, 0, FLAGS, .unit = "transfer"}, | |
| 1087 | 1158 | { "in_v_chr_pos", "input vertical chroma position in luma grid/256" , OFFSET(in_v_chr_pos), AV_OPT_TYPE_INT, { .i64 = -513}, -513, 512, FLAGS }, |
| 1088 | 1159 | { "in_h_chr_pos", "input horizontal chroma position in luma grid/256", OFFSET(in_h_chr_pos), AV_OPT_TYPE_INT, { .i64 = -513}, -513, 512, FLAGS }, |
| 1089 | 1160 | { "out_v_chr_pos", "output vertical chroma position in luma grid/256" , OFFSET(out_v_chr_pos), AV_OPT_TYPE_INT, { .i64 = -513}, -513, 512, FLAGS }, |