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 | @item bottom | 21189 | @item bottom |
| 21190 | @end table | 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 | @item force_original_aspect_ratio | 21248 | @item force_original_aspect_ratio |
| 21193 | Enable decreasing or increasing output video width or height if necessary to | 21249 | Enable decreasing or increasing output video width or height if necessary to |
| 21194 | keep the original aspect ratio. Possible values: | 21250 | keep the original aspect ratio. Possible values: |
| @@ -160,7 +160,10 @@ typedef struct ScaleContext { · 159 unmodified lines | |||
| 160 | 160 | ||
| 161 | int in_color_matrix; | 161 | int in_color_matrix; |
| 162 | int out_color_matrix; | 162 | int out_color_matrix; |
| 163 | 163 | int in_primaries; | |
| 164 | int out_primaries; | ||
| 165 | int in_transfer; | ||
| 166 | int out_transfer; | ||
| 164 | int in_range; | 167 | int in_range; |
| 165 | int out_range; | 168 | int out_range; |
| 166 | 169 | ||
| @@ -387,6 +390,30 @@ static av_cold int init(AVFilterContext *ctx) · 220 unmodified lines | |||
| 387 | if (ret < 0) | 390 | if (ret < 0) |
| 388 | return ret; | 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 | if (scale->in_color_matrix != -1 && !sws_test_colorspace(scale->in_color_matrix, 0)) { | 417 | if (scale->in_color_matrix != -1 && !sws_test_colorspace(scale->in_color_matrix, 0)) { |
| 391 | av_log(ctx, AV_LOG_ERROR, "Unsupported input color matrix '%s'\n", | 418 | av_log(ctx, AV_LOG_ERROR, "Unsupported input color matrix '%s'\n", |
| 392 | av_color_space_name(scale->in_color_matrix)); | 419 | av_color_space_name(scale->in_color_matrix)); |
| @@ -815,6 +842,10 @@ scale: · 422 unmodified lines | |||
| 815 | 842 | ||
| 816 | if (scale->in_color_matrix != -1) | 843 | if (scale->in_color_matrix != -1) |
| 817 | in->colorspace = scale->in_color_matrix; | 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 | if (scale->in_range != AVCOL_RANGE_UNSPECIFIED) | 849 | if (scale->in_range != AVCOL_RANGE_UNSPECIFIED) |
| 819 | in->color_range = scale->in_range; | 850 | in->color_range = scale->in_range; |
| 820 | in->chroma_location = scale->in_chroma_loc; | 851 | in->chroma_location = scale->in_chroma_loc; |
| @@ -832,6 +863,10 @@ scale: · 11 unmodified lines | |||
| 832 | out->colorspace = outlink->colorspace; | 863 | out->colorspace = outlink->colorspace; |
| 833 | if (scale->out_chroma_loc != AVCHROMA_LOC_UNSPECIFIED) | 864 | if (scale->out_chroma_loc != AVCHROMA_LOC_UNSPECIFIED) |
| 834 | out->chroma_location = scale->out_chroma_loc; | 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 | av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, | 871 | av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, |
| 837 | (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w, | 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 | {"top", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_TOP}, 0, 0, FLAGS, .unit = "chroma_loc"}, | 1119 | {"top", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_TOP}, 0, 0, FLAGS, .unit = "chroma_loc"}, |
| 1085 | {"bottomleft", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_BOTTOMLEFT}, 0, 0, FLAGS, .unit = "chroma_loc"}, | 1120 | {"bottomleft", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_BOTTOMLEFT}, 0, 0, FLAGS, .unit = "chroma_loc"}, |
| 1086 | {"bottom", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_BOTTOM}, 0, 0, FLAGS, .unit = "chroma_loc"}, | 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 | { "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 }, | 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 | { "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 }, | 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 | { "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 }, | 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 }, |