Информатизации и телекоммуникационных технологий республики узбекистан


Разработка методики анализа работы и исходного кода программного обеспечения для транскодирования потоков



страница10/12
Дата01.12.2017
Размер0.91 Mb.
#659
ТипИсследование
1   ...   4   5   6   7   8   9   10   11   12

2. Разработка методики анализа работы и исходного кода программного обеспечения для транскодирования потоков


В связи с недостатками в работе системы транскодирования цифровых потоков, связанных со стабильностью в работе, предложено проанализировать работу библиотеки LideoLAN путем анализа исходного кода и отладочных тестов.

Для анализа с официального сайта проекта VideoLAN был скачан исходный код проекта.

Для начала необходимо разобраться в структуре проекта.

Структура проекта VLC


Ядро медиа-системы VLC называется libVLCcore. Оно управляет потоками, модулями(кодеками, демультиплексорами, и т.д.), модулями слоев, часами, плейлистами и низкоуровневыми элементами управления в VLC. Например, оно отвечает за управление синхронизацией между всеми аудио, видео дорожками и дорожками субтитров.

На верхнем уровне ядра находится библиотека libVLC, которая дает доступ сторонним разработчикам приложений к использованию всех возможностей ядра. Модули же связываются с libVLCcore, чтобы взаимодействовать с ядром.



Модульность. Одно из основных понятий VLC – это «модульность». VLC является, по сути, полной мультимедийной платформой (как DirectShow или GStreamer), к которой можно подключать множество модулей динамически, в зависимости от необходимости.

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

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

К основным модулям, относящимся к данному исследованию, относятся модули доступа, демультиплексирования, мультиплексирования, декодирования и кодирования.



Модули доступа (access modules) представляют собой протоколы для доступа к потокам, передаваемым по сети (HTTP, FTP, TCP, UDP, RTSP и т.д.), доступа к физическим и иным источникам медиа, таким как CD, DVD, BD, DirectShow и др.

Модуль демультиплексирования (demux module) разбирает поток байтов и разделяет его на элементарные потоки. Технически модули демультиплексирования «вытягивают» данные из потока, данные в него не передаются путем доступа к модулю демультиплексирования. В частности, в проекте VLC имеются следующие модули демультиплексирования: asf (ASF демультиплексор), avi (демультиплексор файлового потока AVI), mp4 (модуль демультиплексирования MP4), mpeg (PS, TS и др.) и playlist (для импорта списков воспроизведения).

Модуль мультиплексирования (mux module) выполняет работу, обратную той, которую выполняет модуль демультиплексирования, то есть соединяет несколько элементарных потоков в один поток байтов для передачи по сети или иным каналам связи.

Модуль декодирования(decoder) и кодирования(encoder) обычно представляет собой единый модуль (codec module), который осуществляет работу декодирования элементарных потоков в сырой формат (raw format) для последующей его обработки и кодирования или сжатия в тот или иной формат. Модули данного типа выполняют математическую часть процесса воспроизведения и/или преобразования мультимедийных потоков. Они не связаны с модулями демультиплексирования и мультиплексирования. Они не взаимодействуют напрямую с устройствами и источниками мультимедиа, а реализуют исключительно алгоритмы.

Работа модулей осуществляется в порядке, представленном на рис. 28.

access

demux


decoder

encoder


mux

access


Input

Output
Рис. 28. Порядок работы модулей библиотеки VLC при транскодировании мультимедийного потока


Подготовка к анализу структуры модулей


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

Параметры запуска системы:

-vvv -I rc http://192.168.0.3:8080/ch1 :sout=#transcode{vcodec=h264,fps=17,vb=512,scale=0,acodec=mp4a,ab=128,channels=2,samplerate=44100,deinterlace}:udp{dst=127.0.0.1:10010} :ttl=17 --extraintf=http:logger --verbose=3 --file-logging --logfile=D:\vlc-log.txt

Отладочная печать, полученная при тестовом прогоне, приведена в Приложении 2.

В соответствие с данными отладочной печати, определяем задействованные модули доступа, демультиплексирования, декодирования, кодирования и мультиплексирования.

На анализ были выбраны следующие строки:

main debug: using sout access module "access_output_udp"

main debug: `http://192.168.0.3:8080/ch1' gives access `http' demux `' path `192.168.0.3:8080/ch1'

main debug: creating demux: access='http' demux='' path='192.168.0.3:8080/ch1'

main debug: creating access 'http' path='192.168.0.3:8080/ch1'

access_http debug: http: server='192.168.0.3' port=8080 file='/ch1'

access_http debug: protocol 'HTTP' answer code 200

access_http debug: Content-Type: application/octet-stream

main debug: using access module "access_http"

main debug: using demux module "ts"

main debug: TIMER module_need() : 151.000 ms - Total 151.000 ms / 1 intvls (Avg 151.000 ms)

main debug: looking for packetizer module: 21 candidates

main debug: using packetizer module "mpeg_audio"

main debug: using packetizer module "packetizer_mpegvideo"

mux_ts debug: shaping=200000 pcr=70000 dts_delay=400000

main debug: using sout mux module "mux_ts"

main debug: muxer support adding stream at any time

main debug: muxer prefers to wait for all ES before starting to mux

stream_out_transcode debug: codec audio=mp4a 44100Hz 2 channels 128Kb/s

stream_out_transcode debug: codec video=h264 0x0 scaling: 0.000000 512kb/s

main debug: using decoder module "mpeg_audio"

avcodec debug: libavcodec initialized (interface 0x350500)

avcodec debug: found encoder MPEG AAC Audio

main debug: using encoder module "avcodec"

avcodec debug: libavcodec already initialized

avcodec debug: trying to use direct rendering

avcodec debug: ffmpeg codec (MPEG-1/2 Video) started

main debug: using decoder module "avcodec"

x264 debug: version x264 0.115.X

main debug: using encoder module "x264"

Исходя из анализа данных строк, были выделены следующие модули:

Модули доступа: http, udp.

Модуль демультиплексирования: ts.

Модули декодирования: mpeg_audio (аудио), avcodec(видео MPEG-1/2).

Модули кодирования: x264 (видео), avcodec (аудио MPEG AAC).

Модуль мультиплексирования: sout_mux_ts.

Анализ структуры модулей


Анализ структуры модулей доступа

Модули доступа работают со структурой данных access_t, описанной в файле заголовка vlc_access.h.


collaboration graph

Рис 29. Фрагмент диаграммы взаимодействия для модуля доступа.

Исходный код рассматриваемых модулей представлен в Приложении 3.

Модуль доступа http описывается в файле http.c. Данный модуль содержит следующие методы:

Open(), OpenWithCookies() – методы открытия модуля.

Close() – закрытие модуля.

ReadData(), ReadICYMeta(), Read(), ReadCompressed() – методы чтения.

Seek() – метод сдвига курсора для чтения.

Control() – метод управления модулем.

Connect() – метод для открытия HTTP-соединения.

Request() – метод для создания и посылки HTTP-запроса.

Disconnect() – метод разрыва соединения.

cookie_get_content(), cookie_get_domain(), cookie_get_name(), cookie_append() – методы для работы с куки.

AuthReply(), AuthCheckReply() – методы аутентификации.


Модуль доступа udp описывается в файле udp.c. Данный модуль содержит следующие методы:

Open() – метод открытия модуля.

Close() – закрытие модуля.

Control() – метод для управления модулем.

BlockUDP() – работа с блоками UDP.

Анализ исходного кода модуля демультиплексирования

Модули демультиплексирования работают со структурой данных demux_t, описанной в файле заголовка vlc_demux.h.



collaboration graph

Рис 30. Фрагмент диаграммы взаимодействия для модуля демультиплексирования.

Модуль демультиплексирования ts описывается в файле ts.c. Данный модуль содержит следующие основные методы:

Open() – методы открытия модуля.

Close() – закрытие модуля.

Demux(), DemuxFile() – методы демультиплексирования.

Control() – метод управления модулем.

Также данный модуль содержит множество методов для работы с элементарными потоками.

Исходный код рассматриваемого модуля представлен в Приложении 3.

Анализ исходного кода модулей кодирования и декодирования

В основе работы модулей кодирования и декодирования лежат структуры данных encoder_t и decoder_t.



collaboration graph

Рис. 31. Диаграмма взаимодействия для структуры кодировщика



collaboration graph

Рис. 32. Фрагмент диаграммы взаимодействия для структуры декодировщика


Модуль avcodec описывается в файле avcodec/avcodec.c и содержит следующие основные методы:

OpenDecoder() – открытие декодировщика.

CloseDecoder() – закрытие декодировщика.

InitLibavcodec() – инициация кодека libav.

ffmpeg_OpenCodec() – открытие кодека ffmpeg.

ffmpeg_CopyPicture(), ffmpeg_GetFrameBuf(), ffmpeg_ReGetFrameBuf(), ffmpeg_ReleaseFrameBufI() – функции для работы с кадрами.

InitVideoDec(), DecodeVideo(), EndVideoDec() – декодирование видео.
Модуль кодека x264 описывается в файле x264.c и содержит следующие основные методы:

Open() – открытие кодека.

Close() – закрытие кодека.

Encode() – кодирование видео.



Анализ исходного кода модуля мультиплексирования

Модуль мультиплексирования mpeg-ts описан в файле mpeg/ts.c.

Данный модуль содержит следующие основные методы:

Open() – методы открытия модуля.

Close() – закрытие модуля.

Control() – управление модулем.

AddStream(), DelStream() – работа с потоками.

Mux() – мультиплексирование.

PEStoTS() – конвертирует элементарный поток в транспортный.




Поделитесь с Вашими друзьями:
1   ...   4   5   6   7   8   9   10   11   12




База данных защищена авторским правом ©vossta.ru 2022
обратиться к администрации

    Главная страница