Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of F401RE-USBHost by
decodeMJPEG.cpp
00001 // decodeMJPEG.cpp 2012/12/8 00002 // decode motion-jpeg to jpeg 00003 #include "mbed.h" 00004 #include "decodeMJPEG.h" 00005 00006 #define MARK_SOF0 0xc0 00007 #define MARK_DHT 0xc4 00008 #define MARK_RST0 0xd0 00009 #define MARK_RST7 0xd7 00010 #define MARK_SOI 0xd8 00011 #define MARK_EOI 0xd9 00012 #define MARK_SOS 0xda 00013 #define MARK_DQT 0xdb 00014 #define MARK_DRI 0xdd 00015 #define MARK_APP 0xe0 00016 00017 #define SEQ_INIT 0 00018 #define SEQ_SOI 1 00019 #define SEQ_FRAME 2 00020 #define SEQ_MARK 3 00021 #define SEQ_SEG_LEN 4 00022 #define SEQ_SEG_LEN2 5 00023 #define SEQ_SEG_BODY 6 00024 #define SEQ_SOS 7 00025 #define SEQ_SOS2 8 00026 00027 static const uint8_t dht[] = { 00028 0xFF,0xC4,0x01,0xA2,0x00,0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00, 00029 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A, 00030 0x0B,0x01,0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00, 00031 0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x10,0x00, 00032 0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,0x01,0x7D,0x01, 00033 0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22, 00034 0x71,0x14,0x32,0x81,0x91,0xA1,0x08,0x23,0x42,0xB1,0xC1,0x15,0x52,0xD1,0xF0,0x24, 00035 0x33,0x62,0x72,0x82,0x09,0x0A,0x16,0x17,0x18,0x19,0x1A,0x25,0x26,0x27,0x28,0x29, 00036 0x2A,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A, 00037 0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A, 00038 0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A, 00039 0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8, 00040 0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xC2,0xC3,0xC4,0xC5,0xC6, 00041 0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE1,0xE2,0xE3, 00042 0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9, 00043 0xFA,0x11,0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,0x00,0x01, 00044 0x02,0x77,0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07, 00045 0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xA1,0xB1,0xC1,0x09,0x23,0x33, 00046 0x52,0xF0,0x15,0x62,0x72,0xD1,0x0A,0x16,0x24,0x34,0xE1,0x25,0xF1,0x17,0x18,0x19, 00047 0x1A,0x26,0x27,0x28,0x29,0x2A,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46, 00048 0x47,0x48,0x49,0x4A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66, 00049 0x67,0x68,0x69,0x6A,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x82,0x83,0x84,0x85, 00050 0x86,0x87,0x88,0x89,0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3, 00051 0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA, 00052 0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8, 00053 0xD9,0xDA,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF2,0xF3,0xF4,0xF5,0xF6, 00054 0xF7,0xF8,0xF9,0xFA, 00055 }; 00056 00057 decodeMJPEG::decodeMJPEG() 00058 { 00059 m_seq = SEQ_INIT; 00060 } 00061 00062 void decodeMJPEG::inputPacket(const uint8_t* buf, int len) 00063 { 00064 for(int i = 12; i < len; i++) { 00065 input(buf[i]); 00066 } 00067 } 00068 00069 void decodeMJPEG::input(uint8_t c) 00070 { 00071 switch(m_seq) { 00072 case SEQ_INIT: 00073 if (c == 0xff) { 00074 m_seq = SEQ_SOI; 00075 } 00076 break; 00077 case SEQ_SOI: 00078 if (c == MARK_SOI) { 00079 outputJPEG(0xff, JPEG_START); // start 00080 outputJPEG(c); 00081 m_bDHT = false; 00082 m_seq = SEQ_FRAME; 00083 } else { 00084 m_seq = SEQ_INIT; 00085 } 00086 break; 00087 case SEQ_FRAME: 00088 if (c == 0xff) { 00089 m_seq = SEQ_MARK; 00090 } else { 00091 m_seq = SEQ_INIT; 00092 } 00093 break; 00094 case SEQ_MARK: 00095 if (c == MARK_SOI || c == MARK_EOI || c == 0x00) { 00096 m_seq = SEQ_INIT; 00097 break; 00098 } 00099 m_mark = c; 00100 m_seq = SEQ_SEG_LEN; 00101 break; 00102 case SEQ_SEG_LEN: 00103 m_seg_len = c; 00104 m_seq = SEQ_SEG_LEN2; 00105 break; 00106 case SEQ_SEG_LEN2: 00107 m_seg_len <<= 8; 00108 m_seg_len |= c; 00109 m_seg_len -= 2; 00110 m_seg_pos = 0; 00111 m_seq = SEQ_SEG_BODY; 00112 if (m_mark == MARK_SOS) { 00113 if (m_bDHT == false) { 00114 for(int i = 0; i < sizeof(dht); i++) { 00115 outputJPEG(dht[i]); 00116 } 00117 } 00118 m_output_desable = false; 00119 } else if (m_mark == MARK_DHT) { 00120 m_bDHT = true; 00121 m_output_desable = false; 00122 } else { 00123 m_output_desable = false; 00124 } 00125 if (!m_output_desable) { 00126 outputJPEG(0xff); 00127 outputJPEG(m_mark); 00128 outputJPEG((m_seg_len+2) >> 8); 00129 outputJPEG((m_seg_len+2) & 0xff); 00130 } 00131 break; 00132 case SEQ_SEG_BODY: 00133 if (!m_output_desable) { 00134 outputJPEG(c); 00135 } 00136 if (++m_seg_pos < m_seg_len) { 00137 break; 00138 } 00139 if (m_mark == MARK_SOS) { 00140 m_seq = SEQ_SOS; 00141 break; 00142 } 00143 m_seq = SEQ_FRAME; 00144 break; 00145 case SEQ_SOS: 00146 if (c == 0xff) { 00147 m_seq = SEQ_SOS2; 00148 break; 00149 } 00150 outputJPEG(c); 00151 break; 00152 case SEQ_SOS2: 00153 if (c == 0x00) { 00154 outputJPEG(0xff); 00155 outputJPEG(0x00); 00156 m_seq = SEQ_SOS; 00157 break; 00158 } else if (c >= MARK_RST0 && c <= MARK_RST7) { 00159 outputJPEG(0xff); 00160 outputJPEG(c); 00161 m_seq = SEQ_SOS; 00162 break; 00163 } else if (c == MARK_EOI) { 00164 outputJPEG(0xff); 00165 outputJPEG(c, JPEG_END); 00166 m_seq = SEQ_INIT; 00167 break; 00168 } else if (c == MARK_SOI) { 00169 outputJPEG(0xff); 00170 outputJPEG(c); 00171 m_seq = SEQ_INIT; 00172 break; 00173 } 00174 m_seq = SEQ_INIT; 00175 break; 00176 default: 00177 m_seq = SEQ_INIT; 00178 break; 00179 } 00180 }
Generated on Tue Jul 12 2022 21:43:28 by
1.7.2
