History

avfilter/vf_scale: add colorspace and transfer property options

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.

Niklas Haas committed 1 year ago

Commit b7a23331 parent 45f0a7a2 files · +128 −1Browse files

Unified · Split

2 files
  1. doc/filters.texi +56 −0
  2. libavfilter/vf_scale.c +72 −1
doc/filters.texi+56−0
@@ -21189,6 +21189,62 @@ is used by default. Possible values: · 21188 unmodified lines
21189@item bottom21189@item bottom
21190@end table21190@end table
21191 21191
21192@item in_primaries
21193@item out_primaries
21194Set in/output RGB primaries.
21195
21196This allows the autodetected value to be overridden as well as allows forcing
21197a specific value used for the output and encoder. Possible values:
21198
21199@table @samp
21200@item auto
21201Choose 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
21219Set in/output transfer response curve (TRC).
21220
21221This allows the autodetected value to be overridden as well as allows forcing
21222a specific value used for the output and encoder. Possible values:
21223
21224@table @samp
21225@item auto
21226Choose 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_ratio21248@item force_original_aspect_ratio
21193Enable decreasing or increasing output video width or height if necessary to21249Enable decreasing or increasing output video width or height if necessary to
21194keep the original aspect ratio. Possible values:21250keep the original aspect ratio. Possible values:
libavfilter/vf_scale.c+72−1
@@ -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 },

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t