Преобразования предварительной обработки декодера 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) имеет два варианта обработки изображений:
- Игнорируйте этот флаг и передайте содержимое VideoInfoHeader2 в VMR (флаг AMCONTROL_PAD_TO_4x3 уже будет установлен DVD-навигатором в примере). VmR обнаружит пример видео 16x9 с установленным флагом AMCONTROL_PAD_TO_4x3 и потоком подпиктуры 4x3. Приложение должно задать для выходных нормализованных целевых прямоугольников двух потоков одинаковую ширину.
- Преобразуйте анаморфный поток в изображение 4x3, задав верхний и нижний части изображения и задав пропорции изображения 4x3 (см. letterbox выше) и удалив бит AMCONTROL_PAD_TO_4x3 из VIDEOINFOHEADER2.
Декодеры DirectXVA, которые смешивают видео и вложенные потоки, должны обработать этот флаг. Если оборудование не может масштабировать вложенную вложеннуюpicture, декодер должен создать отдельный поток подпиктуры, чтобы VMR смешивался с видео.
AMMPEG2_WidescreenAnalogOut (0x00000200)
: когда аппаратный декодер отображает этот поток в виде видеовыода (обычно соединитель SVIDEO на карта), он должен иметь дисплей 16x9 (анаморфный).Программный декодер (или аппаратный декодер, создающий выходные данные, отправляемые в VMR) имеет два варианта обработки анаморфного изображения:
- Пропустите этот флаг и скопируйте содержимое VideoInfoHeader2 в VMR. VmR будет заполнять 4 x 3 изображения до 16x9, если для них задано AMCONTROL_PAD_TO_16x9.
- Заместите выходное изображение в изображение 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;
}