Hardware decoding, SoC içindeki özel GPU yongaları, DSP veya video işleme blokları kullanarak medya verilerinin donanımsal olarak sıkıştırılmasının açılmasıdır. Yazılım kod çözmenin aksine, donanım kod çözme yalnızca video sıkıştırmayı açmak için tasarlanmış fiziksel devrelerde gerçekleştirilir. Apple VideoToolbox dokümantasyonuna (2026) göre, A serisi yongalarda donanım kod çözme, 60 FPS'de 4K H.264 için enerji verimliliği 0,3W'ye ulaşır.
Önemli Noktalar
Hardware decoding, genel amaçlı bir CPU'da değil, sistem üzerinde çip (SoC) içine entegre edilmiş özel entegre devrelerde gerçekleştirilen medya verisi sıkıştırmasını açma işlemidir. Bu bloklara video kod çözücü veya VPU (Video Processing Unit) denir ve belirli sıkıştırma algoritmaları için optimize edilmiş ASIC hızlandırıcılardır.
Modern mobil SoC'ler, her popüler codec için ayrı donanım blokları içerir. Örneğin, Apple A17 Pro yongası H.264, H.265, VP9, AV1 ve ProRes için kod çözücüler içerir. Her blok, girişte sıkıştırılmış bit akışını kabul edebilen ve CPU katılımı olmadan çıkışta YUV veya BGRA formatında hazır kod çözülmüş kareler sağlayabilen tam bir işleme hattıdır.
Donanım kod çözme, Qualcomm Snapdragon 800 ve Apple A7'nin ilk kez özel H.264 kod çözme blokları içerdiği 2012–2013 yıllarında mobil endüstride standart haline geldi. O zamandan beri, teknoloji tek bir biçim desteğinden, aynı anda birden çok akışı kod çözebilen evrensel çok biçimli bloklara evrildi — örneğin, ayrı bir video akışıyla PiP için.
Donanım kod çözme süreci, yazılım kod çözmeden kökten farklıdır. Sıralı CPU talimatı yürütme yerine, donanım bloğu sıkıştırmayı açmanın her aşaması için fiziksel devreler uygular: entropi kod çözme, ters niceleme, ters DCT ve hareket telafisi.
Tipik bir donanım kod çözücü, birkaç işleme hattı aşamasından oluşur. İlk aşama, CABAC veya CAVLC için sonlu durum makinesi (FSM) olarak uygulanan entropi kod çözücüdür. Her bitin koşullu dallanmalarla işlendiği yazılım uygulamasının aksine, donanım CABAC, bir yerine döngü başına 2–3 bit işlemeye izin veren paralel bağlam tahmin devreleri kullanır.
İkinci aşama, ters DCT bloğudur. Yazılım DCT, CPU'da çarpma-biriktirme döngüleri gerektirir. Donanım uygulaması, bir 8x8 bloğun tüm 64 katsayısını bir döngüde hesaplayan bir matris çarpanı kullanır. Donanım ters DCT 400–600 MHz'de çalışır ve saniyede 4 milyona kadar makroblok işler, bu da gerçek zamanlı 8K video kod çözme için yeterlidir.
Üçüncü aşama, hareket telafisi (MC) modülüdür. Ters DCT'ye paralel olarak, donanım bloğu bit akışından hareket vektörleri alır ve kod çözülmüş kare arabelleğinden referans bölgeleri çıkarır. DPB arabelleği (Decoded Picture Buffer), özel düşük gecikmeli önbellek belleği aracılığıyla erişilen 16'ya kadar referans karesini depolar. Modern kod çözücüler, H.265 ve AV1 için kritik olan uyarlanabilir yumuşatma ve alt piksel enterpolasyonu ile tahmin kullanır.
Donanım kod çözücü yönetimi, bir DMA denetleyicisi aracılığıyla gerçekleşir. Uygulama, paylaşılan bellekteki sıkıştırılmış verilere bir işaretçiyi kod çözücüye iletir ve kod çözücü, doğrudan bellek erişimi yoluyla bit akışını okur. Kare kod çözme tamamlandıktan sonra, bir kesme sürücüyü bilgilendirir ve hazır kare, çıkış arabelleği havuzunda kullanılabilir hale gelir. Bu mekanizma, veri işleme sırasında CPU yükünü tamamen ortadan kaldırır — işlemci yalnızca kod çözmeyi başlatır ve nihai sonucu alır.
Her iki mobil platform da donanım kod çözme için yerel API'ler sağlar, ancak arabellek yönetimi ve kod çözücü yaşam döngüsüne farklı yaklaşımlarla. iOS'ta VideoToolbox, ekran çıkışı için Metal ile sıkı bir şekilde entegre edilmiştir, Android'de MediaCodec ise doğrudan işleme için Surface kullanır.
| Parametre | VideoToolbox (iOS) | MediaCodec (Android) |
|---|---|---|
| Çıkış biçimi | CVPixelBuffer (Metal/OpenGL) | Surface veya ByteBuffer |
| Bellek yönetimi | Havuz aracılığıyla otomatik | dequeue aracılığıyla manuel |
| İş parçacığı güvenliği | Evet, asenkron geri çağrı | Evet, senkron API |
| HDR desteği | Evet (PQ, HLG) | Evet (HDR10, HDR10+) |
| Çoklu kod çözme | 4 oturuma kadar (A17) | SoC'ye bağlı |
VideoToolbox, iOS ve macOS'ta donanım kod çözme için bir çerçevedir. Asenkron bir kod çözme modeli kullanır: VTDecompressionSessionDecodeFrame hemen döner ve hazır kareler ayrı bir kuyrukta geri çağrı yoluyla gelir. VideoToolbox, piksel arabellek havuzunu (CVPixelBufferPool) otomatik olarak yönetir ve yeni kareler için serbest bırakılan arabellekleri yeniden kullanabilir. HDR video için VideoToolbox, ITU-R BT.2020 renk uzaylarını ve PQ/HLG EOTF'yi destekler.
MediaCodec, giriş ve çıkış arabellek kuyruklarıyla senkron bir model kullanır. Uygulama, sıkıştırılmış veri göndermek için dequeueInputBuffer'ı ve kod çözülmüş sonucu almak için dequeueOutputBuffer'ı döngüsel olarak çağırır. Bu yaklaşım, geliştiriciye kod çözme hızı üzerinde tam kontrol sağlar, bu da ses-video senkronizasyonu için önemlidir. Ekran çıkışı için MediaCodec, CPU aracılığıyla kopyalama olmadan doğrudan GPU kod çözmeye izin veren bir Surface kabul eder.
Donanım kod çözme, yazılıma göre üç temel avantaj sunar: enerji verimliliği, performans ve kararlılık. Her biri, sınırlı pil kaynakları ve termal kısıtlamaları olan mobil cihazlar için kritik öneme sahiptir.
Donanım kod çözmenin ana avantajı, kökten daha düşük güç tüketimidir. Tipik bir H.264/H.265 donanım kod çözücü, 1080p videoyu gerçek zamanlı olarak kod çözerken 0,2–0,5W tüketir. Karşılaştırma olarak, aynı akışın CPU'da yazılım kod çözmesi, işlemci mimarisine bağlı olarak 1,5–4W tüketir. 5–10 kat fark, pil ömrünü doğrudan etkiler: donanım kod çözmeyle video oynatma, CPU'da yazılım kod çözmeyle 2–4 saate karşı 10–15 saat film izlemeye olanak tanır.
Enerji verimliliği, dar uzmanlaşma yoluyla elde edilir. Geniş bir yelpazede talimat yürüten ve karmaşık kontrol mantığına sahip CPU'nun aksine, donanım kod çözücü yalnızca belirli bir algoritma için gerekli devreleri içerir. Bu tür blokların saat frekansı, CPU'nun 2–3 GHz'ine kıyasla 200–600 MHz'dir ve bu, voltajın karesiyle orantılı olarak dinamik güç tüketimini azaltır.
Donanım kod çözme, yüksek çözünürlüklerde bile garanti edilmiş kare hızları sağlar. İşleme hattı mimarisi sayesinde, donanım bloğu aynı anda birden çok sıkıştırma açma aşamasını işleyebilir: bir modül sonraki makroblok için entropi kod çözme yaparken, diğeri mevcut olana ters DCT uygular. Böyle bir paralellik, her aşamanın sıralı bir işlem olduğu CPU'da ulaşılamaz.
Donanım kod çözücünün ısı dağılımı önemli ölçüde daha düşüktür: 4K video kod çözme sırasında tipik bir blok, CPU'nun 2–6W'ına kıyasla 0,3–0,8W ısı yayar. Bu, cihazın uzun süreli izleme sırasında bile aşırı ısınmadığı, kısma olmadığı ve kullanıcının düşüş olmadan kararlı 60 FPS aldığı anlamına gelir. Donanım kod çözme sırasında kasa sıcaklığı genellikle yazılım kod çözmeden 5–10 derece daha düşüktür, bu özellikle aktif soğutması olmayan tabletler için önemlidir.
VideoToolbox aracılığıyla iOS'ta geri çağrı işleme ve MediaCodec aracılığıyla Android'de tam işleme hattı ile donanım kod çözmenin pratik bir uygulamasına bakalım.
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
)
}
}
Kod, asenkron bir geri çağrı ile bir VideoToolbox kod çözme oturumu oluşturur. VTDecompressionSessionCreate, sağlanan CMVideoFormatDescription'a dayanarak mevcut donanım kod çözücüyü otomatik olarak algılar. kVTDecodeFrame_EnableAsynchronousDecompression bayrağı asenkron modu etkinleştirir — uygulama kod çözme sırasında bloke olmaz ve geri çağrı yoluyla kareleri alır. H.264 için, önce CMVideoFormatDescriptionCreateFromH264ParameterSets aracılığıyla SPS/PPS NAL birimlerinden bir biçim tanımı oluşturulmalıdır.
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)
}
}
}
Kotlin'deki kod, bir Surface'a bağlı MediaCodec oluşturur ve CPU aracılığıyla veri kopyalamadan doğrudan ekran çıkışı sağlar. mimeType parametresi MediaFormat sabitlerini kullanır: H.264 için video/avc, H.265 için video/hevc, AV1 için video/av01. dequeueInputBuffer yöntemi, zaman aşımı ile kullanılabilir bir giriş arabelleği bekler; arabellek yoksa, geçerli kare atlanır ve düzensiz bit hızında kuyruk taşması önlenir.
Donanım kod çözme, çoğu üretim senaryosu için en uygun seçimdir, ancak evrensel bir çözüm değildir. Uygulanabilirlik sınırlarını anlamak, donanım codec desteğinin olmamasının kullanıcı deneyimini bozduğu durumları önlemeye yardımcı olur.
Donanım kod çözme üç durumda zorunludur: uzun süreli video oynatma (30 dakikadan fazla), 4K içerik kod çözme ve maksimum pil ömrüne odaklanmış herhangi bir uygulama. Akış hizmetleri (Netflix, YouTube, Twitch) yalnızca donanım kod çözme kullanır, çünkü yazılım yüksek bit hızlarında ve büyük çözünürlüklerde kararlı oynatmayı garanti edemez. Bu hizmetler için DRM desteği (FairPlay, Widevine) kritiktir ve yalnızca kod çözücüden ekran çıkışına korumalı işleme hattı sağlayan donanım bloğu aracılığıyla kullanılabilir.
Entegre videolu oyunlar (kesit sahneleri, reklamlar, oyun içi sinematikler) için de donanım kod çözme önerilir. Unity ve Unreal Engine gibi modern oyun motorları, VideoToolbox ve MediaCodec için yerleşik desteğe sahiptir. Oyunlarda donanım kod çözme, fizik simülasyonu, düşman yapay zekası ve giriş işleme için CPU'yu serbest bırakarak genel performansı artırır.
Donanım kod çözmenin ana sınırlaması, donanım biçim desteğine bağımlılıktır. SoC, AV1 için bir kod çözücü içermiyorsa (örneğin, Snapdragon 8 Gen 1'deki cihazlar), uygulama FFmpeg ve dav1d aracılığıyla bir yazılım yedeklemesi sağlamalıdır. Aynı durum eski cihazlarda H.265 ve yalnızca Apple A13+ yongalarında kod çözme için desteklenen ProRes için de geçerlidir. Oynatmayı başlatmadan önce gerekli biçim için bir donanım kod çözücünün kullanılabilirliğini kontrol etmek ve kod çözme stratejisini dinamik olarak seçmek önerilir.
İkinci sınırlama, eşzamanlı kod çözme oturumlarının sayısıdır. Çoğu SoC, 1–2 paralel donanım kod çözücüyü destekler. Üçüncü bir oturum açmaya çalışıldığında, API bir hata döndürecek ve uygulamanın yazılım kod çözmeye geçmesi gerekir. Oturum sayısı SoC üreticisine bağlıdır: Apple yongaları, A17 Pro'da 4 adede kadar H.264 kod çözme oturumuna izin verirken, Snapdragon 8 Gen 2, H.265 için 2'ye kadar ve VP9 için toplam 2'ye kadar destekler.
Sıkça Sorulan Sorular
iOS'ta VTDecompressionSessionCopySupportedPropertyDictionary kullanın ve kVTDecompressionPropertyKey_UsingHardwareAcceleratedVideoDecoder'ı kontrol edin. Android'de, kod çözücüyü oluşturduktan sonra MediaCodec.getCodecInfo().isHardwareAccelerated()'i çağırın. Bayrak false ise, genellikle OMX.google.* olan bir yazılım kod çözücü kullanılıyor.
Evet, akış hizmetlerinde DRM içeriği için donanım kod çözme zorunludur. iOS'ta FairPlay ve Android'de Widevine L1, kod çözücüden ekran çıkışına kadar korumalı bir işleme hattı gerektirir; burada kod çözülmüş kareler uygulama tarafından erişilemez. Böyle bir işleme hattı yalnızca güvenli oturumu destekleyen donanım kod çözmeyle mümkündür.
VDADecoder (Video Decode Acceleration), iOS 6–8'den eski bir çerçevedir ve yerini VideoToolbox almıştır. VideoToolbox, H.265, HDR ve çoklu iş parçacığı desteğiyle daha modern ve esnek bir API sağlar. VDADecoder yeni projeler için önerilmez — VideoToolbox'tan VTDecompressionSession kullanın.
Çoğu durumda, hayır. iOS'ta donanım kod çözücü, güç tüketimi kısıtlamaları nedeniyle etkin bir ön plan uygulaması gerektirir. Android'de, bir hizmette MediaCodec aracılığıyla arka plan kod çözme mümkündür, ancak performans düşebilir. İstisna, sistemin hareketli bir pencerede donanım kod çözmeye izin verdiği PiP modudur.
Mutlak lider, modern mobil cihazların %100'ünde donanım kod çözülen H.264'tür. H.265, cihazların yaklaşık %80'inde desteklenir (iOS 8+, uygun SoC ile Android 5+). AV1 en sınırlı olanıdır: donanım desteği yalnızca Snapdragon 8 Gen 2, Exynos 2200 ve Apple A17 Pro ile 2023+ cihazlarında.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun