mikrocontroller.net

Forum: Compiler & IDEs JPG format kurios - tjpgdec oder libjpeg funktionieren nicht


Autor: fsdf (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Vieleicht kennt jemand das Problem.
Anbei ist ein Jpeg aus einer USB Kamera.
Hier fehlt im Header die Huffmantable.
Dafür ist die Quantisierungstable ... anders.

http://cyber.meme.tips/jpdump/#


Ich versuche diese Bilder mit Hilfe von tjpgdec oder libjpeg zu 
decodieren.
Beide können dieses Format aber nicht lesen.

libjpeg stürzt direkt beim einlesen ab und tjpgdec gibt Aufgrund der 
fehlenden Huffmantables eine Fehlermeldung zurück.

Bei "irgendwelchen" huffcodes zeigt tjpgdec zumindest ein paar Pixel ^^


Bei Jpg bilder mit vollständigem Header funktionieren beide Decoder.
µC ist ein STM32F7


Gibt es einen Trick oder einen Fix um diese Bilder dekodieren zu können?

Autor: fsdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lol ...

habs mit tjpgdec hinbekommen

habe aus einem funktionierenden Jpeg mit ähnlichem aufbau die huffman 
tables herausgenommen.
Diese eingesetzt und siehe da ich habe ein bild.

const unsigned char huffman1[] = {
      0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
      0x07, 0x08, 0x09, 0x0A, 0x0B,
};

const unsigned char huffman2[] = {
      0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
      0x07, 0x08, 0x09, 0x0A, 0x0B,
};


const unsigned char huffman3[] = {
      0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05,
      0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04,
      0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22,
      0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15,
      0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17,
      0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36,
      0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A,
      0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
      0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
      0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95,
      0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
      0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2,
      0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5,
      0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
      0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9,
      0xFA,
};

const unsigned char huffman4[] = {
    0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
      0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
      0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22,
      0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33,
      0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25,
      0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36,
      0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A,
      0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66,
      0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
      0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94,
      0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
      0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA,
      0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4,
      0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
      0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
};



// in der decoderfunktion hinzufügen:

JRESULT jd_prepare (...)
  ...
  BYTE huff = 0;
  ...
    case 0xC4:  /* DHT */
      /* Load segment data */
      ...
      huff = 1;
      break;

    case 0xDA:  /* SOS */
      if( huff == 0 ){
        rc = create_huffman_tbl(jd, huffman1 , sizeof(huffman1)/sizeof(unsigned char) );
        rc = create_huffman_tbl(jd, huffman2 , sizeof(huffman2)/sizeof(unsigned char));
        rc = create_huffman_tbl(jd, huffman3 , sizeof(huffman3)/sizeof(unsigned char));
        rc = create_huffman_tbl(jd, huffman4 , sizeof(huffman4)/sizeof(unsigned char));
      }




ja ich suche schon 2 tage ...
bin gerade per zufall auf einen hinweis gestoßen und hab das mal 
probiert.
ist Quick and dirty .. aber läuft erstmal

Autor: Horst M. (horst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fsdf schrieb:
> Hier fehlt im Header die Huffmantable.

Wenn die JPEGs nicht optimiert sind, sollten die DHT-Segmente 
entsprechend ITU-Rec. T.81 konstruiert sein (also immer gleich). Da das 
dann im Prinzip redundante Informationen sind, kann man sie - offenbar - 
auch weglassen (ich habe hier 
Beitrag "Fast JPEG decoder on AT(x)mega" mal darüber 
geschrieben). Der JPEG-Decoder muß also bei nicht vorhandenen 
DHT-Segmenten auf den Default im Code zurückgreifen.

Autor: fsdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Horst M. schrieb:
> fsdf schrieb:
>> Hier fehlt im Header die Huffmantable.
>
> Wenn die JPEGs nicht optimiert sind, sollten die DHT-Segmente
> entsprechend ITU-Rec. T.81 konstruiert sein (also immer gleich). Da das
> dann im Prinzip redundante Informationen sind, kann man sie - offenbar -
> auch weglassen (ich habe hier
> Beitrag "Fast JPEG decoder on AT(x)mega" mal darüber
> geschrieben). Der JPEG-Decoder muß also bei nicht vorhandenen
> DHT-Segmenten auf den Default im Code zurückgreifen.

hi

ja habe sowas auch gelesen.
Daraufhin den "default" gesucht und dann in einem JPEG das obige 
gefunden.

per default kann das aber weder libjpeg noch tjpgdec
deswegen hab ich den quick and diry fix oben gepostet ...
vlt braucht das ja noch jemand

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.