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.
Dependencies: FatFileSystem TB6612FNG2 mbed
uvc/myjpeg.cpp@0:de03cbbcd0ff, 2015-11-30 (annotated)
- Committer:
- mbed_Cookbook_SE
- Date:
- Mon Nov 30 09:32:15 2015 +0000
- Revision:
- 0:de03cbbcd0ff
??
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 1 | #include "mbed.h" |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 2 | //#define __DEBUG |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 3 | #include "mydbg.h" |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 4 | #include "myjpeg.h" |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 5 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 6 | static const uint8_t dht[] = { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 7 | 0xFF,0xC4,0x01,0xA2,0x00,0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 8 | 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 9 | 0x0B,0x01,0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 10 | 0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x10,0x00, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 11 | 0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,0x01,0x7D,0x01, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 12 | 0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 13 | 0x71,0x14,0x32,0x81,0x91,0xA1,0x08,0x23,0x42,0xB1,0xC1,0x15,0x52,0xD1,0xF0,0x24, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 14 | 0x33,0x62,0x72,0x82,0x09,0x0A,0x16,0x17,0x18,0x19,0x1A,0x25,0x26,0x27,0x28,0x29, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 15 | 0x2A,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 16 | 0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 17 | 0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 18 | 0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 19 | 0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xC2,0xC3,0xC4,0xC5,0xC6, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 20 | 0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE1,0xE2,0xE3, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 21 | 0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 22 | 0xFA,0x11,0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,0x00,0x01, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 23 | 0x02,0x77,0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 24 | 0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xA1,0xB1,0xC1,0x09,0x23,0x33, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 25 | 0x52,0xF0,0x15,0x62,0x72,0xD1,0x0A,0x16,0x24,0x34,0xE1,0x25,0xF1,0x17,0x18,0x19, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 26 | 0x1A,0x26,0x27,0x28,0x29,0x2A,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 27 | 0x47,0x48,0x49,0x4A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 28 | 0x67,0x68,0x69,0x6A,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x82,0x83,0x84,0x85, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 29 | 0x86,0x87,0x88,0x89,0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 30 | 0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 31 | 0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 32 | 0xD9,0xDA,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF2,0xF3,0xF4,0xF5,0xF6, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 33 | 0xF7,0xF8,0xF9,0xFA, |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 34 | }; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 35 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 36 | myjpeg::myjpeg(uint8_t* buf, int len, int capacity) |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 37 | { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 38 | DBG_ASSERT(buf); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 39 | DBG_ASSERT(len >= 0); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 40 | m_buf = buf; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 41 | m_len = len; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 42 | m_capacity = capacity; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 43 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 44 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 45 | int myjpeg::getc() |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 46 | { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 47 | if (m_pos >= m_len) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 48 | return -1; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 49 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 50 | return m_buf[m_pos++]; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 51 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 52 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 53 | int myjpeg::getBE16() |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 54 | { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 55 | int c1 = getc(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 56 | if (c1 == (-1)) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 57 | return -1; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 58 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 59 | int c2 = getc(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 60 | if (c2 == (-1)) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 61 | return -1; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 62 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 63 | return c1<<8|c2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 64 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 65 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 66 | void myjpeg::analytics() |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 67 | { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 68 | m_pos = 0; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 69 | SOS_pos = 0; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 70 | DHT_pos = 0; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 71 | int skip; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 72 | int lp; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 73 | while(1) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 74 | int marker_pos = m_pos; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 75 | int c = getc(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 76 | if (c == (-1)) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 77 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 78 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 79 | if (c != 0xff) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 80 | continue; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 81 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 82 | c = getc(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 83 | if (c == (-1)) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 84 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 85 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 86 | uint8_t marker = c; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 87 | switch(marker) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 88 | case 0xd8: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 89 | DBG("%04X SOI\n", marker_pos); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 90 | skip = 0; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 91 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 92 | case 0xd9: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 93 | DBG("%04X EOI\n", marker_pos); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 94 | skip = 0; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 95 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 96 | case 0x00: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 97 | skip = 0; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 98 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 99 | case 0xc0: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 100 | lp = getBE16(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 101 | DBG("%04X SOF0 %d\n", marker_pos, lp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 102 | skip = lp - 2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 103 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 104 | case 0xc4: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 105 | lp = getBE16(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 106 | DBG("%04X DHT Lh: %d\n", marker_pos, lp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 107 | //DBG("Tc: %d\n", buf[pos+2]>>4); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 108 | //DBG("Th: %d\n", buf[pos+2]&0xf); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 109 | DHT_pos = marker_pos; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 110 | skip = lp - 2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 111 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 112 | case 0xda: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 113 | lp = getBE16(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 114 | DBG("%04X SOS Ls: %d\n", marker_pos, lp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 115 | //DBG("Ns: %d\n", buf[pos+2]); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 116 | //for(i = 1; i <= buf[pos+2]; i++) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 117 | // DBG("Cs%d: %d\n", i, buf[pos+3+(i-1)*2]); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 118 | // DBG("Td%d: %d\n", i, buf[pos+4+(i-1)*2]>>4); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 119 | // DBG("Ta%d: %d\n", i, buf[pos+4+(i-1)*2]&0xf); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 120 | //} |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 121 | SOS_pos = marker_pos; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 122 | skip = lp - 2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 123 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 124 | case 0xdb: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 125 | lp = getBE16(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 126 | DBG("%04X DQT %d\n", marker_pos, lp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 127 | skip = lp - 2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 128 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 129 | case 0xe0: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 130 | lp = getBE16(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 131 | DBG("%04X APP0 %d\n", marker_pos, lp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 132 | skip = lp - 2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 133 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 134 | default: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 135 | DBG("%04X ??? %02X\n", marker_pos, marker); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 136 | skip = 0; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 137 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 138 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 139 | while(skip-- > 0) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 140 | getc(); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 141 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 142 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 143 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 144 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 145 | int myjpeg::insertDHT() |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 146 | { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 147 | DBG("m_len=%d m_capacity=%d SOS=%d\n", m_len, m_capacity, SOS_pos); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 148 | DBG_ASSERT(SOS_pos > 0); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 149 | DBG_ASSERT(SOS_pos < m_len); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 150 | DBG_ASSERT(m_len <= m_capacity); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 151 | DBG_ASSERT(sizeof(dht) == 420); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 152 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 153 | int num1 = m_len - SOS_pos; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 154 | if (num1 > (m_capacity - SOS_pos - sizeof(dht))) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 155 | num1 = m_capacity - SOS_pos - sizeof(dht); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 156 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 157 | DBG("num1=%d\n", num1); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 158 | DBG_ASSERT(SOS_pos+sizeof(dht)+num1 <= m_capacity); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 159 | memmove(m_buf+SOS_pos+sizeof(dht), m_buf+SOS_pos, num1); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 160 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 161 | int num2 = sizeof(dht); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 162 | if (num2 > m_capacity - SOS_pos) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 163 | num2 = m_capacity - SOS_pos; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 164 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 165 | DBG("num2=%d\n", num2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 166 | DBG_ASSERT(SOS_pos+num2 <= m_capacity); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 167 | memcpy(m_buf+SOS_pos, dht, num2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 168 | m_len += sizeof(dht); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 169 | if (m_len > m_capacity) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 170 | m_len = m_capacity; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 171 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 172 | return m_len; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 173 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 174 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 175 | int fgetBE16(FILE* fp) |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 176 | { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 177 | int c1 = fgetc(fp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 178 | if (c1 == EOF) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 179 | return -1; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 180 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 181 | int c2 = fgetc(fp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 182 | if (c2 == EOF) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 183 | return -1; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 184 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 185 | return c1<<8|c2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 186 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 187 | |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 188 | void QcamCopy(const char* destination, const char* source) |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 189 | { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 190 | FILE* fp; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 191 | FILE* fp2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 192 | fp = fopen(source, "rb"); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 193 | if (fp == NULL) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 194 | return; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 195 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 196 | fp2 = fopen(destination, "wb"); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 197 | if (fp2 == NULL) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 198 | return; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 199 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 200 | int i,c1,c2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 201 | bool f_dht = false; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 202 | bool f_lp = false; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 203 | while(!feof(fp)){ |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 204 | c1 = fgetc(fp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 205 | if (c1 != 0xff) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 206 | fputc(c1, fp2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 207 | continue; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 208 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 209 | c2 = fgetc(fp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 210 | switch(c2) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 211 | case 0xda: // SOS |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 212 | if (!f_dht) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 213 | for(i = 0; i < sizeof(dht); i++) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 214 | fputc(dht[i], fp2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 215 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 216 | f_dht = true; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 217 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 218 | f_lp = true; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 219 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 220 | case 0xc4: // DHT |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 221 | f_dht = true; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 222 | f_lp = true; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 223 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 224 | case 0xc0: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 225 | case 0xdb: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 226 | case 0xe0: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 227 | f_lp = true; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 228 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 229 | default: |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 230 | f_lp = false; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 231 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 232 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 233 | fputc(c1, fp2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 234 | fputc(c2, fp2); // marker |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 235 | if (f_lp) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 236 | c1 = fgetc(fp); // length |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 237 | c2 = fgetc(fp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 238 | fputc(c1, fp2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 239 | fputc(c2, fp2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 240 | int skip = c1<<8|c2; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 241 | while(skip-- > 2) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 242 | int c = fgetc(fp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 243 | if (c == EOF) { |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 244 | break; |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 245 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 246 | fputc(c, fp2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 247 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 248 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 249 | } |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 250 | fclose(fp); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 251 | fclose(fp2); |
| mbed_Cookbook_SE | 0:de03cbbcd0ff | 252 | } |