UNICK-SOFT http:unick-soft.xost.ru
VLC документация для разработчиков
Разделы
Оглавление
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Голосарий
Приложение А
Приложение B
Приложение C
Приложение E

Не нашли ответ здесь, заходите на Профессиональный ответ по VLC
< >

Реклама

Глава 2. VLC интерфейс

Обычно VLC запускается в цикле

Этот раздел рассказывает, что происходит, когда вы запускаете vlc программу. После ELF (видать это в противоречие демонам загрузки в *nix-ах) динамической загрузки БЛА-БЛА-БЛА (под этим, наверное, подразумевалась поиск модулей, загрузка этих модулей, инициализация ресурсов), главный поток попадает в интерфейсный поток и запускает src/interface/main.c. Это происходит в несколько этапов:

1. Определение CPU: На каком процессоре мы запускаем, какая его производительность (MMX, MMXEXT, 3DNow, AltiVec...) ? (в VLC многие функции реализованы прям на ассемблере, например конвертация видео форматов);
2. Инициализация интерфейса сообщений;
3. Разбитие параметров командной строки. (Если вы захотите в коде строго зафиксировать параметры, то следует это вставлять в файл src\libvlc-common.c, хотя это одно из решений);
4. Создание плейлиста;
5. Инициализация банка модулей;
6. Открытие интерфайса;
7. Инсталляция сигналов: SIGHUP, SIGINT и SIGQUIT устанавливаются для управления очисткой ресурсов при выходе (пожалуйста помните, что SDL библиотека также устанавливает SIGSEGV) ;
8. Поток вывода аудио;
9. Поток вывода видео;
10. Главный цикл: управления событиями;
Следующие разделы рассказывают о каждом шаге в отдельности, и о многом другом.

Интерфейс сообщений

Это известный факт, что printf() функция не потока безопасна. Как результат, один поток прерывается в вызове printf(), другие вызовы должны покинуть программу в неизвестном состояние. Итак, API должен выводить сообщения без кеширования.

Это API выполнено двумя способами. Если INTF_MSG_QUEUE определён в config.h, каждый printf-like (смотрите ниже) вызов помещается в очередь сообщений в цепной список. Этот список должен быть выведен потоком интерфейса один раз за каждый цикл сообщений. Если INTF_MSG_QUEUE не определён, вызываемый поток блокирует функцию вывода (каждый из двух функций вывода, вызываемые одновременно, препятствует друг другу) и выводит сообщение напрямую (по умолчанию behaviour).

Функции доступные для вывода сообщений:

- intf_Msg ( char * psz_format, ... ) : Выводит сообщения в стандартный поток вывода "stdout", обычным текст (для примера "vlc 0.2.72 (Apr 16 2001)").
- intf_ErrMsg ( char * psz_format, ... ) : Вывод сообщения об ошибки в поток вывода для ошибки "stderr".
- intf_WarnMsg ( int i_level, char * psz_format, ... ) : Выводит сообщения в поток вывода ошибок, если уровень предупреждений (определяются параметрами -v, -vv и -vvv) ниже установленного.

Замечание:
Пожалуйста заметьте чем ниже уровень, тем ниже важность сообщения это (dayou spik ingliche ?).

- intf_DbgMsg ( char * psz_format, ... ) : Эта функция создана для контрольных сообщений, таких как "Мы вошли в функцию dvd_foo_thingy"(это удобно, так как для VLC не существует нормальной среды отладки, единственный выход использовать лог). Функция ничего не делает в non-trace мод. Если VLC скомпилировано с параметром --enable-trace, сообщения каждый раз записывается в лог файл vlc-trace.log (если TRACE_LOG пределено в config.h), или информация выводится в поток вывода ошибок "stderr" (и наоборот).
- intf_MsgImm, intf_ErrMsgImm, intf_WarnMsgImm, intf_DbgMsgImm : Одни как вышеупомянутые, исключая то, что очередь сообщений, в случае если INTF_MSG_QUEUE определёно, будет записана в файл лога перед выходом из функций.
- intf_WarnHexDump ( int i_level, void * p_data, int i_size ) : Дамп i_size файт из p_data в шестнадцатеричном формате. i_level работает также как и intf_WarnMsg . Это полезно для отладочных целей.
- intf_FlushMsg () : Записывает очередь сообщений в файл лога.

Параметры командной строки

VLC использует GNU getopt для разбора параметров командной строки. getopt структуры определены в src/interface/main.c в Константы параметров командной строки("Command line options constants") секции. Для добавления новых опций, эта секция может быть изменена, вследствие с GetConfiguration и Usage.
Большинство директив конфигурации изменяются через массив параметров среды, используя main_Put*Variable и main_Get*Variable. Как результат, ./vlc --height 240 устанавливает точно то же: vlc_height=240 ./vlc. Этот путь конфигурации переменных доступна везде, включая плагины.
Предупреждение:
Пожалуйста, замечание потока безопасности, вы не должны использовать main_Put*Variable однажды, когда второй поток обменивается(spawned).

Управление плейлистом

Плейлист создаётся при начале работы из файлов, поданных в командно строке. Вдобавок плагин интерфейса может добавить или удалять файлы из него. Функции, которые могут использоваться описаны в файлах src/interface/intf_playlist.c. intf_PlaylistAdd и intf_PlaylistDelete обычно используются для этих целей. Плей лист в основном запускается в отдельном потоке, и он определяет какие файлы будет проигрыватся. Главный интерфейс цикла intf_Manage допускает запуск и закрытия потока ввода когда необходимо (видимо под потоком ввода понимается поток чтения файла для воспроизведения).

Модуль банк

При запуске, VLC создаёт банк всех доступных файлов (плагинов) в ".", "./lib", "/usr/local/lib/videolan/vlc (PLUGIN_PATH)", и встроенных плагинов (соответственно в Windows это список dll файлов в директории plug-ins). У каждого плагина проверяется его возможности, ниже приведёт список:
set_capability( "access", 0 ) : Модуль доступа к файлам;
set_capability( "decoder", 0 ) : Плагин декодера;
set_capability( "audio output", 0 ) : Модуль вывода звука;
set_capability( "video output", 0 ): Модуль вывода видео;
set_capability( "audio filter", 0 ): Плагин звуковых эффектов;
set_capability( "demux", 0 ): Модуль демуксер. Демуксер это какой-то промежуточный формат, например, для конвертирования из одного формата в другой;
set_capability( "interface", 0 ): Плагин пользовательского интерфейса;
set_capability( "text renderer", 0 ); Для вывода текста;
set_capability( "sout stream", 50 ); Модуль потоков для вещания;
set_capability( "video filter2", 80 ); Модуль видео фильтров;

Число значит рейтинг этого модуля. Всегда выбираетесь модуль с лучшим рейтингом. Как написано, плагин описывается в специальной секции. Другие потоки могут запрашивать плагин с помощью module_Need ( module_bank_t * p_bank, int i_capabilities, void * p_data ). p_data параметр пока не используется. Возвращаемая структура module_t содержит указатель на функции плагина. Смотрите файл include/modules.h для большой информацией.

Главный цикл интерфейса

Поток интерфейса будет первым заблокирован для соответствующего интерфейса плагина. Он входит в главный цикл, с функцией плагина pf_run. Эта функция должна делать присваивать, и каждые 100 миллисекунд должна вызываться (обычно через GUI таймер callback) intf_Manage.
intf_Manage очищает банк модулей, путём выгрузки ненужных модулей, управления плейлистом и сброса буфера ожидающих сообщений (если сообщения использую очередь).

Как написать плагин

API для модуля

Посмотрите файлы в директориях /modules/access, /modules/control или другую директорию с модулями. Однако GUI интерфейс не прост для понимания, так как он очень большой. Я советую начать изучать не графические интерфейсы модулей для начала. Для примерка modules/control/hotkeys.c.
Модель интерфейса содержит 3 функции и описание (правда со времени написание документации прошло много времени, и число функций увеличилось):

- Описание модуля создано с использованием макросов, описываемых возможности модуля, с его приоритетом, конфигурацию переменных, горячие клавиши, дочерние модули и другое. Пример описания:

vlc_module_begin();
set_shortname( N_("Hotkeys") );
set_description( N_("Hotkeys management interface") );
set_capability( "interface", 0 );
set_callbacks( Open, Close );
vlc_module_end();

- Open ( vlc_object_t* p_object ): Функция вызывается VLC для инициализации модуля

- Run ( vlc_object_t* p_object ): функция которая выполняет всю работу модуля. (ждёт сигналов от пользователя и выводит информацию). Она должна проверять периодически, что p_intf->b_die не равно VLC_TRUE (если b_die= VLC_TRUE, то модуль должен "умереть", то есть окончить свою работу).

- Close ( vcl_object_t * p_object ) функция, вызываемая VLC для выгрузки модуля (по существу, this уничтожение всего что было создано в Open).

Функции используют параметр vlc_object_t*, но может быть необходимо его конвертировать в intf_thread_t*, содержимое которого уже зависит от ваших нужд . Эта структура часто нужна как параметр для экспортных функций VLC, таких как msg_Err(), msg_Warn(), ...
Объявленная intf_sys_t содержит все переменные, которые вам нужны (не используйте статичные переменные, так как приложение много поточное :-) (по опыту могу сказать что наверное от статичных переменных нет ничего страшного, так как один модуль обычно используется не больше одного раза одновременно).
Если вдобавок есть необходимость добавить дополнительные элементы (например Open кнопка, плейлист, меню, etc.), изучите один из модулей графического интерфейса. Вы можете изучить один постной GUI модуль modules/gui/ncurses.c. Это довольно простой модуль, с взаимодействие с плейлистом, полосой процентов.

Подготовка вашего модуля к компиляции

Если вы создали новую директорию для вашего модуля, добавьте файл Modules.am в неё. Файл должен содержать примерно следующее: SOURCES_yourmodule = myfile1.c myfile2.c.
После откройте главный configure.ac файл, и добавьте в AC_CONFIG_FILES секцию (в конце файла) строку примерно такую modules/gui/yourmodule/makefile.
Если вы не создавали директорию для вашего плагина (то есть он находится в существующей директории), вы только должны добавить данные в SOURCES_... в существующий Modules.am файл.
Это объявление вашего модуля; для автоматической компиляции необходимо проделать следующее.
Вам не надо создавать Makefile для вашего модуля. Это будет сделано через bootstrap о процесс конфигурации. Для этого проделайте следующее:

./bootstrap
./configure configure-options
make

Для сборки модуля в ручную, идете в директорию вашего модуля и наберите make libyourmodule_plugin.so (или .dll, это зависти от операционной системы).
Для автоматической сборки вашего модуля, вы добавили строки в configure.ac file; добавить имя вашего модуля можно в секции AX_ADD_PLUGINS.

< >
Программа была скачена с сайта http://unick-soft.xost.ru

со всеми вопросами обращаться на soft_support@list.ru