Metode IMFTransform::P rocessOutput (mftransform.h)

Menghasilkan output dari data input saat ini.

Sintaks

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

Parameter

[in] dwFlags

Bitwise OR dari nol atau lebih bendera dari enumerasi _MFT_PROCESS_OUTPUT_FLAGS .

[in] cOutputBufferCount

Jumlah elemen dalam array pOutputSamples . Nilai harus minimal 1.

[in, out] pOutputSamples

Penunjuk ke array struktur MFT_OUTPUT_DATA_BUFFER , dialokasikan oleh pemanggil. MFT menggunakan array ini untuk mengembalikan data output ke pemanggil.

[out] pdwStatus

Menerima bendera bitwise OR nol atau lebih dari enumerasi _MFT_PROCESS_OUTPUT_STATUS .

Nilai kembali

Metode mengembalikan HRESULT. Nilai yang mungkin termasuk, tetapi tidak terbatas pada, yang ada dalam tabel berikut.

Menampilkan kode Deskripsi
S_OK
Metode berhasil.
E_UNEXPECTED
Metode ProcessOutput dipanggil pada MFT asinkron yang tidak mengharapkan panggilan metode ini.
MF_E_INVALIDSTREAMNUMBER
Pengidentifikasi aliran tidak valid di anggota dwStreamID dari satu atau beberapa struktur MFT_OUTPUT_DATA_BUFFER .
MF_E_TRANSFORM_NEED_MORE_INPUT
Transformasi tidak dapat menghasilkan data output sampai menerima lebih banyak data input.
MF_E_TRANSFORM_STREAM_CHANGE
Format telah berubah pada aliran output, atau ada format pilihan baru, atau ada aliran output baru.
MF_E_TRANSFORM_TYPE_NOT_SET
Anda harus menyetel tipe media pada satu atau beberapa aliran MFT.
 
Catatan Jika Anda mengonversi DirectX Media Object (DMO) ke MFT, ketahuilah bahwa S_FALSE bukan kode pengembalian yang valid untuk IMFTransform::P rocessOutput, tidak seperti metode IMediaObject::P rocessOutput .
 

Keterangan

Ukuran array pOutputSamples harus sama dengan atau lebih besar dari jumlah aliran output yang dipilih . Jumlah aliran output yang dipilih sama dengan jumlah total aliran output dikurangi jumlah aliran yang tidak dipilih . Aliran tidak dipilih jika memiliki bendera MFT_OUTPUT_STREAM_OPTIONAL dan pemanggil tidak mengatur jenis media (atau mengatur jenis media ke NULL). Untuk informasi selengkapnya, lihat enumerasi _MFT_OUTPUT_STREAM_INFO_FLAGS .

Metode ini menghasilkan sampel output dan juga dapat menghasilkan peristiwa. Jika metode berhasil, setidaknya salah satu kondisi berikut ini benar:

  • Satu atau beberapa sampel dalam array pOutputSamples berisi data output.
  • Satu atau beberapa anggota array pOutputSamples berisi kumpulan peristiwa yang tidak kosong.
Jika MFT_UNIQUE_METHOD_NAMES didefinisikan sebelum menyertakan Mftransform.h, metode ini diganti namanya menjadi MFTProcessOutput. Lihat Membuat Objek DMO/MFT Hibrid.

Buffer Output

MFT mengembalikan data output untuk aliran melalui anggota pSample dari struktur MFT_OUTPUT_DATA_BUFFER . Anggota struktur ini adalah penunjuk ke antarmuka IMFSample dari sampel media. (Lihat Sampel Media.) Sampel media dialokasikan baik oleh pemanggil atau oleh MFT, tergantung pada model alokasi MFT. Untuk menemukan model alokasi, panggil IMFTransform::GetOutputStreamInfo dan periksa anggota dwFlags dari struktur MFT_OUTPUT_STREAM_INFO :
  • Jika bendera MFT_OUTPUT_STREAM_PROVIDES_SAMPLES ada, MFT mengalokasikan sampel media.
  • Jika bendera MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES ada, penelepon dapat secara opsional memberikan sampel media. Jika pSampleNULL, MFT akan mengalokasikan sampel media.
  • Jika kedua bendera ini tidak ada, pemanggil harus mengalokasikan sampel media.
Bendera ini tetap konstan kecuali jenis media untuk aliran output berubah.

Jika penelepon mengalokasikan sampel media, sampel media harus berisi buffer yang cukup besar untuk menyimpan data output. Untuk menemukan persyaratan buffer, hubungi GetOutputStreamInfo. MFT menulis data output ke awal buffer, menimpa data apa pun yang sudah ada di buffer.

Jika MFT mengalokasikan sampel, MFT juga mengalokasikan buffer untuk sampel.

Jika MFT memiliki beberapa aliran output, aliran mungkin menghasilkan output pada tingkat yang berbeda, sehingga beberapa aliran mungkin memiliki output sementara aliran lain tidak. Jika aliran tidak menghasilkan output apa pun, MFT menetapkan bendera MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE di anggota dwStatus dari struktur MFT_OUTPUT_DATA_BUFFER untuk aliran tersebut. Dalam hal ini, jika pemanggil mengalokasikan pSample, buffer dalam sampel tidak berisi data yang valid. Jika pemanggil tidak mengalokasikan pSample, bendera MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE menunjukkan bahwa pSample masih sama dengan NULL setelah metode kembali.

Jika tidak ada aliran output yang memiliki data, dan MFT tidak memiliki peristiwa untuk dikembalikan, Maka ProcessOutput mengembalikan MF_E_TRANSFORM_NEED_MORE_INPUT.

MFT tidak dapat mengembalikan lebih dari satu sampel per aliran dalam satu panggilan ke ProcessOutput. Jika ada lebih banyak data output yang tersedia untuk aliran setelah ProcessOutput kembali, MFT mengatur bendera MFT_OUTPUT_DATA_BUFFER_INCOMPLETE di anggota dwStatus dari struktur MFT_OUTPUT_DATA_BUFFER untuk aliran tersebut.

Jika MFT memiliki cukup data untuk menghasilkan output, MFT harus menolak untuk menerima input lagi sampai ProcessOutput telah dipanggil cukup kali untuk menarik semua output yang tersedia. (Pengecualian adalah ketika metode IMFTransform::GetOutputStreamInfo mengembalikan bendera MFT_OUTPUT_STREAM_LAZY_READ .) Umumnya, MFT dengan beberapa aliran output harus menghasilkan output untuk aliran sesegera mungkin, dan tidak menunggu semua aliran memiliki output.

Acara In-Band

MFT dapat mengembalikan kumpulan objek peristiwa di anggota pEvents dari setiap struktur MFT_OUTPUT_DATA_BUFFER . MFT mengalokasikan objek koleksi dan peristiwa.

Untuk mengirim peristiwa ke pemanggil, MFT melakukan langkah-langkah berikut di dalam ProcessOutput:

  1. Buat objek koleksi baru dengan memanggil MFCreateCollection.
  2. Tambahkan satu atau beberapa peristiwa ke koleksi dengan memanggil IMFCollection::AddElement.
  3. Atur anggota pEvents dari struktur MFT_OUTPUT_DATA_BUFFER sama dengan penunjuk IMFCollection . MFT meninggalkan jumlah referensi pada antarmuka ini; penelepon harus melepaskan penunjuk.
Peristiwa tidak memiliki stempel waktu. Pemanggil harus memproses peristiwa sebelum memproses sampel output. Dengan kata lain, peristiwa terjadi pada titik di aliran segera setelah panggilan sebelumnya ke ProcessOutput, dan sebelum sampel output apa pun yang dikembalikan dari panggilan ProcessOutput saat ini.

Ini berlaku untuk metode ProcessOutput untuk mengembalikan satu atau beberapa peristiwa dan nol sampel output.

Pemanggil bertanggung jawab untuk merilis peristiwa apa pun yang dialokasikan MFT. Saat metode kembali, periksa anggota pEvents dari setiap struktur MFT_OUTPUT_DATA_BUFFER . Jika nilainya bukan NULL, pemanggil harus merilis penunjuk antarmuka 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 tidak boleh menggunakan antarmuka IMFMediaEventGenerator untuk mengirim peristiwa dalam band.

Perubahan Stream

Metode ProcessOutput dapat menyebabkan salah satu perubahan berikut dalam aliran output:
  • Penghapusan aliran output. Untuk memberi sinyal penghapusan aliran, MFT mengatur bendera MFT_OUTPUT_DATA_BUFFER_STREAM_END di anggota dwStatus dari struktur MFT_OUTPUT_DATA_BUFFER untuk aliran tersebut.
  • Pembuatan aliran output baru. Untuk memberi sinyal aliran output baru, MFT mengatur bendera MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS di parameter pdwStatus . Aliran baru dapat memiliki pengidentifikasi aliran yang sama dengan aliran yang dihapus.
  • Perubahan format pada aliran output. Untuk memberi sinyal perubahan format, MFT mengatur bendera MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE di anggota dwStatus dari struktur MFT_OUTPUT_DATA_BUFFER untuk aliran tersebut.
Ada kemungkinan bahwa ketiga tindakan ini akan dihasilkan dari satu panggilan ke ProcessOutput. Penelepon harus menanggapinya dalam urutan yang tercantum di sini—penghapusan pertama, lalu penambahan, lalu format perubahan.

Bendera MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE memberi sinyal perubahan format pada aliran output. Ini mungkin berarti jenis media saat ini menjadi tidak valid, atau urutan preferensi telah berubah dan format yang lebih efisien tersedia. Dalam kasus terakhir, ada kemungkinan bahwa klien akan mengatur ulang jenis media asli. Untuk menjaga dari perulangan tanpa akhir, MFT tidak boleh mengatur bendera MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE lagi sampai ada perubahan lain. Selain itu, hindari mengatur bendera ini jika urutan preferensi berubah tetapi jenis media saat ini masih merupakan jenis yang paling disukai.

Atribut Sampel

Sampel input mungkin memiliki atribut, yang diakses melalui antarmuka IMFAttributes . Kecuali atribut tertentu tidak lagi berlaku, semua atribut harus disalin ke dalam sampel output yang sesuai. Tanggung jawab untuk menyalin atribut ditentukan sebagai berikut:
  • Jika nilai properti MFPKEY_EXATTRIBUTE_SUPPORTED pada MFT VARIANT_TRUE, MFT akan menyalin atribut.
  • Jika nilai MFPKEY_EXATTRIBUTE_SUPPORTEDVARIANT_FALSE, atau properti tidak diatur, klien harus menyalin atribut sampel. Jangan timpa atribut apa pun yang ditetapkan MFT pada sampel output.
Untuk daftar atribut sampel, lihat Atribut Sampel.

Pemrosesan Asinkron

Keterangan sebelumnya menjelaskan model pemrosesan sinkron . Untuk mendukung pemrosesan asinkron, lihat MFTs Asinkron.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2008 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header mftransform.h
Pustaka Mfuuid.lib

Lihat juga

IMFTransform

Transformasi Media Foundation