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
2118921189 @item bottom
2119021190 @end table
2119121191
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+
2119221248 @item force_original_aspect_ratio
2119321249 Enable decreasing or increasing output video width or height if necessary to
2119421250 keep the original aspect ratio. Possible values:
libavfilter/vf_scale.c+72−1
@@ -160,7 +160,10 @@ typedef struct ScaleContext { · 159 unmodified lines
160160
161161 int in_color_matrix;
162162 int out_color_matrix;
163−
163+ int in_primaries;
164+ int out_primaries;
165+ int in_transfer;
166+ int out_transfer;
164167 int in_range;
165168 int out_range;
166169
@@ -387,6 +390,30 @@ static av_cold int init(AVFilterContext *ctx) · 220 unmodified lines
387390 if (ret < 0)
388391 return ret;
389392
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+
390417 if (scale->in_color_matrix != -1 && !sws_test_colorspace(scale->in_color_matrix, 0)) {
391418 av_log(ctx, AV_LOG_ERROR, "Unsupported input color matrix '%s'\n",
392419 av_color_space_name(scale->in_color_matrix));
@@ -815,6 +842,10 @@ scale: · 422 unmodified lines
815842
816843 if (scale->in_color_matrix != -1)
817844 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;
818849 if (scale->in_range != AVCOL_RANGE_UNSPECIFIED)
819850 in->color_range = scale->in_range;
820851 in->chroma_location = scale->in_chroma_loc;
@@ -832,6 +863,10 @@ scale: · 11 unmodified lines
832863 out->colorspace = outlink->colorspace;
833864 if (scale->out_chroma_loc != AVCHROMA_LOC_UNSPECIFIED)
834865 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;
835870
836871 av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den,
837872 (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w,
@@ -1084,6 +1119,42 @@ static const AVOption scale_options[] = { · 246 unmodified lines
10841119 {"top", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_TOP}, 0, 0, FLAGS, .unit = "chroma_loc"},
10851120 {"bottomleft", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_BOTTOMLEFT}, 0, 0, FLAGS, .unit = "chroma_loc"},
10861121 {"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"},
10871158 { "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 },
10881159 { "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 },
10891160 { "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