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:
Sun Mar 12 02:01:46 2017 +0000
Revision:
1:3e638b9e91cd
Parent:
0:d0f130e27d32
fixed lcd contrast pin

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mtkrtk 0:d0f130e27d32 1 #include "MovFile.hpp"
mtkrtk 0:d0f130e27d32 2 #ifdef __MBED__
mtkrtk 0:d0f130e27d32 3 #include <cmsis.h>
mtkrtk 0:d0f130e27d32 4 #else
mtkrtk 0:d0f130e27d32 5 #include <arpa/inet.h>
mtkrtk 0:d0f130e27d32 6 #endif
mtkrtk 0:d0f130e27d32 7
mtkrtk 0:d0f130e27d32 8 uint32_t MovFile::frameSizes[];
mtkrtk 0:d0f130e27d32 9 uint32_t MovFile::audioSizes[];
mtkrtk 0:d0f130e27d32 10 MovFile MovFile::singleton;
mtkrtk 0:d0f130e27d32 11
mtkrtk 0:d0f130e27d32 12 #define FourConstant(a, b, c, d) ((a) << 24 | (b) << 16 | (c) << 8 | (d))
mtkrtk 0:d0f130e27d32 13
mtkrtk 0:d0f130e27d32 14 #ifndef htonl
mtkrtk 0:d0f130e27d32 15 # define htonl(x) __REV(x)
mtkrtk 0:d0f130e27d32 16 #endif
mtkrtk 0:d0f130e27d32 17 #ifndef ntohl
mtkrtk 0:d0f130e27d32 18 # define ntohl(x) __REV(x)
mtkrtk 0:d0f130e27d32 19 #endif
mtkrtk 0:d0f130e27d32 20
mtkrtk 0:d0f130e27d32 21 MovFile::MovFile() : frameSizesP(frameSizes), audioSizesP(audioSizes), stszAddress(0), stcoAddress(0), lastFrameAddress(0), availableCount(bufSize)
mtkrtk 0:d0f130e27d32 22 {
mtkrtk 0:d0f130e27d32 23 }
mtkrtk 0:d0f130e27d32 24
mtkrtk 0:d0f130e27d32 25 void MovFile::search(uint32_t pattern)
mtkrtk 0:d0f130e27d32 26 {
mtkrtk 0:d0f130e27d32 27 Buffer buf;
mtkrtk 0:d0f130e27d32 28 uint8_t first = pattern & 0xFF;
mtkrtk 0:d0f130e27d32 29 buf.value = 0;
mtkrtk 0:d0f130e27d32 30 while (1) {
mtkrtk 0:d0f130e27d32 31 size_t size = fread(buf.array, sizeof(int8_t), 1, file);
mtkrtk 0:d0f130e27d32 32 if (size == 0) {
mtkrtk 0:d0f130e27d32 33 return;
mtkrtk 0:d0f130e27d32 34 }
mtkrtk 0:d0f130e27d32 35 if (buf.array[0] == first) {
mtkrtk 0:d0f130e27d32 36 fread(&buf.array[1], sizeof(int8_t), 3, file);
mtkrtk 0:d0f130e27d32 37 if (buf.value == pattern) {
mtkrtk 0:d0f130e27d32 38 break;
mtkrtk 0:d0f130e27d32 39 }
mtkrtk 0:d0f130e27d32 40 }
mtkrtk 0:d0f130e27d32 41 }
mtkrtk 0:d0f130e27d32 42 }
mtkrtk 0:d0f130e27d32 43
mtkrtk 0:d0f130e27d32 44 void MovFile::fillCaches()
mtkrtk 0:d0f130e27d32 45 {
mtkrtk 0:d0f130e27d32 46 Buffer buf[bufSize];
mtkrtk 0:d0f130e27d32 47 Buffer *bufP = buf;
mtkrtk 0:d0f130e27d32 48 uint32_t lastFrame = lastFrameAddress;
mtkrtk 0:d0f130e27d32 49
mtkrtk 0:d0f130e27d32 50 fseek(file, stszAddress, SEEK_SET);
mtkrtk 0:d0f130e27d32 51 fread(frameSizes, sizeof(uint32_t), bufSize, file);
mtkrtk 0:d0f130e27d32 52 stszAddress += sizeof(uint32_t) * bufSize;
mtkrtk 0:d0f130e27d32 53
mtkrtk 0:d0f130e27d32 54 fseek(file, stcoAddress, SEEK_SET);
mtkrtk 0:d0f130e27d32 55 stcoAddress += sizeof(uint32_t) * bufSize;
mtkrtk 0:d0f130e27d32 56 fread(buf, sizeof(Buffer), bufSize, file);
mtkrtk 0:d0f130e27d32 57 availableCount = bufSize;
mtkrtk 0:d0f130e27d32 58 frameSizesP = frameSizes;
mtkrtk 0:d0f130e27d32 59 audioSizesP = audioSizes;
mtkrtk 0:d0f130e27d32 60 do {
mtkrtk 0:d0f130e27d32 61 uint32_t frameAddress = htonl(bufP->value);
mtkrtk 0:d0f130e27d32 62 *frameSizesP = htonl(*frameSizesP);
mtkrtk 0:d0f130e27d32 63 *audioSizesP++ = frameAddress - lastFrameAddress - *frameSizesP;
mtkrtk 0:d0f130e27d32 64 lastFrameAddress = frameAddress;
mtkrtk 0:d0f130e27d32 65 ++frameSizesP;
mtkrtk 0:d0f130e27d32 66 ++bufP;
mtkrtk 0:d0f130e27d32 67 } while (--availableCount);
mtkrtk 0:d0f130e27d32 68
mtkrtk 0:d0f130e27d32 69 fseek(file, lastFrame, SEEK_SET);
mtkrtk 0:d0f130e27d32 70 availableCount = bufSize;
mtkrtk 0:d0f130e27d32 71 frameSizesP = frameSizes;
mtkrtk 0:d0f130e27d32 72 audioSizesP = audioSizes;
mtkrtk 0:d0f130e27d32 73 }
mtkrtk 0:d0f130e27d32 74
mtkrtk 0:d0f130e27d32 75 void MovFile::start(FILE *f)
mtkrtk 0:d0f130e27d32 76 {
mtkrtk 0:d0f130e27d32 77 Buffer buf;
mtkrtk 0:d0f130e27d32 78 file = f;
mtkrtk 0:d0f130e27d32 79 frameSizesP = frameSizes;
mtkrtk 0:d0f130e27d32 80 audioSizesP = audioSizes;
mtkrtk 0:d0f130e27d32 81
mtkrtk 0:d0f130e27d32 82 search(htonl(FourConstant('s', 't', 's', 'z')));
mtkrtk 0:d0f130e27d32 83 printf("stsz is at 0x%lX\n", ftell(file) - 4);
mtkrtk 0:d0f130e27d32 84 fseek(file, 8, SEEK_CUR);
mtkrtk 0:d0f130e27d32 85 fread(&buf, sizeof(Buffer), 1, file);
mtkrtk 0:d0f130e27d32 86 numOfFrames = htonl(buf.value);
mtkrtk 0:d0f130e27d32 87 printf("Number of frames: %lu\n", numOfFrames);
mtkrtk 0:d0f130e27d32 88 stszAddress = ftell(file);
mtkrtk 0:d0f130e27d32 89 fread(&buf, sizeof(Buffer), 1, file);
mtkrtk 0:d0f130e27d32 90
mtkrtk 0:d0f130e27d32 91 search(htonl(FourConstant('s', 't', 'c', 'o')));
mtkrtk 0:d0f130e27d32 92 printf("stco is at 0x%lX\n", ftell(file) - 4);
mtkrtk 0:d0f130e27d32 93 fseek(file, 4, SEEK_CUR);
mtkrtk 0:d0f130e27d32 94 fread(&buf, sizeof(Buffer), 1, file);
mtkrtk 0:d0f130e27d32 95 if (numOfFrames != htonl(buf.value)) {
mtkrtk 0:d0f130e27d32 96 printf("Different number of frames\n");
mtkrtk 0:d0f130e27d32 97 return;
mtkrtk 0:d0f130e27d32 98 }
mtkrtk 0:d0f130e27d32 99 fread(&buf, sizeof(Buffer), 1, file);
mtkrtk 0:d0f130e27d32 100 stcoAddress = ftell(file);
mtkrtk 0:d0f130e27d32 101 lastFrameAddress = htonl(buf.value);
mtkrtk 0:d0f130e27d32 102 printf("First frame is at 0x%lX\n", lastFrameAddress);
mtkrtk 0:d0f130e27d32 103
mtkrtk 0:d0f130e27d32 104 fillCaches();
mtkrtk 0:d0f130e27d32 105 }
mtkrtk 0:d0f130e27d32 106
mtkrtk 0:d0f130e27d32 107 bool MovFile::read(char *videoBuf, char *audioBuf, uint32_t *audioSize)
mtkrtk 0:d0f130e27d32 108 {
mtkrtk 0:d0f130e27d32 109 if (numOfFrames) {
mtkrtk 0:d0f130e27d32 110 uint32_t aSize = *audioSizesP++;
mtkrtk 0:d0f130e27d32 111 fread(videoBuf, *frameSizesP++, 1, file);
mtkrtk 0:d0f130e27d32 112 *audioSize = (uint32_t)fread(audioBuf, 1, aSize, file);
mtkrtk 0:d0f130e27d32 113 if (--availableCount == 0) {
mtkrtk 0:d0f130e27d32 114 fillCaches();
mtkrtk 0:d0f130e27d32 115 }
mtkrtk 0:d0f130e27d32 116 return numOfFrames--;
mtkrtk 0:d0f130e27d32 117 }
mtkrtk 0:d0f130e27d32 118 return false;
mtkrtk 0:d0f130e27d32 119 }
mtkrtk 0:d0f130e27d32 120