Пример фильтра синтаксического анализатора PSI

Описание

Фильтр синтаксического анализатора PSI получает сведения о программе (PSI) из транспортного потока MPEG-2 и извлекает сведения о программе из таблицы ассоциаций программ (PAT) и таблиц карт программ (PMT). Эта информация позволяет приложению настроить mpeg-2 Demultiplexer. Фильтр поддерживает пользовательский интерфейс IMpeg2PsiParser для получения сведений PSI.

Этот фильтр предназначен для устройств MPEG-2, таких как камеры IEEE 1394 MPEG-2 и устройства D-VHS. Дополнительные сведения см. в разделе MSTape Driver . Источники цифрового телевизионного вещания должны использовать фильтр TIF для получения информации о программе.

Использование

Фильтр синтаксического анализатора PSI можно проверить в GraphEdit следующим образом:

  1. Запустите GraphEdit.

  2. Вставьте источник транспорта MPEG-2. Камеры MPEG-2 и устройства D-VHS отображаются как "Устройство подсоединений ленты Microsoft AV/C" в категории "Источники видеозахвата".

  3. Подключение фильтр источника в фильтр MPEG-2 Demultiplexer.

  4. Используйте страницу свойств в demux, чтобы создать выходной контакт с типом носителя MPEG-2 PSI. Этот контакт обеспечит доставку разделов PAT и PMT.

  5. Используйте страницу свойств demux, чтобы сопоставить PID 0x00 с выходным закреплением. Задайте для типа контента значение MPEG2 PSI Sections(Разделы MPEG2 PSI).

  6. Подключение пин-код вывода demux в анализатор PSI, как показано на следующей схеме.

    psi parser filter graph

  7. Запустите граф, чтобы передать данные PSI в фильтр анализатора PSI. По мере того как фильтр декодирует разделы PAT, он автоматически сопоставляет ИДЕНТИФИКАТОРы PMT с тем же выходным закреплением на демю, чтобы он получал разделы PMT.

  8. Используйте страницу свойств средства синтаксического анализа PSI, чтобы выбрать номер программы. В списке простых потоков на странице свойств будет отображаться идентификатор и тип потока, связанные с каждым элементарным потоком в выбранной программе. Страница свойств предназначена для распознавания типов потоков, определенных в iso/IEC 13818-1.

  9. Введите номер PID звука в поле ввода "Звуковой PID " и номер видео PID в поле редактирования видео PID .

  10. Нажмите кнопку "Просмотреть программу ". Средство синтаксического анализа PSI настроит выходные контакты на demux для сопоставления сведений о потоке программы и отрисовки контактов.

Примечание

Страница свойств анализатора PSI предоставляется для упрощения тестирования и предоставления примера кода, который настраивает MPEG-2 Demultiplexer. Не рекомендуется использовать приложения. Приложения должны программно настроить demux.

 

Чтобы использовать фильтр синтаксического анализатора PSI в приложении, сначала создайте граф фильтра из источника MPEG-2 в формат MPEG-2 demux. Код для этого шага не отображается здесь, так как точную конфигурацию графа будет зависеть от источника.

Затем создайте выходную закрепление в демуксе для данных PSI. Сопоставьте 0x00 PID, зарезервированные для разделов PAT, с этим закреплением, как показано в следующем коде:

// Set the media type to MPEG-2 table sections.
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;

// Create the pin.
IPin *pPsiPin;
hr = pDemux->CreateOutputPin(&mt, L"PSI", &pPsiPin);
if (SUCCEEDED(hr))
{
    // Map to PID 0.
    ULONG Pid = 0x00;
    hr = pPid->MapPID(1, &Pid, MEDIA_MPEG2_PSI);
}

Дополнительные сведения см. в разделе "Использование mpeg-2 Demultiplexer".

Добавьте фильтр синтаксического анализатора PSI в граф и подключите его к выходной закреплению в демю. Запросите средство синтаксического анализа PSI для интерфейса IMpeg2PsiParser . Теперь запустите граф и дождитесь событий EC_PROGRAM_CHANGED, которые сигналит новому разделу PAT или PMT. Это событие является пользовательским событием, определенным фильтром анализатора PSI. При получении события EC_PROGRAM_CHANGED можно получить доступные сведения О PSI, вызвав методы IMpeg2PsiParser . В этом разделе описываются наиболее часто необходимые методы.

Чтобы получить количество программ, используйте метод IMpeg2PsiParser::GetCountOfPrograms :

int NumProgs = 0;
hr = pPsi->GetCountOfPrograms(&NumProgs);

Чтобы получить номер программы для конкретной программы, используйте метод IMpeg2PsiParser::GetRecordProgramNumber :

WORD ProgNum = 0;
for (int i = 0; i < NumProgs; i++)
{
    hr = pPsi->GetRecordProgramNumber(i, &ProgNum);
    ...
}

Номер программы используется для получения записей PMT для отдельных программ. Чтобы получить количество простых потоков в программе, используйте метод GetCountOfElementaryStreams :

WORD cElemStreams = 0;
hr = pPsi->GetCountOfElementaryStreams(ProgNum, &cElemStreams);

Для каждого простого потока метод IMpeg2PsiParser::GetRecordElementaryPid возвращает идентификатор PID , а метод IMpeg2PsiParser::GetRecordStreamType возвращает тип потока:

BYTE ESType = 0;
WORD ESPid = 0;
for (WORD j = 0; j < cElemStreams; j++)
{
    hr = pPsi->GetRecordElementaryPid(ProgNum, j, &ESPid);
    hr = pPsi->GetRecordStreamType(ProgNum, j, &ESType);
}

PID и тип потока позволяют настроить новые выходные контакты на MPEG-2 Demultiplexer. Для этого может потребоваться некоторое знание исходного источника. Например, ISO/IEC 13818-1 определяет типы потоков, 0x80 через 0xFF как "частные пользователи", но другие стандарты, основанные на MPEG-2, могут назначать другие значения этим типам.

Демульплексер MPEG-2 может создавать новые контакты и новые сопоставления PID во время работы графа, но для подключения контактов необходимо остановить граф.

Скачивание примера

Чтобы скачать примеры пакета SDK для DirectShow, установите последнюю версию пакета SDK Windows.

Этот пример устанавливается по следующему пути: [корневой каталог SDK]\Samples\Multimedia\DirectShow\Filters\PSIParser.

Примеры DirectShow

Интерфейс IMpeg2PsiParser