convert JPEG stream data to bitmap, BaseJpegDecode example program
Dependencies: BaseJpegDecode BaseUsbHost FATFileSystem mbed-rtos mbed
JPEGデコードのサンプルプログラムです。
JPEGのMCU単位で逐次デコード出力していますので少ないRAMメモリで動かすことが出来ます。
#include "USBHostMSD.h" #include "SimpleJpegDecode.h" #include "bmp24.h" const char* INPUT_FILE = "/usb/input.jpg"; const char* OUTPUT_FILE = "/usb/output.bmp"; bmp24 bmp; RawSerial pc(USBTX, USBRX); void callbackRGB(int x, int y, uint8_t* rgb) { bmp.point(x, y, rgb); pc.printf("x=%d, y=%d, RGB=(0x%02x,0x%02x,0x%02x)\n", x, y, rgb[0], rgb[1], rgb[2]); } int main() { pc.baud(115200); USBHostMSD* msd = new USBHostMSD("usb"); if (!msd->connect()) { error("USB Flash drive not found.\n"); } SimpleJpegDecode* decode = new SimpleJpegDecode(RGB24); decode->setOnResult(callbackRGB); decode->clear(); pc.printf("input: %s\n", INPUT_FILE); FILE* fp = fopen(INPUT_FILE, "rb"); if (fp == NULL) { error("open error\n"); } while(1) { int c = fgetc(fp); if (c == EOF) { break; } decode->input(c); } fclose(fp); pc.printf("output: %s\n", OUTPUT_FILE); if (!bmp.writeFile(OUTPUT_FILE)) { error("write error\n"); } exit(1); }
Diff: UsbFlashDrive/UsbFlashDrive.h
- Revision:
- 0:98f918e1d528
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UsbFlashDrive/UsbFlashDrive.h Sat Feb 02 01:25:25 2013 +0000 @@ -0,0 +1,75 @@ +// usbFlashDrive.h 2013/1/8 +#pragma once + +#include "FATFileSystem.h" + +#define SCSI_CMD_REQUEST_SENSE 0x03 +#define SCSI_CMD_TEST_UNIT_READY 0x00 +#define SCSI_CMD_INQUIRY 0x12 +#define SCSI_CMD_READ_10 0x28 +#define SCSI_CMD_READ_CAPACITY 0x25 +#define SCSI_CMD_WRITE_10 0x2A + +#pragma pack(push,1) +struct CBW { + uint32_t dCBWSignature; + uint32_t dCBWTag; + uint32_t dCBWDataTraansferLength; + uint8_t bmCBWFlags; + uint8_t bCBWLUN; + uint8_t bCBWCBLength; + uint8_t CBWCB[16]; +}; + +struct CSW { + uint32_t dCSWSignature; + uint32_t dCSWTag; + uint32_t dCSWDataResidue; + uint8_t bCSWStatus; +}; +#pragma pack(pop) + +class UsbFlashDrive : public FATFileSystem { +public: + UsbFlashDrive(const char* name, ControlEp* ctlEp = NULL); + static bool check(ControlEp* ctlEp); + virtual int disk_initialize(); + virtual int disk_write(const uint8_t* buffer, uint64_t sector); + virtual int disk_read(uint8_t* buffer, uint64_t sector); + virtual int disk_status(); + virtual int disk_sync(); + virtual uint64_t disk_sectors(); +private: + int setup(ControlEp* ctlEp, int timeout = 9000); + int ParseConfiguration(ControlEp* ctlEp); + int BulkOnlyMassStorageReset(ControlEp* ctlEp); + int GetMaxLUN(ControlEp* ctlEp); + int ReadCapacity(); + int GetSenseInfo(); + int TestUnitReady(); + int Inquire(); + int MS_BulkRecv(uint32_t block_number, int num_blocks, uint8_t* user_buffer); + int MS_BulkSend(uint32_t block_number, int num_blocks, const uint8_t* user_buffer); + int CommandTransport(const uint8_t* cdb, int size); + int StatusTransport(); + int _bulkRecv(uint8_t* buf, int size); + int _bulkSend(const uint8_t* buf, int size); + const char* m_name; + int m_drive; + uint32_t m_numBlocks; + int m_BlockSize; + int m_lun; + int m_MaxLUN; + int m_interface; + uint32_t m_tag; + CBW m_CBW; + CSW m_CSW; + // endpoint + BulkEp* m_pEpBulkIn; + BulkEp* m_pEpBulkOut; + // report + uint32_t m_report_disk_write; + uint32_t m_report_disk_read; + uint32_t m_report_disk_status; + uint32_t m_report_disk_sync; +};