Доля растёт ровно: строка «progress=continue» больше не обнуляет место
Показатель висел на пяти процентах, потом прыгал к семидесяти девяти, потом сразу готово. Виноват не ffmpeg: замерено, что он отдаёт ход безупречно ровно — блок каждые полсекунды, 7%, 14%, 20%, 27% и дальше без единого скачка. Блок заканчивается строкой «progress=continue», в которой места нет: она сообщает только, что работа продолжается, и разбор честно оставляет переданное число как было. Я передавал туда ноль, поэтому каждый блок заканчивался обнулением доли. Показатель стоял и дёргался вверх лишь тогда, когда опрос попадал между строкой со временем и этой. Теперь отсчёт начинается с уже известного места — как это давно делает сборка ролика. Проверено глазами на невидимом экране: шесть снимков подряд через полторы секунды дают 54, 65, 74, 82, 91, 99 процентов, полоса растёт вместе с числом. Ловушку закрепляет проверка в tests/lfmcheck: «progress=continue» и «progress=end» узнаются, но времени не трогают.
This commit is contained in:
parent
e8cb3cc392
commit
d75596bca3
3 changed files with 61 additions and 1 deletions
10
README.md
10
README.md
|
|
@ -865,6 +865,16 @@ Wine с новой библиотекой не грузилось ничего.
|
||||||
привычный RGB. Записанный по привычке код даёт цвет с переставленными
|
привычный RGB. Записанный по привычке код даёт цвет с переставленными
|
||||||
красным и синим.
|
красным и синим.
|
||||||
|
|
||||||
|
**Последняя строка блока о ходе работы обнуляет место.** ffmpeg шлёт ход
|
||||||
|
блоками, и заканчивается блок строкой `progress=continue`, в которой
|
||||||
|
места нет — она сообщает только, что работа продолжается. Разбор честно
|
||||||
|
оставляет переданное число как было, поэтому передавать туда надо уже
|
||||||
|
известное место, а не ноль. С нулём доля обнуляется в конце каждого
|
||||||
|
блока: показатель стоит на месте и дёргается вверх лишь тогда, когда
|
||||||
|
опрос попадёт между строкой со временем и этой — «висит на пяти
|
||||||
|
процентах, потом скачет до семидесяти девяти». Сам ffmpeg при этом
|
||||||
|
отдаёт ход безупречно ровно: блок каждые полсекунды, замерено.
|
||||||
|
|
||||||
**Разбор HEVC на процессоре — самое дорогое в сведении слоёв.** Не
|
**Разбор HEVC на процессоре — самое дорогое в сведении слоёв.** Не
|
||||||
фильтры, как кажется: на десяти секундах 2688x1512 цепочка со сведением
|
фильтры, как кажется: на десяти секундах 2688x1512 цепочка со сведением
|
||||||
стоит 13.5 с, а без всяких фильтров — 12.7 с. Всё время уходит на разбор
|
стоит 13.5 с, а без всяких фильтров — 12.7 с. Всё время уходит на разбор
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,17 @@ var
|
||||||
begin
|
begin
|
||||||
if FStepSeconds <= 0 then
|
if FStepSeconds <= 0 then
|
||||||
Exit;
|
Exit;
|
||||||
Seconds := 0;
|
{ Отсчёт начинается с уже известного места, а не с нуля.
|
||||||
|
|
||||||
|
ffmpeg шлёт ход работы блоками, и последняя строка блока —
|
||||||
|
«progress=continue». Места в ней нет, она сообщает только, что работа
|
||||||
|
продолжается, — и разбор оставляет переданное число как было. Начни
|
||||||
|
мы с нуля, каждый блок заканчивался бы обнулением доли: показатель
|
||||||
|
стоял бы на месте и дёргался вверх только в те мгновения, когда
|
||||||
|
опрос попадал между строкой со временем и этой. Со стороны это
|
||||||
|
выглядело как «висит на пяти процентах, потом скачет до
|
||||||
|
семидесяти девяти». }
|
||||||
|
Seconds := FStepFraction * FStepSeconds;
|
||||||
AtEnd := False;
|
AtEnd := False;
|
||||||
if not ParseProgressLine(ALine, Seconds, AtEnd) then
|
if not ParseProgressLine(ALine, Seconds, AtEnd) then
|
||||||
Exit;
|
Exit;
|
||||||
|
|
|
||||||
|
|
@ -851,6 +851,45 @@ end;
|
||||||
ключ входной: ffmpeg принимает его только перед тем входом, к которому
|
ключ входной: ffmpeg принимает его только перед тем входом, к которому
|
||||||
он относится. Забыть его легко и незаметно — команда останется рабочей,
|
он относится. Забыть его легко и незаметно — команда останется рабочей,
|
||||||
просто медленной. }
|
просто медленной. }
|
||||||
|
{ Разбор строк о ходе работы ffmpeg.
|
||||||
|
|
||||||
|
Ход приходит блоками, и последняя строка блока — «progress=continue».
|
||||||
|
Места в ней нет: она сообщает только, что работа продолжается. Разбор
|
||||||
|
обязан оставить переданное число как было, а вызывающий — передавать
|
||||||
|
туда уже известное место, а не ноль. Иначе каждый блок заканчивается
|
||||||
|
обнулением доли, и показатель стоит на месте, дёргаясь вверх лишь
|
||||||
|
тогда, когда опрос попадёт между строкой со временем и этой. }
|
||||||
|
procedure CheckProgressParsing;
|
||||||
|
var
|
||||||
|
Seconds: Double;
|
||||||
|
AtEnd: Boolean;
|
||||||
|
begin
|
||||||
|
WriteLn;
|
||||||
|
WriteLn('Разбор хода работы ffmpeg');
|
||||||
|
WriteLn;
|
||||||
|
|
||||||
|
Seconds := 0;
|
||||||
|
AtEnd := False;
|
||||||
|
CheckTrue('время узнаётся', ParseProgressLine('out_time_us=2500000',
|
||||||
|
Seconds, AtEnd));
|
||||||
|
CheckTrue('и разбирается верно: ' + FloatToStrF(Seconds, ffFixed, 8, 3),
|
||||||
|
Abs(Seconds - 2.5) < 0.001);
|
||||||
|
|
||||||
|
CheckTrue('«продолжается» — тоже знакомая строка',
|
||||||
|
ParseProgressLine('progress=continue', Seconds, AtEnd));
|
||||||
|
CheckTrue('и она не трогает время: ' + FloatToStrF(Seconds, ffFixed, 8, 3),
|
||||||
|
Abs(Seconds - 2.5) < 0.001);
|
||||||
|
CheckTrue('и не объявляет конец', not AtEnd);
|
||||||
|
|
||||||
|
CheckTrue('конец узнаётся', ParseProgressLine('progress=end',
|
||||||
|
Seconds, AtEnd) and AtEnd);
|
||||||
|
CheckTrue('время и тут осталось прежним',
|
||||||
|
Abs(Seconds - 2.5) < 0.001);
|
||||||
|
|
||||||
|
CheckTrue('незнакомая строка не узнаётся',
|
||||||
|
not ParseProgressLine('bitrate= 12.3kbits/s', Seconds, AtEnd));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure CheckLayerHwDecode;
|
procedure CheckLayerHwDecode;
|
||||||
var
|
var
|
||||||
Layers: array[0..0] of TSegmentLayer;
|
Layers: array[0..0] of TSegmentLayer;
|
||||||
|
|
@ -958,6 +997,7 @@ begin
|
||||||
CheckSplitAllTracks;
|
CheckSplitAllTracks;
|
||||||
CheckGapTolerance;
|
CheckGapTolerance;
|
||||||
CheckSourceRect;
|
CheckSourceRect;
|
||||||
|
CheckProgressParsing;
|
||||||
CheckLayerHwDecode;
|
CheckLayerHwDecode;
|
||||||
CheckButtonClicks;
|
CheckButtonClicks;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue