Использование средства чтения исходного кода Media Foundation для чтения 3D (слева направо) видео - PullRequest
0 голосов
/ 24 декабря 2018

При попытке прочитать видео 4K, помеченное как 3D слева направо, IMFSourceReader возвращает изображения размером 1920x2160 (половина изображения).Я хотел бы получить полное изображение, если это возможно, или, по крайней мере, иметь доступ ко второй половине.

Мне известно о MF_ENABLE_3DVIDEO_OUTPUT, но я не уверен, как применить его к IMFSourceReader.Я попытался установить его на тип носителя, но это ничего не изменило.

Читатель исходного кода говорит мне, что ширина потока равна половине размера кадра (1920x2160 для фильма 4K), но когда яиспользуйте GetBufferCount на примере, результат равен 1. Поэтому я понятия не имею, как получить все данные фрейма.

Я посмотрел на образец DX11VideoRenderer, и, похоже, предполагается, что GetBufferCount возвращает 2. Этооднако не использует IMFSourceReader, поэтому я не уверен, как применить то, что он делает к этому сценарию.

Оптимально, я хочу использовать MF3DVideoOutputType_BaseView и получить полное исходное изображение 4K.

Редактировать:

Это связано с данными Facebook 180.(Настройка «Half Equirectangular» и «Side-bySide». В результате получаются сферические метаданные YouTube V1 в MP4 с особым параметром, который Facebook распознает для стереофонических видео 180 градусов.)

Пример видео доступен здесь: https://drive.google.com/open?id=154dl33y9RKZcvTqdBZkLQ5Y5ckG2mZtf (он будет удален в какой-то момент в будущем; если у кого-то есть лучшая рекомендация о том, куда его загрузить, не стесняйтесь предлагать его).

1 Ответ

0 голосов
/ 26 декабря 2018

Это может быть не совсем ответ, потому что я могу сделать то, что вы пытаетесь, просто прочитав.Однако приведенные ниже шаги могут дать вам подсказку, где можно устранить неполадки.

IMFSourceReader возвращает изображения размером 1920x2160 (половина изображения).Я хотел бы получить полное изображение, если это возможно, или, по крайней мере, иметь доступ ко второй половине.

Я обработал ваш пример видео с помощью приложения, которое использует MF Source Reader для чтения видео, распаковки исохранить как отдельные кадры.Я вижу обе части видео доступны.

enter image description here

Вот подробности.

Тип мультимедиа для видео обозначает 3D-видео:

MF_MT_MAJOR_TYPE, vValue {73646976-0000-0010-8000-00AA00389B71} (Type VT_CLSID, MFMediaType_Video, FourCC vids)
MF_MT_SUBTYPE, vValue {34363248-0000-0010-8000-00AA00389B71} (Type VT_CLSID, MFVideoFormat_H264, FourCC H264)
MF_MT_AM_FORMAT_TYPE, vValue {E06D80E3-DB46-11CF-B4D1-00805F6CBBEA} (Type VT_CLSID, WMFORMAT_MPEG2Video)
MF_MT_VIDEO_PROFILE, vValue 100 (Type VT_UI4)
MF_MT_VIDEO_LEVEL, vValue 51 (Type VT_UI4)
MF_MT_FRAME_SIZE, vValue 16492674418800 (Type VT_UI8, 3840x2160)
MF_MT_PIXEL_ASPECT_RATIO, vValue 4294967297 (Type VT_UI8, 1:1)
MF_MT_INTERLACE_MODE, vValue 7 (Type VT_UI4)
MF_MT_FRAME_RATE, vValue 128849018881001 (Type VT_UI8, 30000/1001, 29.970)
MF_MT_SAMPLE_SIZE, vValue 1 (Type VT_UI4)
MF_MT_AVG_BITRATE, vValue 82101870 (Type VT_UI4)
MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY, vValue 0 (Type VT_UI4)
MF_MT_MPEG4_SAMPLE_DESCRIPTION, vValue 00 00 59 2A 73 74 73 64 00 00 00 00 00 00 00 01 00 00 59 1A 61 76 63 31 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F 00 08 70 00 48 00 00 00 48 00 00 00 00 00 00 00 01 15 41 6D 62 61 72 65 6C 6C 61 20 41 56 43 20 65 6E 63 6F 64 65 72 00 00 00 00 00 00 00 00 00 00 00 18 FF FF 00 00 00 4B 61 76 63 43 01 64 00 33 FF E1 00 34 27 64 00 33 AC 34 C8 03 C0 04... (Type VT_VECTOR | VT_UI1)
MF_MT_MPEG_SEQUENCE_HEADER, vValue 00 00 01 27 64 00 33 AC 34 C8 03 C0 04 3E 84 00 00 0F A4 00 03 A9 83 A1 80 00 4C 4B 40 00 03 93 87 0B BC B8 D0 C0 00 26 25 A0 00 01 C9 C3 85 DE 5C 3E 11 08 D4 00 00 00 00 01 28 EE 38 B0 (Type VT_VECTOR | VT_UI1)
MF_MT_VIDEO_3D, vValue 1 (Type VT_UI4)
MF_MT_VIDEO_3D_FORMAT, vValue 2 (Type VT_UI4)
MF_MT_VIDEO_ROTATION, vValue 0 (Type VT_UI4)
MF_NALU_LENGTH_SET, vValue 1 (Type VT_UI4)
MF_PROGRESSIVE_CODING_CONTENT, vValue 1 (Type VT_UI4)
{11D25A49-BB62-467F-9DB1-C17165716C49}, vValue 00 00 00 00 00 00 00 00 00 00 00 00 (Type VT_VECTOR | VT_UI1)
{4A8FC407-6EA1-46C8-B567-6971D4A139C3}, vValue 0 (Type VT_UI4)
{A51DA449-3FDC-478C-BCB5-30BE76595F55}, vValue 1 (Type VT_UI4)

Примечание 3840x2160разрешение и MF_MT_VIDEO_3D_FORMAT значение MFVideo3DSampleFormat_Packed_LeftRight:

Каждый образец мультимедиа содержит один буфер, причем оба представления упакованы рядом в один кадр.

Это похоже на правильное чтение вашего файла.У меня есть приложение, которое настраивает Source Reader с помощью вызова SetCurrentMediaType со следующим типом носителя:

MF_MT_MAJOR_TYPE, vValue {73646976-0000-0010-8000-00AA00389B71} (Type VT_CLSID, MFMediaType_Video, FourCC vids)
MF_MT_SUBTYPE, vValue {00000016-0000-0010-8000-00AA00389B71} (Type VT_CLSID, MFVideoFormat_RGB32, FourCC 0x00000016)
MF_MT_FRAME_SIZE, vValue 16492674418800 (Type VT_UI8, 3840x2160)
MF_MT_PIXEL_ASPECT_RATIO, vValue 4294967297 (Type VT_UI8, 1:1)
MF_MT_INTERLACE_MODE, vValue 2 (Type VT_UI4)
MF_MT_FRAME_RATE, vValue 128849018881001 (Type VT_UI8, 30000/1001, 29.970)

То есть оно запрашивает распаковку видео в формат RGB с полным разрешением.

Source Readerс таким запросом можно согласиться и поставляет видеодекодер для преобразования формата:

Category MFT_CATEGORY_VIDEO_DECODER, Direct3D 11 Aware, Input MFVideoFormat_H264, 3840 x 2160, Output MFVideoFormat_NV12, 3840 x 2160

По-видимому, это декодер H.264 Video Decoder на случай, если вы захотите управлять им непосредственно снаруживнутреннего конвейера Source Reader.

Первый пример считываемого видео имеет следующие атрибуты:

MF_NALU_LENGTH_INFORMATION, vValue  (Type VT_VECTOR | VT_UI1)
MFSampleExtension_ForwardedDecodeUnits, vValue ??? (Type VT_UNKNOWN)
MFSampleExtension_AccumulatedNonRefPicPercent, vValue 0 (Type VT_UI4)
MFSampleExtension_Token, vValue ??? (Type VT_UNKNOWN, 0x00000282397B1020)
MFSampleExtension_CleanPoint, vValue 1 (Type VT_UI4)
MFSampleExtension_Discontinuity, vValue 1 (Type VT_UI4)
MFSampleExtension_FrameCorruption, vValue 0 (Type VT_UI4)
nSampleTime 0, nSampleDuration 33 3666, nBufferCount 1, nTotalLength 33177600
nBufferIndex 0, nCurrentLength 33177600, nMaxLength 33177600

Как видно, он имеет один буфер и размер данных составляет 3840 *2160* 4 байта.Сам образ является тем, который я прикрепил выше, с обеими половинками.

Это поведение в Windows 10 Октябрь 2018 Обновление (версия 1809).Я полагаю, что поведение в основном соответствует вашему первоначальному запросу.Я также вижу, что атомы MP4 также показывают полное разрешение (3840x2160), поэтому в целом поведение, о котором я упоминал выше, и то, что я на самом деле вижу, вполне ожидаемо.Более того, даже SDK topoedit воспроизводит файл с двумя половинами, что означает, что для достижения поведения фильмов и телевизора, когда стерео смешивается с половинами, необходимо специально настроить декодер определенным образом.

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

Однако может также случиться, что в более ранних версиях Windows отсутствовала поддержка сферического видео, и оно урезало видео, видя, что оно состоит из половинок, но в то же время не имеет пути к коду и реализации для сферических возможностей.

Windows 10 версии 1803 обеспечивает поддержку предварительного просмотра, захвата и записи 360 камер с помощью существующих API MediaCapture.[…]

ОБНОВЛЕНИЕ 27-Dec-2018: Кажется, проблема ограничена или, по крайней мере, связана с включением MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING.При включении Source Reader применяет Видеопроцессор MFT для преобразования формата вместо внутреннего преобразователя (который, однако, AFAIR не аппаратно ускоряется).Внутренний не аппаратный преобразователь выводит оба представления прозрачно, даже не подозревая, что кадр имеет два представления.Видеопроцессор MFT, однако, заявил о возможностях стерео 3D и в своем режиме работы по умолчанию отбрасывает вторую половину.

Кратко рассмотрев, я не смог включить его параметры 3D-вывода и переключить его, чтобы сохранить самую правую половину, будь то часть одиночного буфера, или вторичный буфер, или как поверхность вторичной текстуры.Однако, поскольку похоже, что вторая половина разделена на шаге после декодирования, она должна хорошо работать, если, например - и может быть несколько подобных способов сделать это - текстура NV12 считывается из Source Reader, затемТрехмерная информация удаляется из образца / текстуры, дальнейшее преобразование, в том числе с поддержкой графического процессора, формата пикселей приводит к преобразованию полного кадра 3840x2160 без удаления второй половины.

...