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


von fsdf (Gast)


Angehängte Dateien:

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?

von fsdf (Gast)


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

von Horst M. (horst)


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.

von fsdf (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.