diff options
-rw-r--r-- | include/media/stagefright/ACodec.h | 17 | ||||
-rw-r--r-- | include/media/stagefright/VideoSourceDownSampler.h | 97 | ||||
-rw-r--r-- | media/libstagefright/ACodec.cpp | 33 | ||||
-rw-r--r-- | media/libstagefright/Android.mk | 1 | ||||
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 18 | ||||
-rw-r--r-- | media/libstagefright/VideoSourceDownSampler.cpp | 142 | ||||
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC.cpp | 4 | ||||
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC.h | 3 | ||||
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC2.cpp | 4 | ||||
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC2.h | 3 |
10 files changed, 63 insertions, 259 deletions
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index dd18e95..23e3110 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -56,6 +56,23 @@ struct ACodec : public AHierarchicalStateMachine { void initiateConfigureComponent(const sp<AMessage> &msg); void initiateStart(); + struct PortDescription : public RefBase { + size_t countBuffers(); + IOMX::buffer_id bufferIDAt(size_t index) const; + sp<ABuffer> bufferAt(size_t index) const; + + private: + friend struct ACodec; + + Vector<IOMX::buffer_id> mBufferIDs; + Vector<sp<ABuffer> > mBuffers; + + PortDescription(); + void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer); + + DISALLOW_EVIL_CONSTRUCTORS(PortDescription); + }; + protected: virtual ~ACodec(); diff --git a/include/media/stagefright/VideoSourceDownSampler.h b/include/media/stagefright/VideoSourceDownSampler.h deleted file mode 100644 index 439918c..0000000 --- a/include/media/stagefright/VideoSourceDownSampler.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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. - */ - -// VideoSourceDownSampler implements the MediaSource interface, -// downsampling frames provided from a real video source. - -#ifndef VIDEO_SOURCE_DOWN_SAMPLER_H_ - -#define VIDEO_SOURCE_DOWN_SAMPLER_H_ - -#include <media/stagefright/MediaSource.h> -#include <utils/RefBase.h> - -namespace android { - -class IMemory; -class MediaBuffer; -class MetaData; - -class VideoSourceDownSampler : public MediaSource { -public: - virtual ~VideoSourceDownSampler(); - - // Constructor: - // videoSource: The real video source which provides the original frames. - // width, height: The desired width, height. These should be less than or equal - // to those of the real video source. We then downsample the original frames to - // this size. - VideoSourceDownSampler(const sp<MediaSource> &videoSource, - int32_t width, int32_t height); - - // MediaSource interface - 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); - - virtual status_t pause(); - -private: - // Reference to the real video source. - sp<MediaSource> mRealVideoSource; - - // Size of frames to be provided by this source. - int32_t mWidth; - int32_t mHeight; - - // Size of frames provided by the real source. - int32_t mRealSourceWidth; - int32_t mRealSourceHeight; - - // Down sampling paramters. - int32_t mDownSampleOffsetX; - int32_t mDownSampleOffsetY; - int32_t mDownSampleSkipX; - int32_t mDownSampleSkipY; - - // True if we need to crop the still video image to get the video frame. - bool mNeedDownSampling; - - // Meta data. This is a copy of the real source except for the width and - // height parameters. - sp<MetaData> mMeta; - - // Computes the offset, skip parameters for downsampling the original frame - // to the desired size. - void computeDownSamplingParameters(); - - // Downsamples the frame in sourceBuffer to size (mWidth x mHeight). A new - // buffer is created which stores the downsampled image. - void downSampleYUVImage(const MediaBuffer &sourceBuffer, MediaBuffer **buffer) const; - - // Disallow these. - VideoSourceDownSampler(const VideoSourceDownSampler &); - VideoSourceDownSampler &operator=(const VideoSourceDownSampler &); -}; - -} // namespace android - -#endif // VIDEO_SOURCE_DOWN_SAMPLER_H_ diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 3fd6cef..7ac0f23 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -472,14 +472,16 @@ status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { notify->setInt32("what", ACodec::kWhatBuffersAllocated); notify->setInt32("portIndex", portIndex); + + sp<PortDescription> desc = new PortDescription; + for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { - AString name = StringPrintf("buffer-id_%d", i); - notify->setPointer(name.c_str(), mBuffers[portIndex][i].mBufferID); + const BufferInfo &info = mBuffers[portIndex][i]; - name = StringPrintf("data_%d", i); - notify->setBuffer(name.c_str(), mBuffers[portIndex][i].mData); + desc->addBuffer(info.mBufferID, info.mData); } + notify->setObject("portDesc", desc); notify->post(); return OK; @@ -2110,6 +2112,29 @@ void ACodec::signalError(OMX_ERRORTYPE error, status_t internalError) { //////////////////////////////////////////////////////////////////////////////// +ACodec::PortDescription::PortDescription() { +} + +void ACodec::PortDescription::addBuffer( + IOMX::buffer_id id, const sp<ABuffer> &buffer) { + mBufferIDs.push_back(id); + mBuffers.push_back(buffer); +} + +size_t ACodec::PortDescription::countBuffers() { + return mBufferIDs.size(); +} + +IOMX::buffer_id ACodec::PortDescription::bufferIDAt(size_t index) const { + return mBufferIDs.itemAt(index); +} + +sp<ABuffer> ACodec::PortDescription::bufferAt(size_t index) const { + return mBuffers.itemAt(index); +} + +//////////////////////////////////////////////////////////////////////////////// + ACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) : AState(parentState), mCodec(codec) { diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk index 78a68fd..8ad1cb9 100644 --- a/media/libstagefright/Android.mk +++ b/media/libstagefright/Android.mk @@ -14,7 +14,6 @@ LOCAL_SRC_FILES:= \ AwesomePlayer.cpp \ CameraSource.cpp \ CameraSourceTimeLapse.cpp \ - VideoSourceDownSampler.cpp \ DataSource.cpp \ DRMExtractor.cpp \ ESDS.cpp \ diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index 5b513a8..ff71170 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -562,20 +562,20 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { mPortBuffers[portIndex].clear(); Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; - for (size_t i = 0;; ++i) { - AString name = StringPrintf("buffer-id_%d", i); - void *bufferID; - if (!msg->findPointer(name.c_str(), &bufferID)) { - break; - } + sp<RefBase> obj; + CHECK(msg->findObject("portDesc", &obj)); + + sp<ACodec::PortDescription> portDesc = + static_cast<ACodec::PortDescription *>(obj.get()); - name = StringPrintf("data_%d", i); + size_t numBuffers = portDesc->countBuffers(); + for (size_t i = 0; i < numBuffers; ++i) { BufferInfo info; - info.mBufferID = bufferID; + info.mBufferID = portDesc->bufferIDAt(i); info.mOwnedByClient = false; - CHECK(msg->findBuffer(name.c_str(), &info.mData)); + info.mData = portDesc->bufferAt(i); if (portIndex == kPortIndexInput && mCrypto != NULL) { info.mEncryptedData = diff --git a/media/libstagefright/VideoSourceDownSampler.cpp b/media/libstagefright/VideoSourceDownSampler.cpp deleted file mode 100644 index 90a42c9..0000000 --- a/media/libstagefright/VideoSourceDownSampler.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * 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. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "VideoSourceDownSampler" - -#include <media/stagefright/foundation/ADebug.h> -#include <media/stagefright/VideoSourceDownSampler.h> -#include <media/stagefright/MediaBuffer.h> -#include <media/stagefright/MetaData.h> -#include <media/stagefright/YUVImage.h> -#include <media/stagefright/YUVCanvas.h> -#include "OMX_Video.h" - -namespace android { - -VideoSourceDownSampler::VideoSourceDownSampler(const sp<MediaSource> &videoSource, - int32_t width, int32_t height) { - ALOGV("Construct VideoSourceDownSampler"); - CHECK(width > 0); - CHECK(height > 0); - - mRealVideoSource = videoSource; - mWidth = width; - mHeight = height; - - mMeta = new MetaData(*(mRealVideoSource->getFormat())); - CHECK(mMeta->findInt32(kKeyWidth, &mRealSourceWidth)); - CHECK(mMeta->findInt32(kKeyHeight, &mRealSourceHeight)); - - if ((mWidth != mRealSourceWidth) || (mHeight != mRealSourceHeight)) { - // Change meta data for width and height. - CHECK(mWidth <= mRealSourceWidth); - CHECK(mHeight <= mRealSourceHeight); - - mNeedDownSampling = true; - computeDownSamplingParameters(); - mMeta->setInt32(kKeyWidth, mWidth); - mMeta->setInt32(kKeyHeight, mHeight); - } else { - mNeedDownSampling = false; - } -} - -VideoSourceDownSampler::~VideoSourceDownSampler() { -} - -void VideoSourceDownSampler::computeDownSamplingParameters() { - mDownSampleSkipX = mRealSourceWidth / mWidth; - mDownSampleSkipY = mRealSourceHeight / mHeight; - - mDownSampleOffsetX = mRealSourceWidth - mDownSampleSkipX * mWidth; - mDownSampleOffsetY = mRealSourceHeight - mDownSampleSkipY * mHeight; -} - -void VideoSourceDownSampler::downSampleYUVImage( - const MediaBuffer &sourceBuffer, MediaBuffer **buffer) const { - // find the YUV format - int32_t srcFormat; - CHECK(mMeta->findInt32(kKeyColorFormat, &srcFormat)); - YUVImage::YUVFormat yuvFormat; - if (srcFormat == OMX_COLOR_FormatYUV420SemiPlanar) { - yuvFormat = YUVImage::YUV420SemiPlanar; - } else if (srcFormat == OMX_COLOR_FormatYUV420Planar) { - yuvFormat = YUVImage::YUV420Planar; - } - - // allocate mediaBuffer for down sampled image and setup a canvas. - *buffer = new MediaBuffer(YUVImage::bufferSize(yuvFormat, mWidth, mHeight)); - YUVImage yuvDownSampledImage(yuvFormat, - mWidth, mHeight, - (uint8_t *)(*buffer)->data()); - YUVCanvas yuvCanvasDownSample(yuvDownSampledImage); - - YUVImage yuvImageSource(yuvFormat, - mRealSourceWidth, mRealSourceHeight, - (uint8_t *)sourceBuffer.data()); - yuvCanvasDownSample.downsample(mDownSampleOffsetX, mDownSampleOffsetY, - mDownSampleSkipX, mDownSampleSkipY, - yuvImageSource); -} - -status_t VideoSourceDownSampler::start(MetaData *params) { - ALOGV("start"); - return mRealVideoSource->start(); -} - -status_t VideoSourceDownSampler::stop() { - ALOGV("stop"); - return mRealVideoSource->stop(); -} - -sp<MetaData> VideoSourceDownSampler::getFormat() { - ALOGV("getFormat"); - return mMeta; -} - -status_t VideoSourceDownSampler::read( - MediaBuffer **buffer, const ReadOptions *options) { - ALOGV("read"); - MediaBuffer *realBuffer; - status_t err = mRealVideoSource->read(&realBuffer, options); - - if (mNeedDownSampling) { - downSampleYUVImage(*realBuffer, buffer); - - int64_t frameTime; - realBuffer->meta_data()->findInt64(kKeyTime, &frameTime); - (*buffer)->meta_data()->setInt64(kKeyTime, frameTime); - - // We just want this buffer to be deleted when the encoder releases it. - // So don't add a reference to it and set the observer to NULL. - (*buffer)->setObserver(NULL); - - // The original buffer is no longer required. Release it. - realBuffer->release(); - } else { - *buffer = realBuffer; - } - - return err; -} - -status_t VideoSourceDownSampler::pause() { - ALOGV("pause"); - return mRealVideoSource->pause(); -} - -} // namespace android diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.cpp b/media/libstagefright/codecs/aacdec/SoftAAC.cpp index d509383..65aa2ad 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC.cpp @@ -69,7 +69,7 @@ void SoftAAC::initPorts() { def.nPortIndex = 0; def.eDir = OMX_DirInput; - def.nBufferCountMin = kNumBuffers; + def.nBufferCountMin = kNumInputBuffers; def.nBufferCountActual = def.nBufferCountMin; def.nBufferSize = 8192; def.bEnabled = OMX_TRUE; @@ -87,7 +87,7 @@ void SoftAAC::initPorts() { def.nPortIndex = 1; def.eDir = OMX_DirOutput; - def.nBufferCountMin = kNumBuffers; + def.nBufferCountMin = kNumOutputBuffers; def.nBufferCountActual = def.nBufferCountMin; def.nBufferSize = 8192; def.bEnabled = OMX_TRUE; diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.h b/media/libstagefright/codecs/aacdec/SoftAAC.h index da0b8ed..c0789ab 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC.h +++ b/media/libstagefright/codecs/aacdec/SoftAAC.h @@ -45,7 +45,8 @@ protected: private: enum { - kNumBuffers = 4 + kNumInputBuffers = 32, + kNumOutputBuffers = 4, }; tPVMP4AudioDecoderExternal *mConfig; diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp index e499a0b..303b8ef 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp @@ -64,7 +64,7 @@ void SoftAAC2::initPorts() { def.nPortIndex = 0; def.eDir = OMX_DirInput; - def.nBufferCountMin = kNumBuffers; + def.nBufferCountMin = kNumInputBuffers; def.nBufferCountActual = def.nBufferCountMin; def.nBufferSize = 8192; def.bEnabled = OMX_TRUE; @@ -82,7 +82,7 @@ void SoftAAC2::initPorts() { def.nPortIndex = 1; def.eDir = OMX_DirOutput; - def.nBufferCountMin = kNumBuffers; + def.nBufferCountMin = kNumOutputBuffers; def.nBufferCountActual = def.nBufferCountMin; def.nBufferSize = 8192 * 2; def.bEnabled = OMX_TRUE; diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.h b/media/libstagefright/codecs/aacdec/SoftAAC2.h index e5a1e3e..57565ab 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC2.h +++ b/media/libstagefright/codecs/aacdec/SoftAAC2.h @@ -44,7 +44,8 @@ protected: private: enum { - kNumBuffers = 4 + kNumInputBuffers = 32, + kNumOutputBuffers = 4, }; HANDLE_AACDECODER mAACDecoder; |