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


Метод IMFTransform::P rocessOutput (mftransform.h)

Создает выходные данные из текущих входных данных.

Синтаксис

HRESULT ProcessOutput(
  [in]      DWORD                  dwFlags,
  [in]      DWORD                  cOutputBufferCount,
  [in, out] MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
  [out]     DWORD                  *pdwStatus
);

Параметры

[in] dwFlags

Побитовое ЗНАЧЕНИЕ ИЛИ , равное нулю или более флагам из перечисления _MFT_PROCESS_OUTPUT_FLAGS .

[in] cOutputBufferCount

Количество элементов в массиве pOutputSamples . Значение должно быть не менее 1.

[in, out] pOutputSamples

Указатель на массив MFT_OUTPUT_DATA_BUFFER структур, выделенных вызывающим объектом. MFT использует этот массив для возврата выходных данных вызывающей объекту.

[out] pdwStatus

Получает побитовое значение OR , равное нулю или более флагам, из перечисления _MFT_PROCESS_OUTPUT_STATUS .

Возвращаемое значение

Метод возвращает HRESULT. Допустимые значения включают, но не ограничиваются, значения, приведенные в следующей таблице.

Код возврата Описание
S_OK
Метод выполнен успешно.
E_UNEXPECTED
Метод ProcessOutput был вызван в асинхронном MFT, который не ожидал вызова этого метода.
MF_E_INVALIDSTREAMNUMBER
Недопустимый идентификатор потока в элементе dwStreamID одной или нескольких MFT_OUTPUT_DATA_BUFFER структур.
MF_E_TRANSFORM_NEED_MORE_INPUT
Преобразование не может создавать выходные данные, пока не получит больше входных данных.
MF_E_TRANSFORM_STREAM_CHANGE
Формат изменился в выходном потоке, имеется новый предпочтительный формат или новый выходной поток.
MF_E_TRANSFORM_TYPE_NOT_SET
Необходимо задать тип носителя в одном или нескольких потоках MFT.
 
Примечание При преобразовании объекта мультимедиа DirectX (DMO) в MFT следует помнить, что S_FALSE не является допустимым кодом возврата для IMFTransform::P rocessOutput, в отличие от метода IMediaObject::P rocessOutput .
 

Комментарии

Размер массива pOutputSamples должен быть равен или больше количества выбранных потоков вывода. Количество выбранных выходных потоков равно общему количеству выходных потоков за вычетом количества выделенных потоков. Поток отменяется, если у него есть флаг MFT_OUTPUT_STREAM_OPTIONAL , а вызывающий объект не задает тип носителя (или не задает для него значение NULL). Дополнительные сведения см. в разделе перечисление _MFT_OUTPUT_STREAM_INFO_FLAGS .

Этот метод создает выходные примеры, а также может создавать события. Если метод выполнен успешно, выполняется хотя бы одно из следующих условий:

  • Один или несколько примеров в массиве pOutputSamples содержат выходные данные.
  • Один или несколько элементов массива pOutputSamples содержат непустую коллекцию событий.
Если MFT_UNIQUE_METHOD_NAMES определен перед включением Mftransform.h, этот метод переименован в MFTProcessOutput. См. раздел Создание гибридных объектов DMO/MFT.

Буферы вывода

MFT возвращает выходные данные для потока через элемент pSample структуры MFT_OUTPUT_DATA_BUFFER . Этот элемент структуры является указателем на интерфейс IMFSample образца носителя. (См. примеры мультимедиа.) Образец мультимедиа выделяется вызывающим объектом или MFT в зависимости от модели распределения MFT. Чтобы найти модель распределения, вызовите IMFTransform::GetOutputStreamInfo и проверьте член dwFlagsструктуры MFT_OUTPUT_STREAM_INFO :
  • Если флаг MFT_OUTPUT_STREAM_PROVIDES_SAMPLES присутствует, MFT выделяет образец носителя.
  • Если флаг MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES присутствует, вызывающий объект может при необходимости предоставить образец мультимедиа. Если pSample имеет значение NULL, MFT выделит образец носителя.
  • Если ни тот из этих двух флагов отсутствует, вызывающий объект должен выделить образец носителя.
Эти флаги остаются неизменными, если не изменится тип носителя для выходного потока.

Если вызывающий объект выделяет образец носителя, он должен содержать буфер, который достаточно велик для хранения выходных данных. Чтобы найти требования к буферу, вызовите Метод GetOutputStreamInfo. MFT записывает выходные данные в начало буфера, перезаписав все данные, которые уже существуют в буфере.

Если MFT выделяет образец, MFT также выделяет буферы для примера.

Если MFT имеет несколько выходных потоков, потоки могут выдавать выходные данные с разной скоростью, поэтому некоторые потоки могут иметь выходные данные, а другие — нет. Если поток не выдает выходные данные, MFT устанавливает флаг MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE в элементе dwStatusструктуры MFT_OUTPUT_DATA_BUFFER для этого потока. В этом случае, если вызывающий объект выделил pSample, буферы в примере не содержат допустимых данных. Если вызывающий объект не выделил pSample, флаг MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE указывает, что pSample по-прежнему равно NULL после возврата метода.

Если выходные потоки не имеют данных, а MFT не имеет событий для возврата, processOutput возвращает MF_E_TRANSFORM_NEED_MORE_INPUT.

MFT не может возвращать более одной выборки на поток в одном вызове ProcessOutput. Если после возврата ProcessOutput для потока доступно больше выходных данных, MFT устанавливает флаг MFT_OUTPUT_DATA_BUFFER_INCOMPLETE в элементе dwStatusструктуры MFT_OUTPUT_DATA_BUFFER для этого потока.

Если MFT имеет достаточно данных для получения выходных данных, он должен отказаться принимать дополнительные входные данные, пока ProcessOutput не будет вызван достаточно времени, чтобы извлечь все доступные выходные данные. (Исключением является то, что метод IMFTransform::GetOutputStreamInfo возвращает флаг MFT_OUTPUT_STREAM_LAZY_READ .) Как правило, MFT с несколькими потоками вывода должен как можно скорее создавать выходные данные для потока, а не ждать, пока все потоки будут иметь выходные данные.

События в диапазоне

MFT может возвращать коллекцию объектов событий в элементе pEvents каждой структуры MFT_OUTPUT_DATA_BUFFER . MFT выделяет как объект коллекции, так и события.

Чтобы отправить событие вызывающей объекту, MFT выполняет следующие действия внутри ProcessOutput:

  1. Создайте новый объект коллекции, вызвав MFCreateCollection.
  2. Добавьте одно или несколько событий в коллекцию, вызвав IMFCollection::AddElement.
  3. Установите элемент pEvents структуры MFT_OUTPUT_DATA_BUFFER равным указателю IMFCollection . MFT оставляет счетчик ссылок на этом интерфейсе; вызывающий объект должен освободить указатель.
События не имеют меток времени. Вызывающий объект должен обработать события перед обработкой выходных примеров. Другими словами, события происходят в точке потока сразу после предыдущего вызова ProcessOutput и перед любыми выходными примерами, возвращенными из текущего вызова ProcessOutput .

Метод ProcessOutput может возвращать одно или несколько событий и ноль выходных примеров.

Вызывающий объект отвечает за освобождение всех событий, выделенных MFT. При возврате метода проверка элемент pEvents каждой структуры MFT_OUTPUT_DATA_BUFFER. Если значение не равно NULL, вызывающий объект должен освободить указатель интерфейса IMFCollection :

// Release the events that an MFT might allocate in IMFTransform::ProcessOutput().
void ReleaseEventCollection(DWORD cOutputBuffers, MFT_OUTPUT_DATA_BUFFER* pBuffers)
{
    for (DWORD i = 0; i < cOutputBuffers; i++)
    {
        if (pBuffers[i].pEvents)
        {
            pBuffers[i].pEvents->Release();
            pBuffers[i].pEvents = NULL;
        }
    }
}

MFT не должен использовать интерфейс IMFMediaEventGenerator для отправки событий в полосе.

Изменения Stream

Метод ProcessOutput может вызвать любое из следующих изменений в выходном потоке:
  • Удаление выходного потока. Чтобы сообщить об удалении потока, MFT устанавливает флаг MFT_OUTPUT_DATA_BUFFER_STREAM_END в элементе dwStatusструктуры MFT_OUTPUT_DATA_BUFFER для этого потока.
  • Создание нового выходного потока. Чтобы сообщить о новом выходном потоке, MFT устанавливает флаг MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS в параметре pdwStatus . Новый поток может иметь тот же идентификатор потока, что и удаленный поток.
  • Изменение формата в выходном потоке. Чтобы сообщить об изменении формата, MFT устанавливает флаг MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE в элементе dwStatusструктуры MFT_OUTPUT_DATA_BUFFER для этого потока.
Возможно, все три этих действия будут результатом одного вызова ProcessOutput. Вызывающий объект должен отвечать на них в указанном здесь порядке— сначала удаления, затем добавления, а затем изменения формата.

Флаг MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE сигнализирует об изменении формата в выходном потоке. Это может означать, что текущий тип мультимедиа стал недопустимым или изменился порядок предпочтений и доступен более эффективный формат. В последнем случае клиент может повторно задать исходный тип носителя. Чтобы защититься от бесконечных циклов, MFT не должен устанавливать флаг MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE снова, пока не будет еще одно изменение. Кроме того, не устанавливайте этот флаг, если порядок предпочтения изменяется, но текущий тип носителя по-прежнему является наиболее предпочтительным типом.

Пример атрибутов

Входной образец может иметь атрибуты, доступ к которым осуществляется через интерфейс IMFAttributes . Если конкретный атрибут больше не применяется, все атрибуты должны быть скопированы в соответствующий выходной пример. Ответственность за копирование атрибутов определяется следующим образом:
  • Если значение свойства MFPKEY_EXATTRIBUTE_SUPPORTED в MFT равно VARIANT_TRUE, MFT копирует атрибуты.
  • Если значение MFPKEY_EXATTRIBUTE_SUPPORTEDVARIANT_FALSE или свойство не задано, клиент должен скопировать пример атрибутов. Не перезаписывайте атрибуты, которые MFT задает для выходного примера.
Список примеров атрибутов см. в разделе Примеры атрибутов.

Асинхронная обработка

Предыдущие замечания описывают модель синхронной обработки. Сведения о поддержке асинхронной обработки см. в разделе Асинхронные MFT.

Требования

Требование Значение
Минимальная версия клиента Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2008 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header mftransform.h
Библиотека Mfuuid.lib

См. также раздел

IMFTransform

Преобразования Media Foundation