Библиотека сайта rus-linux.net
Фреймворк GStreamer. Руководство разработчика приложений. Буферы и события
Оригинал: GStreamer Application Development ManualАвторы: Wim Taymans, Steve Baker, Andy Wingo, Ronald S. Bultje, Stefan Kost
Дата публикации: 21 мая 2014 г.
Перевод: А.Панин
Дата перевода: 19 июня 2014 г.
Глава 9. Буферы и события
Процесс передачи данных по конвейеру тесно связан с использованием комбинации буферов и событий. Буферы содержат сами мультимедийные данные. События используются для передачи такой управляющей информации, как информация о перемещении в потоке данных и уведомления о завершении этого потока. Все операции передачи данных в рамках конвейера выполняются автоматически в процессе работы конвейера. Данная глава предназначена в первую очередь для объяснения принципов работы описанного механизма; вам не придется как-либо вмешиваться в его работу.
9.1. Буферы
Буферы содержат данные, которые будут передаваться посредством созданного вами конвейера. Элемент для ввода данных обычно создает новый буфер и передает его с помощью точки соединения следующему элементу в цепочке. При использовании инфраструктуры фреймворка GStreamer для создания конвейера обработки мультимедийных данных вам не придется работать с буферами самостоятельно; элементы сделают это за вас.
- Указателей на объекты памяти. Объекты памяти инкапсулируют фрагмент памяти.
- Метки времени для буфера.
- Счетчика ссылок, который указывает на то, как много элементов использует данный буфер. Этот счетчик ссылок будет использоваться для уничтожения буфера в момент, когда на него не будет ссылаться ни один из элементов.
- Флагов буфера.
В простейшем случае при создании буфера для него резервируется память, в нее помещаются данные, после чего буфер передается следующему элементу. Этот элемент читает данные, выполняет с ними какие-либо действия (такие, как декодирование с записью результирующих данных в предварительно созданный новый буфер) и удаляет ссылку на полученный буфер. Это действие приводит к освобождению зарезервированной для хранения данных памяти и уничтожению буфера. Типичный декодер аудио- или видеопотоков работает именно так.
Хотя существуют и более сложные сценарии. Элементы могут непосредственно модифицировать данные буферов, т.е., изменять данные без резервирования нового буфера. Также элементы могут записывать данные в область памяти, связанную с аппаратным обеспечением (в такую, как память устройств видеозахвата) или зарезервированную сервером оконной системы X (с использованием расширения XShm). Буферы могут предназначаться как только для чтения данных из них, так и для других операций.
9.2. События
События являются сигналами управления, которые отправляются как по направлению, так и против направления конвейера вместе с буферами. События, отправляемые по направлению конвейера, уведомляют целевые элементы об изменениях состояния потока. Набор возможных вариантов событий включает события перемещения в потоке, события опустошения буферов, события окончания потока и.т.д. События, отправляемые против направления конвейера, используются для осуществления взаимодействий как по схеме приложение-элемент, так и по схеме элемент-элемент с целью запроса выполнения таких изменений состояния потока, как переходы к заданным позициям. Для приложений важны исключительно события, отправляемые против направления конвейера. События, отправляемые по направлению конвейера, описаны только для того, чтобы читатель составил более полное представление о концепции механизма передачи данных.
Так как большая часть приложений использует единицы измерения времени для перехода к заданной позиции в потоке, в нашем примере они также будут использоваться:
Функция gst_element_seek ()
является вспомогательной функцией, позволяющей использовать описанную методику перехода к позиции в потоке. Этот пример приведен главным образом для демонстрации методики работы с событиями.
Следующий раздел : Ваше первое приложение.