Instead of undconditionally using the first input. This covers the case of one layer fully obscuring another layer, in which case that should become the new "base" layer.
Showing the changes to libavfilter (1 of 1 file). Show all
Unified · Split
| @@ -940,7 +940,11 @@ static int output_frame(AVFilterContext *ctx, int64_t pts) · 939 unmodified lines | ||
| 940 | 940 | if (!cropped && cur->repr.alpha == PL_ALPHA_NONE) { |
| 941 | 941 | idx_start = i; |
| 942 | 942 | nb_visible = 0; |
| 943 | + ref = NULL; | |
| 943 | 944 | } |
| 945 | + /* Use first visible input as overall reference */ | |
| 946 | + if (!ref) | |
| 947 | + ref = ref_frame(&in->mix); | |
| 944 | 948 | nb_visible++; |
| 945 | 949 | } |
| 946 | 950 | |
| @@ -948,15 +952,6 @@ static int output_frame(AVFilterContext *ctx, int64_t pts) · 1 unmodified line | ||
| 948 | 952 | * valid nonempty frame mix */ |
| 949 | 953 | av_assert1(nb_visible > 0); |
| 950 | 954 | |
| 951 | − /* Use the first active input as metadata reference */ | |
| 952 | − for (int i = 0; i < s->nb_inputs; i++) { | |
| 953 | − const LibplaceboInput *in = &s->inputs[i]; | |
| 954 | − if (in->qstatus == PL_QUEUE_OK && (ref = ref_frame(&in->mix))) | |
| 955 | − break; | |
| 956 | − } | |
| 957 | − if (!ref) | |
| 958 | − return 0; | |
| 959 | − | |
| 960 | 955 | out = ff_get_video_buffer(outlink, outlink->w, outlink->h); |
| 961 | 956 | if (!out) |
| 962 | 957 | return AVERROR(ENOMEM); |