Plays MJPEG Video using the RGA. THe RGA allows resize of the JPEG file.

Dependencies:   GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP SDBlockDevice_GR_PEACH TLV320_RBSP USBHost_custom

Fork of RGA_HelloWorld by Renesas

Overview

This demo shows how play a MJPEG and WAV file video using the RZA1 hardware RGA, JCU and SSIF. The JCU decodes each MJPEG frame. The SSIF plays the raw WAV file, and the RGA supplies the GUI and resize of the JPEG image.

MJPEG Creation

Requirements

Python Script

SD Card

  • Rename the jpg file to Renesas.jpg and audio file Renesas.wav
  • Download this image file and rename is Background.jpg /media/uploads/zkimike/background.jpg
Committer:
zkimike
Date:
Wed Jan 17 19:02:00 2018 +0000
Revision:
13:0a5bd13f6e7f
Parent:
12:9a413bec6673
Plays MJPEG Video on GR-PEACH

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zkimike 12:9a413bec6673 1 /**************************************************************************//**
zkimike 12:9a413bec6673 2 * @file dec_wav.h
zkimike 12:9a413bec6673 3 * @brief wav
zkimike 12:9a413bec6673 4 ******************************************************************************/
zkimike 12:9a413bec6673 5 #include "mbed.h"
zkimike 12:9a413bec6673 6
zkimike 12:9a413bec6673 7 /** A class to communicate a dec_wav
zkimike 12:9a413bec6673 8 *
zkimike 12:9a413bec6673 9 */
zkimike 12:9a413bec6673 10 class dec_wav {
zkimike 12:9a413bec6673 11 public:
zkimike 12:9a413bec6673 12
zkimike 12:9a413bec6673 13 /** analyze header
zkimike 12:9a413bec6673 14 *
zkimike 12:9a413bec6673 15 * @param p_title title tag buffer
zkimike 12:9a413bec6673 16 * @param p_artist artist tag buffer
zkimike 12:9a413bec6673 17 * @param p_album album tag buffer
zkimike 12:9a413bec6673 18 * @param tag_size tag buffer size
zkimike 12:9a413bec6673 19 * @param fp file pointer
zkimike 12:9a413bec6673 20 * @return true = success, false = failure
zkimike 12:9a413bec6673 21 */
zkimike 12:9a413bec6673 22 bool AnalyzeHeder(uint8_t * p_title, uint8_t * p_artist, uint8_t * p_album, uint16_t tag_size, FILE * fp) {
zkimike 12:9a413bec6673 23 bool result = false;
zkimike 12:9a413bec6673 24 size_t read_size;
zkimike 12:9a413bec6673 25 uint8_t wk_read_buff[36];
zkimike 12:9a413bec6673 26 uint8_t *data;
zkimike 12:9a413bec6673 27 uint32_t chunk_size;
zkimike 12:9a413bec6673 28 uint32_t sub_chunk_size;
zkimike 12:9a413bec6673 29 uint32_t list_index_max;
zkimike 12:9a413bec6673 30 bool list_ok = false;
zkimike 12:9a413bec6673 31 uint32_t read_index = 0;
zkimike 12:9a413bec6673 32 uint32_t data_index = 0;
zkimike 12:9a413bec6673 33 uint16_t wk_len;
zkimike 12:9a413bec6673 34
zkimike 12:9a413bec6673 35 if (fp == NULL) {
zkimike 12:9a413bec6673 36 return false;
zkimike 12:9a413bec6673 37 }
zkimike 12:9a413bec6673 38 music_data_size = 0;
zkimike 12:9a413bec6673 39 music_data_index = 0;
zkimike 12:9a413bec6673 40 wav_fp = fp;
zkimike 12:9a413bec6673 41 if (p_title != NULL) {
zkimike 12:9a413bec6673 42 p_title[0] = '\0';
zkimike 12:9a413bec6673 43 }
zkimike 12:9a413bec6673 44 if (p_artist != NULL) {
zkimike 12:9a413bec6673 45 p_artist[0] = '\0';
zkimike 12:9a413bec6673 46 }
zkimike 12:9a413bec6673 47 if (p_album != NULL) {
zkimike 12:9a413bec6673 48 p_album[0] = '\0';
zkimike 12:9a413bec6673 49 }
zkimike 12:9a413bec6673 50
zkimike 12:9a413bec6673 51 read_size = fread(&wk_read_buff[0], sizeof(char), 36, wav_fp);
zkimike 12:9a413bec6673 52 if (read_size < 36) {
zkimike 12:9a413bec6673 53 // do nothing
zkimike 12:9a413bec6673 54 } else if (memcmp(&wk_read_buff[0], "RIFF", 4) != 0) {
zkimike 12:9a413bec6673 55 // do nothing
zkimike 12:9a413bec6673 56 } else if (memcmp(&wk_read_buff[8], "WAVE", 4) != 0) {
zkimike 12:9a413bec6673 57 // do nothing
zkimike 12:9a413bec6673 58 } else if (memcmp(&wk_read_buff[12], "fmt ", 4) != 0) {
zkimike 12:9a413bec6673 59 // do nothing
zkimike 12:9a413bec6673 60 } else {
zkimike 12:9a413bec6673 61 read_index += 36;
zkimike 12:9a413bec6673 62 channel = ((uint32_t)wk_read_buff[22] << 0) + ((uint32_t)wk_read_buff[23] << 8);
zkimike 12:9a413bec6673 63 sampling_rate = ((uint32_t)wk_read_buff[24] << 0)
zkimike 12:9a413bec6673 64 + ((uint32_t)wk_read_buff[25] << 8)
zkimike 12:9a413bec6673 65 + ((uint32_t)wk_read_buff[26] << 16)
zkimike 12:9a413bec6673 66 + ((uint32_t)wk_read_buff[27] << 24);
zkimike 12:9a413bec6673 67 block_size = ((uint32_t)wk_read_buff[34] << 0) + ((uint32_t)wk_read_buff[35] << 8);
zkimike 12:9a413bec6673 68 while (1) {
zkimike 12:9a413bec6673 69 read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
zkimike 12:9a413bec6673 70 read_index += 8;
zkimike 12:9a413bec6673 71 if (read_size < 8) {
zkimike 12:9a413bec6673 72 break;
zkimike 12:9a413bec6673 73 } else {
zkimike 12:9a413bec6673 74 chunk_size = ((uint32_t)wk_read_buff[4] << 0)
zkimike 12:9a413bec6673 75 + ((uint32_t)wk_read_buff[5] << 8)
zkimike 12:9a413bec6673 76 + ((uint32_t)wk_read_buff[6] << 16)
zkimike 12:9a413bec6673 77 + ((uint32_t)wk_read_buff[7] << 24);
zkimike 12:9a413bec6673 78 if (memcmp(&wk_read_buff[0], "data", 4) == 0) {
zkimike 12:9a413bec6673 79 result = true;
zkimike 12:9a413bec6673 80 music_data_size = chunk_size;
zkimike 12:9a413bec6673 81 if (list_ok == true) {
zkimike 12:9a413bec6673 82 break;
zkimike 12:9a413bec6673 83 } else {
zkimike 12:9a413bec6673 84 data_index = read_index;
zkimike 12:9a413bec6673 85 fseek(wav_fp, chunk_size, SEEK_CUR);
zkimike 12:9a413bec6673 86 read_index += chunk_size;
zkimike 12:9a413bec6673 87 }
zkimike 12:9a413bec6673 88 } else if (memcmp(&wk_read_buff[0], "LIST", 4) == 0) {
zkimike 12:9a413bec6673 89 list_ok = true;
zkimike 12:9a413bec6673 90 list_index_max = read_index + chunk_size;
zkimike 12:9a413bec6673 91 read_size = fread(&wk_read_buff[0], sizeof(char), 4, wav_fp);
zkimike 12:9a413bec6673 92 read_index += 4;
zkimike 12:9a413bec6673 93 while (read_index < list_index_max) {
zkimike 12:9a413bec6673 94 read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
zkimike 12:9a413bec6673 95 read_index += 8;
zkimike 12:9a413bec6673 96 if (read_size < 8) {
zkimike 12:9a413bec6673 97 break;
zkimike 12:9a413bec6673 98 } else if (memcmp(&wk_read_buff[0], "INAM", 4) == 0) {
zkimike 12:9a413bec6673 99 data = p_title;
zkimike 12:9a413bec6673 100 } else if (memcmp(&wk_read_buff[0], "IART", 4) == 0) {
zkimike 12:9a413bec6673 101 data = p_artist;
zkimike 12:9a413bec6673 102 } else if (memcmp(&wk_read_buff[0], "IPRD", 4) == 0) {
zkimike 12:9a413bec6673 103 data = p_album;
zkimike 12:9a413bec6673 104 } else {
zkimike 12:9a413bec6673 105 data = NULL;
zkimike 12:9a413bec6673 106 }
zkimike 12:9a413bec6673 107 if ((data != NULL) && (tag_size != 0)) {
zkimike 12:9a413bec6673 108 sub_chunk_size = ((uint32_t)wk_read_buff[4] << 0)
zkimike 12:9a413bec6673 109 + ((uint32_t)wk_read_buff[5] << 8)
zkimike 12:9a413bec6673 110 + ((uint32_t)wk_read_buff[6] << 16)
zkimike 12:9a413bec6673 111 + ((uint32_t)wk_read_buff[7] << 24);
zkimike 12:9a413bec6673 112 if (sub_chunk_size > (tag_size - 1)) {
zkimike 12:9a413bec6673 113 wk_len = (tag_size - 1);
zkimike 12:9a413bec6673 114 } else {
zkimike 12:9a413bec6673 115 wk_len = sub_chunk_size;
zkimike 12:9a413bec6673 116 }
zkimike 12:9a413bec6673 117 read_size = fread(data, sizeof(char), wk_len, wav_fp);
zkimike 12:9a413bec6673 118 read_index += sub_chunk_size;
zkimike 12:9a413bec6673 119 fseek(wav_fp, read_index, SEEK_SET);
zkimike 12:9a413bec6673 120 data[wk_len] = '\0';
zkimike 12:9a413bec6673 121 }
zkimike 12:9a413bec6673 122 }
zkimike 12:9a413bec6673 123 if (data_index != 0) {
zkimike 12:9a413bec6673 124 break;
zkimike 12:9a413bec6673 125 } else {
zkimike 12:9a413bec6673 126 fseek(wav_fp, list_index_max, SEEK_SET);
zkimike 12:9a413bec6673 127 }
zkimike 12:9a413bec6673 128 } else {
zkimike 12:9a413bec6673 129 fseek(wav_fp, chunk_size, SEEK_CUR);
zkimike 12:9a413bec6673 130 read_index += chunk_size;
zkimike 12:9a413bec6673 131 }
zkimike 12:9a413bec6673 132 }
zkimike 12:9a413bec6673 133 }
zkimike 12:9a413bec6673 134
zkimike 12:9a413bec6673 135 if (data_index != 0) {
zkimike 12:9a413bec6673 136 fseek(wav_fp, data_index, SEEK_SET);
zkimike 12:9a413bec6673 137 }
zkimike 12:9a413bec6673 138 }
zkimike 12:9a413bec6673 139
zkimike 12:9a413bec6673 140 return result;
zkimike 12:9a413bec6673 141 };
zkimike 12:9a413bec6673 142
zkimike 12:9a413bec6673 143 /** get next data
zkimike 12:9a413bec6673 144 *
zkimike 12:9a413bec6673 145 * @param buf data buffer address
zkimike 12:9a413bec6673 146 * @param len data buffer length
zkimike 12:9a413bec6673 147 * @return get data size
zkimike 12:9a413bec6673 148 */
zkimike 12:9a413bec6673 149 size_t GetNextData(void *buf, size_t len) {
zkimike 12:9a413bec6673 150 if (block_size == 24) {
zkimike 12:9a413bec6673 151 // Add padding
zkimike 12:9a413bec6673 152 int write_index = 0;
zkimike 12:9a413bec6673 153 int wavfile_index;
zkimike 12:9a413bec6673 154 int read_len;
zkimike 12:9a413bec6673 155 int pading_index = 0;
zkimike 12:9a413bec6673 156 uint8_t * p_buf = (uint8_t *)buf;
zkimike 12:9a413bec6673 157 size_t ret;
zkimike 12:9a413bec6673 158
zkimike 12:9a413bec6673 159 if ((music_data_index + len) > music_data_size) {
zkimike 12:9a413bec6673 160 len = music_data_size - music_data_index;
zkimike 12:9a413bec6673 161 }
zkimike 12:9a413bec6673 162 while (write_index < len) {
zkimike 12:9a413bec6673 163 read_len = (len - write_index) * 3 / 4;
zkimike 12:9a413bec6673 164 if (read_len > sizeof(wk_wavfile_buff)) {
zkimike 12:9a413bec6673 165 read_len = sizeof(wk_wavfile_buff);
zkimike 12:9a413bec6673 166 }
zkimike 12:9a413bec6673 167 music_data_index += read_len;
zkimike 12:9a413bec6673 168 ret = fread(wk_wavfile_buff, sizeof(char), read_len, wav_fp);
zkimike 12:9a413bec6673 169 if (ret < read_len) {
zkimike 12:9a413bec6673 170 break;
zkimike 12:9a413bec6673 171 }
zkimike 12:9a413bec6673 172 wavfile_index = 0;
zkimike 12:9a413bec6673 173 while ((write_index < len) && (wavfile_index < read_len)) {
zkimike 12:9a413bec6673 174 if (pading_index == 0) {
zkimike 12:9a413bec6673 175 p_buf[write_index] = 0;
zkimike 12:9a413bec6673 176 } else {
zkimike 12:9a413bec6673 177 p_buf[write_index] = wk_wavfile_buff[wavfile_index];
zkimike 12:9a413bec6673 178 wavfile_index++;
zkimike 12:9a413bec6673 179 }
zkimike 12:9a413bec6673 180 if (pading_index < 3) {
zkimike 12:9a413bec6673 181 pading_index++;
zkimike 12:9a413bec6673 182 } else {
zkimike 12:9a413bec6673 183 pading_index = 0;
zkimike 12:9a413bec6673 184 }
zkimike 12:9a413bec6673 185 write_index++;
zkimike 12:9a413bec6673 186 }
zkimike 12:9a413bec6673 187 }
zkimike 12:9a413bec6673 188
zkimike 12:9a413bec6673 189 return write_index;
zkimike 12:9a413bec6673 190 } else {
zkimike 12:9a413bec6673 191 if ((music_data_index + len) > music_data_size) {
zkimike 12:9a413bec6673 192 len = music_data_size - music_data_index;
zkimike 12:9a413bec6673 193 }
zkimike 12:9a413bec6673 194 music_data_index += len;
zkimike 12:9a413bec6673 195
zkimike 12:9a413bec6673 196 return fread(buf, sizeof(char), len, wav_fp);
zkimike 12:9a413bec6673 197 }
zkimike 12:9a413bec6673 198 };
zkimike 12:9a413bec6673 199
zkimike 12:9a413bec6673 200 /** get channel
zkimike 12:9a413bec6673 201 *
zkimike 12:9a413bec6673 202 * @return channel
zkimike 12:9a413bec6673 203 */
zkimike 12:9a413bec6673 204 uint16_t GetChannel() {
zkimike 12:9a413bec6673 205 return channel;
zkimike 12:9a413bec6673 206 };
zkimike 12:9a413bec6673 207
zkimike 12:9a413bec6673 208 /** get block size
zkimike 12:9a413bec6673 209 *
zkimike 12:9a413bec6673 210 * @return block size
zkimike 12:9a413bec6673 211 */
zkimike 12:9a413bec6673 212 uint16_t GetBlockSize() {
zkimike 12:9a413bec6673 213 return block_size;
zkimike 12:9a413bec6673 214 };
zkimike 12:9a413bec6673 215
zkimike 12:9a413bec6673 216 /** get sampling rate
zkimike 12:9a413bec6673 217 *
zkimike 12:9a413bec6673 218 * @return sampling rate
zkimike 12:9a413bec6673 219 */
zkimike 12:9a413bec6673 220 uint32_t GetSamplingRate() {
zkimike 12:9a413bec6673 221 return sampling_rate;
zkimike 12:9a413bec6673 222 };
zkimike 12:9a413bec6673 223
zkimike 12:9a413bec6673 224 private:
zkimike 12:9a413bec6673 225 #define FILE_READ_BUFF_SIZE (3072)
zkimike 12:9a413bec6673 226
zkimike 12:9a413bec6673 227 FILE * wav_fp;
zkimike 12:9a413bec6673 228 uint32_t music_data_size;
zkimike 12:9a413bec6673 229 uint32_t music_data_index;
zkimike 12:9a413bec6673 230 uint16_t channel;
zkimike 12:9a413bec6673 231 uint16_t block_size;
zkimike 12:9a413bec6673 232 uint32_t sampling_rate;
zkimike 12:9a413bec6673 233 uint8_t wk_wavfile_buff[FILE_READ_BUFF_SIZE];
zkimike 12:9a413bec6673 234 };