Pentru convertirea fișierelor imagine (JPG, PNG) in video (M2V) ce poate fi integrat in firmware-ul receptoarelor, se poate folosi utilitarul gratuit [Only registered and activated users can see links. Click Here To Register...] sau avconv de la linia de comandă (ca alternativă la TMPGEnc). Comanda pentru Amiko 8260 arată cam așa:
Pentru alte receptoare, argumentele vor fi ajustate astfel incat să se obțină un fișier video cu parametri cat mai apropiați de cel original (se extrage intai M2V-ul original, se analizează cu MediaInfo).Code:ffmpeg -framerate 30000/1001 -i fisier_photo.png -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m -c:v mpeg2video -b:v 30000k -minrate 30000k -maxrate 30000k -aspect 16:9 -s 1920x1080 -pix_fmt yuv420p logo_out.m2v
Bitrate-ul va trebui micșorat dacă fișierul M2V rezultat nu incape in secțiunea corespunzătoare din firmware. Un exemplu de logo pentru Amiko 8260 generat prin această metodă: [Only registered and activated users can see links. Click Here To Register...].
[Only registered and activated users can see links. Click Here To Register...]
Integrarea fișierului in firmware se poate face cu diverse utilitare (?) sau manual utilizand un editor hexazecimal (ex. HxD).
Procedura este destul de complexă, iar dacă este efectuată incorect, incărcarea firmware-ului modificat in receptor poate duce la defectarea lui, fără posibilitatea de a rescrie un firmware bun prin metode accesibile.
Vom deschide un fișier ABS cu HxD. Secțiunile care conțin logo-uri au in nume inclus „logo_” (de ex. logo_boot, logo_user, logo_menu, logo_radio). Se caută folosind Ctrl+F (șir text).
[Only registered and activated users can see links. Click Here To Register...]
O dată ajunși la secțiunea care ne interesează, ne uităm la secvența de 16 bytes anterioară celei in care se găsește „logo_”.
[Only registered and activated users can see links. Click Here To Register...]
Primii 4 bytes reprezintă identificatorul secțiunii. Următorii 4 reprezintă mărimea fișierului M2V plus cei 0x70 bytes aferenți metadatelor. Următorii 4 arată mărimea secțiunii in totalitate (cu acest header, metadatele, fișierul M2V și octeții liberi de la sfarșit). Ultimii 4 reprezintă CRC32 al blocului de bytes ce conține metadatele și fișierul M2V.
1. Extragerea fișierului video original
Punem cursorul la inceputul fișierului video (click la inceputul primului rand după metadate - care in exemplu incepe cu 0x000001B3). Vom selecta blocul de conține doar fișierul M2V (Editare - Selectare bloc, sau Ctr+E). Bifăm lungime. Vom scrie aici mărimea minus 0x70 (adică fără metadate). Conform exemplului, ADEF - 70 = AD7F.
[Only registered and activated users can see links. Click Here To Register...]
Acum putem copia blocul selectat (Ctrl +C), facem un fișier nou (Ctrl +N), punem aici (Ctrl +V) - apăsăm OK, salvăm (Ctrl +S) cu extensia M2V.
2. Inserarea noului fișier
Inainte de a insera noul fișier, va trebui să il eliminăm pe cel anterior. Cu blocul de bytes aferent fișierului video incă selectat (in tabul anterior), mergem la Editare - Umplere selecție. Setăm valori hex FF.
[Only registered and activated users can see links. Click Here To Register...]
După ce apăsați OK, nu trebuie să apară un dialog de avertisment referitor la modificarea mărimii fișierului.
Punem din nou cursorul in locul aferent inceputului fișierului video. Căutăm inapoi șirul text „logo_” pe care il vom modifica, și punem cursorul 7 randuri mai jos (unde octeții sunt scriși cu roșu).
[Only registered and activated users can see links. Click Here To Register...]
Pregătim noul fișier video. Acesta nu poate fi mai mare decat mărimea secțiunii - 0x80 (in exemplu 27f80-80 = 27F00 = 163584 bytes). Deschidem fișierul video intr-un tab nou in HxD. Apăsăm Ctrl+A (selectare totală) și notăm mărimea fișierului (bara de jos specifică mărimea in format hexazecimal - fișierul ales de mine are mărimea 1E84A, mai mică decat 27F00). Cu toții octeții selectați apăsăm Ctrl+C și ne intoarcem in tabul ce conține firmware-ul deschis și cursorul poziționat. Apăsăm Ctrl+B (Editare - Alipire scriere).
Căutăm din nou inapoi șirul text „logo_” pentru secțiunea pe care o modificăm. Va trebui să modificăm secvența de 4 bytes care conținea mărimea fișierului video + metadate (marcată cu roșu in imaginea de sus). Vom pune aici mărimea fișierului video la care adăugăm 0x70 (in exemplu 1E84A + 70 = 1E8BA, pe care o vom scrie așa: 00 01 E8 BA inlocuind valorile existente, nu adăugand alți octeți).
3. Calcul CRC32
Punem cursorul la inceputul metadatelor (inceputul șirului „logo”). Mergem la Editare - Selectare bloc, și setăm lungimea la valoarea pe care am calculat-o anterior (mărimea) (in exemplu 1E8BA).
[Only registered and activated users can see links. Click Here To Register...]
Cu blocul respectiv selectat, din meniul Analize, alegem Suma de control. Selectăm CRC Ales (32 bit) și apăsăm butonul CRC obișnuit (custom CRC).
[Only registered and activated users can see links. Click Here To Register...]
In dialogul care apare, setăm următoarele: suma termenilor = 4C11DB7 și valoare inițială = FFFFFFFF.
[Only registered and activated users can see links. Click Here To Register...]
Apăsand OK, ne intoarcem la dialogul precedent, verificăm să fie bifat Selecție și opțiunea CRC ales (32-bit) și apăsăm OK.
Ne ducem din nou, la inceputul secțiunii și punem valoarea calculată in campul aferent CRC-ului.
[Only registered and activated users can see links. Click Here To Register...]
Acum putem salva fișierul. După salvare, recomand redeschiderea in HxD ca read-only, selectarea primului bloc (bootloader-ul), calcularea unei sume de control pentru acest bloc și compararea blocul dintr-un firmware oficial, nemodificat. Dacă sumele de control nu corespund, nu incărcați firmware-ul in receptor.
Procedura prin care este calculat CRC-ul este următoarea:
Funcția poate fi folosită astfel, cu un pointer către secvența de octeți (char *data) și un integer reprezentand mărimea secvenței (int size):Code:unsigned int crc32Be(unsigned int crc, const char *p, unsigned int len){
int i;
while (len--) {
crc ^= *p++ << 24;
for (i = 0; i < 8; i++)
crc = (crc << 1) ^ ((crc & 0x80000000) ? 0x04C11DB7 : 0);
}
return crc;
}
Code:unsigned int crc = crc32Be(~0, data, size);