Study

Dependencies:   DisplayApp mbed-os-lychee

Committer:
yagyag
Date:
Fri Nov 16 07:48:32 2018 +0000
Revision:
2:437003074bc7
Parent:
0:78f7f7683a42
???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:78f7f7683a42 1 #include "mbed.h"
dkato 0:78f7f7683a42 2 #include "EasyAttach_CameraAndLCD.h"
dkato 0:78f7f7683a42 3 #include "JPEG_Converter.h"
dkato 0:78f7f7683a42 4 #include "dcache-control.h"
dkato 0:78f7f7683a42 5 #include "DisplayApp.h"
dkato 0:78f7f7683a42 6
dkato 0:78f7f7683a42 7 /**** User Selection *********/
dkato 0:78f7f7683a42 8 /** JPEG out setting **/
dkato 0:78f7f7683a42 9 #define JPEG_ENCODE_QUALITY (75) /* JPEG encode quality (min:1, max:75 (Considering the size of JpegBuffer, about 75 is the upper limit.)) */
dkato 0:78f7f7683a42 10 #define VFIELD_INT_SKIP_CNT (0) /* A guide for GR-LYCHEE. 0:60fps, 1:30fps, 2:20fps, 3:15fps, 4:12fps, 5:10fps */
dkato 0:78f7f7683a42 11 /*****************************/
dkato 0:78f7f7683a42 12
dkato 0:78f7f7683a42 13 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:78f7f7683a42 14 in accordance with the frame buffer burst transfer mode. */
dkato 0:78f7f7683a42 15 #define VIDEO_PIXEL_HW (640u) /* VGA */
dkato 0:78f7f7683a42 16 #define VIDEO_PIXEL_VW (480u) /* VGA */
dkato 0:78f7f7683a42 17
dkato 0:78f7f7683a42 18 #define FRAME_BUFFER_STRIDE (((VIDEO_PIXEL_HW * 2) + 31u) & ~31u)
dkato 0:78f7f7683a42 19 #define FRAME_BUFFER_HEIGHT (VIDEO_PIXEL_VW)
dkato 0:78f7f7683a42 20
dkato 0:78f7f7683a42 21 DisplayBase Display;
dkato 0:78f7f7683a42 22
dkato 0:78f7f7683a42 23 #if defined(__ICCARM__)
dkato 0:78f7f7683a42 24 #pragma data_alignment=32
dkato 0:78f7f7683a42 25 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * FRAME_BUFFER_HEIGHT]@ ".mirrorram";
dkato 0:78f7f7683a42 26 #pragma data_alignment=32
dkato 0:78f7f7683a42 27 static uint8_t JpegBuffer[2][1024 * 64];
yagyag 2:437003074bc7 28 static uint8_t JpegBuffer_Send[1024 * 64];
dkato 0:78f7f7683a42 29 #else
dkato 0:78f7f7683a42 30 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * FRAME_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(32)));
dkato 0:78f7f7683a42 31 static uint8_t JpegBuffer[2][1024 * 64]__attribute((aligned(32)));
yagyag 2:437003074bc7 32 static uint8_t JpegBuffer_Send[1024 * 64]__attribute((aligned(32)));
dkato 0:78f7f7683a42 33 #endif
dkato 0:78f7f7683a42 34 static size_t jcu_encode_size[2];
dkato 0:78f7f7683a42 35 static JPEG_Converter Jcu;
dkato 0:78f7f7683a42 36 static int jcu_buf_index_write = 0;
dkato 0:78f7f7683a42 37 static int jcu_buf_index_write_done = 0;
dkato 0:78f7f7683a42 38 static int jcu_buf_index_read = 0;
dkato 0:78f7f7683a42 39 static volatile int jcu_encoding = 0;
dkato 0:78f7f7683a42 40 static volatile int image_change = 0;
dkato 0:78f7f7683a42 41 static DisplayApp display_app;
dkato 0:78f7f7683a42 42 static int Vfield_Int_Cnt = 0;
dkato 0:78f7f7683a42 43
dkato 0:78f7f7683a42 44 static void JcuEncodeCallBackFunc(JPEG_Converter::jpeg_conv_error_t err_code) {
dkato 0:78f7f7683a42 45 if (err_code == JPEG_Converter::JPEG_CONV_OK) {
dkato 0:78f7f7683a42 46 jcu_buf_index_write_done = jcu_buf_index_write;
dkato 0:78f7f7683a42 47 image_change = 1;
dkato 0:78f7f7683a42 48 }
dkato 0:78f7f7683a42 49 jcu_encoding = 0;
dkato 0:78f7f7683a42 50 }
dkato 0:78f7f7683a42 51
dkato 0:78f7f7683a42 52 static void snapshot(void) {
yagyag 2:437003074bc7 53 //JPEGにエンコード中 or エンコード未完了
dkato 0:78f7f7683a42 54 while ((jcu_encoding == 1) || (image_change == 0)) {
dkato 0:78f7f7683a42 55 Thread::wait(1);
dkato 0:78f7f7683a42 56 }
dkato 0:78f7f7683a42 57 jcu_buf_index_read = jcu_buf_index_write_done;
yagyag 2:437003074bc7 58 //画像データをコピー(JpegBufferは他から書き換えられる可能性があるため)
yagyag 2:437003074bc7 59 memcpy(JpegBuffer_Send, JpegBuffer[jcu_buf_index_read],1024 * 64);
dkato 0:78f7f7683a42 60 image_change = 0;
yagyag 2:437003074bc7 61
yagyag 2:437003074bc7 62 //撮影した画像データ(JPEG)をPCにUSBシリアル通信で転送
yagyag 2:437003074bc7 63 display_app.SendJpeg(JpegBuffer_Send, (uint32_t)jcu_encode_size[jcu_buf_index_read]);
dkato 0:78f7f7683a42 64 }
dkato 0:78f7f7683a42 65
dkato 0:78f7f7683a42 66 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) {
dkato 0:78f7f7683a42 67 if (Vfield_Int_Cnt < VFIELD_INT_SKIP_CNT) {
dkato 0:78f7f7683a42 68 Vfield_Int_Cnt++;
dkato 0:78f7f7683a42 69 return;
dkato 0:78f7f7683a42 70 }
dkato 0:78f7f7683a42 71 Vfield_Int_Cnt = 0;
dkato 0:78f7f7683a42 72
dkato 0:78f7f7683a42 73 //Interrupt callback function
dkato 0:78f7f7683a42 74 if (jcu_encoding == 0) {
dkato 0:78f7f7683a42 75 JPEG_Converter::bitmap_buff_info_t bitmap_buff_info;
dkato 0:78f7f7683a42 76 JPEG_Converter::encode_options_t encode_options;
dkato 0:78f7f7683a42 77
dkato 0:78f7f7683a42 78 bitmap_buff_info.width = VIDEO_PIXEL_HW;
dkato 0:78f7f7683a42 79 bitmap_buff_info.height = VIDEO_PIXEL_VW;
dkato 0:78f7f7683a42 80 bitmap_buff_info.format = JPEG_Converter::WR_RD_YCbCr422;
dkato 0:78f7f7683a42 81 bitmap_buff_info.buffer_address = (void *)user_frame_buffer0;
dkato 0:78f7f7683a42 82
dkato 0:78f7f7683a42 83 encode_options.encode_buff_size = sizeof(JpegBuffer[0]);
dkato 0:78f7f7683a42 84 encode_options.p_EncodeCallBackFunc = &JcuEncodeCallBackFunc;
dkato 0:78f7f7683a42 85 encode_options.input_swapsetting = JPEG_Converter::WR_RD_WRSWA_32_16_8BIT;
dkato 0:78f7f7683a42 86
dkato 0:78f7f7683a42 87 jcu_encoding = 1;
dkato 0:78f7f7683a42 88 if (jcu_buf_index_read == jcu_buf_index_write) {
dkato 0:78f7f7683a42 89 jcu_buf_index_write ^= 1; // toggle
dkato 0:78f7f7683a42 90 }
dkato 0:78f7f7683a42 91 jcu_encode_size[jcu_buf_index_write] = 0;
dkato 0:78f7f7683a42 92 dcache_invalid(JpegBuffer[jcu_buf_index_write], sizeof(JpegBuffer[0]));
dkato 0:78f7f7683a42 93 if (Jcu.encode(&bitmap_buff_info, JpegBuffer[jcu_buf_index_write],
dkato 0:78f7f7683a42 94 &jcu_encode_size[jcu_buf_index_write], &encode_options) != JPEG_Converter::JPEG_CONV_OK) {
dkato 0:78f7f7683a42 95 jcu_encode_size[jcu_buf_index_write] = 0;
dkato 0:78f7f7683a42 96 jcu_encoding = 0;
dkato 0:78f7f7683a42 97 }
dkato 0:78f7f7683a42 98 }
dkato 0:78f7f7683a42 99 }
dkato 0:78f7f7683a42 100
dkato 0:78f7f7683a42 101 static void Start_Video_Camera(void) {
dkato 0:78f7f7683a42 102 // Initialize the background to black
dkato 0:78f7f7683a42 103 for (uint32_t i = 0; i < sizeof(user_frame_buffer0); i += 2) {
dkato 0:78f7f7683a42 104 user_frame_buffer0[i + 0] = 0x10;
dkato 0:78f7f7683a42 105 user_frame_buffer0[i + 1] = 0x80;
dkato 0:78f7f7683a42 106 }
dkato 0:78f7f7683a42 107
dkato 0:78f7f7683a42 108 // Interrupt callback function setting (Field end signal for recording function in scaler 0)
dkato 0:78f7f7683a42 109 Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VFIELD, 0, IntCallbackFunc_Vfield);
dkato 0:78f7f7683a42 110
dkato 0:78f7f7683a42 111 // Video capture setting (progressive form fixed)
dkato 0:78f7f7683a42 112 Display.Video_Write_Setting(
dkato 0:78f7f7683a42 113 DisplayBase::VIDEO_INPUT_CHANNEL_0,
dkato 0:78f7f7683a42 114 DisplayBase::COL_SYS_NTSC_358,
dkato 0:78f7f7683a42 115 (void *)user_frame_buffer0,
dkato 0:78f7f7683a42 116 FRAME_BUFFER_STRIDE,
dkato 0:78f7f7683a42 117 DisplayBase::VIDEO_FORMAT_YCBCR422,
dkato 0:78f7f7683a42 118 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:78f7f7683a42 119 VIDEO_PIXEL_VW,
dkato 0:78f7f7683a42 120 VIDEO_PIXEL_HW
dkato 0:78f7f7683a42 121 );
dkato 0:78f7f7683a42 122 EasyAttach_CameraStart(Display, DisplayBase::VIDEO_INPUT_CHANNEL_0);
dkato 0:78f7f7683a42 123 }
dkato 0:78f7f7683a42 124
dkato 0:78f7f7683a42 125 int main(void) {
dkato 0:78f7f7683a42 126 Jcu.SetQuality(JPEG_ENCODE_QUALITY);
dkato 0:78f7f7683a42 127
dkato 0:78f7f7683a42 128 EasyAttach_Init(Display);
dkato 0:78f7f7683a42 129 Start_Video_Camera();
dkato 0:78f7f7683a42 130
dkato 0:78f7f7683a42 131 while (1) {
dkato 0:78f7f7683a42 132 snapshot();
dkato 0:78f7f7683a42 133 }
dkato 0:78f7f7683a42 134 }