Hardware decoding — decoding perangkat keras data media menggunakan chip GPU khusus, DSP atau blok pemrosesan video di dalam SoC. Berbeda dengan decoding perangkat lunak, decoding perangkat keras dilakukan pada sirkuit fisik yang dirancang khusus untuk dekompresi video. Menurut data Apple VideoToolbox documentation (2026), decoding perangkat keras pada chip seri A mencapai efisiensi energi 0,3 W untuk 4K H.264 pada 60 FPS.
Poin Utama
Hardware decoding — adalah proses dekompresi data media yang dilakukan bukan pada CPU universal, melainkan pada sirkuit terintegrasi khusus yang terintegrasi dalam sistem-on-chip (SoC). Blok semacam itu disebut decoder video atau VPU (Video Processing Unit) dan merupakan akselerator ASIC yang dioptimalkan untuk algoritma kompresi tertentu.
SoC seluler modern berisi blok perangkat keras terpisah untuk setiap codec populer. Misalnya, chip Apple A17 Pro menyertakan decoder untuk H.264, H.265, VP9, AV1 dan ProRes. Setiap blok merupakan pipeline pemrosesan lengkap, mampu menerima aliran bit terkompresi pada input dan memberikan frame yang sudah didekode dalam format YUV atau BGRA pada output tanpa partisipasi CPU.
Decoding perangkat keras menjadi standar di industri seluler pada tahun 2012–2013, ketika Qualcomm Snapdragon 800 dan Apple A7 untuk pertama kalinya menyertakan blok decoding H.264 khusus. Sejak itu, teknologi telah berevolusi dari dukungan satu format menjadi blok multi-format universal yang mampu mendekode beberapa aliran secara bersamaan — misalnya, untuk operasi PiP dengan aliran video terpisah.
Proses decoding perangkat keras sangat berbeda dari perangkat lunak. Alih-alih mengeksekusi instruksi CPU secara sekuensial, blok perangkat keras mengimplementasikan sirkuit fisik untuk setiap tahap dekompresi: decoding entropi, kuantisasi terbalik, DCT terbalik, dan kompensasi gerak.
Decoder perangkat keras tipikal terdiri dari beberapa tahap pipeline. Tahap pertama — decoder entropi, diimplementasikan sebagai finite state machine (FSM) untuk CABAC atau CAVLC. Tidak seperti implementasi perangkat lunak di mana setiap bit diproses dengan lompatan bersyarat, CABAC perangkat keras menggunakan sirkuit prediksi konteks paralel, memungkinkan pemrosesan 2–3 bit per siklus clock, bukan satu.
Tahap kedua — blok DCT terbalik. DCT perangkat lunak memerlukan siklus perkalian-akumulasi pada CPU. Implementasi perangkat keras menggunakan pengali matriks yang menghitung semua 64 koefisien blok 8×8 dalam satu siklus clock. DCT terbalik perangkat keras bekerja pada frekuensi 400–600 MHz dan memproses hingga 4 juta makroblok per detik, cukup untuk decoding video 8K secara real-time.
Tahap ketiga — modul kompensasi gerak (MC). Secara paralel dengan DCT terbalik, blok perangkat keras menerima vektor gerak dari aliran bit dan mengambil area referensi dari buffer frame yang telah didekode. Buffer DPB (Decoded Picture Buffer) menyimpan hingga 16 frame referensi, yang diakses melalui memori cache khusus dengan latensi rendah. Decoder modern menggunakan prediksi dengan penghalusan adaptif dan interpolasi subpiksel, yang sangat penting untuk H.265 dan AV1.
Manajemen decoder perangkat keras dilakukan melalui kontroler DMA. Aplikasi mengirimkan pointer ke data terkompresi di memori bersama ke decoder, dan decoder secara mandiri membaca aliran bit melalui akses langsung ke memori. Setelah decoding frame selesai, interupsi memberi tahu driver, dan frame yang siap tersedia di kumpulan buffer keluaran. Mekanisme ini sepenuhnya menghilangkan beban CPU pada tahap pemrosesan data — prosesor hanya memulai decoding dan menerima hasil yang sudah jadi.
Kedua platform seluler menyediakan API asli untuk decoding perangkat keras, tetapi dengan pendekatan berbeda terhadap manajemen buffer dan siklus hidup decoder. VideoToolbox di iOS terintegrasi erat dengan Metal untuk output ke layar, sementara MediaCodec di Android menggunakan Surface untuk rendering langsung.
| Parameter | VideoToolbox (iOS) | MediaCodec (Android) |
|---|---|---|
| Format keluaran | CVPixelBuffer (Metal/OpenGL) | Surface atau ByteBuffer |
| Manajemen memori | Otomatis melalui pool | Manual melalui dequeue |
| Keamanan thread | Ya, callback asinkron | Ya, API sinkron |
| Dukungan HDR | Ya (PQ, HLG) | Ya (HDR10, HDR10+) |
| Multi-decoding | Hingga 4 sesi (A17) | Tergantung SoC |
VideoToolbox — framework untuk decoding perangkat keras di iOS dan macOS. Menggunakan model decoding asinkron: panggilan VTDecompressionSessionDecodeFrame segera kembali, dan frame siap datang melalui callback pada antrian terpisah. VideoToolbox secara otomatis mengelola kumpulan buffer piksel (CVPixelBufferPool) dan dapat menggunakan kembali buffer yang dibebaskan untuk frame baru. Untuk video HDR, VideoToolbox mendukung ruang warna ITU-R BT.2020 dan PQ/HLG EOTF.
MediaCodec menggunakan model sinkron dengan antrian buffer input dan output. Aplikasi secara siklis memanggil dequeueInputBuffer untuk mengirim data terkompresi dan dequeueOutputBuffer untuk menerima hasil decoding. Pendekatan ini memberikan pengembang kendali penuh atas kecepatan decoding, yang penting untuk sinkronisasi audio dan video. Untuk output ke layar, MediaCodec menerima Surface, memungkinkan decoding langsung di GPU tanpa menyalin melalui CPU.
Decoding perangkat keras memberikan tiga kelebihan utama dibandingkan perangkat lunak: efisiensi energi, kinerja, dan stabilitas. Masing-masing sangat penting untuk perangkat seluler dengan sumber daya baterai terbatas dan keterbatasan termal.
Kelebihan utama decoding perangkat keras — konsumsi daya yang secara radikal lebih rendah. Decoder perangkat keras H.264/H.265 tipikal mengonsumsi 0,2–0,5 W saat mendekode video 1080p secara real-time. Sebagai perbandingan, decoding perangkat lunak dari aliran yang sama pada CPU mengonsumsi 1,5–4 W tergantung pada arsitektur prosesor. Perbedaan 5–10 kali lipat secara langsung memengaruhi daya tahan baterai: saat menonton video, decoding perangkat keras memungkinkan menonton film 10–15 jam dibandingkan 2–4 jam pada decoding perangkat lunak di CPU.
Efisiensi energi dicapai melalui spesialisasi sempit. Tidak seperti CPU yang menjalankan berbagai instruksi dan memiliki logika kontrol yang kompleks, decoder perangkat keras hanya berisi sirkuit yang diperlukan untuk algoritma tertentu. Frekuensi clock blok tersebut adalah 200–600 MHz dibandingkan 2–3 GHz CPU, yang mengurangi konsumsi daya dinamis secara proporsional dengan kuadrat tegangan.
Decoding perangkat keras menjamin kecepatan frame yang stabil bahkan untuk resolusi tinggi. Berkat arsitektur pipeline, blok perangkat keras dapat memproses beberapa tahap dekompresi secara bersamaan: sementara satu modul melakukan decoding entropi untuk makroblok berikutnya, modul lain sudah menerapkan DCT terbalik pada yang saat ini. Paralelisme semacam ini tidak dapat dicapai di CPU, di mana setiap tahap adalah operasi sekuensial.
Pembuangan panas decoder perangkat keras secara signifikan lebih rendah: blok tipikal membuang 0,3–0,8 W panas dibandingkan 2–6 W CPU pada decoding perangkat lunak video 4K. Ini berarti perangkat tidak terlalu panas bahkan saat menonton dalam waktu lama, throttling tidak terjadi, dan pengguna mendapatkan 60 FPS stabil tanpa penurunan. Suhu casing pada decoding perangkat keras biasanya 5–10 derajat lebih rendah daripada perangkat lunak, yang sangat penting untuk tablet tanpa pendinginan aktif.
Mari kita lihat implementasi praktis decoding perangkat keras dengan pemrosesan callback di iOS melalui VideoToolbox dan pipeline lengkap di Android melalui MediaCodec.
import VideoToolbox
import CoreMedia
class HardwareDecoder {
var session: VTDecompressionSession?
func setup() {
let formatDesc = createFormatDescription()
var callback = VTDecompressionOutputCallbackRecord(
decompressionOutputCallback: decodingCallback,
decompressionOutputRefCon: nil
)
VTDecompressionSessionCreate(
allocator: nil,
videoFormatDescription: formatDesc,
videoDecoderSpecification: nil,
destinationImageBufferAttributes: nil,
outputCallback: &callback,
decompressionSessionOut: &session
)
}
func decode(sampleBuffer: CMSampleBuffer) {
VTDecompressionSessionDecodeFrame(
session!, sampleBuffer: sampleBuffer,
flags: ._EnableAsynchronousDecompression,
frameRefcon: nil, infoFlagsOut: nil
)
}
}
Kode membuat sesi decoding VideoToolbox dengan callback asinkron. VTDecompressionSessionCreate secara otomatis menentukan decoder perangkat keras yang tersedia berdasarkan CMVideoFormatDescription yang diberikan. Bendera kVTDecodeFrame_EnableAsynchronousDecompression mengaktifkan mode asinkron — aplikasi tidak terblokir selama decoding, melainkan menerima frame melalui callback. Untuk H.264, format description harus dibuat terlebih dahulu dari unit NAL SPS/PPS melalui CMVideoFormatDescriptionCreateFromH264ParameterSets.
class HardwareDecoder(private val surface: Surface) {
private var mediaCodec: MediaCodec? = null
fun initDecoder(mimeType: String, width: Int, height: Int) {
mediaCodec = MediaCodec.createDecoderByType(mimeType)
val format = MediaFormat.createVideoFormat(mimeType, width, height)
mediaCodec?.configure(format, surface, null, 0)
mediaCodec?.start()
}
fun feedFrame(data: ByteArray, pts: Long) {
val inputIndex = mediaCodec!!.dequeueInputBuffer(TIMEOUT_US)
if (inputIndex >= 0) {
val buffer = mediaCodec!!.getInputBuffer(inputIndex)
buffer?.put(data)
mediaCodec!!.queueInputBuffer(inputIndex, 0, data.size, pts, 0)
}
}
}
Kode dalam Kotlin membuat MediaCodec yang terikat ke Surface, memungkinkan output langsung ke layar tanpa menyalin data melalui CPU. Parameter mimeType menggunakan konstanta MediaFormat: video/avc untuk H.264, video/hevc untuk H.265, video/av01 untuk AV1. Metode dequeueInputBuffer menunggu buffer input yang tersedia dengan timeout; jika buffer tidak tersedia — frame saat ini dilewati, mencegah luapan antrian pada bitrate yang tidak merata.
Decoding perangkat keras adalah pilihan optimal untuk sebagian besar skenario produksi, tetapi bukan solusi universal. Memahami batas penerapan membantu menghindari situasi di mana kurangnya dukungan perangkat keras codec merusak pengalaman pengguna.
Decoding perangkat keras wajib dalam tiga kasus: pemutaran video dalam waktu lama (lebih dari 30 menit), decoding konten 4K, dan aplikasi apa pun yang ditujukan untuk daya tahan baterai maksimal. Layanan streaming (Netflix, YouTube, Twitch) menggunakan decoding perangkat keras secara eksklusif, karena perangkat lunak tidak dapat menjamin pemutaran yang stabil pada bitrate tinggi dan resolusi besar. Untuk layanan ini, dukungan DRM (FairPlay, Widevine) sangat penting, yang hanya tersedia melalui blok perangkat keras yang menyediakan pipeline aman dari decoder ke layar.
Untuk game dengan video terintegrasi (adegan potong, iklan, video dalam game) juga direkomendasikan decoding perangkat keras. Mesin game modern seperti Unity dan Unreal Engine memiliki dukungan bawaan untuk VideoToolbox dan MediaCodec. Decoding perangkat keras dalam game membebaskan CPU untuk simulasi fisika, AI lawan, dan pemrosesan input, yang meningkatkan kinerja keseluruhan.
Keterbatasan utama decoding perangkat keras — ketergantungan pada dukungan perangkat keras format. Jika SoC tidak mengandung decoder untuk AV1 (misalnya, perangkat Snapdragon 8 Gen 1), aplikasi harus menyediakan fallback perangkat lunak melalui FFmpeg dan dav1d. Situasi serupa dengan H.265 pada perangkat lama dan ProRes, yang hanya didukung pada chip Apple A13+ untuk decoding. Disarankan untuk memeriksa ketersediaan decoder perangkat keras format yang diperlukan sebelum memulai pemutaran dan memilih strategi decoding secara dinamis.
Keterbatasan kedua — jumlah sesi decoding simultan. Sebagian besar SoC mendukung 1–2 decoder perangkat keras paralel. Saat mencoba membuka sesi ketiga, API akan mengembalikan kesalahan dan aplikasi harus beralih ke decoding perangkat lunak. Jumlah sesi tergantung pada pabrikan SoC: chip Apple mengizinkan hingga 4 sesi decoding H.264 pada A17 Pro, dan Snapdragon 8 Gen 2 — hingga 2 untuk H.265 dan hingga 2 untuk VP9 secara total.
Pertanyaan yang Sering Diajukan
Di iOS gunakan VTDecompressionSessionCopySupportedPropertyDictionary dan periksa kVTDecompressionPropertyKey_UsingHardwareAcceleratedVideoDecoder. Di Android panggil MediaCodec.getCodecInfo().isHardwareAccelerated() setelah membuat decoder. Jika flag false — decoder perangkat lunak digunakan, biasanya OMX.google.*.
Ya, decoding perangkat keras wajib untuk konten DRM di layanan streaming. FairPlay di iOS dan Widevine L1 di Android memerlukan pipeline yang aman dari decoder ke layar, di mana frame yang didekode tidak dapat dibaca oleh aplikasi. Pipeline semacam itu hanya dimungkinkan dengan decoding perangkat keras yang mendukung secure session.
VDADecoder (Video Decode Acceleration) — framework lama dari iOS 6–8, digantikan oleh VideoToolbox. VideoToolbox menyediakan API yang lebih modern dan fleksibel dengan dukungan H.265, HDR, dan multi-threading. VDADecoder tidak direkomendasikan untuk proyek baru — gunakan VTDecompressionSession dari VideoToolbox.
Dalam kebanyakan kasus tidak. Di iOS, decoder perangkat keras memerlukan aplikasi aktif di latar depan karena batasan konsumsi daya. Di Android, decoding latar belakang dimungkinkan melalui MediaCodec dalam layanan, tetapi kinerja mungkin berkurang. Pengecualian — mode PiP, di mana sistem mengizinkan decoding perangkat keras di jendela mengambang.
Pemimpin mutlak — H.264, yang didekode secara perangkat keras pada 100% perangkat seluler modern. H.265 didukung pada ~80% perangkat (iOS 8+, Android 5+ dengan SoC yang sesuai). AV1 adalah yang paling terbatas: dukungan perangkat keras hanya pada perangkat 2023+ dengan Snapdragon 8 Gen 2, Exynos 2200 dan Apple A17 Pro.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga