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 |
---|---|
|
Metode berhasil. |
|
Metode ProcessOutput dipanggil pada MFT asinkron yang tidak mengharapkan panggilan metode ini. |
|
Pengidentifikasi aliran tidak valid di anggota dwStreamID dari satu atau beberapa struktur MFT_OUTPUT_DATA_BUFFER . |
|
Transformasi tidak dapat menghasilkan data output sampai menerima lebih banyak data input. |
|
Format telah berubah pada aliran output, atau ada format pilihan baru, atau ada aliran output baru. |
|
Anda harus menyetel tipe media pada satu atau beberapa aliran MFT. |
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.
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.
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:
- Buat objek koleksi baru dengan memanggil MFCreateCollection.
- Tambahkan satu atau beberapa peristiwa ke koleksi dengan memanggil IMFCollection::AddElement.
- Atur anggota pEvents dari struktur MFT_OUTPUT_DATA_BUFFER sama dengan penunjuk IMFCollection . MFT meninggalkan jumlah referensi pada antarmuka ini; penelepon harus melepaskan penunjuk.
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.
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.
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 |