History

lavfi/vf_libplacebo: fix side data stripping logic

This was accidentally comparing s->colorspace against out->colorspace, which is wrong - the intent was to compare in->colorspace against out->colorspace. We also forgot to strip mastering metadata. Finally, the order is sort of wrong - we should strip this side data *before* process_frames, because otherwise it may end up being seen and used by libplacebo.

Niklas Haas committed 4 years ago

Commit ecf09761 parent 479f3c61 file · +12 −9Browse files

Showing the changes to libavfilter (1 of 1 file). Show all

Unified · Split

libavfilter/vf_libplacebo.c+12−9
@@ -390,7 +390,7 @@ fail: · 389 unmodified lines
390390
391391 static int filter_frame(AVFilterLink *link, AVFrame *in)
392392 {
393− int err, changed;
393+ int err, changed_csp;
394394 AVFilterContext *ctx = link->dst;
395395 LibplaceboContext *s = ctx->priv;
396396 AVFilterLink *outlink = ctx->outputs[0];
@@ -426,22 +426,25 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) · 29 unmodified lines
426426 if (s->color_primaries >= 0)
427427 out->color_primaries = s->color_primaries;
428428
429− RET(process_frames(ctx, out, in));
430−
431− int changed_csp = s->colorspace != out->colorspace ||
432− s->color_range != out->color_range ||
433− s->color_trc != out->color_trc ||
434− s->color_primaries != out->color_primaries;
429+ changed_csp = in->colorspace != out->colorspace ||
430+ in->color_range != out->color_range ||
431+ in->color_trc != out->color_trc ||
432+ in->color_primaries != out->color_primaries;
435433
434+ /* Strip side data if no longer relevant */
435+ if (changed_csp) {
436+ av_frame_remove_side_data(out, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
437+ av_frame_remove_side_data(out, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
438+ }
436439 if (s->apply_dovi || changed_csp) {
437− /* Strip side data if no longer relevant */
438440 av_frame_remove_side_data(out, AV_FRAME_DATA_DOVI_RPU_BUFFER);
439441 av_frame_remove_side_data(out, AV_FRAME_DATA_DOVI_METADATA);
440442 }
441−
442443 if (s->apply_filmgrain)
443444 av_frame_remove_side_data(out, AV_FRAME_DATA_FILM_GRAIN_PARAMS);
444445
446+ RET(process_frames(ctx, out, in));
447+
445448 av_frame_free(&in);
446449
447450 return ff_filter_frame(outlink, out);

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