Поделиться через


Преобразования предварительной обработки декодера MPEG

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Letterbox и PanScan

Изображение 4x3 можно сформировать путем заполнения верхней и нижней части изображения (называемого изображением Letterbox) или путем извлечения части изображения 4x3 (называемой изображением PanScan). Меню и вложенные потоки накладываются поверх окончательного видеоистопа. Изображения с соотношением 16x9 хранятся в анаморфном формате 4x3. Растяжение анаморфного пропорции 4x3 исходного видео 720x480 до пропорций 16x9 формирует исходное изображение 16x9.

Ниже приведено описание правильного отображения каждого из режимов и их выделения.

  • Широкоэкранный: Исходное видео растянуто в самую большую область окна вывода 16x9. Основные моменты относятся к внутренней части области 16x9. Черные полосы следует добавлять в верхнюю и нижнюю части или по бокам, чтобы сохранить область 16x9.
  • Сканирование сдвига: Из видео 16x9 используйте горизонтальное смещение, предоставленное в потоке MPEG2, для извлечения подокна 4x3. Поместите подокно 4x3 в самую большую область 4x3 окна выходного клиента. Координаты выделения относятся к окну вывода 4x3 и не связаны с исходным видео 16x9. Черные полосы следует добавлять в верхнюю и нижнюю части или по бокам, чтобы сохранить область 4x3.
  • Почтовый ящик: Вычисление самой большой области окна вывода 4x3. Черные полосы следует добавлять в верхнюю и нижнюю части или по бокам, чтобы сохранить область 4x3. Исходное анаморфное видео 4x3 (представляющее изображение 16x9) помещается в самое большое подокно 16x9 внутри области 4x3. Черные полосы должны быть добавлены в верхнюю и нижнюю части подокна, чтобы сохранить область 16x9. Координаты выделения относятся к области 4x3 и не имеют отношения к исходному видео 16x9. Диск может указать выделение, которое находится за пределами области 16x9 (но все равно в окне 4x3). Для видео 4x3 видео помещается в самую большую область вывода 4x3 окна выходного клиента. Черные полосы следует добавлять в верхнюю и нижнюю части или по бокам, чтобы сохранить область 4x3.

Предварительная обработка MPEG с помощью DVD-навигатора и VMR

В настоящее время декодер передается FORMAT_MPEG2_VIDEO типу мультимедиа (блок формата которого указывает на структуру MPEG2VIDEOINFO ). На выходных контактах декодер создает FORMAT_VideoInfo2 тип мультимедиа, блок формата которого указывает на структуру VIDEOINFOHEADER2 . Поле dwReserved структуры переименовано в флаги dwControls .

Элемент dwControlFlags теперь будет содержать новые биты.

Метка Значение
AMCONTROL_USED 0x00000001
AMCONTROL_PAD_TO_4x3 0x00000002
AMCONTROL_PAD_TO_16x9 0x00000004

 

AMCONTROL_USED используется для проверки поддержки этих новых флагов. Исходный фильтр должен задать флаг AMCONTROL_USED и проверить, успешно ли выполняется QueryAccept(MediaType) в подчиненном закреплении. Если он отклоняется, флаги AMCONTROL нельзя использовать, а параметру dwReserved1 необходимо присвоить значение 0.

AMCONTROL_PAD_TO_4x3 указывает, что изображение должно быть заполнено и отображено в области 4x3.

AMCONTROL_PAD_TO_16x9 указывает, что изображение должно быть заполнено и отображено в области 16x9.

Декодер должен слепо копировать или обрабатывать биты. Если декодер выполняет сам почтовый ящик, он должен изменить пропорции пикселей, заполнить изображение и удалить соответствующие биты AMCONTROL_*.

MPEG2VIDEOINFO.dwFlags теперь содержит три флага для управления отображением содержимого:

  • AMMPEG2_DoPanScan (0x00000001): если этот флаг установлен, декодер видео MPEG-2 должен обрезать выходное изображение на основе векторов панорамного сканирования в picture_display_extension и изменить пропорции изображения на 4x3. VmR не должен получать пример 16x9 с этим флагом. Простая реализация может изменить исходный прямоугольник, чтобы указать исходную область шириной 540 с левым краем, равным смещению отображения в picture_display_extension.

  • AMMPEG2_LetterboxAnalogOut (0x00000020): когда аппаратный декодер отображает этот поток в виде видеовыода (обычно соединитель SVIDEO на карта), он должен применять правила для отображения образца 16x9 на дисплее 4x3.

    Программный декодер (или аппаратный декодер, создающий выходные данные, отправляемые в VMR) имеет два варианта обработки изображений:

    1. Игнорируйте этот флаг и передайте содержимое VideoInfoHeader2 в VMR (флаг AMCONTROL_PAD_TO_4x3 уже будет установлен DVD-навигатором в примере). VmR обнаружит пример видео 16x9 с установленным флагом AMCONTROL_PAD_TO_4x3 и потоком подпиктуры 4x3. Приложение должно задать для выходных нормализованных целевых прямоугольников двух потоков одинаковую ширину.
    2. Преобразуйте анаморфный поток в изображение 4x3, задав верхний и нижний части изображения и задав пропорции изображения 4x3 (см. letterbox выше) и удалив бит AMCONTROL_PAD_TO_4x3 из VIDEOINFOHEADER2.

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

  • AMMPEG2_WidescreenAnalogOut (0x00000200): когда аппаратный декодер отображает этот поток в виде видеовыода (обычно соединитель SVIDEO на карта), он должен иметь дисплей 16x9 (анаморфный).

    Программный декодер (или аппаратный декодер, создающий выходные данные, отправляемые в VMR) имеет два варианта обработки анаморфного изображения:

    1. Пропустите этот флаг и скопируйте содержимое VideoInfoHeader2 в VMR. VmR будет заполнять 4 x 3 изображения до 16x9, если для них задано AMCONTROL_PAD_TO_16x9.
    2. Заместите выходное изображение в изображение 16x9 и удалите бит AMCONTROL_PAD_TO_16x9.

Большинство декодеров должны использовать GetMediaType для обнаружения изменений мультимедиа на входном контакте и копирования содержимого VIDEOINFOHEADER2 (содержащегося в MPEG2INFOHEADER) в выходной контакт. Вероятно, они будут обрабатывать только бит PanScan.

В следующем примере кода показано, как скопировать содержимое VIDEOINFOHEADER2 из входного контакта в выходной.

#include <dvdmedia.h>
HRESULT CopyMPeg2ToVideoInfoHeader2(CMediaSample* pInSample, CMediaSample* pOutSample)
{
    HRESULT hr = S_OK;
    // Check for a media type on the input sample.
    AM_MEDIA_TYPE* pInType;
    if (pInSample->GetMediaType(&pInType) == S_OK) 
    {
        // Make sure it's an MPEG2 Video format.
        if ((pInType->formattype == FORMAT_MPEG2_VIDEO) &&
            (pInType->cbFormat >= sizeof(MPEG2VIDEOINFO)))
        {
            hr = S_OK; // Initialize hr for the CMediaType constructor.
            CMediaType outType(*pInType, &hr);
            if (FAILED(hr))
            {
                DeleteMediaType( pInType );
                return hr;
            }

            // Set the format type GUID.
            outType.SetFormatType(&FORMAT_VideoInfo2);
                
            // Truncate the format block to include just the VIDEOINFOHEADER part.
            MPEG2VIDEOINFO *pMPeg2Header = (MPEG2VIDEOINFO*)pInType->pbFormat;
            BYTE *pVIH = (BYTE*)&pMPeg2Header->hdr;
            hr = (outType.SetFormat(pVIH, sizeof(VIDEOINFOHEADER2)) ? S_OK : E_OUTOFMEMORY);
            if (SUCCEEDED(hr))
            {
                hr = pOutSample->SetMediaType(&outType);
            }
        } 
        else 
        {
            ASSERT(FALSE); // Not a MPEG2 header.
            hr = VFW_E_INVALIDMEDIATYPE;
        }
        DeleteMediaType( pInType );
    } 

    return hr;
}