Hello World for JCU(JPEG Codec Unit). JCU is JPEG codec unit of RZ/A1. When you use this program, we judge you have agreed to the following contents. https://developer.mbed.org/teams/Renesas/wiki/About-LICENSE

License

When you use this program, we judge you have agreed to the following contents.

本プログラムを使用する際は、以下の内容に合意した事になります。

https://developer.mbed.org/teams/Renesas/wiki/About-LICENSE

Information

Japanese version is available in lower part of this page.

このページの後半に日本語版が用意されています.

What is this ?

JPEG driver sample program using GR-PEACH or GR-LYCHEE.
When you decode/encode file, input file set width is 320 pixel and height is 240 pixel.

FormatJPEG file".jpg"
Color formatYCbCr422
Pixel size320x240
FormatBitmap file".bin"
Color formatYCbCr422
Pixel size320x240

Composition

GR-PEACH or GR-LYCHEE, PC and USB media.

  • Use USB0 of GR-PEACH:

/media/uploads/tyama/jpeg_conv_usb0.png

If you use the USB0 as USB Host, please close GR-PEACH's JP3.

/media/uploads/tyama/gr-peach-c_usb2.png

Please select USB0 connector by the following configuration.

mbed_app.json

{
    "config": {
        "usb-host-ch":{
            "help": "(for GR-PEACH) 0:ch0 1:ch1",
            "value": "0"
        },
        "audio-camera-shield":{
            "help": "(for GR-PEACH) 0:not use 1:use",
            "value": "0"
        }
   }
}


  • Use USB1 of GR-PEACH:

/media/uploads/tyama/jpeg_conv_usb1.png

If you use the USB1 as USB Host, please close Audio/Camera Shield's JP1.

/media/uploads/tyama/audiocamerashield_jp1.jpg

Please select Audio/Camera Shield and USB1 connector by the following configuration.

mbed_app.json

{
    "config": {
        "usb-host-ch":{
            "help": "(for GR-PEACH) 0:ch0 1:ch1",
            "value": "1"
        },
        "audio-camera-shield":{
            "help": "(for GR-PEACH) 0:not use 1:use",
            "value": "1"
        }
    }
}



The size of the changed picture is made 320x240pixel fixing by a sample program. When using a file with the picture size besides that, please change the below.

JPEG_converter\main.cpp

#define SAMPLE_WIDTH        (320)
#define SAMPLE_HEIGHT       (240)

How to use

  1. Please turn on the power to GR-PEACH or GR-LYCHEE and start terminal software.
  2. Please connect a USB media and press the reset button on the board.
  3. Input request of the file name is output on terminal.
  4. When a file of extension ".jpg" is designated, a JPEG file is decoded. A decoded file will be data of 320x240pixel and YCbCr422.
  5. When a file of extension ".bin" is designated, it's encoded to a JPEG file. An encoded file will be a JPEG file of 320x240pixel and YCbCr422.

The default setting of serial communication (baud rate etc.) in mbed is shown the following link.
Please refer to the link and change the settings of your PC terminal software.
The default value of baud rate in mbed is 9600, and this application uses baud rate 9600.
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication


概要

GR-PEACH or GR-LYCHEEを使ったJPEG driverサンプルプログラムです。
デコード/エンコードする入力ファイルは、幅を320pixel、高さを240pixelに設定してください。

FormatJPEG file".jpg"
Color formatYCbCr422
Pixel size320x240
FormatBitmap file".bin"
Color formatYCbCr422
Pixel size320x240

構成

GR-PEACH or GR-LYCHEE、PC、USBメディア

  • GR-PEACHでUSB0を使用する場合:

/media/uploads/tyama/jpeg_conv_usb0.png

USBホストとしてUSB0を使用する場合は、GR-PEACHのJP3を閉じてください。

/media/uploads/tyama/gr-peach-c_usb2.png

以下の設定でUSB0コネクタを選択して下さい。

mbed_app.json

{
    "config": {
        "usb-host-ch":{
            "help": "(for GR-PEACH) 0:ch0 1:ch1",
            "value": "0"
        },
        "audio-camera-shield":{
            "help": "(for GR-PEACH) 0:not use 1:use",
            "value": "0"
        }
}


  • GR-PEACHでUSB1を使用する場合:

/media/uploads/tyama/jpeg_conv_usb1.png

USBホストとしてUSB1を使用する場合は、Audio/Camera ShieldのJP1を閉じてください。

/media/uploads/tyama/audiocamerashield_jp1.jpg

以下の設定でAudio/Camera ShieldとUSB1コネクタを選択して下さい。

mbed_app.json

{
    "config": {
        "usb-host-ch":{
            "help": "(for GR-PEACH) 0:ch0 1:ch1",
            "value": "1"
        },
        "audio-camera-shield":{
            "help": "(for GR-PEACH) 0:not use 1:use",
            "value": "1"
        }
    }
}



サンプルプログラムでは、変換する画像のサイズを320x240pixel固定としております。 それ以外の画像サイズのファイルを使用する場合は以下を変更してください。

JPEG_converter\main.cpp

#define SAMPLE_WIDTH        (320)
#define SAMPLE_HEIGHT       (240)

使い方

  1. GR-PEACH or GR-LYCHEEに電源を入れ、Terminalソフトを立ち上げます。
  2. USBメディアを接続し、ボード上にあるリセットします。
  3. Terminal上にファイル名の入力要求が出力されます。
  4. 拡張子".jpg"のファイルを指定するとJPEGファイルのデコードを実行します。デコードしたファイルは、320x240pixel、YCbCr422のデータとなります。
  5. 拡張子".bin"のファイルを指定するとJPEGファイルへのエンコードを実行します。エンコードしたファイルは、320x240pixel、YCbCr422のJPEGファイルとなります。

mbedのシリアル通信(ボーレート等)のデフォルト設定は以下のリンクに示しています。
リンクを参考に、お使いのPCターミナルソフトの設定を変更して下さい。
mbedでのボーレートのデフォルト値は9600で、このサンプルではボーレート9600を使います。
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH-Getting-Started#install-the-usb-serial-communication

Committer:
Osamu Nakamura
Date:
Tue Mar 21 19:22:30 2017 +0900
Revision:
7:492ae3d420d1
Parent:
6:30dff7910f8b
Child:
8:284c50c65346
Update GraphicsFramework to the latest one

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:94bcab936677 1 #include "mbed.h"
dkato 0:94bcab936677 2 #include "JPEG_Converter.h"
Osamu Nakamura 6:30dff7910f8b 3 #include "FATFileSystem.h"
dkato 0:94bcab936677 4 #include "USBHostMSD.h"
dkato 0:94bcab936677 5 #if defined(TARGET_RZ_A1H)
dkato 0:94bcab936677 6 #include "usb_host_setting.h"
dkato 0:94bcab936677 7 #else
dkato 0:94bcab936677 8 #define USB_HOST_CH 0
dkato 0:94bcab936677 9 #endif
dkato 0:94bcab936677 10
dkato 0:94bcab936677 11 #define SAMPLE_WIDTH (320)
dkato 0:94bcab936677 12 #define SAMPLE_HEIGHT (240)
dkato 0:94bcab936677 13 #define SAMPLE_BUFF_SIZE (SAMPLE_WIDTH * SAMPLE_HEIGHT * 4)
dkato 0:94bcab936677 14
dkato 0:94bcab936677 15 #define MAX_FILE_NAME_LENGTH (64)
dkato 0:94bcab936677 16 #define FOLD_COUNT (5)
dkato 0:94bcab936677 17
dkato 0:94bcab936677 18 #if (USB_HOST_CH == 1) //Audio Camera Shield USB1
dkato 0:94bcab936677 19 DigitalOut usb1en(P3_8);
dkato 0:94bcab936677 20 #endif
dkato 0:94bcab936677 21 DigitalOut led1(LED1);
dkato 0:94bcab936677 22 Serial pc(USBTX, USBRX);
dkato 0:94bcab936677 23
dkato 4:6e390b05b558 24 #if defined(__ICCARM__)
dkato 4:6e390b05b558 25 #pragma data_alignment=8
dkato 4:6e390b05b558 26 static uint8_t JCUBuffer_INPUT[SAMPLE_BUFF_SIZE]@ ".mirrorram"; //8 bytes aligned!;
1050186 5:6dfd2c98ddb9 27 #pragma data_alignment=8
dkato 4:6e390b05b558 28 static uint8_t JCUBuffer_OUTPUT[SAMPLE_BUFF_SIZE]@ ".mirrorram"; //8 bytes aligned!;
dkato 4:6e390b05b558 29 #else
dkato 0:94bcab936677 30 static uint8_t JCUBuffer_INPUT[SAMPLE_BUFF_SIZE]__attribute((section("NC_BSS"),aligned(8))); //8 bytes aligned!;
dkato 0:94bcab936677 31 static uint8_t JCUBuffer_OUTPUT[SAMPLE_BUFF_SIZE]__attribute((section("NC_BSS"),aligned(8))); //8 bytes aligned!;
dkato 4:6e390b05b558 32 #endif
dkato 0:94bcab936677 33
dkato 0:94bcab936677 34 bool get_file_name(char * p_buf, int size) {
dkato 0:94bcab936677 35 bool ret;
dkato 0:94bcab936677 36 char ch;
dkato 0:94bcab936677 37 int i = 0;
dkato 0:94bcab936677 38
dkato 0:94bcab936677 39 while (1) {
dkato 0:94bcab936677 40 ch = (char)pc.getc();
dkato 0:94bcab936677 41 if (ch == '\r'){
dkato 0:94bcab936677 42 p_buf[i] = '\0';
dkato 0:94bcab936677 43 pc.putc('\n');
dkato 0:94bcab936677 44 ret = true;
dkato 0:94bcab936677 45 break;
dkato 0:94bcab936677 46 } else if (ch == '\n') {
dkato 0:94bcab936677 47 // Do Nothing
dkato 0:94bcab936677 48 } else if (ch == '\b') {
dkato 0:94bcab936677 49 if (i > 0) {
dkato 0:94bcab936677 50 pc.puts("\b \b");
dkato 0:94bcab936677 51 i--;
dkato 0:94bcab936677 52 p_buf[i] = '\0';
dkato 0:94bcab936677 53 }
dkato 0:94bcab936677 54 } else if (i < size) {
dkato 0:94bcab936677 55 p_buf[i] = ch;
dkato 0:94bcab936677 56 i++;
dkato 0:94bcab936677 57 pc.putc(ch);
dkato 0:94bcab936677 58 } else {
dkato 0:94bcab936677 59 ret = false;
dkato 0:94bcab936677 60 break;
dkato 0:94bcab936677 61 }
dkato 0:94bcab936677 62 }
dkato 0:94bcab936677 63
dkato 0:94bcab936677 64 return ret;
dkato 0:94bcab936677 65 }
dkato 0:94bcab936677 66
dkato 0:94bcab936677 67 int main() {
dkato 0:94bcab936677 68 char file_name[MAX_FILE_NAME_LENGTH + FOLD_COUNT];
dkato 0:94bcab936677 69 JPEG_Converter decoder;
dkato 0:94bcab936677 70 JPEG_Converter::bitmap_buff_info_t aBitmapData;
dkato 0:94bcab936677 71 FILE * rd_fp = NULL;
dkato 0:94bcab936677 72 FILE * wr_fp = NULL;
dkato 0:94bcab936677 73 int filesize;
dkato 0:94bcab936677 74 size_t EncodeSize;
Osamu Nakamura 6:30dff7910f8b 75
Osamu Nakamura 6:30dff7910f8b 76 FATFileSystem fs("usb");
Osamu Nakamura 6:30dff7910f8b 77 USBHostMSD msd;
dkato 0:94bcab936677 78
dkato 0:94bcab936677 79 file_name[0] = '/';
dkato 0:94bcab936677 80 file_name[1] = 'u';
dkato 0:94bcab936677 81 file_name[2] = 's';
dkato 0:94bcab936677 82 file_name[3] = 'b';
dkato 0:94bcab936677 83 file_name[4] = '/';
dkato 0:94bcab936677 84
dkato 0:94bcab936677 85 #if (USB_HOST_CH == 1) //Audio Shield USB1
dkato 0:94bcab936677 86 //Audio Shield USB1 enable
dkato 0:94bcab936677 87 usb1en = 1; //Outputs high level
dkato 0:94bcab936677 88 Thread::wait(5);
dkato 0:94bcab936677 89 usb1en = 0; //Outputs low level
dkato 0:94bcab936677 90 #endif
dkato 0:94bcab936677 91
dkato 0:94bcab936677 92 //try to connect a MSD device
dkato 0:94bcab936677 93 while(!msd.connect()) {
dkato 0:94bcab936677 94 Thread::wait(500);
dkato 0:94bcab936677 95 }
Osamu Nakamura 6:30dff7910f8b 96
Osamu Nakamura 6:30dff7910f8b 97 //Now that USB flash disk is detected, file system is mounted
Osamu Nakamura 6:30dff7910f8b 98 fs.mount(&msd);
dkato 0:94bcab936677 99
dkato 3:19e5a993ec7d 100 pc.printf("%dpix x %dpix\n", SAMPLE_WIDTH, SAMPLE_HEIGHT);
dkato 0:94bcab936677 101
dkato 0:94bcab936677 102 while (1) {
dkato 3:19e5a993ec7d 103 pc.printf("\nInput file name (.jpg or .bin)>");
dkato 0:94bcab936677 104 if (get_file_name(&file_name[FOLD_COUNT], MAX_FILE_NAME_LENGTH) == false) {
dkato 3:19e5a993ec7d 105 pc.printf("Error:Max file name length is %d\n", MAX_FILE_NAME_LENGTH);
dkato 0:94bcab936677 106 } else {
dkato 0:94bcab936677 107 size_t len = strlen(file_name);
dkato 0:94bcab936677 108 if ((len > 4) && (file_name[len - 4] == (char)'.')
dkato 0:94bcab936677 109 && ((file_name[len - 3] | 0x20u) == (char)'j')
dkato 0:94bcab936677 110 && ((file_name[len - 2] | 0x20u) == (char)'p')
dkato 0:94bcab936677 111 && ((file_name[len - 1] | 0x20u) == (char)'g')) {
dkato 0:94bcab936677 112 // input ".jpg"
dkato 0:94bcab936677 113 // decode JPG file to bitmap file
dkato 0:94bcab936677 114 rd_fp = fopen(file_name, "r");
dkato 0:94bcab936677 115 if (rd_fp == NULL) {
dkato 3:19e5a993ec7d 116 pc.printf("Error:File is not exist \n");
dkato 0:94bcab936677 117 } else {
dkato 0:94bcab936677 118 fseek(rd_fp, 0, SEEK_END);
dkato 0:94bcab936677 119 filesize = ftell(rd_fp);
dkato 0:94bcab936677 120 if (filesize > SAMPLE_BUFF_SIZE) {
dkato 3:19e5a993ec7d 121 pc.printf("Error:File size over \n");
dkato 0:94bcab936677 122 } else {
dkato 0:94bcab936677 123 led1 = 1;
dkato 0:94bcab936677 124 fseek(rd_fp, 0, SEEK_SET);
dkato 0:94bcab936677 125 fread(&JCUBuffer_INPUT[0], sizeof(char), filesize, rd_fp);
dkato 3:19e5a993ec7d 126 pc.printf("[Decode Mode]\n");
dkato 3:19e5a993ec7d 127 pc.printf("\nOutput file name (.bin)>");
dkato 0:94bcab936677 128 if (get_file_name(&file_name[FOLD_COUNT], MAX_FILE_NAME_LENGTH) == false) {
dkato 3:19e5a993ec7d 129 pc.printf("Error:Max file name length is %d\n", MAX_FILE_NAME_LENGTH);
dkato 0:94bcab936677 130 } else {
dkato 0:94bcab936677 131 //YCbCr setting
dkato 0:94bcab936677 132 aBitmapData.width = SAMPLE_WIDTH;
dkato 0:94bcab936677 133 aBitmapData.height = SAMPLE_HEIGHT;
dkato 0:94bcab936677 134 aBitmapData.format = JPEG_Converter::WR_RD_YCbCr422; //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
dkato 0:94bcab936677 135 aBitmapData.buffer_address = (void *)JCUBuffer_OUTPUT;
dkato 3:19e5a993ec7d 136 pc.printf("File decode start\n");
dkato 0:94bcab936677 137 // JPEG_Converter
dkato 0:94bcab936677 138 if (decoder.decode((void *)JCUBuffer_INPUT, &aBitmapData) == JPEG_Converter::JPEG_CONV_OK) {
dkato 3:19e5a993ec7d 139 pc.printf("File decode done %dbyte\n", (SAMPLE_WIDTH * SAMPLE_HEIGHT * 4));
dkato 3:19e5a993ec7d 140 pc.printf("File write start\n");
dkato 0:94bcab936677 141 wr_fp = fopen(file_name, "w");
dkato 0:94bcab936677 142 fwrite(JCUBuffer_OUTPUT, sizeof(char), (SAMPLE_WIDTH * SAMPLE_HEIGHT * 4), wr_fp);
dkato 0:94bcab936677 143
dkato 0:94bcab936677 144 fclose(wr_fp);
dkato 3:19e5a993ec7d 145 pc.printf("File write done\n");
dkato 0:94bcab936677 146 led1 = 0;
dkato 0:94bcab936677 147 } else {
dkato 3:19e5a993ec7d 148 pc.printf("Error:JCU decode error\n");
dkato 0:94bcab936677 149 led1 = 0;
dkato 0:94bcab936677 150 }
dkato 0:94bcab936677 151 }
dkato 0:94bcab936677 152 }
dkato 0:94bcab936677 153 fclose(rd_fp);
dkato 0:94bcab936677 154 }
dkato 0:94bcab936677 155 } else if ((file_name[len - 4] == (char)'.')
dkato 0:94bcab936677 156 && ((file_name[len - 3] | 0x20u) == (char)'b')
dkato 0:94bcab936677 157 && ((file_name[len - 2] | 0x20u) == (char)'i')
dkato 0:94bcab936677 158 && ((file_name[len - 1] | 0x20u) == (char)'n')) {
dkato 0:94bcab936677 159 // input ".bin"
dkato 0:94bcab936677 160 // encode bitmap file to JPEG file
dkato 0:94bcab936677 161 rd_fp = fopen(file_name, "r");
dkato 0:94bcab936677 162 if (rd_fp == NULL) {
dkato 3:19e5a993ec7d 163 pc.printf("Error:File is not exist\n");
dkato 0:94bcab936677 164 } else {
dkato 0:94bcab936677 165 fseek(rd_fp, 0, SEEK_END);
dkato 0:94bcab936677 166 filesize = ftell(rd_fp);
dkato 0:94bcab936677 167 if (filesize > SAMPLE_BUFF_SIZE) {
dkato 0:94bcab936677 168 fclose(wr_fp);
dkato 3:19e5a993ec7d 169 pc.printf("Error:File size over\n");
dkato 0:94bcab936677 170 } else {
dkato 0:94bcab936677 171 led1 = 1;
dkato 0:94bcab936677 172 fseek(rd_fp, 0, SEEK_SET);
dkato 0:94bcab936677 173 fread(&JCUBuffer_INPUT[0], sizeof(char), filesize, rd_fp);
dkato 3:19e5a993ec7d 174 pc.printf("[Encode Mode]\n");
dkato 3:19e5a993ec7d 175 pc.printf("\nOutput file name (.jpg)>");
dkato 0:94bcab936677 176 if (get_file_name(&file_name[FOLD_COUNT], MAX_FILE_NAME_LENGTH) == false) {
dkato 3:19e5a993ec7d 177 pc.printf("Error:Max file name length is %d\n", MAX_FILE_NAME_LENGTH);
dkato 0:94bcab936677 178 fclose(rd_fp);
dkato 0:94bcab936677 179 } else {
dkato 0:94bcab936677 180 //YCbCr setting
dkato 0:94bcab936677 181 aBitmapData.width = SAMPLE_WIDTH;
dkato 0:94bcab936677 182 aBitmapData.height = SAMPLE_HEIGHT;
dkato 0:94bcab936677 183 aBitmapData.format = JPEG_Converter::WR_RD_YCbCr422; //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
dkato 0:94bcab936677 184 aBitmapData.buffer_address = (void *)JCUBuffer_INPUT;
dkato 3:19e5a993ec7d 185 pc.printf("File encode start\n");
dkato 0:94bcab936677 186 // JPEG_Converter
dkato 0:94bcab936677 187 if (decoder.encode(&aBitmapData, JCUBuffer_OUTPUT, &EncodeSize) == JPEG_Converter::JPEG_CONV_OK) {
dkato 3:19e5a993ec7d 188 pc.printf("File encode done %dbyte\n", EncodeSize);
dkato 3:19e5a993ec7d 189 pc.printf("File write start\n");
dkato 0:94bcab936677 190 wr_fp = fopen(file_name, "w");
dkato 0:94bcab936677 191 fwrite(JCUBuffer_OUTPUT, sizeof(char), EncodeSize, wr_fp);
dkato 0:94bcab936677 192
dkato 0:94bcab936677 193 fclose(wr_fp);
dkato 3:19e5a993ec7d 194 pc.printf("File write done\n");
dkato 0:94bcab936677 195 led1 = 0;
dkato 0:94bcab936677 196 } else {
dkato 3:19e5a993ec7d 197 pc.printf("Error:JCU encode error\n");
dkato 0:94bcab936677 198 led1 = 0;
dkato 0:94bcab936677 199 }
dkato 0:94bcab936677 200 }
dkato 0:94bcab936677 201 }
dkato 0:94bcab936677 202 fclose(rd_fp);
dkato 0:94bcab936677 203 }
dkato 0:94bcab936677 204 } else {
dkato 3:19e5a993ec7d 205 pc.printf("Error:Not supported extension (.jpg or .bin)\n");
dkato 0:94bcab936677 206 }
dkato 0:94bcab936677 207 }
dkato 0:94bcab936677 208 }
dkato 0:94bcab936677 209 }