Pentru convertirea fișierelor imagine (JPG, PNG) in video (M2V) ce poate fi integrat in firmware-ul receptoarelor, se poate folosi utilitarul gratuit ffmpeg sau avconv de la linia de comandă (ca alternativă la TMPGEnc). Comanda pentru Amiko 8260 arată cam așa:

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
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).

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ă: logo_amiko_light.m2v.



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).



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_”.



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.



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.



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).



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).



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).



In dialogul care apare, setăm următoarele: suma termenilor = 4C11DB7 și valoare inițială = FFFFFFFF.



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.



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:

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;
}
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 crc = crc32Be(~0, data, size);