FFmpeg sws_scale в измененной области

Я использовал sws_scale для преобразования группы изображений RGB32 в формат YUV420. Каждое изображение очень похоже на предыдущее и отличается только областью прямоугольника Q.

Мой вопрос: как использовать Q для ускорения процесса преобразования? В функцию sws_scale следует добавить дополнительный параметр.

sws_scale( ctx, in_plane, in_stride, sliceY, height, out_plane, out_stride, Q){
    // parameter out_plane stores the YUV420 data of previous image
    Instead of scanning the whole image, scan through rectangle Q{
        Do conversion
    }
}

person useprxf    schedule 28.09.2016    source источник


Ответы (1)


В текущем API такого параметра нет, но вы можете использовать sws_scale как есть. Вы можете создать два контекста - один для всей картинки и один для Q; чтобы преобразовать только Q:

  • использовать контекст, который вы создали для Q
  • Сдвиньте все указатели данных так, чтобы все они указывали на первый пиксель Q во входных/выходных изображениях.
  • Оставьте шаги, как они были для полной картины

Здесь следует обратить внимание на несколько предостережений: во-первых, поскольку вы используете YUV420 в качестве выходного формата, вы хотите увеличить Q, чтобы он начинался с четной строки/столбца и занимал четную ширину/высоту (иначе на границе Q может быть искаженный цвет). Во-вторых, убедитесь, что указатели всех плоскостей изображения указывают на один и тот же пиксель — для этого требуются разные смещения для каждой плоскости в зависимости от формата пикселя. В-третьих, лучше всего это работает, если нет масштабирования — в противном случае результирующее изображение может выглядеть не совсем так, как при полном масштабе из-за дизеринга.

person Andrey Turkin    schedule 01.10.2016
comment
Не является ли создание нового контекста затратным с точки зрения ресурсов? Например, если регион меняется в каждом кадре случайным образом? - person Rudolfs Bundulis; 10.12.2017
comment
Это зависит от вашего определения дороговизны. Это несколько небольших выделений памяти и некоторые вычисления; (вероятно) дешевле инициировать новый контекст для преобразования одной небольшой области, чем выполнять полное преобразование кадра с использованием одного статического контекста. - person Andrey Turkin; 11.12.2017
comment
Думаю, я буду каждый раз делать сравнительный анализ libyuv и swscale с новым контекстом и смотреть, как это выглядит. - person Rudolfs Bundulis; 11.12.2017