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