This program plays QuickTime movies on GR-Peach

Dependencies:   AsciiFont GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP TLV320_RBSP mbed-rtos mbed

Requirements

  • GR-Peach
  • GR-Peach Audio Camera Shield or I²S compatible audio DAC
  • GR-Peach LCD Shield
  • USB memory stick

How to play movie files

  • Encode movie files

encode movies with ffmpeg

$ ffmpeg -i <input -ar 44100 -acodec pcm_s16le -s 480x270 -vcodec mjpeg -q:v 3 -movflags faststart -threads 4 -vf fps=30 <output>.mov
  • Copy movies to the root directory of USB memory
  • Build and upload this program
  • Run it
Committer:
mtkrtk
Date:
Fri Mar 10 11:30:02 2017 +0000
Revision:
0:d0f130e27d32
Child:
1:3e638b9e91cd
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mtkrtk 0:d0f130e27d32 1 #include "LCD.hpp"
mtkrtk 0:d0f130e27d32 2 #include "rtos.h"
mtkrtk 0:d0f130e27d32 3
mtkrtk 0:d0f130e27d32 4 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB565)
mtkrtk 0:d0f130e27d32 5 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32_16BIT)
mtkrtk 0:d0f130e27d32 6
mtkrtk 0:d0f130e27d32 7 volatile int32_t LCD::vsync_count = 0;
mtkrtk 0:d0f130e27d32 8 uint8_t LCD::user_frame_buffer1[];
mtkrtk 0:d0f130e27d32 9 uint8_t LCD::user_frame_buffer2[];
mtkrtk 0:d0f130e27d32 10 frame_buffer_t LCD::frame_buffer_info;
mtkrtk 0:d0f130e27d32 11 LCD LCD::instance;
mtkrtk 0:d0f130e27d32 12
mtkrtk 0:d0f130e27d32 13 void LCD::IntCallbackFunc_LoVsync(DisplayBase::int_type_t MBED_UNUSED int_type) {
mtkrtk 0:d0f130e27d32 14 /* Interrupt callback function for Vsync interruption */
mtkrtk 0:d0f130e27d32 15 if (vsync_count > 0) {
mtkrtk 0:d0f130e27d32 16 vsync_count--;
mtkrtk 0:d0f130e27d32 17 }
mtkrtk 0:d0f130e27d32 18 }
mtkrtk 0:d0f130e27d32 19
mtkrtk 0:d0f130e27d32 20 LCD::LCD() : lcd_pwon(P7_15), lcd_blon(P8_1), lcd_cntrst(P8_14), lcd_nctrst_dummy(P8_15)
mtkrtk 0:d0f130e27d32 21 {
mtkrtk 0:d0f130e27d32 22 }
mtkrtk 0:d0f130e27d32 23
mtkrtk 0:d0f130e27d32 24 void LCD::start()
mtkrtk 0:d0f130e27d32 25 {
mtkrtk 0:d0f130e27d32 26 DisplayBase::graphics_error_t error;
mtkrtk 0:d0f130e27d32 27 DisplayBase::lcd_config_t lcd_config;
mtkrtk 0:d0f130e27d32 28 PinName lvds_pin[8] = {
mtkrtk 0:d0f130e27d32 29 /* data pin */
mtkrtk 0:d0f130e27d32 30 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
mtkrtk 0:d0f130e27d32 31 };
mtkrtk 0:d0f130e27d32 32
mtkrtk 0:d0f130e27d32 33 lcd_pwon = 0;
mtkrtk 0:d0f130e27d32 34 lcd_blon = 0;
mtkrtk 0:d0f130e27d32 35 rtos::Thread::wait(100);
mtkrtk 0:d0f130e27d32 36 lcd_pwon = 1;
mtkrtk 0:d0f130e27d32 37 lcd_blon = 1;
mtkrtk 0:d0f130e27d32 38
mtkrtk 0:d0f130e27d32 39 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
mtkrtk 0:d0f130e27d32 40
mtkrtk 0:d0f130e27d32 41 /* Graphics initialization process */
mtkrtk 0:d0f130e27d32 42 lcd_config = LcdCfgTbl_LCD_shield;
mtkrtk 0:d0f130e27d32 43 error = Display.Graphics_init(&lcd_config);
mtkrtk 0:d0f130e27d32 44 if (error != DisplayBase::GRAPHICS_OK) {
mtkrtk 0:d0f130e27d32 45 printf("Line %d, error %d\n", __LINE__, error);
mtkrtk 0:d0f130e27d32 46 mbed_die();
mtkrtk 0:d0f130e27d32 47 }
mtkrtk 0:d0f130e27d32 48
mtkrtk 0:d0f130e27d32 49 /* Interrupt callback function setting (Vsync signal output from scaler 0) */
mtkrtk 0:d0f130e27d32 50 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, LCD::IntCallbackFunc_LoVsync);
mtkrtk 0:d0f130e27d32 51 if (error != DisplayBase::GRAPHICS_OK) {
mtkrtk 0:d0f130e27d32 52 printf("Line %d, error %d\n", __LINE__, error);
mtkrtk 0:d0f130e27d32 53 mbed_die();
mtkrtk 0:d0f130e27d32 54 }
mtkrtk 0:d0f130e27d32 55
mtkrtk 0:d0f130e27d32 56 memset(user_frame_buffer1, 0, sizeof(user_frame_buffer1));
mtkrtk 0:d0f130e27d32 57 memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2));
mtkrtk 0:d0f130e27d32 58 frame_buffer_info.buffer_address[0] = user_frame_buffer1;
mtkrtk 0:d0f130e27d32 59 frame_buffer_info.buffer_address[1] = user_frame_buffer2;
mtkrtk 0:d0f130e27d32 60 frame_buffer_info.buffer_count = 2;
mtkrtk 0:d0f130e27d32 61 frame_buffer_info.show_buffer_index = 0;
mtkrtk 0:d0f130e27d32 62 frame_buffer_info.draw_buffer_index = 0;
mtkrtk 0:d0f130e27d32 63 frame_buffer_info.width = LCD_PIXEL_WIDTH;
mtkrtk 0:d0f130e27d32 64 frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL;
mtkrtk 0:d0f130e27d32 65 frame_buffer_info.stride = LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL;
mtkrtk 0:d0f130e27d32 66 frame_buffer_info.height = LCD_PIXEL_HEIGHT;
mtkrtk 0:d0f130e27d32 67 frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565;
mtkrtk 0:d0f130e27d32 68
mtkrtk 0:d0f130e27d32 69 DisplayBase::rect_t rect;
mtkrtk 0:d0f130e27d32 70
mtkrtk 0:d0f130e27d32 71 rect.vs = 0;
mtkrtk 0:d0f130e27d32 72 rect.vw = LCD_PIXEL_HEIGHT;
mtkrtk 0:d0f130e27d32 73 rect.hs = 0;
mtkrtk 0:d0f130e27d32 74 rect.hw = LCD_PIXEL_WIDTH;
mtkrtk 0:d0f130e27d32 75 Display.Graphics_Read_Setting(DisplayBase::GRAPHICS_LAYER_0, (void *)frame_buffer_info.buffer_address[0],
mtkrtk 0:d0f130e27d32 76 FRAME_BUFFER_STRIDE, GRAPHICS_FORMAT, WR_RD_WRSWA, &rect);
mtkrtk 0:d0f130e27d32 77 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
mtkrtk 0:d0f130e27d32 78
mtkrtk 0:d0f130e27d32 79 rtos::Thread::wait(200);
mtkrtk 0:d0f130e27d32 80 lcd_cntrst.period_us(491);
mtkrtk 0:d0f130e27d32 81 lcd_cntrst = 0.1;
mtkrtk 0:d0f130e27d32 82
mtkrtk 0:d0f130e27d32 83 errnum_t err;
mtkrtk 0:d0f130e27d32 84 Canvas2D_ContextConfigClass config;
mtkrtk 0:d0f130e27d32 85 config.frame_buffer = &frame_buffer_info;
mtkrtk 0:d0f130e27d32 86 canvas2d = R_RGA_New_Canvas2D_ContextClass(config);
mtkrtk 0:d0f130e27d32 87 err = R_OSPL_GetErrNum();
mtkrtk 0:d0f130e27d32 88 if (err != 0) {
mtkrtk 0:d0f130e27d32 89 printf("Line %d, error %d\n", __LINE__, err);
mtkrtk 0:d0f130e27d32 90 while (1);
mtkrtk 0:d0f130e27d32 91 }
mtkrtk 0:d0f130e27d32 92
mtkrtk 0:d0f130e27d32 93 graphics = canvas2d.c_LanguageContext;
mtkrtk 0:d0f130e27d32 94 }
mtkrtk 0:d0f130e27d32 95
mtkrtk 0:d0f130e27d32 96 void LCD::stop()
mtkrtk 0:d0f130e27d32 97 {
mtkrtk 0:d0f130e27d32 98 lcd_pwon = 0;
mtkrtk 0:d0f130e27d32 99 lcd_blon = 0;
mtkrtk 0:d0f130e27d32 100 }
mtkrtk 0:d0f130e27d32 101
mtkrtk 0:d0f130e27d32 102 void LCD::Wait_Vsync(const int32_t wait_count)
mtkrtk 0:d0f130e27d32 103 {
mtkrtk 0:d0f130e27d32 104 /* Wait for the specified number of times Vsync occurs */
mtkrtk 0:d0f130e27d32 105 vsync_count = wait_count;
mtkrtk 0:d0f130e27d32 106 while (vsync_count > 0) {
mtkrtk 0:d0f130e27d32 107 /* Do nothing */
mtkrtk 0:d0f130e27d32 108 }
mtkrtk 0:d0f130e27d32 109 }
mtkrtk 0:d0f130e27d32 110
mtkrtk 0:d0f130e27d32 111 void LCD::Swap_FrameBuffer()
mtkrtk 0:d0f130e27d32 112 {
mtkrtk 0:d0f130e27d32 113 if (frame_buffer_info.draw_buffer_index == 1) {
mtkrtk 0:d0f130e27d32 114 frame_buffer_info.draw_buffer_index = 0;
mtkrtk 0:d0f130e27d32 115 } else {
mtkrtk 0:d0f130e27d32 116 frame_buffer_info.draw_buffer_index = 1;
mtkrtk 0:d0f130e27d32 117 }
mtkrtk 0:d0f130e27d32 118 }
mtkrtk 0:d0f130e27d32 119
mtkrtk 0:d0f130e27d32 120 void LCD::Update_LCD_Display()
mtkrtk 0:d0f130e27d32 121 {
mtkrtk 0:d0f130e27d32 122 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0,
mtkrtk 0:d0f130e27d32 123 (void *)frame_buffer_info.buffer_address[frame_buffer_info.draw_buffer_index]);
mtkrtk 0:d0f130e27d32 124 Wait_Vsync(1);
mtkrtk 0:d0f130e27d32 125 }
mtkrtk 0:d0f130e27d32 126