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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren