Persegi Panjang Sumber dan Target di Perender Video
[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]
Ada tiga ukuran yang ditemukan dalam struktur format VIDEOINFO, VIDEOINFOHEADER, dan VIDEOINFOHEADER2 dari jenis media video. Artikel ini menjelaskan apa itu dan cara kerjanya.
Pertama, ada ukuran dalam anggota bmiHeader dari struktur ini. Anggota bmiHeader adalah struktur BITMAPINFOHEADER dengan anggota lebar dan tingginya sendiri, bmiHeader.biWidth dan bmiHeader.biHeight.
Kedua, ada persegi panjang di anggota rcSource dari struktur ini; dan terakhir, ada persegi panjang di anggota rcTarget dari struktur ini.
Asumsikan Anda memiliki dua filter, A dan B, dan bahwa filter ini terhubung satu sama lain (A di sebelah kiri, atau hulu, dan B di sebelah kanan, atau hilir) dengan jenis media video tertentu.
Buffer yang melewati antara filter A dan B memiliki ukuran (bmiHeader.biWidth, bmiHeader.biHeight). Filter A harus mengambil sebagian video inputnya yang ditentukan oleh rcSource dan meregangkan video tersebut untuk mengisi bagian rcTarget dari buffer. Bagian video input yang akan digunakan didasarkan pada bagaimana rcSource dibandingkan dengan ukuran (biWidth, biHeight) dari jenis media yang memfilter A dan B yang awalnya terhubung. Jika rcSource kosong, filter A menggunakan seluruh video inputnya. Jika rcTarget kosong, filter A akan mengisi seluruh buffer output.
Misalnya, asumsikan filter A menerima data video yang 160 x 120 piksel. Asumsikan juga bahwa filter A tersambung ke filter B dengan jenis media berikut.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 0, 0)
- rcTarget: (0, 0, 0, 0)
Ini berarti bahwa filter A akan meregangkan video yang diterimanya dengan 2 arah x dan y, dan mengisi buffer output 320 x 240.
Sebagai contoh lain, asumsikan filter A menerima data video 160 x 120, dan tersambung ke filter B dengan jenis media berikut.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 160, 240)
- rcTarget: (0, 0, 0, 0)
Anggota rcSource relatif terhadap ukuran buffer yang terhubung 320, 240. Karena rcSource yang ditentukan (0, 0, 160, 240) adalah setengah kiri buffer, filter A akan mengambil bagian kiri video inputnya, atau bagian (0, 0, 80, 120), dan meregangkan video ke ukuran (320, 240) (dengan 4 ke arah x, dan dengan 2 arah y) dan mengisi buffer output 320 x 240.
Sekarang asumsikan bahwa filter A memanggil CBaseAllocator::GetBuffer, dan sampel media yang dikembalikan memiliki jenis media yang melekat padanya, menandakan bahwa filter B ingin memfilter A untuk memberikan ukuran atau jenis video yang berbeda dari yang telah disediakan sebelumnya. Asumsikan jenis media baru adalah:
- (biWidth, biHeight): 640, 480
- rcSource: (0, 0, 160, 120)
- rcTarget: (0, 0, 80, 60)
Ini berarti bahwa sampel media memiliki buffer yang berukuran 640 x 480. Anggota rcSource relatif terhadap jenis media asli yang terhubung (320, 240) bukan ke jenis media baru (640, 480), sehingga rcSource menentukan bahwa sudut kiri atas (25%) dari video input akan digunakan. Bagian video input ini ditempatkan di kiri atas (80, 60) piksel dari buffer output 640 x 480, seperti yang ditentukan oleh rcTarget dari (0, 0, 80, 60). Karena filter A menerima video 160 x 120, sudut kiri atas video input adalah potongan (80, 60), ukuran bitmap output yang sama, dan tidak diperlukan peregangan.
Filter A tidak akan menempatkan data dalam piksel lain dari buffer output, dan akan membuat bit tersebut tidak tersentuh. Anggota rcSource dibatasi oleh biWidth dan biHeight dari jenis media asli yang terhubung antara filter A dan B, dan rcTarget dibatasi oleh biWidth baru dan biHeight sampel media. Dalam contoh sebelumnya, rcSource tidak dapat keluar batas (0, 0, 320, 240) dan rcTarget tidak dapat keluar dari batas (0, 0, 640, 480).