From: Glenn Kasten Date: Thu, 29 Sep 2011 16:40:50 +0000 (-0700) Subject: Simplify code for the AAC decode use case X-Git-Tag: android-x86-7.1-r1~650^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ced4f212ab5b03f4f8fbff114c13b8cb3f0ef3a4;p=android-x86%2Fsystem-media.git Simplify code for the AAC decode use case Details: AacBqToPcmCbRenderer constructor now takes an additional parameter: the IAndroidBufferQueue * interface. So now there is no need to register a callback after construction, and AacBqToPcmCbRenderer::registerSourceQueueCallback can be deleted. This allows android_audioPlayer_androidBufferQueue_registerCallback_l to be deleted. AacBqToPcmCbRenderer::mBqSource is always non-NULL and const, so this allows removal of mBqSourceLock and some error-checking code. BufferQueueSource source constructor now takes the IAndroidBufferQueue * interface instead of the list [user, context, caller]. This allows mAndroidBufferQueueSource to be const, which then allows more code to be deleted in IAndroidBufferQueue_RegisterCallback. new AacAdtsExtractor can't fail. Change-Id: I1f39ccc1e69833fe6df616feb76edbe4ce82fca7 --- diff --git a/wilhelm/src/android/AacBqToPcmCbRenderer.cpp b/wilhelm/src/android/AacBqToPcmCbRenderer.cpp index 44aaafc6..194662bd 100644 --- a/wilhelm/src/android/AacBqToPcmCbRenderer.cpp +++ b/wilhelm/src/android/AacBqToPcmCbRenderer.cpp @@ -108,12 +108,12 @@ SLresult AacBqToPcmCbRenderer::validateBufferStartEndOnFrameBoundaries(void* dat } //-------------------------------------------------------------------------------------------------- -AacBqToPcmCbRenderer::AacBqToPcmCbRenderer(const AudioPlayback_Parameters* params) : +AacBqToPcmCbRenderer::AacBqToPcmCbRenderer(const AudioPlayback_Parameters* params, + IAndroidBufferQueue *androidBufferQueue) : AudioToCbRenderer(params), - mBqSource(0) + mBqSource(new BufferQueueSource(androidBufferQueue)) { SL_LOGD("AacBqToPcmCbRenderer::AacBqToPcmCbRenderer()"); - } @@ -124,20 +124,6 @@ AacBqToPcmCbRenderer::~AacBqToPcmCbRenderer() { //-------------------------------------------------- -void AacBqToPcmCbRenderer::registerSourceQueueCallback( - const void* user, void *context, const void *caller) { - SL_LOGD("AacBqToPcmCbRenderer::registerQueueCallback"); - - Mutex::Autolock _l(mBqSourceLock); - - mBqSource = new BufferQueueSource(user, context, caller); - - CHECK(mBqSource != 0); - SL_LOGD("AacBqToPcmCbRenderer::registerSourceQueueCallback end"); -} - - -//-------------------------------------------------- // Event handlers void AacBqToPcmCbRenderer::onPrepare() { SL_LOGD("AacBqToPcmCbRenderer::onPrepare()"); @@ -157,23 +143,7 @@ void AacBqToPcmCbRenderer::onPrepare() { mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_CHANNELMASK] = UNKNOWN_CHANNELMASK; } - sp dataSource; - { - Mutex::Autolock _l(mBqSourceLock); - dataSource = mBqSource; - } - if (dataSource == 0) { - SL_LOGE("AacBqToPcmCbRenderer::onPrepare(): Error no data source"); - notifyPrepared(MEDIA_ERROR_BASE); - return; - } - - sp extractor = new AacAdtsExtractor(dataSource); - if (extractor == 0) { - SL_LOGE("AacBqToPcmCbRenderer::onPrepare: Could not instantiate AAC extractor."); - notifyPrepared(ERROR_UNSUPPORTED); - return; - } + sp extractor = new AacAdtsExtractor(mBqSource); // only decoding a single track of data const size_t kTrackToDecode = 0; @@ -235,7 +205,7 @@ void AacBqToPcmCbRenderer::onPrepare() { //--------------------------------- // The data source, and audio source (a decoder) are ready to be used - mDataSource = dataSource; + mDataSource = mBqSource; mAudioSource = source; mAudioSourceStarted = true; diff --git a/wilhelm/src/android/AudioPlayer_to_android.cpp b/wilhelm/src/android/AudioPlayer_to_android.cpp index 7e64b7bd..e79a1610 100644 --- a/wilhelm/src/android/AudioPlayer_to_android.cpp +++ b/wilhelm/src/android/AudioPlayer_to_android.cpp @@ -1519,7 +1519,8 @@ SLresult android_audioPlayer_realize(CAudioPlayer *pAudioPlayer, SLboolean async //----------------------------------- // AacBqToPcmCbRenderer case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE: { - android::AacBqToPcmCbRenderer* bqtobq = new android::AacBqToPcmCbRenderer(&app); + android::AacBqToPcmCbRenderer* bqtobq = new android::AacBqToPcmCbRenderer(&app, + &pAudioPlayer->mAndroidBufferQueue); // configures the callback for the sink buffer queue bqtobq->setDataPushListener(adecoder_writeToBufferQueue, pAudioPlayer); pAudioPlayer->mAPlayer = bqtobq; @@ -2144,30 +2145,6 @@ SLresult android_audioPlayer_bufferQueue_onClear(CAudioPlayer *ap) { //----------------------------------------------------------------------------- -SLresult android_audioPlayer_androidBufferQueue_registerCallback_l(CAudioPlayer *ap) { - SLresult result = SL_RESULT_SUCCESS; - assert(ap->mAPlayer != 0); - // FIXME investigate why these two cases are not handled symmetrically any more - switch (ap->mAndroidObjType) { - case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: { - } break; - case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE: { - android::AacBqToPcmCbRenderer* dec = - static_cast(ap->mAPlayer.get()); - dec->registerSourceQueueCallback((const void*)ap /*user*/, - ap->mAndroidBufferQueue.mContext /*context*/, - (const void*)&(ap->mAndroidBufferQueue.mItf) /*caller*/); - } break; - default: - SL_LOGE("Error registering AndroidBufferQueue callback: unexpected object type %d", - ap->mAndroidObjType); - result = SL_RESULT_INTERNAL_ERROR; - break; - } - return result; -} - -//----------------------------------------------------------------------------- void android_audioPlayer_androidBufferQueue_clear_l(CAudioPlayer *ap) { switch (ap->mAndroidObjType) { case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: diff --git a/wilhelm/src/android/AudioPlayer_to_android.h b/wilhelm/src/android/AudioPlayer_to_android.h index 96855e6b..430b6227 100644 --- a/wilhelm/src/android/AudioPlayer_to_android.h +++ b/wilhelm/src/android/AudioPlayer_to_android.h @@ -138,9 +138,6 @@ extern SLresult android_audioPlayer_bufferQueue_onClear(CAudioPlayer *pAudioPlay * Android Buffer Queue ****************************/ /* must be called with a lock on pAudioPlayer->mThis */ -extern SLresult android_audioPlayer_androidBufferQueue_registerCallback_l( - CAudioPlayer *pAudioPlayer); -/* must be called with a lock on pAudioPlayer->mThis */ extern void android_audioPlayer_androidBufferQueue_clear_l(CAudioPlayer *pAudioPlayer); /* must be called with a lock on pAudioPlayer->mThis */ extern void android_audioPlayer_androidBufferQueue_onRefilled_l(CAudioPlayer *pAudioPlayer); diff --git a/wilhelm/src/android/BufferQueueSource.cpp b/wilhelm/src/android/BufferQueueSource.cpp index 1ad2cadf..9257f532 100644 --- a/wilhelm/src/android/BufferQueueSource.cpp +++ b/wilhelm/src/android/BufferQueueSource.cpp @@ -36,17 +36,11 @@ const SLuint32 BufferQueueSource::kItemProcessed[NB_BUFFEREVENT_ITEM_FIELDS] = { }; -BufferQueueSource::BufferQueueSource(const void* user, void *context, const void *caller) : - mAndroidBufferQueueSource(NULL), +BufferQueueSource::BufferQueueSource(IAndroidBufferQueue *androidBufferQueue) : + mAndroidBufferQueueSource(androidBufferQueue), mStreamToBqOffset(0), mEosReached(false) { - if (NULL != user) { - mAndroidBufferQueueSource = &((CAudioPlayer*)user)->mAndroidBufferQueue; - } else { - SL_LOGE("Can't create BufferQueueSource with NULL user"); - } - } diff --git a/wilhelm/src/android/BufferQueueSource.h b/wilhelm/src/android/BufferQueueSource.h index c91b7b1c..c362df27 100644 --- a/wilhelm/src/android/BufferQueueSource.h +++ b/wilhelm/src/android/BufferQueueSource.h @@ -33,7 +33,7 @@ public: // store an item structure to indicate a processed buffer static const SLuint32 kItemProcessed[NB_BUFFEREVENT_ITEM_FIELDS]; - BufferQueueSource(const void* user, void *context, const void *caller); + BufferQueueSource(IAndroidBufferQueue *androidBufferQueue); virtual status_t initCheck() const; @@ -45,7 +45,7 @@ public: private: // the Android Buffer Queue from which data is consumed - IAndroidBufferQueue* mAndroidBufferQueueSource; + IAndroidBufferQueue* const mAndroidBufferQueueSource; // a monotonically increasing offset used to translate an offset from the beginning // of the stream, to an offset in each buffer from the buffer queue source diff --git a/wilhelm/src/android/include/AacBqToPcmCbRenderer.h b/wilhelm/src/android/include/AacBqToPcmCbRenderer.h index d144f1eb..62cbd6e9 100644 --- a/wilhelm/src/android/include/AacBqToPcmCbRenderer.h +++ b/wilhelm/src/android/include/AacBqToPcmCbRenderer.h @@ -33,11 +33,10 @@ class AacBqToPcmCbRenderer : public AudioToCbRenderer { public: - AacBqToPcmCbRenderer(const AudioPlayback_Parameters* params); + AacBqToPcmCbRenderer(const AudioPlayback_Parameters* params, + IAndroidBufferQueue *androidBufferQueue); virtual ~AacBqToPcmCbRenderer(); - void registerSourceQueueCallback(const void* user, void *context, const void *caller); - // verifies the given memory starts and ends on ADTS frame boundaries. // This is for instance used whenever ADTS data is being enqueued through an // SL / XA AndroidBufferQueue interface so only parseable ADTS data goes in @@ -51,9 +50,7 @@ protected: private: - // mutex used to protect mBqSource - Mutex mBqSourceLock; - sp mBqSource; + const sp mBqSource; private: DISALLOW_EVIL_CONSTRUCTORS(AacBqToPcmCbRenderer); diff --git a/wilhelm/src/itf/IAndroidBufferQueue.c b/wilhelm/src/itf/IAndroidBufferQueue.c index 278b7fdf..76ab546b 100644 --- a/wilhelm/src/itf/IAndroidBufferQueue.c +++ b/wilhelm/src/itf/IAndroidBufferQueue.c @@ -214,19 +214,7 @@ static SLresult IAndroidBufferQueue_RegisterCallback(SLAndroidBufferQueueItf sel if (SL_PLAYSTATE_STOPPED == getAssociatedState(thiz)) { thiz->mCallback = callback; thiz->mContext = pContext; - - // FIXME investigate why these two cases are not handled symmetrically any more - switch (InterfaceToObjectID(thiz)) { - case SL_OBJECTID_AUDIOPLAYER: - result = android_audioPlayer_androidBufferQueue_registerCallback_l( - (CAudioPlayer*) thiz->mThis); - break; - case XA_OBJECTID_MEDIAPLAYER: - result = SL_RESULT_SUCCESS; - break; - default: - result = SL_RESULT_PARAMETER_INVALID; - } + result = SL_RESULT_SUCCESS; } else { result = SL_RESULT_PRECONDITIONS_VIOLATED;