JPG format kurios - tjpgdec oder libjpeg funktionieren nicht

Gast #5615729
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?
Angehängte Dateien:
Gast #5615906
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.
1
const unsigned char huffman1[] = {
2
      0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
3
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
4
      0x07, 0x08, 0x09, 0x0A, 0x0B,
5
};
6

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

13

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

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

51

52

53
// in der decoderfunktion hinzufügen:
54

55
JRESULT jd_prepare (...)
56
  ...
57
  BYTE huff = 0;
58
  ...
59
    case 0xC4:  /* DHT */
60
      /* Load segment data */
61
      ...
62
      huff = 1;
63
      break;
64

65
    case 0xDA:  /* SOS */
66
      if( huff == 0 ){
67
        rc = create_huffman_tbl(jd, huffman1 , sizeof(huffman1)/sizeof(unsigned char) );
68
        rc = create_huffman_tbl(jd, huffman2 , sizeof(huffman2)/sizeof(unsigned char));
69
        rc = create_huffman_tbl(jd, huffman3 , sizeof(huffman3)/sizeof(unsigned char));
70
        rc = create_huffman_tbl(jd, huffman4 , sizeof(huffman4)/sizeof(unsigned char));
71
      }



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
#5615967
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.
Gast #5616187
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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.