History

lavfi/vf_vpp_qsv: set color properties for output

User may set color range / matrix coefficient set / primaries / transfer characteristics for output.

Haihao Xiang committed 3 years ago

Commit b66aecf1 parent b42ea031 file · +87 −3Browse files

Unified · Split

libavfilter/vf_vpp_qsv.c+87−3
@@ -61,6 +61,8 @@ typedef struct VPPContext{ · 60 unmodified lines
6161 #if QSV_ONEVPL
6262 /** Video signal info attached on the input frame */
6363 mfxExtVideoSignalInfo invsi_conf;
64+ /** Video signal info attached on the output frame */
65+ mfxExtVideoSignalInfo outvsi_conf;
6466 #endif
6567
6668 /**
@@ -104,6 +106,16 @@ typedef struct VPPContext{ · 37 unmodified lines
104106 char *ow, *oh;
105107 char *output_format_str;
106108
109+ /** The color properties for output */
110+ char *color_primaries_str;
111+ char *color_transfer_str;
112+ char *color_matrix_str;
113+
114+ int color_range;
115+ enum AVColorPrimaries color_primaries;
116+ enum AVColorTransferCharacteristic color_transfer;
117+ enum AVColorSpace color_matrix;
118+
107119 int has_passthrough; /* apply pass through mode if possible */
108120 int field_rate; /* Generate output at frame rate or field rate for deinterlace mode, 0: frame, 1: field */
109121 } VPPContext;
@@ -231,6 +243,11 @@ static av_cold int vpp_preinit(AVFilterContext *ctx) · 121 unmodified lines
231243 vpp->contrast = 1.0;
232244 vpp->transpose = -1;
233245
246+ vpp->color_range = AVCOL_RANGE_UNSPECIFIED;
247+ vpp->color_primaries = AVCOL_PRI_UNSPECIFIED;
248+ vpp->color_transfer = AVCOL_TRC_UNSPECIFIED;
249+ vpp->color_matrix = AVCOL_SPC_UNSPECIFIED;
250+
234251 vpp->has_passthrough = 1;
235252
236253 return 0;
@@ -250,6 +267,24 @@ static av_cold int vpp_init(AVFilterContext *ctx) · 13 unmodified lines
250267 }
251268 }
252269
270+#define STRING_OPTION(var_name, func_name, default_value) do { \
271+ if (vpp->var_name ## _str) { \
272+ int var = av_ ## func_name ## _from_name(vpp->var_name ## _str); \
273+ if (var < 0) { \
274+ av_log(ctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \
275+ return AVERROR(EINVAL); \
276+ } \
277+ vpp->var_name = var; \
278+ } else { \
279+ vpp->var_name = default_value; \
280+ } \
281+ } while (0)
282+
283+ STRING_OPTION(color_primaries, color_primaries, AVCOL_PRI_UNSPECIFIED);
284+ STRING_OPTION(color_transfer, color_transfer, AVCOL_TRC_UNSPECIFIED);
285+ STRING_OPTION(color_matrix, color_space, AVCOL_SPC_UNSPECIFIED);
286+
287+#undef STRING_OPTION
253288 return 0;
254289 }
255290
@@ -353,11 +388,11 @@ static int vpp_set_frame_ext_params(AVFilterContext *ctx, const AVFrame *in, AVF · 97 unmodified lines
353388 #if QSV_ONEVPL
354389 VPPContext *vpp = ctx->priv;
355390 QSVVPPContext *qsvvpp = &vpp->qsv;
356− mfxExtVideoSignalInfo invsi_conf;
391+ mfxExtVideoSignalInfo invsi_conf, outvsi_conf;
357392
358393 fp->num_ext_buf = 0;
359394
360− if (!in ||
395+ if (!in || !out ||
361396 !QSV_RUNTIME_VERSION_ATLEAST(qsvvpp->ver, 2, 0))
362397 return 0;
363398
@@ -370,9 +405,32 @@ static int vpp_set_frame_ext_params(AVFilterContext *ctx, const AVFrame *in, AVF · 6 unmodified lines
370405 invsi_conf.MatrixCoefficients = (in->colorspace == AVCOL_SPC_UNSPECIFIED) ? AVCOL_SPC_BT709 : in->colorspace;
371406 invsi_conf.ColourDescriptionPresent = 1;
372407
373− if (memcmp(&vpp->invsi_conf, &invsi_conf, sizeof(mfxExtVideoSignalInfo))) {
408+ if (vpp->color_range != AVCOL_RANGE_UNSPECIFIED)
409+ out->color_range = vpp->color_range;
410+ if (vpp->color_primaries != AVCOL_PRI_UNSPECIFIED)
411+ out->color_primaries = vpp->color_primaries;
412+ if (vpp->color_transfer != AVCOL_TRC_UNSPECIFIED)
413+ out->color_trc = vpp->color_transfer;
414+ if (vpp->color_matrix != AVCOL_SPC_UNSPECIFIED)
415+ out->colorspace = vpp->color_matrix;
416+
417+ memset(&outvsi_conf, 0, sizeof(mfxExtVideoSignalInfo));
418+ outvsi_conf.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT;
419+ outvsi_conf.Header.BufferSz = sizeof(mfxExtVideoSignalInfo);
420+ outvsi_conf.VideoFullRange = (out->color_range == AVCOL_RANGE_JPEG);
421+ outvsi_conf.ColourPrimaries = (out->color_primaries == AVCOL_PRI_UNSPECIFIED) ? AVCOL_PRI_BT709 : out->color_primaries;
422+ outvsi_conf.TransferCharacteristics = (out->color_trc == AVCOL_TRC_UNSPECIFIED) ? AVCOL_TRC_BT709 : out->color_trc;
423+ outvsi_conf.MatrixCoefficients = (out->colorspace == AVCOL_SPC_UNSPECIFIED) ? AVCOL_SPC_BT709 : out->colorspace;
424+ outvsi_conf.ColourDescriptionPresent = 1;
425+
426+ if (memcmp(&vpp->invsi_conf, &invsi_conf, sizeof(mfxExtVideoSignalInfo)) ||
427+ memcmp(&vpp->outvsi_conf, &outvsi_conf, sizeof(mfxExtVideoSignalInfo))) {
374428 vpp->invsi_conf = invsi_conf;
375429 fp->ext_buf[fp->num_ext_buf++] = (mfxExtBuffer*)&vpp->invsi_conf;
430+
431+ vpp->outvsi_conf = outvsi_conf;
432+ fp->ext_buf[fp->num_ext_buf++] = (mfxExtBuffer*)&vpp->outvsi_conf;
433+
376434 }
377435 #endif
378436
@@ -560,6 +618,10 @@ static int config_output(AVFilterLink *outlink) · 181 unmodified lines
560618 if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise ||
561619 vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip ||
562620 inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format ||
621+ vpp->color_range != AVCOL_RANGE_UNSPECIFIED ||
622+ vpp->color_primaries != AVCOL_PRI_UNSPECIFIED ||
623+ vpp->color_transfer != AVCOL_TRC_UNSPECIFIED ||
624+ vpp->color_matrix != AVCOL_SPC_UNSPECIFIED ||
563625 !vpp->has_passthrough)
564626 return ff_qsvvpp_init(ctx, &param);
565627 else {
@@ -750,6 +812,28 @@ static const AVOption vpp_options[] = { · 184 unmodified lines
750812 { "field", "Output at field rate (one frame of output for each field)",
751813 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "rate" },
752814
815+ { "out_range", "Output color range",
816+ OFFSET(color_range), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED },
817+ AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_JPEG, FLAGS, "range" },
818+ { "full", "Full range",
819+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
820+ { "limited", "Limited range",
821+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
822+ { "jpeg", "Full range",
823+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
824+ { "mpeg", "Limited range",
825+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
826+ { "tv", "Limited range",
827+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
828+ { "pc", "Full range",
829+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
830+ { "out_color_matrix", "Output color matrix coefficient set",
831+ OFFSET(color_matrix_str), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
832+ { "out_color_primaries", "Output color primaries",
833+ OFFSET(color_primaries_str), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
834+ { "out_color_transfer", "Output color transfer characteristics",
835+ OFFSET(color_transfer_str), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
836+
753837 { NULL }
754838 };
755839

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