summaryrefslogtreecommitdiff
path: root/media/libstagefright/PCMExtractor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/PCMExtractor.cpp')
-rw-r--r--media/libstagefright/PCMExtractor.cpp276
1 files changed, 0 insertions, 276 deletions
diff --git a/media/libstagefright/PCMExtractor.cpp b/media/libstagefright/PCMExtractor.cpp
deleted file mode 100644
index d85af33e63f7..000000000000
--- a/media/libstagefright/PCMExtractor.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2010
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Author: Andreas Gustafsson (andreas.a.gustafsson@stericsson.com)
- * for ST-Ericsson
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "PCMExtractor"
-#include <utils/Log.h>
-
-#include "include/PCMExtractor.h"
-
-#include <media/stagefright/DataSource.h>
-#include <media/stagefright/MediaBufferGroup.h>
-#include <media/stagefright/MediaDebug.h>
-#include <media/stagefright/MediaDefs.h>
-#include <media/stagefright/MediaErrors.h>
-#include <media/stagefright/MetaData.h>
-#include <utils/String8.h>
-
-namespace android {
-
-static const uint16_t kDefaultNumChannels = 2;
-static const uint32_t kDefaultSampleRate = 48000;
-static const uint16_t kDefaultFormat = 16;
-
-struct PCMSource : public MediaSource {
- PCMSource(
- const sp<DataSource> &dataSource,
- const sp<MetaData> &meta,
- int32_t bitsPerSample,
- off_t offset, size_t size);
-
- virtual status_t start(MetaData *params = NULL);
- virtual status_t stop();
- virtual sp<MetaData> getFormat();
-
- virtual status_t read(
- MediaBuffer **buffer, const ReadOptions *options = NULL);
-
-protected:
- virtual ~PCMSource();
-
-private:
- static const size_t kMaxFrameSize;
-
- sp<DataSource> mDataSource;
- sp<MetaData> mMeta;
- int32_t mSampleRate;
- int32_t mNumChannels;
- int32_t mBitsPerSample;
- off_t mOffset;
- size_t mSize;
- bool mStarted;
- MediaBufferGroup *mGroup;
- off_t mCurrentPos;
- uint32_t mBufferSize;
-
- PCMSource(const PCMSource &);
- PCMSource &operator=(const PCMSource &);
-};
-
-PCMExtractor::PCMExtractor(const sp<DataSource> &source)
- : mDataSource(source),
- mValidFormat(false) {
- mInitCheck = init();
-}
-
-PCMExtractor::~PCMExtractor() {
-}
-
-sp<MetaData> PCMExtractor::getMetaData() {
- sp<MetaData> meta = new MetaData;
-
- if (mInitCheck != OK) {
- return meta;
- }
-
- meta->setCString(kKeyMIMEType, "audio/raw");
-
- return meta;
-}
-
-size_t PCMExtractor::countTracks() {
- return mInitCheck == OK ? 1 : 0;
-}
-
-sp<MediaSource> PCMExtractor::getTrack(size_t index) {
- if (mInitCheck != OK || index > 0) {
- return NULL;
- }
-
- return new PCMSource(
- mDataSource, mTrackMeta,
- mBitsPerSample, mDataOffset, mDataSize);
-}
-
-sp<MetaData> PCMExtractor::getTrackMetaData(
- size_t index, uint32_t flags) {
- if (mInitCheck != OK || index > 0) {
- return NULL;
- }
-
- return mTrackMeta;
-}
-
-status_t PCMExtractor::init() {
- mNumChannels = kDefaultNumChannels;
- mSampleRate = kDefaultSampleRate;
- mBitsPerSample = kDefaultFormat;
- mDataOffset = 0;
- mDataSize = 0;
- mValidFormat = true;
- mTrackMeta = new MetaData;mTrackMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
- mTrackMeta->setInt32(kKeyChannelCount, mNumChannels);
- mTrackMeta->setInt32(kKeySampleRate, mSampleRate);
- return OK;
-}
-
-const size_t PCMSource::kMaxFrameSize = 4800;
-
-PCMSource::PCMSource(
- const sp<DataSource> &dataSource,
- const sp<MetaData> &meta,
- int32_t bitsPerSample,
- off_t offset, size_t size)
- : mDataSource(dataSource),
- mMeta(meta),
- mSampleRate(0),
- mNumChannels(0),
- mBitsPerSample(bitsPerSample),
- mOffset(offset),
- mSize(size),
- mStarted(false),
- mGroup(NULL),
- mBufferSize(0) {
- CHECK(mMeta->findInt32(kKeySampleRate, &mSampleRate));
- CHECK(mMeta->findInt32(kKeyChannelCount, &mNumChannels));
-}
-
-PCMSource::~PCMSource() {
- if (mStarted) {
- stop();
- }
-}
-
-status_t PCMSource::start(MetaData *params) {
- CHECK(!mStarted);
-
- mBufferSize = kMaxFrameSize;
- mGroup = new MediaBufferGroup;
- mGroup->add_buffer(new MediaBuffer(mBufferSize));
-
- if (mBitsPerSample == 8) {
- // As a temporary buffer for 8->16 bit conversion.
- mGroup->add_buffer(new MediaBuffer(mBufferSize));
- }
-
- mCurrentPos = mOffset;
-
- mStarted = true;
- return OK;
-}
-
-status_t PCMSource::stop() {
-
- CHECK(mStarted);
- delete mGroup;
- mGroup = NULL;
-
- mStarted = false;
- return OK;
-}
-
-sp<MetaData> PCMSource::getFormat() {
- return mMeta;
-}
-
-status_t PCMSource::read(
- MediaBuffer **out, const ReadOptions *options) {
- *out = NULL;
- int64_t seekTimeUs;
- ReadOptions::SeekMode seek = ReadOptions::SEEK_CLOSEST_SYNC;
- if (options != NULL && options->getSeekTo(&seekTimeUs,&seek)) {
- int64_t pos = (seekTimeUs * mSampleRate) / 1000000 * mNumChannels * 2;
- if (pos > mSize) {
- pos = mSize;
- }
- mCurrentPos = pos + mOffset;
- }
-
- MediaBuffer *buffer;
- status_t err = mGroup->acquire_buffer(&buffer);
- if (err != OK) {
- return err;
- }
-
- ssize_t n = mDataSource->readAt(
- mCurrentPos, buffer->data(), mBufferSize);
- if (n <= 0) {
- buffer->release();
- buffer = NULL;
- return ERROR_END_OF_STREAM;
- }
-
- mCurrentPos += n;
-
- buffer->set_range(0, n);
-
- if (mBitsPerSample == 8) {
- // Convert 8-bit unsigned samples to 16-bit signed.
-
- MediaBuffer *tmp;
- CHECK_EQ(mGroup->acquire_buffer(&tmp), OK);
-
- // The new buffer holds the sample number of samples, but each
- // one is 2 bytes wide.
- tmp->set_range(0, 2 * n);
-
- int16_t *dst = (int16_t *)tmp->data();
- const uint8_t *src = (const uint8_t *)buffer->data();
- while (n-- > 0) {
- *dst++ = ((int16_t)(*src) - 128) * 256;
- ++src;
- }
-
- buffer->release();
- buffer = tmp;
- } else if (mBitsPerSample == 24) {
- // Convert 24-bit signed samples to 16-bit signed.
-
- const uint8_t *src =
- (const uint8_t *)buffer->data() + buffer->range_offset();
- int16_t *dst = (int16_t *)src;
-
- size_t numSamples = buffer->range_length() / 3;
- for (size_t i = 0; i < numSamples; ++i) {
- int32_t x = (int32_t)(src[0] | src[1] << 8 | src[2] << 16);
- x = (x << 8) >> 8; // sign extension
-
- x = x >> 8;
- *dst++ = (int16_t)x;
- src += 3;
- }
-
- buffer->set_range(buffer->range_offset(), 2 * numSamples);
- }
-
- size_t bytesPerSample = mBitsPerSample >> 3;
-
- buffer->meta_data()->setInt64(
- kKeyTime,
- 1000000LL * (mCurrentPos - mOffset)
- / (mNumChannels * bytesPerSample) / mSampleRate);
-
-
- *out = buffer;
-
- return OK;
-}
-
-} // namespace android