diff --git a/README.md b/README.md index ebdb6fd..afc6dfb 100644 --- a/README.md +++ b/README.md @@ -865,6 +865,16 @@ Wine с новой библиотекой не грузилось ничего. привычный RGB. Записанный по привычке код даёт цвет с переставленными красным и синим. +**Последняя строка блока о ходе работы обнуляет место.** ffmpeg шлёт ход +блоками, и заканчивается блок строкой `progress=continue`, в которой +места нет — она сообщает только, что работа продолжается. Разбор честно +оставляет переданное число как было, поэтому передавать туда надо уже +известное место, а не ноль. С нулём доля обнуляется в конце каждого +блока: показатель стоит на месте и дёргается вверх лишь тогда, когда +опрос попадёт между строкой со временем и этой — «висит на пяти +процентах, потом скачет до семидесяти девяти». Сам ffmpeg при этом +отдаёт ход безупречно ровно: блок каждые полсекунды, замерено. + **Разбор HEVC на процессоре — самое дорогое в сведении слоёв.** Не фильтры, как кажется: на десяти секундах 2688x1512 цепочка со сведением стоит 13.5 с, а без всяких фильтров — 12.7 с. Всё время уходит на разбор diff --git a/src/uGenerate.pas b/src/uGenerate.pas index 3bda511..ba91621 100644 --- a/src/uGenerate.pas +++ b/src/uGenerate.pas @@ -168,7 +168,17 @@ var begin if FStepSeconds <= 0 then Exit; - Seconds := 0; + { Отсчёт начинается с уже известного места, а не с нуля. + + ffmpeg шлёт ход работы блоками, и последняя строка блока — + «progress=continue». Места в ней нет, она сообщает только, что работа + продолжается, — и разбор оставляет переданное число как было. Начни + мы с нуля, каждый блок заканчивался бы обнулением доли: показатель + стоял бы на месте и дёргался вверх только в те мгновения, когда + опрос попадал между строкой со временем и этой. Со стороны это + выглядело как «висит на пяти процентах, потом скачет до + семидесяти девяти». } + Seconds := FStepFraction * FStepSeconds; AtEnd := False; if not ParseProgressLine(ALine, Seconds, AtEnd) then Exit; diff --git a/tests/lfmcheck/lfmcheck.lpr b/tests/lfmcheck/lfmcheck.lpr index 2d41043..17d85b2 100644 --- a/tests/lfmcheck/lfmcheck.lpr +++ b/tests/lfmcheck/lfmcheck.lpr @@ -851,6 +851,45 @@ end; ключ входной: 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; var Layers: array[0..0] of TSegmentLayer; @@ -958,6 +997,7 @@ begin CheckSplitAllTracks; CheckGapTolerance; CheckSourceRect; + CheckProgressParsing; CheckLayerHwDecode; CheckButtonClicks;