Сохранение миниатюр [Готово]

Автор V0lt, 25 июня 2016, 10:52:34

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Angel

а можно приделать сообщение о том, что миниатюры рендерятся и юзер должен подождать?
в идеале еще и прогрессбар процесса этого вывести, тогда не будут возникать позывы закрыть плеер в процессе их создания.

Aleksoid1978

Если что - вот тестовый билд с другим алгоритмом уменьшения, сравниваем
https://yadi.sk/d/yl6QXfawsnrXu
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Aleksoid1978
На этом билде хорошо.


Angel
Я думал о небольшом модальном окне с прогресс-баром и кнопкой "Oтмена". Это пока самый оптимальный вариант.

Aleksoid1978

А я предлагаю примерно как с диалогом сохранения - будет и кнопка отмена, и прогресс бар(правда не плавный - но все равно).
[merge_posts_bbcode]Добавлено: 2016-06-26 13:22:00[/merge_posts_bbcode]

Тоже проверил на 8K - http://screenshotcomparison.com/comparison/176652
Разница на лицо :) Думаю надо внедрять новый алгоритм.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Внедряй, только просьба безо всякой косметики, а то потом в логе изменений трудно понять, что поменялось.

Есть описание алгоритма?

Aleksoid1978

Описания как такового нет, есть комментарии в сырцах и страничка где это взято, её укажу как источник.
[merge_posts_bbcode]Добавлено: 2016-06-27 15:15:13[/merge_posts_bbcode]

Еще вот тут нашел сырцы https://github.com/artcom/y60/tree/master/netsrc/paintlib/src/Filter
Там есть pl2passscale.h - 2-х проходный ресайзер, сперва по горизонтали, потом по вертикали.

Но т.к. у нас уже хорошее качество - не стал проверять, думаю вряд ли может получиться сильно лучше.

[merge_posts_bbcode]Добавлено: 2016-06-28 17:15:00[/merge_posts_bbcode]

Предлагаю текстовый билд с диалогом - https://yadi.sk/d/ZQDe5J0JsqcMp
и так же патч для этого дела - https://yadi.sk/d/MJhOnIb4sqcPn

Не пугаться - в патче еще изменения немного не в тему, изменены проверки работы оператора new. На самом деле вот такой код:
BYTE* p = DNew BYTE[size];
if (!p) {
    return;
}

не работает, т.к. в любом случае переменная p не будет нулевой и проверка не пройдет. А вот если не получиться память выделить - тогда сработает CMemoryException, что и надо отловить. Там конечно размеры выделяются маленькие и по идее такое никогда не сработает - но в любом случае правильнее использовать try {} catch {}.

[merge_posts_bbcode]Добавлено: 2016-06-28 17:32:28[/merge_posts_bbcode]

Там правда есть нюансы:
1) - Плавное изменение ползунка не получиться, как и моментальная отмена операции по нажатию на кнопку.
2) - После отмены не возвращается на прежнее место. Пока не копался.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Спасибо за патч. У тебя слишком много лишнего в новом потоке. Стоп и выключение звука, а также возврат к исходному лучше оставить в основном окне.

Я переработал свой вариант, мне надо немного потестить и выложу сборку.

Aleksoid1978

Да я по быстрому просто перенёс код.

По поводу проверки/тестирования - советую обратить особое внимание обработки нажатия Отмены во время построения. Ну чтобы не было косяков и зависаний.

Сборку выкладывай сразу с патчем.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Сборку залил.
Все отрабатывает корректно, кроме зависания MPC Audio Renderer. Тот чего-то пытается ждать какие-то данные на паузе.

Еще непонятно назначение этого блока
HANDLE hGraphEvent = NULL;
pMainFrm->m_pME->GetEventHandle((OAEVENT*)&hGraphEvent);
while (hGraphEvent && WaitForSingleObject(hGraphEvent, INFINITE) == WAIT_OBJECT_0) {
    LONG evCode = 0;
    LONG_PTR evParam1, evParam2;
    while (pMainFrm->m_pME && SUCCEEDED(pMainFrm->m_pME->GetEvent(&evCode, &evParam1, &evParam2, 0))) {
        pMainFrm->m_pME->FreeEventParams(evCode, evParam1, evParam2);
        if (EC_STEP_COMPLETE == evCode) {
            hGraphEvent = NULL;
        }
    }
}
Поэтому оставил как есть. Если будет информация, то напишу комментарий.

Aleksoid1978

1 - раньше были зависания с нашим аудио выводом ??
2 - тот код ждет завершения шага от видео-рендерера.
[merge_posts_bbcode]Добавлено: 2016-06-30 08:52:21[/merge_posts_bbcode]

И вот еще что "не красиво" - ты в самом CTaskDlg вызываешь AfxMessageBox(). Выглядит некрасиво. Лучше как я делал - закрывать диалог и уже после показывать сообщение.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Кстати, можно сохранять миниатюры на стопе. Вроде не зависает.
Я потестирую еще.
[merge_posts_bbcode]Добавлено: 2016-06-30 06:44:08[/merge_posts_bbcode]

AfxMessageBox() посмотрю...

[merge_posts_bbcode]Добавлено: 2016-07-04 22:13:42[/merge_posts_bbcode]

В общем проблема оказалась в том, что у нас получается два обработчика событий графа. Это неправильно, т.к. в результате до каждого обработчика доходит лишь часть событий.
Исправил в r1706.