Tanda Waktu dan Durasi
Topik ini menjelaskan bagaimana Transformasi Media Foundation harus menangani stempel waktu.
MFT harus mengatur stempel waktu dan durasi seakurat mungkin pada semua sampel output. Untuk MFT sederhana yang mengambil satu buffer input dan sepenuhnya memprosesnya menjadi buffer output, MFT hanya boleh menyalin stempel waktu dan durasi langsung dari sampel input ke sampel output. Namun, banyak transformasi yang lebih kompleks dari ini dan mungkin memerlukan perhitungan waktu output yang lebih kompleks. Semua MFT harus mengamati aturan dasar berikut:
- MFT harus mencoba meletakkan stempel waktu dan durasi pada semua sampel output video atau audio yang tidak dikompresi jika stempel waktu atau durasi yang akurat diberikan pada sampel input atau dapat dihitung. Interpolasi mungkin diperlukan untuk beberapa stempel waktu output, terutama untuk dekode.
- Stempel waktu dan durasi sampel input harus dipertahankan pada sampel output sebanyak mungkin.
- Stempel atau durasi waktu output mungkin tidak cocok dengan input karena MFT menahan data atau memecah output menjadi potongan berukuran berbeda dari input. Dalam hal ini, MFT harus menghitung stempel waktu output dari sampel input paling awal yang berisi data yang digunakan untuk membuat sampel output. Untuk menghitung stempel waktu output, tambahkan stempel waktu input sampel input yang sesuai ke durasi data yang telah diubah dari sampel tersebut. Contoh kedua di akhir bagian ini menggambarkan ide ini.
- Jika sampel input memiliki durasi, durasi tersebut harus dipertahankan. Jika sampel input tidak memiliki durasi, MFT harus menghitung durasi jika memungkinkan dari ukuran buffer output atau laju data yang diberikan oleh jenis media.
- Durasi terhitung harus dipotok (dibulatkan ke bawah), tidak dibulatkan ke kenaikan terdekat. Alur memiliki cukup kelonggaran untuk menangani durasi yang sedikit tidak akurat, tetapi lebih mudah bagi alur untuk menangani durasi yang 1% terlalu pendek daripada durasi yang terlalu panjang 1%. Meskipun demikian, tidak ada alasan untuk dengan sengaja mempersingkat durasi, selain dengan membulatkan.
Decoder
Dekoder mengonversi paket terkompresi menjadi data yang tidak dikompresi. Karena output tidak dikompresi, dekode memiliki kewajiban khusus untuk mendapatkan tanda waktu dan durasi yang benar. Beberapa format terkompresi, terutama MPEG-2, tidak memiliki stempel waktu pada semua paket input dan sering kali tidak memiliki durasi pada paket apa pun. Untuk format ini, dekoder bertanggung jawab untuk menempatkan stempel waktu dan durasi yang valid pada setiap sampel output, dengan menjumlahkan durasi tersirat dari semua output sejak sampel input bertanda waktu terakhir.
Untuk video, jika durasi tidak tersedia dalam format terkompresi, dekoder harus menghitung durasi sebagai inversi kecepatan bingkai, dikonversi menjadi 100 unit nanodetik dan dibulatkan ke bawah.
Untuk audio, jika durasi tidak tersedia dalam format terkompresi, dekoder harus menghitung durasi sebagai inversi laju sampel audio dikalikan dengan jumlah sampel dalam buffer output, dikonversi menjadi 100 unit nanodetik dan dibulatkan ke bawah.
Satu-satunya waktu transformasi harus menghasilkan sampel tanpa stempel waktu adalah jika MFT belum pernah menerima stempel waktu pada sampel input, atau jika tidak ada cara untuk menghitung stempel waktu output yang akurat dari stempel waktu input sebelumnya.
Dekode Audio
Untuk dekode audio, durasi setiap sampel output dihitung dari laju pengambilan sampel audio dan jumlah sampel PCM per saluran dalam buffer output.
Cara yang benar untuk menghitung stempel waktu output tergantung pada apakah sampel input berisi stempel waktu.
Jika sampel input berisi stempel waktu, dekoder menghitung stempel waktu output dari stempel waktu input, sebagai berikut:
- Jika setiap buffer input berisi satu atau beberapa bingkai terkompresi lengkap, tanpa bingkai parsial, stempel waktu output sama dengan stempel waktu input, dikurangi latensi dekoder yang diketahui. Misalnya, dekoder Dolby Digital (AC-3) memiliki latensi 256 sampel PCM. Misalnya, pada tingkat pengambilan sampel 48 kHz, latensinya adalah 5,33 milidetik (msec). Oleh karena itu, jika stempel waktu input adalah 1000 msec, stempel waktu output adalah 1000 – 5,33 = 994,66 msec. Jika buffer input menyertakan lebih dari satu bingkai terkompresi utuh, dekoder akan menghasilkan satu sampel output untuk setiap bingkai dalam sampel input. Semua sampel output akan diberi stempel waktu dengan benar sehingga tidak ada celah.
- Bergantung pada format transportasi, buffer input mungkin berisi bingkai parsial. Misalnya, buffer mungkin berisi bagian bingkai dari buffer input sebelumnya, diikuti oleh satu atau beberapa bingkai lengkap, diikuti dengan awal bingkai berikutnya. Dalam hal ini, umumnya benar untuk mengasumsikan bahwa stempel waktu input sesuai dengan bingkai pertama yang dimulai dalam buffer. (Artinya, bingkai parsial yang dimulai di buffer sebelumnya tidak disertakan dalam stempel waktu untuk buffer saat ini.) Hitung stempel waktu output yang sesuai.
Jika sampel input tidak berisi stempel waktu apa pun:
- Dekoder harus menghasilkan stempel waktunya sendiri, mengatur stempel waktu output pertama ke nol.
- Durasi sampel dihitung dari jumlah sampel output dalam buffer dan laju sampel.
- Stempel waktu berikutnya dihitung dari stempel dan durasi waktu sebelumnya: Stempel waktu saat ini + durasi saat ini = stempel waktu berikutnya. Seharusnya tidak ada celah dalam stempel waktu output.
Jika aliran input awalnya berisi stempel waktu, tetapi untuk beberapa alasan beralih ke tidak ada stempel waktu, dekoder harus terus menghasilkan stempel waktu outputnya sendiri, sedemikian rupa sehingga berkelanjutan dan tidak ada celah.
Jika aliran input berisi stempel waktu, tetapi ada celah pada waktunya, dekoder hanya akan menyebarkan celah ini. Dengan kata lain, dekoder tidak boleh mencoba memperbaiki stempel waktu yang tidak konsisten di aliran input.
Mixer
Catatan
Di Windows Vista, alur Media Foundation tidak mendukung MFTs dengan lebih dari satu input. MFTs multi-input didukung di Windows 7.
Mixer mengambil beberapa input dan mencampurnya ke dalam satu output. Jika aliran input tidak sepenuhnya dikunci laju, atau sedikit diimbangi satu sama lain dari satu sama lain, mungkin ada ambiguitas tentang waktu mana yang akan diatur pada output. Berikut adalah beberapa panduan, tergantung pada jenis media:
Audio. Saat startup atau segera setelah pengurasan atau flush, mixer audio harus menunggu untuk menghasilkan sampel output hingga menerima sampel input pada semua aliran input yang diperlukan. Pada saat itu, ia harus memilih stempel waktu paling awal dari sampel awal untuk digunakan sebagai garis besar untuk stempel waktu output. Aliran lain harus diisi dengan keheningan untuk membentuk perbedaan waktu. Jika sampel diterima pada aliran input opsional, sampel juga harus diperhitungkan dalam perhitungan. Sejak saat itu, MFT harus berusaha untuk menghasilkan rantai stempel waktu output yang berkelanjutan dan tidak terganggu. Secara umum, MFT tidak boleh mencoba mempertanyakan satu aliran yang melayang relatif terhadap aliran lainnya. Sebaliknya, ia harus menghitung stempel waktu output dari stempel waktu garis besar, laju output, dan ukuran buffer. Ketika pengurasan atau flush lain terjadi, MFT harus mengatur ulang stempel waktu garis besarnya.
Video. Saat startup atau segera setelah pengurasan atau flush, mixer video harus menunggu untuk menghasilkan sampel output hingga menerima sampel input pada semua aliran input yang diperlukan. Pada saat itu, ia harus memilih stempel waktu paling awal dari sampel awal untuk digunakan sebagai garis besar untuk stempel waktu output. Secara umum, ini harus berusaha untuk menjaga stempel waktu output berkelanjutan dan reguler dan durasi tetap, bahkan jika input tidak teratur, jika perlu dengan mengulangi bingkai input.
Encoder
Encoder mengonversi audio atau video yang tidak dikompresi menjadi paket terkompresi. Encoder harus mengikuti panduan berikut:
Encoder harus mengikuti konvensi format output. Jika format biasanya tidak memberi stempel waktu setiap sampel, seperti dalam MPEG-2, tidak setiap sampel output perlu memiliki stempel waktu dan durasi.
Stempel waktu input harus dipertahankan dalam format output, jika format memiliki bidang untuk stempel waktu, kecuali informasi waktu yang lebih baik tersedia dari sumber lain, seperti aplikasi itu sendiri.
Multiplexers
Catatan
Di Windows Vista, alur Media Foundation tidak mendukung MFTs dengan lebih dari satu input. MFTs multi-input didukung di Windows 7.
Multiplexer menggabungkan dua aliran audio atau video yang berbeda ke dalam satu format yang diselingi, seperti AVI atau MPEG-2 Transport Stream. Multiplexer harus mengikuti panduan berikut:
Multiplexer harus mengikuti konvensi format output. Jika format biasanya tidak memberi stempel waktu setiap sampel, seperti dalam MPEG-2, tidak setiap sampel output perlu memiliki stempel waktu dan durasi.
Stempel waktu harus mencerminkan waktu paling awal yang akan ditempatkan pada bingkai apa pun yang dimulai dalam paket tersebut, atau waktu sampel audio pertama yang akan didekodekan dari paket tersebut. Abaikan pedoman ini jika bertentangan dengan konvensi format output.
Demultiplexers
Demultiplexer membagi format yang saling terkait, seperti AVI atau MPEG-2 Transport Stream, ke dalam aliran audio dan video yang mendasar.
Jika format berisi informasi stempel waktu tertentu yang dapat digunakan untuk menghitung stempel waktu output yang akurat berdasarkan stempel waktu input, informasi tersebut harus digunakan. Namun, jika format berisi waktu dalam basis yang sama sekali berbeda yang tidak berkaitan dengan stempel waktu input, dan offset yang akurat ke stempel waktu input tidak dapat dihitung, waktu format itu sendiri harus diabaikan.
Jika format tidak memiliki informasi stempel waktu yang dapat digunakan, demultiplexer harus mengikuti aturan berikut:
Aliran output yang tidak dikompresi harus memiliki stempel waktu dan durasi yang valid jika memungkinkan, dihitung dari stempel waktu input terdekat sebelumnya.
Aliran output terkompresi harus memiliki stempel waktu hanya pada sampel output pertama yang berasal dari sampel input dengan stempel waktu. Jika sampel input tidak memiliki stempel waktu, tidak ada sampel output yang berasal dari sampel input tersebut harus memiliki stempel waktu. Jika sampel input dipecah menjadi beberapa sampel output, hanya sampel output pertama yang harus memiliki stempel waktu, dan sisanya seharusnya tidak memiliki stempel waktu.
Contoh
Contoh 1. Misalkan efek video selalu mengambil bingkai input yang tidak dikompresi, menerapkan efeknya, dan menyalinnya ke output. Ini tidak pernah menahan bingkai atau buffer input apa pun. MFT ini hanya menyalin stempel waktu dan durasi dari sampel input ke sampel output, jika tersedia, dan tidak melakukan perhitungan waktu sama sekali.
Contoh 2. Misalkan efek audio mengubah semua kecuali 10 milidetik (md) dari setiap buffer input, menyimpan 10 ms tambahan untuk digabungkan dengan buffer berikutnya. Ini mendapatkan aliran sampel yang semuanya memiliki durasi 50 mdtk. Waktu input ditampilkan dalam tabel berikut.
Sampel | Waktu input | Durasi input | Waktu output | Durasi output |
---|---|---|---|---|
1 | 20 | 50 | 20 | 40 |
2 | 70 | 50 | 60 | 50 |
3 | 121 | 50 | 110 | 50 |
4 | 171 | 50 | 161 | 50 |
Perhatikan perbedaan 1 md antara durasi aktual sampel 2 dan durasi tersirat berdasarkan stempel waktu berikutnya (121 ? 70 = 51).
Karena MFT menahan 10 md, MFT menghasilkan 40 md sampel input pertama 1 sebagai sampel output 1, dengan stempel waktu 20 md dan durasi 40 mdtk.
Sampel output 2 menggabungkan 10 md yang sebelumnya ditahan kembali dengan 40 md sampel input 2. Sampel ini diberi stempel waktu 60 md (stempel waktu sampel input sebelumnya, 20ms, ditambah durasi data yang sudah diproses dari sampel tersebut, 40ms). Ini diberikan durasi 50ms.
Demikian pula, sampel berikutnya memiliki stempel waktu 110ms (70ms + 40ms) dengan durasi 50 mdtk.
Perhitungan berikutnya lebih menarik. Stempel waktu tersirat dari waktu dan durasi output sebelumnya adalah 160 ms (stempel waktu 110 md + durasi 50 md). Namun, stempel waktu output seharusnya dihitung dari stempel waktu input sampel input paling awal yang tumpang tindih dengan sampel output tepat waktu, ditambah panjang data apa pun yang sudah diproses dari sampel tersebut. Sampel input yang tumpang tindih terdekat adalah sampel 4 (stempel waktu = 171), tetapi ini bukan yang paling awal. Sampel yang tumpang tindih paling awal adalah sampel 3 (stempel waktu = 121). Menambahkan 40ms yang telah diproses dari sampel tersebut, hasilnya adalah 161.
Topik terkait