• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "FLACExtractor"
19 #include <utils/Log.h>
20 
21 #include "FLACExtractor.h"
22 // libFLAC parser
23 #include "FLAC/stream_decoder.h"
24 
25 #include <media/DataSourceBase.h>
26 #include <media/MediaTrack.h>
27 #include <media/VorbisComment.h>
28 #include <media/stagefright/foundation/ABuffer.h>
29 #include <media/stagefright/foundation/ADebug.h>
30 #include <media/stagefright/foundation/base64.h>
31 #include <media/stagefright/MediaBufferGroup.h>
32 #include <media/stagefright/MediaDefs.h>
33 #include <media/stagefright/MetaData.h>
34 #include <media/stagefright/MediaBufferBase.h>
35 
36 namespace android {
37 
38 class FLACParser;
39 
40 class FLACSource : public MediaTrack {
41 
42 public:
43     FLACSource(
44             DataSourceBase *dataSource,
45             MetaDataBase &meta);
46 
47     virtual status_t start(MetaDataBase *params);
48     virtual status_t stop();
49     virtual status_t getFormat(MetaDataBase &meta);
50 
51     virtual status_t read(
52             MediaBufferBase **buffer, const ReadOptions *options = NULL);
53 
54 protected:
55     virtual ~FLACSource();
56 
57 private:
58     DataSourceBase *mDataSource;
59     MetaDataBase mTrackMetadata;
60     FLACParser *mParser;
61     bool mInitCheck;
62     bool mStarted;
63 
64     // no copy constructor or assignment
65     FLACSource(const FLACSource &);
66     FLACSource &operator=(const FLACSource &);
67 
68 };
69 
70 // FLACParser wraps a C libFLAC parser aka stream decoder
71 
72 class FLACParser {
73 
74 public:
75     enum {
76         kMaxChannels = 8,
77     };
78 
79     explicit FLACParser(
80         DataSourceBase *dataSource,
81         // If metadata pointers aren't provided, we don't fill them
82         MetaDataBase *fileMetadata = 0,
83         MetaDataBase *trackMetadata = 0);
84 
85     virtual ~FLACParser();
86 
initCheck() const87     status_t initCheck() const {
88         return mInitCheck;
89     }
90 
91     // stream properties
getMaxBlockSize() const92     unsigned getMaxBlockSize() const {
93         return mStreamInfo.max_blocksize;
94     }
getSampleRate() const95     unsigned getSampleRate() const {
96         return mStreamInfo.sample_rate;
97     }
getChannels() const98     unsigned getChannels() const {
99         return mStreamInfo.channels;
100     }
getBitsPerSample() const101     unsigned getBitsPerSample() const {
102         return mStreamInfo.bits_per_sample;
103     }
getTotalSamples() const104     FLAC__uint64 getTotalSamples() const {
105         return mStreamInfo.total_samples;
106     }
107 
108     // media buffers
109     void allocateBuffers();
110     void releaseBuffers();
readBuffer()111     MediaBufferBase *readBuffer() {
112         return readBuffer(false, 0LL);
113     }
readBuffer(FLAC__uint64 sample)114     MediaBufferBase *readBuffer(FLAC__uint64 sample) {
115         return readBuffer(true, sample);
116     }
117 
118 private:
119     DataSourceBase *mDataSource;
120     MetaDataBase *mFileMetadata;
121     MetaDataBase *mTrackMetadata;
122     bool mInitCheck;
123 
124     // media buffers
125     size_t mMaxBufferSize;
126     MediaBufferGroup *mGroup;
127     void (*mCopy)(short *dst, const int * src[kMaxChannels], unsigned nSamples, unsigned nChannels);
128 
129     // handle to underlying libFLAC parser
130     FLAC__StreamDecoder *mDecoder;
131 
132     // current position within the data source
133     off64_t mCurrentPos;
134     bool mEOF;
135 
136     // cached when the STREAMINFO metadata is parsed by libFLAC
137     FLAC__StreamMetadata_StreamInfo mStreamInfo;
138     bool mStreamInfoValid;
139 
140     // cached when a decoded PCM block is "written" by libFLAC parser
141     bool mWriteRequested;
142     bool mWriteCompleted;
143     FLAC__FrameHeader mWriteHeader;
144     FLAC__int32 const * mWriteBuffer[kMaxChannels];
145 
146     // most recent error reported by libFLAC parser
147     FLAC__StreamDecoderErrorStatus mErrorStatus;
148 
149     status_t init();
150     MediaBufferBase *readBuffer(bool doSeek, FLAC__uint64 sample);
151 
152     // no copy constructor or assignment
153     FLACParser(const FLACParser &);
154     FLACParser &operator=(const FLACParser &);
155 
156     // FLAC parser callbacks as C++ instance methods
157     FLAC__StreamDecoderReadStatus readCallback(
158             FLAC__byte buffer[], size_t *bytes);
159     FLAC__StreamDecoderSeekStatus seekCallback(
160             FLAC__uint64 absolute_byte_offset);
161     FLAC__StreamDecoderTellStatus tellCallback(
162             FLAC__uint64 *absolute_byte_offset);
163     FLAC__StreamDecoderLengthStatus lengthCallback(
164             FLAC__uint64 *stream_length);
165     FLAC__bool eofCallback();
166     FLAC__StreamDecoderWriteStatus writeCallback(
167             const FLAC__Frame *frame, const FLAC__int32 * const buffer[]);
168     void metadataCallback(const FLAC__StreamMetadata *metadata);
169     void errorCallback(FLAC__StreamDecoderErrorStatus status);
170 
171     // FLAC parser callbacks as C-callable functions
172     static FLAC__StreamDecoderReadStatus read_callback(
173             const FLAC__StreamDecoder *decoder,
174             FLAC__byte buffer[], size_t *bytes,
175             void *client_data);
176     static FLAC__StreamDecoderSeekStatus seek_callback(
177             const FLAC__StreamDecoder *decoder,
178             FLAC__uint64 absolute_byte_offset,
179             void *client_data);
180     static FLAC__StreamDecoderTellStatus tell_callback(
181             const FLAC__StreamDecoder *decoder,
182             FLAC__uint64 *absolute_byte_offset,
183             void *client_data);
184     static FLAC__StreamDecoderLengthStatus length_callback(
185             const FLAC__StreamDecoder *decoder,
186             FLAC__uint64 *stream_length,
187             void *client_data);
188     static FLAC__bool eof_callback(
189             const FLAC__StreamDecoder *decoder,
190             void *client_data);
191     static FLAC__StreamDecoderWriteStatus write_callback(
192             const FLAC__StreamDecoder *decoder,
193             const FLAC__Frame *frame, const FLAC__int32 * const buffer[],
194             void *client_data);
195     static void metadata_callback(
196             const FLAC__StreamDecoder *decoder,
197             const FLAC__StreamMetadata *metadata,
198             void *client_data);
199     static void error_callback(
200             const FLAC__StreamDecoder *decoder,
201             FLAC__StreamDecoderErrorStatus status,
202             void *client_data);
203 
204 };
205 
206 // The FLAC parser calls our C++ static callbacks using C calling conventions,
207 // inside FLAC__stream_decoder_process_until_end_of_metadata
208 // and FLAC__stream_decoder_process_single.
209 // We immediately then call our corresponding C++ instance methods
210 // with the same parameter list, but discard redundant information.
211 
read_callback(const FLAC__StreamDecoder *,FLAC__byte buffer[],size_t * bytes,void * client_data)212 FLAC__StreamDecoderReadStatus FLACParser::read_callback(
213         const FLAC__StreamDecoder * /* decoder */, FLAC__byte buffer[],
214         size_t *bytes, void *client_data)
215 {
216     return ((FLACParser *) client_data)->readCallback(buffer, bytes);
217 }
218 
seek_callback(const FLAC__StreamDecoder *,FLAC__uint64 absolute_byte_offset,void * client_data)219 FLAC__StreamDecoderSeekStatus FLACParser::seek_callback(
220         const FLAC__StreamDecoder * /* decoder */,
221         FLAC__uint64 absolute_byte_offset, void *client_data)
222 {
223     return ((FLACParser *) client_data)->seekCallback(absolute_byte_offset);
224 }
225 
tell_callback(const FLAC__StreamDecoder *,FLAC__uint64 * absolute_byte_offset,void * client_data)226 FLAC__StreamDecoderTellStatus FLACParser::tell_callback(
227         const FLAC__StreamDecoder * /* decoder */,
228         FLAC__uint64 *absolute_byte_offset, void *client_data)
229 {
230     return ((FLACParser *) client_data)->tellCallback(absolute_byte_offset);
231 }
232 
length_callback(const FLAC__StreamDecoder *,FLAC__uint64 * stream_length,void * client_data)233 FLAC__StreamDecoderLengthStatus FLACParser::length_callback(
234         const FLAC__StreamDecoder * /* decoder */,
235         FLAC__uint64 *stream_length, void *client_data)
236 {
237     return ((FLACParser *) client_data)->lengthCallback(stream_length);
238 }
239 
eof_callback(const FLAC__StreamDecoder *,void * client_data)240 FLAC__bool FLACParser::eof_callback(
241         const FLAC__StreamDecoder * /* decoder */, void *client_data)
242 {
243     return ((FLACParser *) client_data)->eofCallback();
244 }
245 
write_callback(const FLAC__StreamDecoder *,const FLAC__Frame * frame,const FLAC__int32 * const buffer[],void * client_data)246 FLAC__StreamDecoderWriteStatus FLACParser::write_callback(
247         const FLAC__StreamDecoder * /* decoder */, const FLAC__Frame *frame,
248         const FLAC__int32 * const buffer[], void *client_data)
249 {
250     return ((FLACParser *) client_data)->writeCallback(frame, buffer);
251 }
252 
metadata_callback(const FLAC__StreamDecoder *,const FLAC__StreamMetadata * metadata,void * client_data)253 void FLACParser::metadata_callback(
254         const FLAC__StreamDecoder * /* decoder */,
255         const FLAC__StreamMetadata *metadata, void *client_data)
256 {
257     ((FLACParser *) client_data)->metadataCallback(metadata);
258 }
259 
error_callback(const FLAC__StreamDecoder *,FLAC__StreamDecoderErrorStatus status,void * client_data)260 void FLACParser::error_callback(
261         const FLAC__StreamDecoder * /* decoder */,
262         FLAC__StreamDecoderErrorStatus status, void *client_data)
263 {
264     ((FLACParser *) client_data)->errorCallback(status);
265 }
266 
267 // These are the corresponding callbacks with C++ calling conventions
268 
readCallback(FLAC__byte buffer[],size_t * bytes)269 FLAC__StreamDecoderReadStatus FLACParser::readCallback(
270         FLAC__byte buffer[], size_t *bytes)
271 {
272     size_t requested = *bytes;
273     ssize_t actual = mDataSource->readAt(mCurrentPos, buffer, requested);
274     if (0 > actual) {
275         *bytes = 0;
276         return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
277     } else if (0 == actual) {
278         *bytes = 0;
279         mEOF = true;
280         return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
281     } else {
282         assert(actual <= requested);
283         *bytes = actual;
284         mCurrentPos += actual;
285         return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
286     }
287 }
288 
seekCallback(FLAC__uint64 absolute_byte_offset)289 FLAC__StreamDecoderSeekStatus FLACParser::seekCallback(
290         FLAC__uint64 absolute_byte_offset)
291 {
292     mCurrentPos = absolute_byte_offset;
293     mEOF = false;
294     return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
295 }
296 
tellCallback(FLAC__uint64 * absolute_byte_offset)297 FLAC__StreamDecoderTellStatus FLACParser::tellCallback(
298         FLAC__uint64 *absolute_byte_offset)
299 {
300     *absolute_byte_offset = mCurrentPos;
301     return FLAC__STREAM_DECODER_TELL_STATUS_OK;
302 }
303 
lengthCallback(FLAC__uint64 * stream_length)304 FLAC__StreamDecoderLengthStatus FLACParser::lengthCallback(
305         FLAC__uint64 *stream_length)
306 {
307     off64_t size;
308     if (OK == mDataSource->getSize(&size)) {
309         *stream_length = size;
310         return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
311     } else {
312         return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
313     }
314 }
315 
eofCallback()316 FLAC__bool FLACParser::eofCallback()
317 {
318     return mEOF;
319 }
320 
writeCallback(const FLAC__Frame * frame,const FLAC__int32 * const buffer[])321 FLAC__StreamDecoderWriteStatus FLACParser::writeCallback(
322         const FLAC__Frame *frame, const FLAC__int32 * const buffer[])
323 {
324     if (mWriteRequested) {
325         mWriteRequested = false;
326         // FLAC parser doesn't free or realloc buffer until next frame or finish
327         mWriteHeader = frame->header;
328         memmove(mWriteBuffer, buffer, sizeof(const FLAC__int32 * const) * getChannels());
329         mWriteCompleted = true;
330         return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
331     } else {
332         ALOGE("FLACParser::writeCallback unexpected");
333         return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
334     }
335 }
336 
metadataCallback(const FLAC__StreamMetadata * metadata)337 void FLACParser::metadataCallback(const FLAC__StreamMetadata *metadata)
338 {
339     switch (metadata->type) {
340     case FLAC__METADATA_TYPE_STREAMINFO:
341         if (!mStreamInfoValid) {
342             mStreamInfo = metadata->data.stream_info;
343             mStreamInfoValid = true;
344         } else {
345             ALOGE("FLACParser::metadataCallback unexpected STREAMINFO");
346         }
347         break;
348     case FLAC__METADATA_TYPE_VORBIS_COMMENT:
349         {
350         const FLAC__StreamMetadata_VorbisComment *vc;
351         vc = &metadata->data.vorbis_comment;
352         for (FLAC__uint32 i = 0; i < vc->num_comments; ++i) {
353             FLAC__StreamMetadata_VorbisComment_Entry *vce;
354             vce = &vc->comments[i];
355             if (mFileMetadata != 0 && vce->entry != NULL) {
356                 parseVorbisComment(mFileMetadata, (const char *) vce->entry,
357                         vce->length);
358             }
359         }
360         }
361         break;
362     case FLAC__METADATA_TYPE_PICTURE:
363         if (mFileMetadata != 0) {
364             const FLAC__StreamMetadata_Picture *p = &metadata->data.picture;
365             mFileMetadata->setData(kKeyAlbumArt,
366                     MetaData::TYPE_NONE, p->data, p->data_length);
367             mFileMetadata->setCString(kKeyAlbumArtMIME, p->mime_type);
368         }
369         break;
370     default:
371         ALOGW("FLACParser::metadataCallback unexpected type %u", metadata->type);
372         break;
373     }
374 }
375 
errorCallback(FLAC__StreamDecoderErrorStatus status)376 void FLACParser::errorCallback(FLAC__StreamDecoderErrorStatus status)
377 {
378     ALOGE("FLACParser::errorCallback status=%d", status);
379     mErrorStatus = status;
380 }
381 
382 // Copy samples from FLAC native 32-bit non-interleaved to 16-bit interleaved.
383 // These are candidates for optimization if needed.
384 
copyMono8(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned)385 static void copyMono8(
386         short *dst,
387         const int * src[FLACParser::kMaxChannels],
388         unsigned nSamples,
389         unsigned /* nChannels */) {
390     for (unsigned i = 0; i < nSamples; ++i) {
391         *dst++ = src[0][i] << 8;
392     }
393 }
394 
copyStereo8(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned)395 static void copyStereo8(
396         short *dst,
397         const int * src[FLACParser::kMaxChannels],
398         unsigned nSamples,
399         unsigned /* nChannels */) {
400     for (unsigned i = 0; i < nSamples; ++i) {
401         *dst++ = src[0][i] << 8;
402         *dst++ = src[1][i] << 8;
403     }
404 }
405 
copyMultiCh8(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned nChannels)406 static void copyMultiCh8(short *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels)
407 {
408     for (unsigned i = 0; i < nSamples; ++i) {
409         for (unsigned c = 0; c < nChannels; ++c) {
410             *dst++ = src[c][i] << 8;
411         }
412     }
413 }
414 
copyMono16(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned)415 static void copyMono16(
416         short *dst,
417         const int * src[FLACParser::kMaxChannels],
418         unsigned nSamples,
419         unsigned /* nChannels */) {
420     for (unsigned i = 0; i < nSamples; ++i) {
421         *dst++ = src[0][i];
422     }
423 }
424 
copyStereo16(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned)425 static void copyStereo16(
426         short *dst,
427         const int * src[FLACParser::kMaxChannels],
428         unsigned nSamples,
429         unsigned /* nChannels */) {
430     for (unsigned i = 0; i < nSamples; ++i) {
431         *dst++ = src[0][i];
432         *dst++ = src[1][i];
433     }
434 }
435 
copyMultiCh16(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned nChannels)436 static void copyMultiCh16(short *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels)
437 {
438     for (unsigned i = 0; i < nSamples; ++i) {
439         for (unsigned c = 0; c < nChannels; ++c) {
440             *dst++ = src[c][i];
441         }
442     }
443 }
444 
445 // 24-bit versions should do dithering or noise-shaping, here or in AudioFlinger
446 
copyMono24(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned)447 static void copyMono24(
448         short *dst,
449         const int * src[FLACParser::kMaxChannels],
450         unsigned nSamples,
451         unsigned /* nChannels */) {
452     for (unsigned i = 0; i < nSamples; ++i) {
453         *dst++ = src[0][i] >> 8;
454     }
455 }
456 
copyStereo24(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned)457 static void copyStereo24(
458         short *dst,
459         const int * src[FLACParser::kMaxChannels],
460         unsigned nSamples,
461         unsigned /* nChannels */) {
462     for (unsigned i = 0; i < nSamples; ++i) {
463         *dst++ = src[0][i] >> 8;
464         *dst++ = src[1][i] >> 8;
465     }
466 }
467 
copyMultiCh24(short * dst,const int * src[FLACParser::kMaxChannels],unsigned nSamples,unsigned nChannels)468 static void copyMultiCh24(short *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels)
469 {
470     for (unsigned i = 0; i < nSamples; ++i) {
471         for (unsigned c = 0; c < nChannels; ++c) {
472             *dst++ = src[c][i] >> 8;
473         }
474     }
475 }
476 
copyTrespass(short *,const int * [FLACParser::kMaxChannels],unsigned,unsigned)477 static void copyTrespass(
478         short * /* dst */,
479         const int *[FLACParser::kMaxChannels] /* src */,
480         unsigned /* nSamples */,
481         unsigned /* nChannels */) {
482     TRESPASS();
483 }
484 
485 // FLACParser
486 
FLACParser(DataSourceBase * dataSource,MetaDataBase * fileMetadata,MetaDataBase * trackMetadata)487 FLACParser::FLACParser(
488         DataSourceBase *dataSource,
489         MetaDataBase *fileMetadata,
490         MetaDataBase *trackMetadata)
491     : mDataSource(dataSource),
492       mFileMetadata(fileMetadata),
493       mTrackMetadata(trackMetadata),
494       mInitCheck(false),
495       mMaxBufferSize(0),
496       mGroup(NULL),
497       mCopy(copyTrespass),
498       mDecoder(NULL),
499       mCurrentPos(0LL),
500       mEOF(false),
501       mStreamInfoValid(false),
502       mWriteRequested(false),
503       mWriteCompleted(false),
504       mErrorStatus((FLAC__StreamDecoderErrorStatus) -1)
505 {
506     ALOGV("FLACParser::FLACParser");
507     memset(&mStreamInfo, 0, sizeof(mStreamInfo));
508     memset(&mWriteHeader, 0, sizeof(mWriteHeader));
509     mInitCheck = init();
510 }
511 
~FLACParser()512 FLACParser::~FLACParser()
513 {
514     ALOGV("FLACParser::~FLACParser");
515     if (mDecoder != NULL) {
516         FLAC__stream_decoder_delete(mDecoder);
517         mDecoder = NULL;
518     }
519 }
520 
init()521 status_t FLACParser::init()
522 {
523     // setup libFLAC parser
524     mDecoder = FLAC__stream_decoder_new();
525     if (mDecoder == NULL) {
526         // The new should succeed, since probably all it does is a malloc
527         // that always succeeds in Android.  But to avoid dependence on the
528         // libFLAC internals, we check and log here.
529         ALOGE("new failed");
530         return NO_INIT;
531     }
532     FLAC__stream_decoder_set_md5_checking(mDecoder, false);
533     FLAC__stream_decoder_set_metadata_ignore_all(mDecoder);
534     FLAC__stream_decoder_set_metadata_respond(
535             mDecoder, FLAC__METADATA_TYPE_STREAMINFO);
536     FLAC__stream_decoder_set_metadata_respond(
537             mDecoder, FLAC__METADATA_TYPE_PICTURE);
538     FLAC__stream_decoder_set_metadata_respond(
539             mDecoder, FLAC__METADATA_TYPE_VORBIS_COMMENT);
540     FLAC__StreamDecoderInitStatus initStatus;
541     initStatus = FLAC__stream_decoder_init_stream(
542             mDecoder,
543             read_callback, seek_callback, tell_callback,
544             length_callback, eof_callback, write_callback,
545             metadata_callback, error_callback, (void *) this);
546     if (initStatus != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
547         // A failure here probably indicates a programming error and so is
548         // unlikely to happen. But we check and log here similarly to above.
549         ALOGE("init_stream failed %d", initStatus);
550         return NO_INIT;
551     }
552     // parse all metadata
553     if (!FLAC__stream_decoder_process_until_end_of_metadata(mDecoder)) {
554         ALOGE("end_of_metadata failed");
555         return NO_INIT;
556     }
557     if (mStreamInfoValid) {
558         // check channel count
559         if (getChannels() == 0 || getChannels() > kMaxChannels) {
560             ALOGE("unsupported channel count %u", getChannels());
561             return NO_INIT;
562         }
563         // check bit depth
564         switch (getBitsPerSample()) {
565         case 8:
566         case 16:
567         case 24:
568             break;
569         default:
570             ALOGE("unsupported bits per sample %u", getBitsPerSample());
571             return NO_INIT;
572         }
573         // check sample rate
574         switch (getSampleRate()) {
575         case  8000:
576         case 11025:
577         case 12000:
578         case 16000:
579         case 22050:
580         case 24000:
581         case 32000:
582         case 44100:
583         case 48000:
584         case 88200:
585         case 96000:
586             break;
587         default:
588             ALOGE("unsupported sample rate %u", getSampleRate());
589             return NO_INIT;
590         }
591         // configure the appropriate copy function, defaulting to trespass
592         static const struct {
593             unsigned mChannels;
594             unsigned mBitsPerSample;
595             void (*mCopy)(short *dst, const int * src[kMaxChannels], unsigned nSamples, unsigned nChannels);
596         } table[] = {
597             { 1,  8, copyMono8    },
598             { 2,  8, copyStereo8  },
599             { 8,  8, copyMultiCh8  },
600             { 1, 16, copyMono16   },
601             { 2, 16, copyStereo16 },
602             { 8, 16, copyMultiCh16 },
603             { 1, 24, copyMono24   },
604             { 2, 24, copyStereo24 },
605             { 8, 24, copyMultiCh24 },
606         };
607         for (unsigned i = 0; i < sizeof(table)/sizeof(table[0]); ++i) {
608             if (table[i].mChannels >= getChannels() &&
609                     table[i].mBitsPerSample == getBitsPerSample()) {
610                 mCopy = table[i].mCopy;
611                 break;
612             }
613         }
614         // populate track metadata
615         if (mTrackMetadata != 0) {
616             mTrackMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
617             mTrackMetadata->setInt32(kKeyChannelCount, getChannels());
618             mTrackMetadata->setInt32(kKeySampleRate, getSampleRate());
619             mTrackMetadata->setInt32(kKeyPcmEncoding, kAudioEncodingPcm16bit);
620             // sample rate is non-zero, so division by zero not possible
621             mTrackMetadata->setInt64(kKeyDuration,
622                     (getTotalSamples() * 1000000LL) / getSampleRate());
623         }
624     } else {
625         ALOGE("missing STREAMINFO");
626         return NO_INIT;
627     }
628     if (mFileMetadata != 0) {
629         mFileMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_FLAC);
630     }
631     return OK;
632 }
633 
allocateBuffers()634 void FLACParser::allocateBuffers()
635 {
636     CHECK(mGroup == NULL);
637     mGroup = new MediaBufferGroup;
638     mMaxBufferSize = getMaxBlockSize() * getChannels() * sizeof(short);
639     mGroup->add_buffer(MediaBufferBase::Create(mMaxBufferSize));
640 }
641 
releaseBuffers()642 void FLACParser::releaseBuffers()
643 {
644     CHECK(mGroup != NULL);
645     delete mGroup;
646     mGroup = NULL;
647 }
648 
readBuffer(bool doSeek,FLAC__uint64 sample)649 MediaBufferBase *FLACParser::readBuffer(bool doSeek, FLAC__uint64 sample)
650 {
651     mWriteRequested = true;
652     mWriteCompleted = false;
653     if (doSeek) {
654         // We implement the seek callback, so this works without explicit flush
655         if (!FLAC__stream_decoder_seek_absolute(mDecoder, sample)) {
656             ALOGE("FLACParser::readBuffer seek to sample %lld failed", (long long)sample);
657             return NULL;
658         }
659         ALOGV("FLACParser::readBuffer seek to sample %lld succeeded", (long long)sample);
660     } else {
661         if (!FLAC__stream_decoder_process_single(mDecoder)) {
662             ALOGE("FLACParser::readBuffer process_single failed");
663             return NULL;
664         }
665     }
666     if (!mWriteCompleted) {
667         ALOGV("FLACParser::readBuffer write did not complete");
668         return NULL;
669     }
670     // verify that block header keeps the promises made by STREAMINFO
671     unsigned blocksize = mWriteHeader.blocksize;
672     if (blocksize == 0 || blocksize > getMaxBlockSize()) {
673         ALOGE("FLACParser::readBuffer write invalid blocksize %u", blocksize);
674         return NULL;
675     }
676     if (mWriteHeader.sample_rate != getSampleRate() ||
677         mWriteHeader.channels != getChannels() ||
678         mWriteHeader.bits_per_sample != getBitsPerSample()) {
679         ALOGE("FLACParser::readBuffer write changed parameters mid-stream: %d/%d/%d -> %d/%d/%d",
680                 getSampleRate(), getChannels(), getBitsPerSample(),
681                 mWriteHeader.sample_rate, mWriteHeader.channels, mWriteHeader.bits_per_sample);
682         return NULL;
683     }
684     // acquire a media buffer
685     CHECK(mGroup != NULL);
686     MediaBufferBase *buffer;
687     status_t err = mGroup->acquire_buffer(&buffer);
688     if (err != OK) {
689         return NULL;
690     }
691     size_t bufferSize = blocksize * getChannels() * sizeof(short);
692     CHECK(bufferSize <= mMaxBufferSize);
693     short *data = (short *) buffer->data();
694     buffer->set_range(0, bufferSize);
695     // copy PCM from FLAC write buffer to our media buffer, with interleaving
696     (*mCopy)(data, mWriteBuffer, blocksize, getChannels());
697     // fill in buffer metadata
698     CHECK(mWriteHeader.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
699     FLAC__uint64 sampleNumber = mWriteHeader.number.sample_number;
700     int64_t timeUs = (1000000LL * sampleNumber) / getSampleRate();
701     buffer->meta_data().setInt64(kKeyTime, timeUs);
702     buffer->meta_data().setInt32(kKeyIsSyncFrame, 1);
703     return buffer;
704 }
705 
706 // FLACsource
707 
FLACSource(DataSourceBase * dataSource,MetaDataBase & trackMetadata)708 FLACSource::FLACSource(
709         DataSourceBase *dataSource,
710         MetaDataBase &trackMetadata)
711     : mDataSource(dataSource),
712       mTrackMetadata(trackMetadata),
713       mParser(0),
714       mInitCheck(false),
715       mStarted(false)
716 {
717     ALOGV("FLACSource::FLACSource");
718     // re-use the same track metadata passed into constructor from FLACExtractor
719     mParser = new FLACParser(mDataSource);
720     mInitCheck  = mParser->initCheck();
721 }
722 
~FLACSource()723 FLACSource::~FLACSource()
724 {
725     ALOGV("~FLACSource::FLACSource");
726     if (mStarted) {
727         stop();
728     }
729     delete mParser;
730 }
731 
start(MetaDataBase *)732 status_t FLACSource::start(MetaDataBase * /* params */)
733 {
734     ALOGV("FLACSource::start");
735 
736     CHECK(!mStarted);
737     mParser->allocateBuffers();
738     mStarted = true;
739 
740     return OK;
741 }
742 
stop()743 status_t FLACSource::stop()
744 {
745     ALOGV("FLACSource::stop");
746 
747     CHECK(mStarted);
748     mParser->releaseBuffers();
749     mStarted = false;
750 
751     return OK;
752 }
753 
getFormat(MetaDataBase & meta)754 status_t FLACSource::getFormat(MetaDataBase &meta)
755 {
756     meta = mTrackMetadata;
757     return OK;
758 }
759 
read(MediaBufferBase ** outBuffer,const ReadOptions * options)760 status_t FLACSource::read(
761         MediaBufferBase **outBuffer, const ReadOptions *options)
762 {
763     MediaBufferBase *buffer;
764     // process an optional seek request
765     int64_t seekTimeUs;
766     ReadOptions::SeekMode mode;
767     if ((NULL != options) && options->getSeekTo(&seekTimeUs, &mode)) {
768         FLAC__uint64 sample;
769         if (seekTimeUs <= 0LL) {
770             sample = 0LL;
771         } else {
772             // sample and total samples are both zero-based, and seek to EOF ok
773             sample = (seekTimeUs * mParser->getSampleRate()) / 1000000LL;
774             if (sample >= mParser->getTotalSamples()) {
775                 sample = mParser->getTotalSamples();
776             }
777         }
778         buffer = mParser->readBuffer(sample);
779     // otherwise read sequentially
780     } else {
781         buffer = mParser->readBuffer();
782     }
783     *outBuffer = buffer;
784     return buffer != NULL ? (status_t) OK : (status_t) ERROR_END_OF_STREAM;
785 }
786 
787 // FLACExtractor
788 
FLACExtractor(DataSourceBase * dataSource)789 FLACExtractor::FLACExtractor(
790         DataSourceBase *dataSource)
791     : mDataSource(dataSource),
792       mParser(nullptr),
793       mInitCheck(false)
794 {
795     ALOGV("FLACExtractor::FLACExtractor");
796     // FLACParser will fill in the metadata for us
797     mParser = new FLACParser(mDataSource, &mFileMetadata, &mTrackMetadata);
798     mInitCheck = mParser->initCheck();
799 }
800 
~FLACExtractor()801 FLACExtractor::~FLACExtractor()
802 {
803     ALOGV("~FLACExtractor::FLACExtractor");
804     delete mParser;
805 }
806 
countTracks()807 size_t FLACExtractor::countTracks()
808 {
809     return mInitCheck == OK ? 1 : 0;
810 }
811 
getTrack(size_t index)812 MediaTrack *FLACExtractor::getTrack(size_t index)
813 {
814     if (mInitCheck != OK || index > 0) {
815         return NULL;
816     }
817     return new FLACSource(mDataSource, mTrackMetadata);
818 }
819 
getTrackMetaData(MetaDataBase & meta,size_t index,uint32_t)820 status_t FLACExtractor::getTrackMetaData(
821         MetaDataBase &meta,
822         size_t index, uint32_t /* flags */) {
823     if (mInitCheck != OK || index > 0) {
824         return UNKNOWN_ERROR;
825     }
826     meta = mTrackMetadata;
827     return OK;
828 }
829 
getMetaData(MetaDataBase & meta)830 status_t FLACExtractor::getMetaData(MetaDataBase &meta)
831 {
832     meta = mFileMetadata;
833     return OK;
834 }
835 
836 // Sniffer
837 
SniffFLAC(DataSourceBase * source,float * confidence)838 bool SniffFLAC(DataSourceBase *source, float *confidence)
839 {
840     // first 4 is the signature word
841     // second 4 is the sizeof STREAMINFO
842     // 042 is the mandatory STREAMINFO
843     // no need to read rest of the header, as a premature EOF will be caught later
844     uint8_t header[4+4];
845     if (source->readAt(0, header, sizeof(header)) != sizeof(header)
846             || memcmp("fLaC\0\0\0\042", header, 4+4))
847     {
848         return false;
849     }
850 
851     *confidence = 0.5;
852 
853     return true;
854 }
855 
856 
857 extern "C" {
858 // This is the only symbol that needs to be exported
859 __attribute__ ((visibility ("default")))
GETEXTRACTORDEF()860 MediaExtractor::ExtractorDef GETEXTRACTORDEF() {
861     return {
862         MediaExtractor::EXTRACTORDEF_VERSION,
863             UUID("1364b048-cc45-4fda-9934-327d0ebf9829"),
864             1,
865             "FLAC Extractor",
866             [](
867                     DataSourceBase *source,
868                     float *confidence,
869                     void **,
870                     MediaExtractor::FreeMetaFunc *) -> MediaExtractor::CreatorFunc {
871                 if (SniffFLAC(source, confidence)) {
872                     return [](
873                             DataSourceBase *source,
874                             void *) -> MediaExtractor* {
875                         return new FLACExtractor(source);};
876                 }
877                 return NULL;
878             }
879      };
880 }
881 
882 } // extern "C"
883 
884 }  // namespace android
885