Как написать быстрый видео транскодер на Intel® Media SDK. Эпизод 1

Slava Korobycin (Intel) (5 пост(а)) 19.03.2010 14:37

Синхронная однопотоковая модель. Просто и медленно

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

Синхронная однопотоковая модель хорошо подходит для начального исследования процесса транскодирования. Её реализация предельно проста и наглядна для демонстрации обрабатывающих элементов и организации потока данных. Платой за простоту является низкое быстродействие, потому что кадры обрабатываются последовательно Decode, Video Preprocessing (VPP) и Encode. Каждый кадр проходит все три стадии от входного потока до выходного и только после этого начинается обработка следующего кадра как показано на Диаграмме 1.

Диаграмма 1: Однопотоковая обработка кадров

Приведённый ниже псевдо-код иллюстрирует реализацию рассматриваемой модели. Заметьте, каждая стадия обработки может быть хорошо оптимизирована, чтобы получить выигрыш от multi-core оборудования. Поэтому около каждого вызова организован цикл, который ждёт завершения операции, это называется синхронизацией (Sync)

while (there is data to process)
{
    do
    {   status = DecodeFrame();
        if (status ==    FatalError) return Error;
        if (status == NonFatalError) FixDecodeError(); // Error handling
    } while(status != Success); // Sync

    do
    {   status = VPPFrame();
        if (status ==    FatalError) return Error;
        if (status == NonFatalError) FixVPPError(); // Error handling
    } while(status != Success); // Sync

    do
    {   status = EncodeFrame();
        if (status ==    FatalError) return Error;
        if (status == NonFatalError) FixEncodeError(); // Error handling
    } while(status != Success); // Sync

    WriteFrame();
}

return Success;

Мы предполагаем, что платформа поддерживает аппаратное ускорение Decode и VPP, а Encode выполняется на CPU. Эта модель транскодирования теряет много вычислительных ресурсов как CPU, так и GPU, потому что Encode вынужден ждать завершения работы Decode и VPP, а Decode вынужден ждать, когда Encode завершит обработку предыдущего кадра. В лучшем случае теряется половина ресурсов как это показано на Диаграмме 2.

Диаграмма 2: Однопотоковая модель теряет значительную часть вычислительных ресурсов

Разумеется, существует множество способов, как улучшить быстродействие. Можете ли Вы предложить некоторые из них?

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

Спасибо за внимание!

Слава.

Категории: Графика

Пожалуйста, обратитесь к странице Уведомление об оптимизации для более подробной информации относительно производительности и оптимизации в программных продуктах компании Intel.

Комментарии (13)

19.03.2010 05:23

ilnarb
ilnarbВсего баллов:
5,804
коричневый пояс
Нужно завести буфер (орграниченной длины) фреймов прошедших обработку на GPU и ждущих обработки на CPU
и тогда в идеале GPU или CPU не будет простаивать (в зависимости от того кто быстрее справляется)
19.03.2010 05:32

Dmitry Oganezov (Intel)
Dmitry Oganezov (Intel)Всего баллов:
25,608
Community Manager
Я как инсайдер, который читает все посты нашего блога, в том числе вот этот (http://software.intel.com/ru-ru/blogs/2009/07/20/2001715/) предлагаю сразу уйти от схемы распараллеливания "по кадрам" ;)
19.03.2010 05:35

Slava Korobycin (Intel)
Slava Korobycin (Intel)Всего баллов:
1,825
Зарегистрированный пользователь
Хорошо! Действительно, грамотно реализованный буфер сильно поможет. Есть ещё идеи? :)
19.03.2010 05:38

Slava Korobycin (Intel)
Slava Korobycin (Intel)Всего баллов:
1,825
Зарегистрированный пользователь
Дима, по-моему в блоге про который ты говоришь описано как написать хороший параллельный декодер. А у нас тут и декодер, и VPP, и энкодер. :) Могу расценивать твой совет так: "написать транскодер одной функцией"? :)
19.03.2010 06:12

Dmitry Oganezov (Intel)
Dmitry Oganezov (Intel)Всего баллов:
25,608
Community Manager
Как все сложно! ;)
Если честно то у меня мозг отключается уже на этапе синхронизации CPUGPU. Идея с буфером хороша, но если углубляться в распараллеливание по блокам (или как там эти фрагменты кадра называются), то синхронизация создаст ИМХО слишком большой оверхед.
19.03.2010 06:23

Slava Korobycin (Intel)
Slava Korobycin (Intel)Всего баллов:
1,825
Зарегистрированный пользователь
Дима, очень хороший комментарий. :) На самом деле, то, что отключается мозг это хорошо. :)))
Я планирую нежно подвести читателя к Intel® Media SDK и напомнить: "вот видите, как было неудобно, а с Intel® Media SDK стало хорошо"
19.03.2010 07:28

Dmitry Kozlov (Intel)
Dmitry Kozlov (Intel)Всего баллов:
715
коричневый пояс
пока не пришел Леша Куканов, могу предположить что TBB'шный pipeline должен подойти для решения данной проблемы
19.03.2010 12:31

Dmitry Serkin (Intel)
Dmitry Serkin (Intel)Всего баллов:
3,960
коричневый пояс
Эх, снять что-ли всю интригу :)
23.03.2010 01:56

ilnarb
ilnarbВсего баллов:
5,804
коричневый пояс
>> Эх, снять что-ли всю интригу :)
ДАВАЙ!! ))
23.03.2010 06:01

Slava Korobycin (Intel)
Slava Korobycin (Intel)Всего баллов:
1,825
Зарегистрированный пользователь
Дима, TBB -- это интересная идея.
Можешь прикинуть как преобразится приведённый выше псевдо-код, если его написать с использованием TBB? Останется ли он таким же простым и понятным? ;)

Кстати, при транскодировании нередко на разных стадиях возникают ошибки, которые нужно правильно обрабатывать прежде чем продолжить процесс. А это добавляет зависимостей в цепочку, да не простых, а условных (например: если Decode получилось, то пускаем VPP; иначе что-то чиним в Decode и пускаем его повторно)
11.04.2010 02:16


Стас
Slava Korobycin (Intel)
... при транскодировании нередко на разных стадиях возникают ошибки
У меня аналогичная проблема, как решить?
30.04.2010 05:30

Slava Korobycin (Intel)
Slava Korobycin (Intel)Всего баллов:
1,825
Зарегистрированный пользователь
Стас, какого рода у тебя проблема?

В данной модели всё довольно просто: случилась ошибка, мы об этом тут же узнали. Пытаемся её устранить, возможно просто какую-то компоненту нужно переинициализировать с новыми параметрами. Если получилось, то стартуем процесс с того же места где мы были до ошибки. Если не получилось, то прекращаем процесс.
26.10.2011 12:53

575-61
575-61Всего баллов:
110
зеленый пояс
А что, метод пузырьковой сортировки - тоже метод...

Обратная ссылка (3)


Оставить комментарий  

Для получения технической помощи посетите сайт службы поддержки.
Имя (обязательно)*

Электронная почта (обязательно; не будет отображено на этой странице)*

Ваш URL-адрес (необязательно)


Комментарий*