Накладываемая картинка показывается в предпросмотре готовым куском

В окне картинки не было вовсе, хотя в ролик она попадала. Плеер получал
сам файл, а его декодер на этом webp спотыкался: «webp: invalid TIFF
header in Exif data» — накладывать стало нечего. У неподвижного кадра
есть и вторая беда: в списке кусков у него нет длины.

Теперь наложению отдаётся заготовка — обычное видео нужной длины,
сделанное тем же путём, что и остальные вставки, только цепочкой без
полей: поля тут вредны, чёрное закрыло бы нижнее видео. Масштаб уже
внутри куска, плееру остаётся поставить его на место.

Заготовки наложения собираются отдельным списком: уплощение ниже
заполняет список недостающего заново и затёрло бы их.

Проверено на том самом файле: в окне картинка легла поверх видео, в
ролике слева нижнее видео (253, 0, 0), справа картинка. Числовые
проверки в flattest: кусок собирается слоями, у верхнего слоя полей нет,
предпросмотру отдан кусок из кэша, и он заказан к созданию.
This commit is contained in:
4aiman 2026-10-16 16:36:11 +03:00
commit 766f1ad196
3 changed files with 106 additions and 4 deletions

View file

@ -1122,6 +1122,35 @@ begin
Check(Missing[0].TargetPath <> PlainPath,
'кусок с кадрированием — отдельный файл');
end;
{ Под картинкой появляется видео — и она должна лечь поверх него, а
не закрыть его своими чёрными полями. }
Proj.AddTrack('V2');
Proj.AddClip(Proj.Tracks[1], Media, 0, 5, 0);
FlattenStream(Proj, tkVideo, 0, Segs, Missing);
Check((Length(Segs) = 1) and (Length(Segs[0].Layers) = 2),
'кусок собирается слоями: нижнее видео и картинка поверх');
if (Length(Segs) = 1) and (Length(Segs[0].Layers) = 2) then
Check(Pos('pad=', Segs[0].Layers[1].FitFilter) = 0,
'у верхнего слоя полей нет');
{ Предпросмотру картинка отдаётся готовым куском, а не самим файлом:
своих декодеров у плеера хватает не на всё, а у неподвижного кадра
нет длины. }
FlattenPreview(Proj, Segs, AudioSegs, Overlays, Missing, True);
Check(Length(Overlays) = 1, 'картинка ушла в накладываемые');
if Length(Overlays) = 1 then
begin
Check(Pos('.nlve-cache', Overlays[0].FilePath) > 0,
'показывается готовый кусок, а не сам файл');
Check(Pos('pad=', Overlays[0].Filter) = 0,
'полей в цепочке наложения нет');
PlainPath := '';
for I := 0 to High(Missing) do
if Missing[I].TargetPath = Overlays[0].FilePath then
PlainPath := Missing[I].TargetPath;
Check(PlainPath <> '', 'этот кусок заказан к созданию');
end;
finally
Proj.Free;
end;