Decoding este procesul de conversie a fluxului media comprimat într-un format necomprimat, potrivit pentru afișare pe ecran și difuzoare. În dispozitivele mobile, decodarea se realizează fie software prin CPU, fie hardware prin blocuri specializate GPU și DSP. Conform datelor MDN Web Docs (2026), codecurile moderne comprimă fluxul de 100–500 de ori, iar decodarea restabilește calitatea originală fără pierderi la alegerea corectă a profilului de compresie.
Principalele puncte
Decoding este procesul de conversie a datelor digitale comprimate înapoi în formatul original necomprimat. În contextul media, decodarea restabilește cadrele video din fluxul de biți comprimat creat de encoder. Fără decodare, utilizatorul nu poate vedea videoul sau auzi audio, deoarece toate formatele media moderne utilizează compresia pentru economisirea lățimii de bandă și a spațiului pe disc.
Un flux video tipic în format H.264 cu un bitrate de 5 Mbps ocupă de 100 de ori mai puțin spațiu decât un flux RGB necomprimat cu rezoluție similară. Algoritmul de decodare trebuie să restabilească fiecare cadru înapoi la rezoluția și spațiul de culoare original, urmând specificația codecului în ordine inversă față de codare. Pentru aceasta, decoderul procesează date intracadru (I-frame) și intercadru (P-frame, B-frame).
Pe dispozitivele mobile, decodarea poate avea loc atât pe CPU, cât și pe blocuri hardware dedicate. SoC-urile moderne de la Apple (seria A), Qualcomm (Snapdragon) și MediaTek (Dimensity) conțin decodere încorporate pentru toate formatele populare. Procesorul video preia munca grea de transformare cosinus discretă inversă și compensare a mișcării, eliberând CPU pentru alte sarcini.
Procesul de decodare constă din mai multe etape succesive care inversează pașii de codare. Mai întâi, din fluxul de biți sunt extrase anteturile și parametrii de compresie — profilul, nivelul, rezoluția, spațiul de culoare. Apoi decoderul procesează secvențial macroblocurile comprimate, aplicându-le transformări inverse.
Prima etapă — extragerea codului entropic. Decodarea entropică utilizează algoritmii CABAC sau CAVLC pentru restabilirea coeficienților transformării cosinus discrete. Această etapă nu depinde de rezoluția video — procesează fluxul de biți, nu pixelii, iar complexitatea sa este determinată de bitrate, nu de dimensiunile cadrului.
A doua etapă — cuantizarea inversă și DCT invers. Decoderul înmulțește coeficienții cuantizați cu pasul de cuantizare, restabilind valorile aproximative ale coeficienților DCT, apoi aplică transformarea DCT inversă. DCT invers restabilește datele spațiale din domeniul frecvenței, formând un macrobloc de pixeli. Pentru crominanță și luminanță, transformarea se execută independent.
A treia etapă — compensarea mișcării. Pentru cadrele P și B, decoderul utilizează vectorii de mișcare extrași din fluxul de biți și se referă la cadrele de referință decodate anterior. Compensarea mișcării creează un predictor al macroblocului curent, la care se adaugă semnalul rezidual după DCT invers. Rezultatul — un cadru complet restabilit, gata pentru afișare.
// Pseudocodul decodării de bază a unui cadru video
struct DecodedFrame {
uint8_t* y_plane;
uint8_t* u_plane;
uint8_t* v_plane;
int width, height;
};
class Decoder {
public:
bool decodeNALUnit(const uint8_t* nalUnit, size_t size) {
if (!parseNALUHeader(nalUnit, size))
return false;
int sliceType = parseSliceType(nalUnit);
entropyDecode(nalUnit);
inverseQuantize();
inverseDCT();
if (sliceType != I_SLICE)
motionCompensation();
return true;
}
};
Exemplul de mai sus arată structura de bază a decoderului H.264. Funcția decodeNALUnit primește o unitate NAL — blocul de bază al fluxului comprimat H.264. Decoderul parsează secvențial antetul, extrage tipul de slice, aplică decodarea entropică, cuantizarea inversă și DCT invers. Pentru slice-urile P și B, se execută suplimentar compensarea mișcării utilizând cadrele de referință din bufferul DPB.
Codecurile video moderne diferă prin algoritmii de compresie, eficiență și cerințele de resurse de calcul. Alegerea formatului influențează direct dimensiunea fișierului, calitatea imaginii și consumul de energie la decodarea pe un dispozitiv mobil.
| Codec | An | Compresie | Suport hardware |
|---|---|---|---|
| H.264 | 2003 | 1:100 | Toate SoC-urile moderne |
| H.265 | 2013 | 1:200 | Apple A8+, Snapdragon 805+ |
| VP9 | 2013 | 1:180 | Snapdragon 820+, Exynos |
| AV1 | 2018 | 1:300 | Apple A17+, Snapdragon 8 Gen 2+ |
H.264 este cel mai răspândit codec video, suportat de toate dispozitivele mobile. Principalul său avantaj este universalitatea: orice smartphone Android și iPhone pot decoda H.264 hardware. Cu toate acestea, la același bitrate, H.264 pierde în calitate față de codecurile mai moderne H.265 și AV1, necesitând cu 30–50% mai mult bitrate pentru o calitate vizuală similară.
H.265 asigură o compresie de două ori mai bună comparativ cu H.264 la aceeași calitate. Decodarea H.265 necesită un bloc hardware mai puternic: VideoToolbox pe iOS suportă H.265 începând cu iPhone 6 (A8), iar dispozitivele Android — cu Snapdragon 805 și mai sus. La alegerea H.265 pentru o aplicație mobilă, trebuie avut în vedere că dispozitivele mai vechi pot să nu aibă suport hardware și vor decoda acest format software, ceea ce crește drastic consumul de energie.
AV1 este un codec deschis de la Alliance for Open Media, care asigură cea mai bună compresie dintre toate formatele moderne. AV1 este cu 30% mai eficient decât H.265 și cu 50% mai eficient decât H.264 la aceeași calitate vizuală. Decodarea hardware AV1 a apărut doar în SoC-urile din 2023+: Apple A17 Pro, Qualcomm Snapdragon 8 Gen 2 și mai noi. Pentru dispozitivele mai vechi, decodarea AV1 este posibilă doar software prin biblioteca dav1d, ceea ce creează o încărcare semnificativă pe CPU.
Alegerea între decodarea software și hardware este o decizie arhitecturală cheie în dezvoltarea unui player media mobil. Fiecare abordare are avantajele și limitările sale care trebuie luate în considerare la proiectarea aplicației.
Decodarea hardware se realizează pe blocuri specializate de procesare video care consumă semnificativ mai puțină energie decât CPU la executarea aceleiași sarcini. Conform datelor Qualcomm, decoderul hardware H.265 consumă de 5–10 ori mai puțină energie decât decodarea software pe CPU Snapdragon 8 Gen 1 la redarea video 4K. Acest lucru este critic pentru dispozitivele mobile, unde fiecare miliwatt influențează durata de funcționare a bateriei.
Decodarea software, în schimb, oferă o flexibilitate maximă. FFmpeg cu biblioteca libavcodec suportă zeci de codecuri și containere, inclusiv formate rare și învechite care nu au suport hardware. Dezvoltatorul poate modifica pipeline-ul de decodare, adăuga post-procesare și filtre din zbor, lucru imposibil la utilizarea blocurilor hardware închise.
Decodarea software este justificată în câteva scenarii: la redarea formatelor rare (ProRes, DNxHD, Motion JPEG), când este necesar controlul precis asupra fiecărei etape de procesare a cadrului, precum și la decodarea AV1 pe dispozitive fără suport hardware. libavcodec din componența FFmpeg permite decodarea practic a oricărui format cunoscut, ceea ce îl face standardul de facto pentru playerele media universale.
Limitarea decodării software este degajarea de căldură. Decodarea continuă a video 4K pe CPU poate încălzi dispozitivul la 45–50 de grade în 10–15 minute, ceea ce duce la throttling și scăderea ratei de cadre. Pe dispozitivele fără răcire activă (tablete, telefoane), acest lucru este deosebit de vizibil. Consumul de energie al CPU la decodarea software poate atinge 3–5 W față de 0,3–0,5 W la decodarea hardware a aceluiași flux.
Decodarea hardware este alegerea implicită pentru orice player media de producție. Asigură 60 de cadre/s stabile pentru video 4K cu un consum minim de energie. VideoToolbox pe iOS și MediaCodec pe Android oferă API-uri native pentru decodarea hardware, care aleg automat blocul optim de procesare în funcție de codec și rezoluție.
API-urile platformei preiau gestionarea bufferelor de cadre (surface pool pe Android, CVPixelBufferPool pe iOS), sincronizarea cu afișajul și optimizarea memoriei. Dezvoltatorul trebuie doar să deschidă decoderul cu parametrii necesari și să primească cadrele gata. Decodarea hardware suportă un pipeline end-to-end cu latență minimă: de la recepționarea fluxului de biți până la afișarea pe ecran trec 5–15 ms față de 30–80 ms la decodarea software.
Să examinăm implementarea practică a decodării pe ambele platforme mobile. Pe iOS, decodarea hardware se realizează prin VideoToolbox, iar cea software — prin FFmpeg. Pe Android se utilizează MediaCodec pentru decodarea hardware.
@interface VideoDecoder ()
@property (nonatomic) VTDecompressionSessionRef session;
@end
@implementation VideoDecoder
- (void)setupDecoder {
CMVideoFormatDescriptionRef formatDesc;
CMVideoCodecType codecType = kCMVideoCodecType_H264;
OSStatus status = CMVideoFormatDescriptionCreate(
NULL, codecType, 1920, 1080, NULL, &formatDesc
);
VTDecompressionOutputCallbackRecord callback;
callback.decompressionOutputCallback = &decodingCallback;
VTDecompressionSessionCreate(NULL, formatDesc, NULL,
NULL, &callback, &_session);
}
- (void)decodeFrame: (uint8_t*)nalData length:(size_t)size {
CMBlockBufferRef blockBuffer;
CMBlockBufferCreateWithMemoryBlock(NULL, nalData,
size, NULL, NULL, 0, size, 0, &blockBuffer);
CMSampleBufferRef sampleBuffer;
CMSampleBufferCreate(NULL, blockBuffer, true, NULL,
NULL, NULL, 1, 0, NULL, 0, NULL, &sampleBuffer);
VTDecompressionSessionDecodeFrame(_session,
sampleBuffer, 0, NULL, 0);
}
@end
Codul demonstrează inițializarea decoderului hardware H.264 pe iOS. VTDecompressionSessionCreate creează o sesiune de decodare, iar VTCreate apelează un callback la apariția unui cadru gata. Sesiunea utilizează automat blocul hardware, dacă este disponibil pentru codecul specificat. Pentru primirea cadrelor decodate în format CVPixelBuffer se utilizează un callback care transmite fiecare cadru gata cu o latență minimă.
MediaCodec decoder = MediaCodec.createDecoderByType("video/avc");
MediaFormat format = MediaFormat.createVideoFormat(
"video/avc", 1920, 1080
);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
decoder.configure(format, surface, null, 0);
decoder.start();
ByteBuffer[] inputBuffers = decoder.getInputBuffers();
int inputIndex = decoder.dequeueInputBuffer(10000);
if (inputIndex >= 0) {
ByteBuffer buffer = inputBuffers[inputIndex];
buffer.clear();
buffer.put(nalData);
decoder.queueInputBuffer(inputIndex, 0, nalData.length, pts, 0);
}
Pe Android, MediaCodec utilizează pentru ieșire Surface, nu un buffer de pixeli, ceea ce minimizează copierea datelor între GPU și CPU. Decoderul alege automat blocul hardware (componenta OMX) pe baza tipului de codec. Pentru H.264 se utilizează OMX.google.h264.decoder, care poate fi atât hardware, cât și software, în funcție de implementarea producătorului.
Alegerea strategiei de decodare depinde de publicul țintă al aplicației, formatele suportate și cerințele de performanță. Soluția optimă include adesea o abordare hibridă: decodare hardware pentru formatele principale (H.264, H.265) cu fallback software pentru codecurile rare.
Dacă aplicația este orientată spre compatibilitate maximă — utilizați H.264, care este garantat a fi decodat hardware pe orice dispozitiv. Pentru serviciile de streaming video, H.265 cu suport hardware pe dispozitivele după 2016 este justificat. AV1 este alegerea pentru serviciile unde economisirea lățimii de bandă este importantă: YouTube, Netflix și alte platforme mari implementează activ AV1 pentru reducerea costurilor CDN, păstrând în același timp calitatea.
Parametrul critic — dimensiunea bufferului decoderului. Decoderele hardware au un pool fix de buffere (de obicei 4–16 cadre). La redarea unui flux cu bitrate ridicat, bufferele se pot umple, ceea ce duce la omiterea cadrelor. MediaCodec oferă metoda getOutputFrameRate pentru determinarea performanței reale a decoderului pe un dispozitiv specific, iar VideoToolbox permite controlarea priorității în timp real prin kVTDecodeFrame_EnableAsynchronousDecompression.
Throttling-ul termic este un alt factor. Chiar și decodarea hardware poate încălzi dispozitivul la redarea prelungită a video 4K HDR. Se recomandă monitorizarea temperaturii prin ProcessInfo pe iOS și BatteryManager pe Android, reducând calitatea sau rezoluția fluxului la supraîncălzire. Acest lucru este deosebit de critic pentru jocuri și aplicații de streaming cu sesiuni lungi de vizionare.
Întrebări frecvente
Codarea (encoding) transformă datele necomprimate într-un format comprimat, iar decodarea (decoding) restabilește datele originale din fluxul comprimat. Aceste procese sunt inverse unul altuia și utilizează aceiași algoritmi: DCT, cuantizare, compensare a mișcării. Encoderul execută transformarea directă, decoderul — pe cea inversă.
Pentru compatibilitate maximă — H.264, deoarece este decodat hardware pe 100% din dispozitivele moderne. Pentru o compresie mai bună — H.265 sau AV1. Alegerea depinde de audiență: dacă 80% dintre utilizatori au dispozitive din 2021+, H.265 va asigura o calitate mai bună la un bitrate mai mic. AV1 este justificat pentru dispozitivele flagship cu suport hardware 2023+.
Decoderul hardware este un microcip specializat (ASIC) proiectat exclusiv pentru decodare. Spre deosebire de CPU, care execută decodarea prin instrucțiuni secvențiale, blocul hardware procesează macroblocurile în paralel. Consumul de energie al decoderului hardware este de 5–10 ori mai mic, deoarece cipul funcționează la o frecvență mai redusă și nu are etape de pipeline suplimentare.
Profilul (profile) definește setul de algoritmi de compresie utilizați de encoder: Baseline, Main, High. Nivelul (level) stabilește parametrii maximi ai fluxului: rezoluția, bitrate-ul, dimensiunea bufferului. Pentru dispozitivele mobile se recomandă profilul High și nivelul 4.1–5.2 — acest lucru este suficient pentru video 1080p–4K cu decodare hardware.
Pe Android, utilizați MediaCodecList pentru a obține lista codecurilor disponibile și a verifica care dintre ele este hardware. Pe iOS, verificați suportul prin CMVideoFormatDescription cu codecul specificat — dacă VTDecompressionSessionCreate are succes, codecul este suportat. Pentru AV1 pe Android, verificați prezența codecului OMX.google.aomc.decoder sau a versiunii sale hardware.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și