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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.