Захват GPUImagePhotoAsImageProcessedUpToFilter работает только для последнего фильтра

В моем приложении я использую стек из 3 фильтров и добавляю его в неподвижную камеру. Я пытаюсь взять изображение из filter1, это пустой фильтр, поэтому он возвращает фактическое изображение.

    [stillCamera addTarget:filter1];
[filter1 addTarget:filter2];
[filter2 addTarget:filter3];
[filter3 addTarget:cameraView];

Когда я вызываю CapturePhotoAsImageProcessedUpToFilter, он возвращает изображение только тогда, когда я передаю его filter3, как показано ниже.

[stillCamera capturePhotoAsImageProcessedUpToFilter:filter3 with...

Два приведенных ниже примера никогда не возвращают изображения.

[stillCamera capturePhotoAsImageProcessedUpToFilter:filter1 with...
[stillCamera capturePhotoAsImageProcessedUpToFilter:filter2 with...

Я делаю что-то неправильно? В качестве исправления я использую:

[filter1 imageFromCurrentlyProcessedOutput]

Есть ли разница между вызовом CapturePhotoAsImageProcessedUpToFilter и imageFromCurrentlyProcessedOutput?


person Joe Andolina    schedule 14.01.2014    source источник


Ответы (1)


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

К сожалению, в большинстве случаев это не работает должным образом, и поскольку буферы кадра удаляются по мере продвижения изображения, только последний фильтр в цепочке получает действительный буфер кадра для чтения. Я, вероятно, собираюсь отказаться от этой оптимизации в какой-то момент в ближайшем будущем в пользу внутреннего фреймбуфера и кеша текстур, но я не уверен, что можно сделать тем временем, чтобы читать эти промежуточные фильтры в цепочке.

person Brad Larson    schedule 14.01.2014
comment
Спасибо за ответ и отличный фреймворк! Кажется, вы правы, оптимизируя во время нормальной работы. Лучшее из обоих миров может быть возможным, если вы сохраняете буферы только при вызове функций типа ...ProcessedUpToFilter и ...CurrentlyProcessedOutput. - person Joe Andolina; 14.01.2014
comment
@BradLarson Я использую 0.1.6, и в моей неподвижной камере есть только 1 фильтр. Я использую этот фильтр с capturePhotoAsImageProcessedUpToFilter, но не получаю processedImage - person onmyway133; 21.11.2014