diff options
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/ACodec.cpp | 19 | ||||
-rw-r--r-- | media/libstagefright/SampleTable.cpp | 101 | ||||
-rw-r--r-- | media/libstagefright/avc_utils.cpp | 22 | ||||
-rw-r--r-- | media/libstagefright/chromium_http/support.cpp | 22 | ||||
-rw-r--r-- | media/libstagefright/foundation/AMessage.cpp | 9 | ||||
-rw-r--r-- | media/libstagefright/include/SampleTable.h | 6 | ||||
-rw-r--r-- | media/libstagefright/include/avc_utils.h | 1 | ||||
-rw-r--r-- | media/libstagefright/omx/OMX.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/omx/SimpleSoftOMXComponent.cpp | 2 |
9 files changed, 154 insertions, 30 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 2ba2273..a2d9e59 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -1377,8 +1377,13 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { memcpy(info->mData->data(), buffer->data(), buffer->size()); } - LOGV("[%s] calling emptyBuffer %p", - mCodec->mComponentName.c_str(), bufferID); + if (flags & OMX_BUFFERFLAG_CODECCONFIG) { + LOGV("[%s] calling emptyBuffer %p w/ codec specific data", + mCodec->mComponentName.c_str(), bufferID); + } else { + LOGV("[%s] calling emptyBuffer %p w/ time %lld us", + mCodec->mComponentName.c_str(), bufferID, timeUs); + } CHECK_EQ(mCodec->mOMX->emptyBuffer( mCodec->mNode, @@ -1396,7 +1401,7 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { LOGV("[%s] Signalling EOS on the input port", mCodec->mComponentName.c_str()); - LOGV("[%s] calling emptyBuffer %p", + LOGV("[%s] calling emptyBuffer %p signalling EOS", mCodec->mComponentName.c_str(), bufferID); CHECK_EQ(mCodec->mOMX->emptyBuffer( @@ -1457,8 +1462,8 @@ bool ACodec::BaseState::onOMXFillBufferDone( int64_t timeUs, void *platformPrivate, void *dataPtr) { - LOGV("[%s] onOMXFillBufferDone %p", - mCodec->mComponentName.c_str(), bufferID); + LOGV("[%s] onOMXFillBufferDone %p time %lld us", + mCodec->mComponentName.c_str(), bufferID, timeUs); ssize_t index; BufferInfo *info = @@ -1686,7 +1691,11 @@ void ACodec::UninitializedState::onSetup( ++matchIndex) { componentName = matchingCodecs.itemAt(matchIndex).string(); + pid_t tid = androidGetTid(); + int prevPriority = androidGetThreadPriority(tid); + androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND); status_t err = omx->allocateNode(componentName.c_str(), observer, &node); + androidSetThreadPriority(tid, prevPriority); if (err == OK) { break; diff --git a/media/libstagefright/SampleTable.cpp b/media/libstagefright/SampleTable.cpp index 2b9d99b..ebad321 100644 --- a/media/libstagefright/SampleTable.cpp +++ b/media/libstagefright/SampleTable.cpp @@ -23,8 +23,8 @@ #include <arpa/inet.h> +#include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/DataSource.h> -#include <media/stagefright/MediaDebug.h> #include <media/stagefright/Utils.h> namespace android { @@ -40,6 +40,71 @@ const uint32_t SampleTable::kSampleSizeTypeCompact = FOURCC('s', 't', 'z', '2'); //////////////////////////////////////////////////////////////////////////////// +struct SampleTable::CompositionDeltaLookup { + CompositionDeltaLookup(); + + void setEntries( + const uint32_t *deltaEntries, size_t numDeltaEntries); + + uint32_t getCompositionTimeOffset(uint32_t sampleIndex); + +private: + Mutex mLock; + + const uint32_t *mDeltaEntries; + size_t mNumDeltaEntries; + + size_t mCurrentDeltaEntry; + size_t mCurrentEntrySampleIndex; + + DISALLOW_EVIL_CONSTRUCTORS(CompositionDeltaLookup); +}; + +SampleTable::CompositionDeltaLookup::CompositionDeltaLookup() + : mDeltaEntries(NULL), + mNumDeltaEntries(0), + mCurrentDeltaEntry(0), + mCurrentEntrySampleIndex(0) { +} + +void SampleTable::CompositionDeltaLookup::setEntries( + const uint32_t *deltaEntries, size_t numDeltaEntries) { + Mutex::Autolock autolock(mLock); + + mDeltaEntries = deltaEntries; + mNumDeltaEntries = numDeltaEntries; + mCurrentDeltaEntry = 0; + mCurrentEntrySampleIndex = 0; +} + +uint32_t SampleTable::CompositionDeltaLookup::getCompositionTimeOffset( + uint32_t sampleIndex) { + Mutex::Autolock autolock(mLock); + + if (mDeltaEntries == NULL) { + return 0; + } + + if (sampleIndex < mCurrentEntrySampleIndex) { + mCurrentDeltaEntry = 0; + mCurrentEntrySampleIndex = 0; + } + + while (mCurrentDeltaEntry < mNumDeltaEntries) { + uint32_t sampleCount = mDeltaEntries[2 * mCurrentDeltaEntry]; + if (sampleIndex < mCurrentEntrySampleIndex + sampleCount) { + return mDeltaEntries[2 * mCurrentDeltaEntry + 1]; + } + + mCurrentEntrySampleIndex += sampleCount; + ++mCurrentDeltaEntry; + } + + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// + SampleTable::SampleTable(const sp<DataSource> &source) : mDataSource(source), mChunkOffsetOffset(-1), @@ -56,6 +121,7 @@ SampleTable::SampleTable(const sp<DataSource> &source) mSampleTimeEntries(NULL), mCompositionTimeDeltaEntries(NULL), mNumCompositionTimeDeltaEntries(0), + mCompositionDeltaLookup(new CompositionDeltaLookup), mSyncSampleOffset(-1), mNumSyncSamples(0), mSyncSamples(NULL), @@ -71,6 +137,9 @@ SampleTable::~SampleTable() { delete[] mSyncSamples; mSyncSamples = NULL; + delete mCompositionDeltaLookup; + mCompositionDeltaLookup = NULL; + delete[] mCompositionTimeDeltaEntries; mCompositionTimeDeltaEntries = NULL; @@ -318,6 +387,9 @@ status_t SampleTable::setCompositionTimeToSampleParams( mCompositionTimeDeltaEntries[i] = ntohl(mCompositionTimeDeltaEntries[i]); } + mCompositionDeltaLookup->setEntries( + mCompositionTimeDeltaEntries, mNumCompositionTimeDeltaEntries); + return OK; } @@ -430,8 +502,12 @@ void SampleTable::buildSampleEntriesTable() { mSampleTimeEntries[sampleIndex].mSampleIndex = sampleIndex; + uint32_t compTimeDelta = + mCompositionDeltaLookup->getCompositionTimeOffset( + sampleIndex); + mSampleTimeEntries[sampleIndex].mCompositionTime = - sampleTime + getCompositionTimeOffset(sampleIndex); + sampleTime + compTimeDelta; } ++sampleIndex; @@ -739,25 +815,8 @@ status_t SampleTable::getMetaDataForSample( return OK; } -uint32_t SampleTable::getCompositionTimeOffset(uint32_t sampleIndex) const { - if (mCompositionTimeDeltaEntries == NULL) { - return 0; - } - - uint32_t curSample = 0; - for (size_t i = 0; i < mNumCompositionTimeDeltaEntries; ++i) { - uint32_t sampleCount = mCompositionTimeDeltaEntries[2 * i]; - - if (sampleIndex < curSample + sampleCount) { - uint32_t sampleDelta = mCompositionTimeDeltaEntries[2 * i + 1]; - - return sampleDelta; - } - - curSample += sampleCount; - } - - return 0; +uint32_t SampleTable::getCompositionTimeOffset(uint32_t sampleIndex) { + return mCompositionDeltaLookup->getCompositionTimeOffset(sampleIndex); } } // namespace android diff --git a/media/libstagefright/avc_utils.cpp b/media/libstagefright/avc_utils.cpp index 8a42e8b..07aa140 100644 --- a/media/libstagefright/avc_utils.cpp +++ b/media/libstagefright/avc_utils.cpp @@ -329,6 +329,28 @@ bool IsIDR(const sp<ABuffer> &buffer) { return foundIDR; } +bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit) { + const uint8_t *data = accessUnit->data(); + size_t size = accessUnit->size(); + + const uint8_t *nalStart; + size_t nalSize; + while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { + CHECK_GT(nalSize, 0u); + + unsigned nalType = nalStart[0] & 0x1f; + + if (nalType == 5) { + return true; + } else if (nalType == 1) { + unsigned nal_ref_idc = (nalStart[0] >> 5) & 3; + return nal_ref_idc != 0; + } + } + + return true; +} + sp<MetaData> MakeAACCodecSpecificData( unsigned profile, unsigned sampling_freq_index, unsigned channel_configuration) { diff --git a/media/libstagefright/chromium_http/support.cpp b/media/libstagefright/chromium_http/support.cpp index de936c4..f15014e 100644 --- a/media/libstagefright/chromium_http/support.cpp +++ b/media/libstagefright/chromium_http/support.cpp @@ -74,10 +74,32 @@ bool logMessageHandler( return false; } +struct AutoPrioritySaver { + AutoPrioritySaver() + : mTID(androidGetTid()), + mPrevPriority(androidGetThreadPriority(mTID)) { + androidSetThreadPriority(mTID, ANDROID_PRIORITY_NORMAL); + } + + ~AutoPrioritySaver() { + androidSetThreadPriority(mTID, mPrevPriority); + } + +private: + pid_t mTID; + int mPrevPriority; + + DISALLOW_EVIL_CONSTRUCTORS(AutoPrioritySaver); +}; static void InitializeNetworkThreadIfNecessary() { Mutex::Autolock autoLock(gNetworkThreadLock); + if (gNetworkThread == NULL) { + // Make sure any threads spawned by the chromium framework are + // running at normal priority instead of inheriting this thread's. + AutoPrioritySaver saver; + gNetworkThread = new base::Thread("network"); base::Thread::Options options; options.message_loop_type = MessageLoop::TYPE_IO; diff --git a/media/libstagefright/foundation/AMessage.cpp b/media/libstagefright/foundation/AMessage.cpp index 582bdba..f039bc1 100644 --- a/media/libstagefright/foundation/AMessage.cpp +++ b/media/libstagefright/foundation/AMessage.cpp @@ -385,6 +385,15 @@ AString AMessage::debugString(int32_t indent) const { item.u.refValue)->debugString( indent + strlen(item.mName) + 14).c_str()); break; + case kTypeRect: + tmp = StringPrintf( + "Rect %s(%d, %d, %d, %d)", + item.mName, + item.u.rectValue.mLeft, + item.u.rectValue.mTop, + item.u.rectValue.mRight, + item.u.rectValue.mBottom); + break; default: TRESPASS(); } diff --git a/media/libstagefright/include/SampleTable.h b/media/libstagefright/include/SampleTable.h index a6a6524..847dff7 100644 --- a/media/libstagefright/include/SampleTable.h +++ b/media/libstagefright/include/SampleTable.h @@ -86,6 +86,8 @@ protected: ~SampleTable(); private: + struct CompositionDeltaLookup; + static const uint32_t kChunkOffsetType32; static const uint32_t kChunkOffsetType64; static const uint32_t kSampleSizeType32; @@ -117,6 +119,7 @@ private: uint32_t *mCompositionTimeDeltaEntries; size_t mNumCompositionTimeDeltaEntries; + CompositionDeltaLookup *mCompositionDeltaLookup; off64_t mSyncSampleOffset; uint32_t mNumSyncSamples; @@ -135,8 +138,7 @@ private: friend struct SampleIterator; status_t getSampleSize_l(uint32_t sample_index, size_t *sample_size); - - uint32_t getCompositionTimeOffset(uint32_t sampleIndex) const; + uint32_t getCompositionTimeOffset(uint32_t sampleIndex); static int CompareIncreasingTime(const void *, const void *); diff --git a/media/libstagefright/include/avc_utils.h b/media/libstagefright/include/avc_utils.h index 15cd4d4..e418822 100644 --- a/media/libstagefright/include/avc_utils.h +++ b/media/libstagefright/include/avc_utils.h @@ -50,6 +50,7 @@ struct MetaData; sp<MetaData> MakeAVCCodecSpecificData(const sp<ABuffer> &accessUnit); bool IsIDR(const sp<ABuffer> &accessUnit); +bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit); const char *AVCProfileToString(uint8_t profile); diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index bc24dbb..33d3f30 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -85,7 +85,7 @@ OMX::CallbackDispatcher::CallbackDispatcher(OMXNodeInstance *owner) : mOwner(owner), mDone(false) { mThread = new CallbackDispatcherThread(this); - mThread->run("OMXCallbackDisp", ANDROID_PRIORITY_AUDIO); + mThread->run("OMXCallbackDisp", ANDROID_PRIORITY_FOREGROUND); } OMX::CallbackDispatcher::~CallbackDispatcher() { diff --git a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp index f7330f3..b705d00 100644 --- a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp +++ b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp @@ -42,7 +42,7 @@ SimpleSoftOMXComponent::SimpleSoftOMXComponent( mLooper->start( false, // runOnCallingThread false, // canCallJava - PRIORITY_AUDIO); + ANDROID_PRIORITY_FOREGROUND); } void SimpleSoftOMXComponent::prepareForDestruction() { |