Вы пытались позволить SourceReader выполнить преобразование за вас:
hr = mAttributes->SetUINT32(MF_READWRITE_DISABLE_CONVERTERS, FALSE);
По умолчанию считыватель источника и приемник могут выполнять некоторые преобразования формата для несжатых аудио- и видеопотоков. Чтобы отключить это поведение, установите для этого атрибута значение ИСТИНА при создании средства чтения или записи исходного кода.
По умолчанию это FALSE, поэтому вам не нужно явно устанавливать этот атрибут.
Тогда:
hr = mSourceReader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediaType);
с:
mOutputMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12);
Также рассчитайте размер изображения в соответствии с форматом NV12 (MF_MT_FRAME_SIZE). Не устанавливайте MF_MT_DEFAULT_STRIDE, SourceReader сделает это за вас.
Таким образом, идея состоит в том, чтобы получить формат NV12 из SourceReader, даже если источник захвата предоставляет формат RGB32. SourceReader обычно может это сделать.