Easy playback library for AUDIO_GRBoard.
Dependents: GR-PEACH_Audio_WAV_PwmOut GR-Boards_Audio_WAV
decoder/EasyDec_Mov.cpp@2:6c46c61630b3, 2018-07-24 (annotated)
- Committer:
- dkato
- Date:
- Tue Jul 24 08:45:30 2018 +0000
- Revision:
- 2:6c46c61630b3
- Parent:
- 1:fdd79b99ba73
Add PwmOutSpeaker to output
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dkato | 1:fdd79b99ba73 | 1 | /* mbed EasyDec_Mov Library |
dkato | 1:fdd79b99ba73 | 2 | * Copyright (C) 2018 dkato |
dkato | 1:fdd79b99ba73 | 3 | * |
dkato | 1:fdd79b99ba73 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
dkato | 1:fdd79b99ba73 | 5 | * you may not use this file except in compliance with the License. |
dkato | 1:fdd79b99ba73 | 6 | * You may obtain a copy of the License at |
dkato | 1:fdd79b99ba73 | 7 | * |
dkato | 1:fdd79b99ba73 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
dkato | 1:fdd79b99ba73 | 9 | * |
dkato | 1:fdd79b99ba73 | 10 | * Unless required by applicable law or agreed to in writing, software |
dkato | 1:fdd79b99ba73 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
dkato | 1:fdd79b99ba73 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
dkato | 1:fdd79b99ba73 | 13 | * See the License for the specific language governing permissions and |
dkato | 1:fdd79b99ba73 | 14 | * limitations under the License. |
dkato | 1:fdd79b99ba73 | 15 | */ |
dkato | 1:fdd79b99ba73 | 16 | |
dkato | 1:fdd79b99ba73 | 17 | #include "EasyDec_Mov.h" |
dkato | 1:fdd79b99ba73 | 18 | |
dkato | 1:fdd79b99ba73 | 19 | #define FourConstant(a, b, c, d) ((a) << 24 | (b) << 16 | (c) << 8 | (d)) |
dkato | 1:fdd79b99ba73 | 20 | |
dkato | 1:fdd79b99ba73 | 21 | #ifndef htonl |
dkato | 1:fdd79b99ba73 | 22 | # define htonl(x) __REV(x) |
dkato | 1:fdd79b99ba73 | 23 | #endif |
dkato | 1:fdd79b99ba73 | 24 | #ifndef ntohl |
dkato | 1:fdd79b99ba73 | 25 | # define ntohl(x) __REV(x) |
dkato | 1:fdd79b99ba73 | 26 | #endif |
dkato | 1:fdd79b99ba73 | 27 | |
dkato | 1:fdd79b99ba73 | 28 | uint8_t * EasyDec_Mov::_videoBuf = NULL; |
dkato | 1:fdd79b99ba73 | 29 | uint32_t EasyDec_Mov::_videoBufSize = 0; |
dkato | 1:fdd79b99ba73 | 30 | Callback<void()> EasyDec_Mov::_function = NULL; |
dkato | 1:fdd79b99ba73 | 31 | |
dkato | 1:fdd79b99ba73 | 32 | void EasyDec_Mov::attach(Callback<void()> func, uint8_t * video_buf, uint32_t video_buf_size) { |
dkato | 1:fdd79b99ba73 | 33 | _function = func; |
dkato | 1:fdd79b99ba73 | 34 | _videoBuf = video_buf; |
dkato | 1:fdd79b99ba73 | 35 | _videoBufSize = video_buf_size; |
dkato | 1:fdd79b99ba73 | 36 | } |
dkato | 1:fdd79b99ba73 | 37 | |
dkato | 1:fdd79b99ba73 | 38 | bool EasyDec_Mov::AnalyzeHeder(char* p_title, char* p_artist, char* p_album, uint16_t tag_size, FILE* fp) { |
dkato | 1:fdd79b99ba73 | 39 | Buffer buf; |
dkato | 1:fdd79b99ba73 | 40 | |
dkato | 1:fdd79b99ba73 | 41 | if (fp == NULL) { |
dkato | 1:fdd79b99ba73 | 42 | return false; |
dkato | 1:fdd79b99ba73 | 43 | } |
dkato | 1:fdd79b99ba73 | 44 | if (p_title != NULL) { |
dkato | 1:fdd79b99ba73 | 45 | p_title[0] = '\0'; |
dkato | 1:fdd79b99ba73 | 46 | } |
dkato | 1:fdd79b99ba73 | 47 | if (p_artist != NULL) { |
dkato | 1:fdd79b99ba73 | 48 | p_artist[0] = '\0'; |
dkato | 1:fdd79b99ba73 | 49 | } |
dkato | 1:fdd79b99ba73 | 50 | if (p_album != NULL) { |
dkato | 1:fdd79b99ba73 | 51 | p_album[0] = '\0'; |
dkato | 1:fdd79b99ba73 | 52 | } |
dkato | 1:fdd79b99ba73 | 53 | |
dkato | 1:fdd79b99ba73 | 54 | mov_fp = fp; |
dkato | 1:fdd79b99ba73 | 55 | availableCount = bufSize; |
dkato | 1:fdd79b99ba73 | 56 | |
dkato | 1:fdd79b99ba73 | 57 | frameSizesP = frameSizes; |
dkato | 1:fdd79b99ba73 | 58 | audioSizesP = audioSizes; |
dkato | 1:fdd79b99ba73 | 59 | |
dkato | 1:fdd79b99ba73 | 60 | search(htonl(FourConstant('s', 't', 's', 'z'))); |
dkato | 1:fdd79b99ba73 | 61 | fseek(mov_fp, 8, SEEK_CUR); |
dkato | 1:fdd79b99ba73 | 62 | fread(&buf, sizeof(Buffer), 1, mov_fp); |
dkato | 1:fdd79b99ba73 | 63 | numOfFrames = htonl(buf.value); |
dkato | 1:fdd79b99ba73 | 64 | stszAddress = ftell(mov_fp); |
dkato | 1:fdd79b99ba73 | 65 | fread(&buf, sizeof(Buffer), 1, mov_fp); |
dkato | 1:fdd79b99ba73 | 66 | |
dkato | 1:fdd79b99ba73 | 67 | search(htonl(FourConstant('s', 't', 'c', 'o'))); |
dkato | 1:fdd79b99ba73 | 68 | fseek(mov_fp, 4, SEEK_CUR); |
dkato | 1:fdd79b99ba73 | 69 | fread(&buf, sizeof(Buffer), 1, mov_fp); |
dkato | 1:fdd79b99ba73 | 70 | if (numOfFrames != htonl(buf.value)) { |
dkato | 1:fdd79b99ba73 | 71 | return false; |
dkato | 1:fdd79b99ba73 | 72 | } |
dkato | 1:fdd79b99ba73 | 73 | fread(&buf, sizeof(Buffer), 1, mov_fp); |
dkato | 1:fdd79b99ba73 | 74 | stcoAddress = ftell(mov_fp); |
dkato | 1:fdd79b99ba73 | 75 | lastFrameAddress = htonl(buf.value); |
dkato | 1:fdd79b99ba73 | 76 | |
dkato | 1:fdd79b99ba73 | 77 | fillCaches(); |
dkato | 1:fdd79b99ba73 | 78 | |
dkato | 1:fdd79b99ba73 | 79 | _video_flg = true; |
dkato | 1:fdd79b99ba73 | 80 | |
dkato | 1:fdd79b99ba73 | 81 | return true; |
dkato | 1:fdd79b99ba73 | 82 | } |
dkato | 1:fdd79b99ba73 | 83 | |
dkato | 1:fdd79b99ba73 | 84 | size_t EasyDec_Mov::GetNextData(void *buf, size_t len) { |
dkato | 1:fdd79b99ba73 | 85 | size_t ret; |
dkato | 1:fdd79b99ba73 | 86 | uint32_t rest_size = 0; |
dkato | 1:fdd79b99ba73 | 87 | uint32_t aSize = *audioSizesP; |
dkato | 1:fdd79b99ba73 | 88 | |
dkato | 1:fdd79b99ba73 | 89 | if (numOfFrames <= 0) { |
dkato | 1:fdd79b99ba73 | 90 | return 0; |
dkato | 1:fdd79b99ba73 | 91 | } |
dkato | 1:fdd79b99ba73 | 92 | |
dkato | 1:fdd79b99ba73 | 93 | if (_video_flg) { |
dkato | 1:fdd79b99ba73 | 94 | _video_flg = false; |
dkato | 1:fdd79b99ba73 | 95 | if ((_videoBuf == NULL) || (*frameSizesP > _videoBufSize)) { |
dkato | 1:fdd79b99ba73 | 96 | fseek(mov_fp, *frameSizesP, SEEK_CUR); |
dkato | 1:fdd79b99ba73 | 97 | } else { |
dkato | 1:fdd79b99ba73 | 98 | fread(_videoBuf, 1, *frameSizesP, mov_fp); |
dkato | 1:fdd79b99ba73 | 99 | if (_function) { |
dkato | 1:fdd79b99ba73 | 100 | _function(); |
dkato | 1:fdd79b99ba73 | 101 | } |
dkato | 1:fdd79b99ba73 | 102 | } |
dkato | 1:fdd79b99ba73 | 103 | frameSizesP++; |
dkato | 1:fdd79b99ba73 | 104 | } |
dkato | 1:fdd79b99ba73 | 105 | |
dkato | 1:fdd79b99ba73 | 106 | if ((int)aSize < 0) { |
dkato | 1:fdd79b99ba73 | 107 | ret = 0; |
dkato | 1:fdd79b99ba73 | 108 | } else { |
dkato | 1:fdd79b99ba73 | 109 | if (aSize > len) { |
dkato | 1:fdd79b99ba73 | 110 | rest_size = aSize - len; |
dkato | 1:fdd79b99ba73 | 111 | *audioSizesP = rest_size; |
dkato | 1:fdd79b99ba73 | 112 | aSize = len; |
dkato | 1:fdd79b99ba73 | 113 | } |
dkato | 1:fdd79b99ba73 | 114 | ret = (uint32_t)fread(buf, 1, aSize, mov_fp); |
dkato | 1:fdd79b99ba73 | 115 | } |
dkato | 1:fdd79b99ba73 | 116 | if (rest_size == 0) { |
dkato | 1:fdd79b99ba73 | 117 | _video_flg = true; |
dkato | 1:fdd79b99ba73 | 118 | audioSizesP++; |
dkato | 1:fdd79b99ba73 | 119 | if (--availableCount == 0) { |
dkato | 1:fdd79b99ba73 | 120 | fillCaches(); |
dkato | 1:fdd79b99ba73 | 121 | } |
dkato | 1:fdd79b99ba73 | 122 | numOfFrames--; |
dkato | 1:fdd79b99ba73 | 123 | } |
dkato | 1:fdd79b99ba73 | 124 | |
dkato | 1:fdd79b99ba73 | 125 | return ret; |
dkato | 1:fdd79b99ba73 | 126 | } |
dkato | 1:fdd79b99ba73 | 127 | |
dkato | 1:fdd79b99ba73 | 128 | uint16_t EasyDec_Mov::GetChannel() { |
dkato | 1:fdd79b99ba73 | 129 | return 2; |
dkato | 1:fdd79b99ba73 | 130 | } |
dkato | 1:fdd79b99ba73 | 131 | |
dkato | 1:fdd79b99ba73 | 132 | uint16_t EasyDec_Mov::GetBlockSize() { |
dkato | 1:fdd79b99ba73 | 133 | return 16; |
dkato | 1:fdd79b99ba73 | 134 | } |
dkato | 1:fdd79b99ba73 | 135 | |
dkato | 1:fdd79b99ba73 | 136 | uint32_t EasyDec_Mov::GetSamplingRate() { |
dkato | 1:fdd79b99ba73 | 137 | return 44100; |
dkato | 1:fdd79b99ba73 | 138 | } |
dkato | 1:fdd79b99ba73 | 139 | |
dkato | 1:fdd79b99ba73 | 140 | void EasyDec_Mov::search(uint32_t pattern) { |
dkato | 1:fdd79b99ba73 | 141 | Buffer buf; |
dkato | 1:fdd79b99ba73 | 142 | uint8_t first = pattern & 0xFF; |
dkato | 1:fdd79b99ba73 | 143 | buf.value = 0; |
dkato | 1:fdd79b99ba73 | 144 | while (true) { |
dkato | 1:fdd79b99ba73 | 145 | size_t size = fread(buf.array, sizeof(int8_t), 1, mov_fp); |
dkato | 1:fdd79b99ba73 | 146 | if (size == 0) { |
dkato | 1:fdd79b99ba73 | 147 | return; |
dkato | 1:fdd79b99ba73 | 148 | } |
dkato | 1:fdd79b99ba73 | 149 | if (buf.array[0] == first) { |
dkato | 1:fdd79b99ba73 | 150 | fread(&buf.array[1], sizeof(int8_t), 3, mov_fp); |
dkato | 1:fdd79b99ba73 | 151 | if (buf.value == pattern) { |
dkato | 1:fdd79b99ba73 | 152 | break; |
dkato | 1:fdd79b99ba73 | 153 | } |
dkato | 1:fdd79b99ba73 | 154 | } |
dkato | 1:fdd79b99ba73 | 155 | } |
dkato | 1:fdd79b99ba73 | 156 | } |
dkato | 1:fdd79b99ba73 | 157 | |
dkato | 1:fdd79b99ba73 | 158 | void EasyDec_Mov::fillCaches() { |
dkato | 1:fdd79b99ba73 | 159 | Buffer buf[bufSize]; |
dkato | 1:fdd79b99ba73 | 160 | Buffer *bufP = buf; |
dkato | 1:fdd79b99ba73 | 161 | uint32_t lastFrame = lastFrameAddress; |
dkato | 1:fdd79b99ba73 | 162 | |
dkato | 1:fdd79b99ba73 | 163 | fseek(mov_fp, stszAddress, SEEK_SET); |
dkato | 1:fdd79b99ba73 | 164 | fread(frameSizes, sizeof(uint32_t), bufSize, mov_fp); |
dkato | 1:fdd79b99ba73 | 165 | stszAddress += sizeof(uint32_t) * bufSize; |
dkato | 1:fdd79b99ba73 | 166 | |
dkato | 1:fdd79b99ba73 | 167 | fseek(mov_fp, stcoAddress, SEEK_SET); |
dkato | 1:fdd79b99ba73 | 168 | stcoAddress += sizeof(uint32_t) * bufSize; |
dkato | 1:fdd79b99ba73 | 169 | fread(buf, sizeof(Buffer), bufSize, mov_fp); |
dkato | 1:fdd79b99ba73 | 170 | availableCount = bufSize; |
dkato | 1:fdd79b99ba73 | 171 | frameSizesP = frameSizes; |
dkato | 1:fdd79b99ba73 | 172 | audioSizesP = audioSizes; |
dkato | 1:fdd79b99ba73 | 173 | do { |
dkato | 1:fdd79b99ba73 | 174 | uint32_t frameAddress = htonl(bufP->value); |
dkato | 1:fdd79b99ba73 | 175 | *frameSizesP = htonl(*frameSizesP); |
dkato | 1:fdd79b99ba73 | 176 | *audioSizesP++ = frameAddress - lastFrameAddress - *frameSizesP; |
dkato | 1:fdd79b99ba73 | 177 | lastFrameAddress = frameAddress; |
dkato | 1:fdd79b99ba73 | 178 | ++frameSizesP; |
dkato | 1:fdd79b99ba73 | 179 | ++bufP; |
dkato | 1:fdd79b99ba73 | 180 | } while (--availableCount); |
dkato | 1:fdd79b99ba73 | 181 | |
dkato | 1:fdd79b99ba73 | 182 | fseek(mov_fp, lastFrame, SEEK_SET); |
dkato | 1:fdd79b99ba73 | 183 | availableCount = bufSize; |
dkato | 1:fdd79b99ba73 | 184 | frameSizesP = frameSizes; |
dkato | 1:fdd79b99ba73 | 185 | audioSizesP = audioSizes; |
dkato | 1:fdd79b99ba73 | 186 | } |
dkato | 1:fdd79b99ba73 | 187 | |
dkato | 1:fdd79b99ba73 | 188 |