BaseUsbHost example program

Dependencies:   BaseUsbHost FATFileSystem mbed mbed-rtos

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers decodeMJPEG.cpp Source File

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 }