diff --git a/content/html/content/src/HTMLMediaElement.cpp b/content/html/content/src/HTMLMediaElement.cpp index 24a65c39f91..f3445171937 100644 --- a/content/html/content/src/HTMLMediaElement.cpp +++ b/content/html/content/src/HTMLMediaElement.cpp @@ -3244,11 +3244,6 @@ void HTMLMediaElement::SuspendOrResumeElement(bool aPauseElement, bool aSuspendE void HTMLMediaElement::NotifyOwnerDocumentActivityChanged() { nsIDocument* ownerDoc = OwnerDoc(); - - if (mDecoder) { - mDecoder->SetDormantIfNecessary(ownerDoc->Hidden()); - } - // SetVisibilityState will update mMuted with MUTED_BY_AUDIO_CHANNEL via the // CanPlayChanged callback. if (UseAudioChannelService() && mPlayingThroughTheAudioChannel && diff --git a/content/media/MediaDecoder.cpp b/content/media/MediaDecoder.cpp index 5eb74ae54f3..e3d0c802a02 100644 --- a/content/media/MediaDecoder.cpp +++ b/content/media/MediaDecoder.cpp @@ -112,47 +112,11 @@ public: NS_IMPL_THREADSAFE_ISUPPORTS1(MediaDecoder, nsIObserver) -void MediaDecoder::SetDormantIfNecessary(bool aDormant) -{ - MOZ_ASSERT(NS_IsMainThread()); - ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); - - if (!mDecoderStateMachine || !mDecoderStateMachine->IsDormantNeeded() || (mPlayState == PLAY_STATE_SHUTDOWN)) { - return; - } - - if (mIsDormant == aDormant) { - // no change to dormant state - return; - } - - if(aDormant) { - // enter dormant state - StopProgress(); - DestroyDecodedStream(); - mDecoderStateMachine->SetDormant(true); - - mRequestedSeekTime = mCurrentTime; - if (mPlayState == PLAY_STATE_PLAYING){ - mNextState = PLAY_STATE_PLAYING; - } else { - mNextState = PLAY_STATE_PAUSED; - } - mNextState = mPlayState; - mIsDormant = aDormant; - ChangeState(PLAY_STATE_LOADING); - } else if ((aDormant != true) && (mPlayState == PLAY_STATE_LOADING)) { - // exit dormant state - // just trigger to state machine. - mDecoderStateMachine->SetDormant(false); - } -} - void MediaDecoder::Pause() { MOZ_ASSERT(NS_IsMainThread()); ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); - if (mPlayState == PLAY_STATE_LOADING || mPlayState == PLAY_STATE_SEEKING || mPlayState == PLAY_STATE_ENDED) { + if (mPlayState == PLAY_STATE_SEEKING || mPlayState == PLAY_STATE_ENDED) { mNextState = PLAY_STATE_PAUSED; return; } @@ -369,8 +333,6 @@ MediaDecoder::MediaDecoder() : mTransportSeekable(true), mMediaSeekable(true), mReentrantMonitor("media.decoder"), - mIsMetadataLoaded(false), - mIsDormant(false), mPlayState(PLAY_STATE_PAUSED), mNextState(PLAY_STATE_PAUSED), mCalledResourceLoaded(false), @@ -557,7 +519,7 @@ nsresult MediaDecoder::Play() NS_ASSERTION(mDecoderStateMachine != nullptr, "Should have state machine."); nsresult res = ScheduleStateMachineThread(); NS_ENSURE_SUCCESS(res,res); - if (mPlayState == PLAY_STATE_LOADING || mPlayState == PLAY_STATE_SEEKING) { + if (mPlayState == PLAY_STATE_SEEKING) { mNextState = PLAY_STATE_PLAYING; return NS_OK; } @@ -657,7 +619,7 @@ nsresult MediaDecoder::Seek(double aTime) // If we are already in the seeking state, then setting mRequestedSeekTime // above will result in the new seek occurring when the current seek // completes. - if (mPlayState != PLAY_STATE_LOADING && mPlayState != PLAY_STATE_SEEKING) { + if (mPlayState != PLAY_STATE_SEEKING) { bool paused = false; if (mOwner) { paused = mOwner->GetPaused(); @@ -741,9 +703,7 @@ void MediaDecoder::MetadataLoaded(int aChannels, int aRate, bool aHasAudio, bool // Make sure the element and the frame (if any) are told about // our new size. Invalidate(); - if (!mIsMetadataLoaded) { - mOwner->MetadataLoaded(aChannels, aRate, aHasAudio, aHasVideo, aTags); - } + mOwner->MetadataLoaded(aChannels, aRate, aHasAudio, aHasVideo, aTags); } if (!mCalledResourceLoaded) { @@ -760,9 +720,7 @@ void MediaDecoder::MetadataLoaded(int aChannels, int aRate, bool aHasAudio, bool bool notifyResourceIsLoaded = !mCalledResourceLoaded && IsDataCachedToEndOfResource(); if (mOwner) { - if (!mIsMetadataLoaded) { - mOwner->FirstFrameLoaded(notifyResourceIsLoaded); - } + mOwner->FirstFrameLoaded(notifyResourceIsLoaded); } // This can run cache callbacks. @@ -788,8 +746,6 @@ void MediaDecoder::MetadataLoaded(int aChannels, int aRate, bool aHasAudio, bool // Run NotifySuspendedStatusChanged now to give us a chance to notice // that autoplay should run. NotifySuspendedStatusChanged(); - - mIsMetadataLoaded = true; } void MediaDecoder::ResourceLoaded() @@ -1204,11 +1160,6 @@ void MediaDecoder::ChangeState(PlayState aState) break; } } - - if (aState!= PLAY_STATE_LOADING) { - mIsDormant = false; - } - GetReentrantMonitor().NotifyAll(); } diff --git a/content/media/MediaDecoder.h b/content/media/MediaDecoder.h index f25884be627..eda871cfffb 100644 --- a/content/media/MediaDecoder.h +++ b/content/media/MediaDecoder.h @@ -332,12 +332,6 @@ public: // called. virtual nsresult Play(); - // Set/Unset dormant state if necessary. - // Dormant state is a state to free all scarce media resources - // (like hw video codec), did not decoding and stay dormant. - // It is used to share scarece media resources in system. - virtual void SetDormantIfNecessary(bool aDormant); - // Pause video playback. virtual void Pause(); // Adjust the speed of the playback, optionally with pitch correction, @@ -1006,13 +1000,6 @@ public: // without holding the monitor. nsAutoPtr mDecodedStream; - // True if metadata is already loaded in the past. - bool mIsMetadataLoaded; - - // True if this decoder is in dormant state. - // Should be true only when PlayState is PLAY_STATE_LOADING. - bool mIsDormant; - // Set to one of the valid play states. // This can only be changed on the main thread while holding the decoder // monitor. Thus, it can be safely read while holding the decoder monitor diff --git a/content/media/MediaDecoderReader.h b/content/media/MediaDecoderReader.h index 47f128cf9ad..e7cef26c2ee 100644 --- a/content/media/MediaDecoderReader.h +++ b/content/media/MediaDecoderReader.h @@ -407,13 +407,6 @@ public: // on failure. virtual nsresult Init(MediaDecoderReader* aCloneDonor) = 0; - // True if this reader is waiting media resource allocation - virtual bool IsWaitingMediaResources() { return false; } - // True when this reader need to become dormant state - virtual bool IsDormantNeeded() { return false; } - // Release media resources they should be released in dormant state - virtual void ReleaseMediaResources() {}; - // Resets all state related to decoding, emptying all buffers etc. virtual nsresult ResetDecode(); diff --git a/content/media/MediaDecoderStateMachine.cpp b/content/media/MediaDecoderStateMachine.cpp index 48a6fa34511..ef9b79577c4 100644 --- a/content/media/MediaDecoderStateMachine.cpp +++ b/content/media/MediaDecoderStateMachine.cpp @@ -503,28 +503,12 @@ void MediaDecoderStateMachine::DecodeThreadRun() while (mState != DECODER_STATE_SHUTDOWN && mState != DECODER_STATE_COMPLETED && - mState != DECODER_STATE_DORMANT && !mStopDecodeThread) { if (mState == DECODER_STATE_DECODING || mState == DECODER_STATE_BUFFERING) { DecodeLoop(); } else if (mState == DECODER_STATE_SEEKING) { DecodeSeek(); - } else if (mState == DECODER_STATE_DECODING_METADATA) { - if (NS_FAILED(DecodeMetadata())) { - NS_ASSERTION(mState == DECODER_STATE_SHUTDOWN, - "Should be in shutdown state if metadata loading fails."); - LOG(PR_LOG_DEBUG, ("Decode metadata failed, shutting down decode thread")); - } - } else if (mState == DECODER_STATE_WAIT_FOR_RESOURCES) { - mDecoder->GetReentrantMonitor().Wait(); - - if (!mReader->IsWaitingMediaResources()) { - // change state to DECODER_STATE_WAIT_FOR_RESOURCES - StartDecodeMetadata(); - } - } else if (mState == DECODER_STATE_DORMANT) { - mDecoder->GetReentrantMonitor().Wait(); } } @@ -969,7 +953,6 @@ void MediaDecoderStateMachine::DecodeLoop() if (!mStopDecodeThread && mState != DECODER_STATE_SHUTDOWN && - mState != DECODER_STATE_DORMANT && mState != DECODER_STATE_SEEKING) { mState = DECODER_STATE_COMPLETED; @@ -1474,33 +1457,6 @@ void MediaDecoderStateMachine::SetMediaSeekable(bool aMediaSeekable) mMediaSeekable = aMediaSeekable; } -bool MediaDecoderStateMachine::IsDormantNeeded() -{ - return mReader->IsDormantNeeded(); -} - -void MediaDecoderStateMachine::SetDormant(bool aDormant) -{ - NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); - mDecoder->GetReentrantMonitor().AssertCurrentThreadIn(); - - if (!mReader) { - return; - } - - if (aDormant) { - ScheduleStateMachine(); - mState = DECODER_STATE_DORMANT; - mDecoder->GetReentrantMonitor().NotifyAll(); - } else if ((aDormant != true) && (mState == DECODER_STATE_DORMANT)) { - ScheduleStateMachine(); - mStartTime = 0; - mCurrentFrameTime = 0; - mState = DECODER_STATE_DECODING_METADATA; - mDecoder->GetReentrantMonitor().NotifyAll(); - } -} - void MediaDecoderStateMachine::Shutdown() { NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); @@ -1528,22 +1484,6 @@ void MediaDecoderStateMachine::StartDecoding() ScheduleStateMachine(); } -void MediaDecoderStateMachine::StartWaitForResources() -{ - NS_ASSERTION(OnStateMachineThread() || OnDecodeThread(), - "Should be on state machine or decode thread."); - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - mState = DECODER_STATE_WAIT_FOR_RESOURCES; -} - -void MediaDecoderStateMachine::StartDecodeMetadata() -{ - NS_ASSERTION(OnStateMachineThread() || OnDecodeThread(), - "Should be on state machine or decode thread."); - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - mState = DECODER_STATE_DECODING_METADATA; -} - void MediaDecoderStateMachine::Play() { NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); @@ -1875,12 +1815,6 @@ nsresult MediaDecoderStateMachine::DecodeMetadata() ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor()); res = mReader->ReadMetadata(&info, &tags); } - if (NS_SUCCEEDED(res) && (mState == DECODER_STATE_DECODING_METADATA) && (mReader->IsWaitingMediaResources())) { - // change state to DECODER_STATE_WAIT_FOR_RESOURCES - StartWaitForResources(); - return NS_OK; - } - mInfo = info; if (NS_FAILED(res) || (!info.mHasVideo && !info.mHasAudio)) { @@ -2147,10 +2081,6 @@ nsresult MediaDecoderStateMachine::RunStateMachine() // Now that those threads are stopped, there's no possibility of // mPendingWakeDecoder being needed again. Revoke it. mPendingWakeDecoder = nullptr; - { - ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor()); - mReader->ReleaseMediaResources(); - } NS_ASSERTION(mState == DECODER_STATE_SHUTDOWN, "How did we escape from the shutdown state?"); // We must daisy-chain these events to destroy the decoder. We must @@ -2170,26 +2100,6 @@ nsresult MediaDecoderStateMachine::RunStateMachine() return NS_OK; } - case DECODER_STATE_DORMANT: { - if (IsPlaying()) { - StopPlayback(); - } - StopAudioThread(); - StopDecodeThread(); - // Now that those threads are stopped, there's no possibility of - // mPendingWakeDecoder being needed again. Revoke it. - mPendingWakeDecoder = nullptr; - { - ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor()); - mReader->ReleaseMediaResources(); - } - return NS_OK; - } - - case DECODER_STATE_WAIT_FOR_RESOURCES: { - return NS_OK; - } - case DECODER_STATE_DECODING_METADATA: { // Ensure we have a decode thread to decode metadata. return ScheduleDecodeThread(); diff --git a/content/media/MediaDecoderStateMachine.h b/content/media/MediaDecoderStateMachine.h index 23179e4c517..a4fcdbaa684 100644 --- a/content/media/MediaDecoderStateMachine.h +++ b/content/media/MediaDecoderStateMachine.h @@ -116,8 +116,6 @@ public: // Enumeration for the valid decoding states enum State { DECODER_STATE_DECODING_METADATA, - DECODER_STATE_WAIT_FOR_RESOURCES, - DECODER_STATE_DORMANT, DECODER_STATE_DECODING, DECODER_STATE_SEEKING, DECODER_STATE_BUFFERING, @@ -134,11 +132,6 @@ public: // calling this. void SetVolume(double aVolume); void SetAudioCaptured(bool aCapture); - - // Check if the decoder needs to become dormant state. - bool IsDormantNeeded(); - // Set/Unset dormant state. - void SetDormant(bool aDormant); void Shutdown(); // Called from the main thread to get the duration. The decoder monitor @@ -500,10 +493,6 @@ private: // thread. The decoder monitor must be held. void StartDecoding(); - void StartWaitForResources(); - - void StartDecodeMetadata(); - // Returns true if we're currently playing. The decoder monitor must // be held. bool IsPlaying(); diff --git a/content/media/moz.build b/content/media/moz.build index 3eb82d0be57..2e7596cd3a5 100644 --- a/content/media/moz.build +++ b/content/media/moz.build @@ -34,7 +34,6 @@ PARALLEL_DIRS += ['webrtc'] if CONFIG['MOZ_OMX_DECODER']: PARALLEL_DIRS += ['omx'] - PARALLEL_DIRS += ['omx/mediaresourcemanager'] if CONFIG['MOZ_WEBSPEECH']: PARALLEL_DIRS += ['webspeech'] diff --git a/content/media/omx/Makefile.in b/content/media/omx/Makefile.in index 9717543d344..33f0310785f 100644 --- a/content/media/omx/Makefile.in +++ b/content/media/omx/Makefile.in @@ -18,7 +18,6 @@ include $(topsrcdir)/config/rules.mk include $(topsrcdir)/ipc/chromium/chromium-config.mk INCLUDES += \ - -I$(srcdir)/mediaresourcemanager \ -I$(topsrcdir)/ipc/chromium/src \ -I$(srcdir)/../../base/src \ -I$(srcdir)/../../html/content/src \ diff --git a/content/media/omx/MediaOmxReader.cpp b/content/media/omx/MediaOmxReader.cpp index 2db09caedaf..c34c49ec42c 100644 --- a/content/media/omx/MediaOmxReader.cpp +++ b/content/media/omx/MediaOmxReader.cpp @@ -35,7 +35,6 @@ MediaOmxReader::MediaOmxReader(AbstractMediaDecoder *aDecoder) : MediaOmxReader::~MediaOmxReader() { ResetDecode(); - mOmxDecoder.clear(); } nsresult MediaOmxReader::Init(MediaDecoderReader* aCloneDonor) @@ -43,25 +42,6 @@ nsresult MediaOmxReader::Init(MediaDecoderReader* aCloneDonor) return NS_OK; } -bool MediaOmxReader::IsWaitingMediaResources() -{ - return mOmxDecoder->IsWaitingMediaResources(); -} - -bool MediaOmxReader::IsDormantNeeded() -{ - if (!mOmxDecoder.get()) { - return false; - } - return mOmxDecoder->IsDormantNeeded(); -} - -void MediaOmxReader::ReleaseMediaResources() -{ - ResetDecode(); - mOmxDecoder->ReleaseMediaResources(); -} - nsresult MediaOmxReader::ReadMetadata(VideoInfo* aInfo, MetadataTags** aTags) { @@ -76,14 +56,6 @@ nsresult MediaOmxReader::ReadMetadata(VideoInfo* aInfo, } } - if (!mOmxDecoder->TryLoad()) { - return NS_ERROR_FAILURE; - } - - if (IsWaitingMediaResources()) { - return NS_OK; - } - // Set the total duration (the max of the audio and video track). int64_t durationUs; mOmxDecoder->GetDuration(&durationUs); @@ -140,6 +112,8 @@ nsresult MediaOmxReader::ResetDecode() if (container) { container->ClearCurrentFrame(); } + + mOmxDecoder.clear(); return NS_OK; } diff --git a/content/media/omx/MediaOmxReader.h b/content/media/omx/MediaOmxReader.h index 13a36c595c6..9165740cc87 100644 --- a/content/media/omx/MediaOmxReader.h +++ b/content/media/omx/MediaOmxReader.h @@ -54,11 +54,6 @@ public: return mHasVideo; } - virtual bool IsWaitingMediaResources(); - - virtual bool IsDormantNeeded(); - virtual void ReleaseMediaResources(); - virtual nsresult ReadMetadata(VideoInfo* aInfo, MetadataTags** aTags); virtual nsresult Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime); diff --git a/content/media/omx/OMXCodecProxy.cpp b/content/media/omx/OMXCodecProxy.cpp deleted file mode 100644 index 253548dd0d7..00000000000 --- a/content/media/omx/OMXCodecProxy.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "OMXCodecProxy" - -#include -#include -#include -#include -#include - -#include "nsDebug.h" - -#include "IMediaResourceManagerService.h" - -#include "OMXCodecProxy.h" - -namespace android { - -// static -sp OMXCodecProxy::Create( - const sp &omx, - const sp &meta, bool createEncoder, - const sp &source, - const char *matchComponentName, - uint32_t flags, - const sp &nativeWindow) -{ - sp proxy; - - const char *mime; - if (!meta->findCString(kKeyMIMEType, &mime)) { - return NULL; - } - - if (!strncasecmp(mime, "video/", 6)) { - proxy = new OMXCodecProxy(omx, meta, createEncoder, source, matchComponentName, flags, nativeWindow); - } - return proxy; -} - - -OMXCodecProxy::OMXCodecProxy( - const sp &omx, - const sp &meta, - bool createEncoder, - const sp &source, - const char *matchComponentName, - uint32_t flags, - const sp &nativeWindow) - : mOMX(omx), - mSrcMeta(meta), - mIsEncoder(createEncoder), - mSource(source), - mComponentName(NULL), - mFlags(flags), - mNativeWindow(nativeWindow), - mState(MediaResourceManagerClient::CLIENT_STATE_WAIT_FOR_RESOURCE) -{ -} - -OMXCodecProxy::~OMXCodecProxy() -{ - if (mOMXCodec.get()) { - wp tmp = mOMXCodec; - mOMXCodec.clear(); - while (tmp.promote() != NULL) { - // this value come from stagefrigh's AwesomePlayer. - usleep(1000); - } - } - // Complete all pending Binder ipc transactions - IPCThreadState::self()->flushCommands(); - - if (mManagerService.get() && mClient.get()) { - mManagerService->cancelClient(mClient); - } - - mSource.clear(); - free(mComponentName); - mComponentName = NULL; -} - -MediaResourceManagerClient::State OMXCodecProxy::getState() -{ - Mutex::Autolock autoLock(mLock); - return mState; -} - -void OMXCodecProxy::setEventListener(const wp& listener) -{ - Mutex::Autolock autoLock(mLock); - mEventListener = listener; -} - -void OMXCodecProxy::notifyStatusChangedLocked() -{ - if (mEventListener != NULL) { - sp listener = mEventListener.promote(); - if (listener != NULL) { - listener->statusChanged(); - } - } -} - -void OMXCodecProxy::requestResource() -{ - Mutex::Autolock autoLock(mLock); - - if (mClient.get()) { - return; - } - sp listener = this; - mClient = new MediaResourceManagerClient(listener); - - mManagerService = mClient->getMediaResourceManagerService(); - if (!mManagerService.get()) { - mClient = NULL; - return; - } - - mManagerService->requestMediaResource(mClient, MediaResourceManagerClient::HW_VIDEO_DECODER); -} - -bool OMXCodecProxy::IsWaitingResources() -{ - Mutex::Autolock autoLock(mLock); - return mState == MediaResourceManagerClient::CLIENT_STATE_WAIT_FOR_RESOURCE; -} - -// called on Binder ipc thread -void OMXCodecProxy::statusChanged(int event) -{ - Mutex::Autolock autoLock(mLock); - - if (mState != MediaResourceManagerClient::CLIENT_STATE_WAIT_FOR_RESOURCE) { - return; - } - - mState = (MediaResourceManagerClient::State) event; - - const char *mime; - if (!mSrcMeta->findCString(kKeyMIMEType, &mime)) { - return; - } - - if (!strncasecmp(mime, "video/", 6)) { - sp codec; - mOMXCodec = OMXCodec::Create(mOMX, mSrcMeta, mIsEncoder, mSource, mComponentName, mFlags, mNativeWindow); - if (mOMXCodec == NULL) { - mState = MediaResourceManagerClient::CLIENT_STATE_SHUTDOWN; - notifyStatusChangedLocked(); - return; - } - // Check if this video is sized such that we're comfortable - // possibly using an OMX decoder. - int32_t maxWidth, maxHeight; - char propValue[PROPERTY_VALUE_MAX]; - property_get("ro.moz.omx.hw.max_width", propValue, "-1"); - maxWidth = atoi(propValue); - property_get("ro.moz.omx.hw.max_height", propValue, "-1"); - maxHeight = atoi(propValue); - - int32_t width = -1, height = -1; - if (maxWidth > 0 && maxHeight > 0 && - !(mOMXCodec->getFormat()->findInt32(kKeyWidth, &width) && - mOMXCodec->getFormat()->findInt32(kKeyHeight, &height) && - width * height <= maxWidth * maxHeight)) { - printf_stderr("Failed to get video size, or it was too large for HW decoder ( but )", - width, height, maxWidth, maxHeight); - mState = MediaResourceManagerClient::CLIENT_STATE_SHUTDOWN; - notifyStatusChangedLocked(); - return; - } - - if (mOMXCodec->start() != OK) { - NS_WARNING("Couldn't start OMX video source"); - mState = MediaResourceManagerClient::CLIENT_STATE_SHUTDOWN; - notifyStatusChangedLocked(); - return; - } - } - notifyStatusChangedLocked(); -} - -status_t OMXCodecProxy::start(MetaData *params) -{ - Mutex::Autolock autoLock(mLock); - - if (!mOMXCodec.get()) { - return NO_INIT; - } - return mOMXCodec->start(); -} - -status_t OMXCodecProxy::stop() -{ - Mutex::Autolock autoLock(mLock); - - if (!mOMXCodec.get()) { - return NO_INIT; - } - return mOMXCodec->stop(); -} - -sp OMXCodecProxy::getFormat() -{ - Mutex::Autolock autoLock(mLock); - - if (!mOMXCodec.get()) { - sp meta = new MetaData; - return meta; - } - return mOMXCodec->getFormat(); -} - -status_t OMXCodecProxy::read(MediaBuffer **buffer, const ReadOptions *options) -{ - Mutex::Autolock autoLock(mLock); - - if (!mOMXCodec.get()) { - return NO_INIT; - } - return mOMXCodec->read(buffer, options); -} - -status_t OMXCodecProxy::pause() -{ - Mutex::Autolock autoLock(mLock); - - if (!mOMXCodec.get()) { - return NO_INIT; - } - return mOMXCodec->pause(); -} - -} // namespace android diff --git a/content/media/omx/OMXCodecProxy.h b/content/media/omx/OMXCodecProxy.h deleted file mode 100644 index cd55d1b743c..00000000000 --- a/content/media/omx/OMXCodecProxy.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef OMX_CODEC_PROXY_DECODER_H_ -#define OMX_CODEC_PROXY_DECODER_H_ - - -#include -#include -#include -#include -#include - -#include "MediaResourceManagerClient.h" - -namespace android { - -struct MediaBufferGroup; -struct MetaData; - -class OMXCodecProxy : public MediaSource, - public MediaResourceManagerClient::EventListener -{ -public: - struct EventListener : public virtual RefBase { - virtual void statusChanged() = 0; - }; - - static sp Create( - const sp &omx, - const sp &meta, bool createEncoder, - const sp &source, - const char *matchComponentName = NULL, - uint32_t flags = 0, - const sp &nativeWindow = NULL); - - MediaResourceManagerClient::State getState(); - - void setEventListener(const wp& listener); - - void requestResource(); - bool IsWaitingResources(); - - // MediaResourceManagerClient::EventListener - virtual void statusChanged(int event); - - // MediaSource - virtual status_t start(MetaData *params = NULL); - virtual status_t stop(); - - virtual sp getFormat(); - - virtual status_t read( - MediaBuffer **buffer, const ReadOptions *options = NULL); - - virtual status_t pause(); - -protected: - OMXCodecProxy( - const sp &omx, - const sp &meta, - bool createEncoder, - const sp &source, - const char *matchComponentName, - uint32_t flags, - const sp &nativeWindow); - - virtual ~OMXCodecProxy(); - - void notifyStatusChangedLocked(); - -private: - OMXCodecProxy(const OMXCodecProxy &); - OMXCodecProxy &operator=(const OMXCodecProxy &); - - Mutex mLock; - - sp mOMX; - sp mSrcMeta; - char *mComponentName; - bool mIsEncoder; - // Flags specified in the creation of the codec. - uint32_t mFlags; - sp mNativeWindow; - - sp mSource; - - sp mOMXCodec; - sp mClient; - MediaResourceManagerClient::State mState; - - sp mManagerService; - wp mEventListener; -}; - -} // namespace android - -#endif // OMX_CODEC_PROXY_DECODER_H_ diff --git a/content/media/omx/OmxDecoder.cpp b/content/media/omx/OmxDecoder.cpp index 7a7b45a453d..796ff0c5251 100644 --- a/content/media/omx/OmxDecoder.cpp +++ b/content/media/omx/OmxDecoder.cpp @@ -22,7 +22,6 @@ #include "GonkNativeWindow.h" #include "GonkNativeWindowClient.h" -#include "OMXCodecProxy.h" #include "OmxDecoder.h" #ifdef PR_LOGGING @@ -164,7 +163,22 @@ OmxDecoder::OmxDecoder(MediaResource *aResource, OmxDecoder::~OmxDecoder() { - ReleaseMediaResources(); + { + // Free all pending video buffers. + Mutex::Autolock autoLock(mSeekLock); + ReleaseAllPendingVideoBuffersLocked(); + } + + ReleaseVideoBuffer(); + ReleaseAudioBuffer(); + + if (mVideoSource.get()) { + mVideoSource->stop(); + } + + if (mAudioSource.get()) { + mAudioSource->stop(); + } // unregister AMessage handler from ALooper. mLooper->unregisterHandler(mReflector->id()); @@ -172,15 +186,19 @@ OmxDecoder::~OmxDecoder() mLooper->stop(); } -void OmxDecoder::statusChanged() -{ - mozilla::ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - mDecoder->GetReentrantMonitor().NotifyAll(); -} +class AutoStopMediaSource { + sp mMediaSource; +public: + AutoStopMediaSource(const sp& aMediaSource) : mMediaSource(aMediaSource) { + } + + ~AutoStopMediaSource() { + mMediaSource->stop(); + } +}; static sp sOMX = nullptr; -static sp GetOMX() -{ +static sp GetOMX() { if(sOMX.get() == nullptr) { sOMX = new OMX; } @@ -213,6 +231,7 @@ bool OmxDecoder::Init() { ssize_t audioTrackIndex = -1; ssize_t videoTrackIndex = -1; + const char *audioMime = nullptr; for (size_t i = 0; i < extractor->countTracks(); ++i) { sp meta = extractor->getTrackMetaData(i); @@ -230,6 +249,7 @@ bool OmxDecoder::Init() { videoTrackIndex = i; } else if (audioTrackIndex == -1 && !strncasecmp(mime, "audio/", 6)) { audioTrackIndex = i; + audioMime = mime; } } @@ -240,52 +260,134 @@ bool OmxDecoder::Init() { mResource->SetReadMode(MediaCacheStream::MODE_PLAYBACK); - if (videoTrackIndex != -1) { - mVideoTrack = extractor->getTrack(videoTrackIndex); - } + int64_t totalDurationUs = 0; - if (audioTrackIndex != -1) { - mAudioTrack = extractor->getTrack(audioTrackIndex); - } - return true; -} + mNativeWindow = new GonkNativeWindow(); + mNativeWindowClient = new GonkNativeWindowClient(mNativeWindow); -bool OmxDecoder::TryLoad() { + // OMXClient::connect() always returns OK and abort's fatally if + // it can't connect. + OMXClient client; + DebugOnly err = client.connect(); + NS_ASSERTION(err == OK, "Failed to connect to OMX in mediaserver."); + sp omx = client.interface(); - if (!AllocateMediaResources()) { - return false; - } + sp videoTrack; + sp videoSource; + if (videoTrackIndex != -1 && (videoTrack = extractor->getTrack(videoTrackIndex)) != nullptr) { + // Experience with OMX codecs is that only the HW decoders are + // worth bothering with, at least on the platforms where this code + // is currently used, and for formats this code is currently used + // for (h.264). So if we don't get a hardware decoder, just give + // up. + int flags = kHardwareCodecsOnly; - //check if video is waiting resources - if (mVideoSource.get()) { - if (mVideoSource->IsWaitingResources()) { - return true; + char propQemu[PROPERTY_VALUE_MAX]; + property_get("ro.kernel.qemu", propQemu, ""); + if (!strncmp(propQemu, "1", 1)) { + // If we are in emulator, allow to fall back to software. + flags = 0; + } + videoSource = OMXCodec::Create(omx, + videoTrack->getFormat(), + false, // decoder + videoTrack, + nullptr, + flags, + mNativeWindowClient); + if (videoSource == nullptr) { + NS_WARNING("Couldn't create OMX video source"); + return false; + } + + // Check if this video is sized such that we're comfortable + // possibly using an OMX decoder. + int32_t maxWidth, maxHeight; + char propValue[PROPERTY_VALUE_MAX]; + property_get("ro.moz.omx.hw.max_width", propValue, "-1"); + maxWidth = atoi(propValue); + property_get("ro.moz.omx.hw.max_height", propValue, "-1"); + maxHeight = atoi(propValue); + + int32_t width = -1, height = -1; + if (maxWidth > 0 && maxHeight > 0 && + !(videoSource->getFormat()->findInt32(kKeyWidth, &width) && + videoSource->getFormat()->findInt32(kKeyHeight, &height) && + width * height <= maxWidth * maxHeight)) { + printf_stderr("Failed to get video size, or it was too large for HW decoder ( but )", + width, height, maxWidth, maxHeight); + return false; + } + + if (videoSource->start() != OK) { + NS_WARNING("Couldn't start OMX video source"); + return false; + } + + int64_t durationUs; + if (videoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { + if (durationUs > totalDurationUs) + totalDurationUs = durationUs; } } - // calculate duration - int64_t totalDurationUs = 0; - int64_t durationUs = 0; - if (mVideoTrack.get() && mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { - if (durationUs > totalDurationUs) - totalDurationUs = durationUs; - } - if (mAudioTrack.get() && mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { - if (durationUs > totalDurationUs) - totalDurationUs = durationUs; + sp audioTrack; + sp audioSource; + if (audioTrackIndex != -1 && (audioTrack = extractor->getTrack(audioTrackIndex)) != nullptr) + { + if (!strcasecmp(audioMime, "audio/raw")) { + audioSource = audioTrack; + } else { + // try to load hardware codec in mediaserver process. + int flags = kHardwareCodecsOnly; + audioSource = OMXCodec::Create(omx, + audioTrack->getFormat(), + false, // decoder + audioTrack, + nullptr, + flags); + } + if (audioSource == nullptr) { + // try to load software codec in this process. + int flags = kSoftwareCodecsOnly; + audioSource = OMXCodec::Create(GetOMX(), + audioTrack->getFormat(), + false, // decoder + audioTrack, + nullptr, + flags); + if (audioSource == nullptr) { + NS_WARNING("Couldn't create OMX audio source"); + return false; + } + } + if (audioSource->start() != OK) { + NS_WARNING("Couldn't start OMX audio source"); + return false; + } + + int64_t durationUs; + if (audioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { + if (durationUs > totalDurationUs) + totalDurationUs = durationUs; + } } + + // set decoder state + mVideoTrack = videoTrack; + mVideoSource = videoSource; + mAudioTrack = audioTrack; + mAudioSource = audioSource; mDurationUs = totalDurationUs; - // read video metadata if (mVideoSource.get() && !SetVideoFormat()) { NS_WARNING("Couldn't set OMX video format"); return false; } - // read audio metadata + // To reliably get the channel and sample rate data we need to read from the + // audio source until we get a INFO_FORMAT_CHANGE status if (mAudioSource.get()) { - // To reliably get the channel and sample rate data we need to read from the - // audio source until we get a INFO_FORMAT_CHANGE status status_t err = mAudioSource->read(&mAudioBuffer); if (err != INFO_FORMAT_CHANGED) { if (err != OK) { @@ -309,132 +411,6 @@ bool OmxDecoder::TryLoad() { return true; } -bool OmxDecoder::IsDormantNeeded() -{ - if (mVideoTrack.get()) { - return true; - } - return false; -} - -bool OmxDecoder::IsWaitingMediaResources() -{ - if (mVideoSource.get()) { - return mVideoSource->IsWaitingResources(); - } - return false; -} - -bool OmxDecoder::AllocateMediaResources() -{ - // OMXClient::connect() always returns OK and abort's fatally if - // it can't connect. - OMXClient client; - DebugOnly err = client.connect(); - NS_ASSERTION(err == OK, "Failed to connect to OMX in mediaserver."); - sp omx = client.interface(); - - if ((mVideoTrack != nullptr) && (mVideoSource == nullptr)) { - mNativeWindow = new GonkNativeWindow(); - mNativeWindowClient = new GonkNativeWindowClient(mNativeWindow); - - // Experience with OMX codecs is that only the HW decoders are - // worth bothering with, at least on the platforms where this code - // is currently used, and for formats this code is currently used - // for (h.264). So if we don't get a hardware decoder, just give - // up. - int flags = kHardwareCodecsOnly; - - char propQemu[PROPERTY_VALUE_MAX]; - property_get("ro.kernel.qemu", propQemu, ""); - if (!strncmp(propQemu, "1", 1)) { - // If we are in emulator, allow to fall back to software. - flags = 0; - } - mVideoSource = - OMXCodecProxy::Create(omx, - mVideoTrack->getFormat(), - false, // decoder - mVideoTrack, - nullptr, - flags, - mNativeWindowClient); - if (mVideoSource == nullptr) { - NS_WARNING("Couldn't create OMX video source"); - return false; - } else { - sp listener = this; - mVideoSource->setEventListener(listener); - mVideoSource->requestResource(); - } - } - - if ((mAudioTrack != nullptr) && (mAudioSource == nullptr)) { - const char *audioMime = nullptr; - sp meta = mAudioTrack->getFormat(); - if (!meta->findCString(kKeyMIMEType, &audioMime)) { - return false; - } - if (!strcasecmp(audioMime, "audio/raw")) { - mAudioSource = mAudioTrack; - } else { - // try to load hardware codec in mediaserver process. - int flags = kHardwareCodecsOnly; - mAudioSource = OMXCodec::Create(omx, - mAudioTrack->getFormat(), - false, // decoder - mAudioTrack, - nullptr, - flags); - } - - if (mAudioSource == nullptr) { - // try to load software codec in this process. - int flags = kSoftwareCodecsOnly; - mAudioSource = OMXCodec::Create(GetOMX(), - mAudioTrack->getFormat(), - false, // decoder - mAudioTrack, - nullptr, - flags); - if (mAudioSource == nullptr) { - NS_WARNING("Couldn't create OMX audio source"); - return false; - } - } - if (mAudioSource->start() != OK) { - NS_WARNING("Couldn't start OMX audio source"); - return false; - } - } - return true; -} - - -void OmxDecoder::ReleaseMediaResources() { - { - // Free all pending video buffers. - Mutex::Autolock autoLock(mSeekLock); - ReleaseAllPendingVideoBuffersLocked(); - } - - ReleaseVideoBuffer(); - ReleaseAudioBuffer(); - - if (mVideoSource.get()) { - mVideoSource->stop(); - mVideoSource.clear(); - } - - if (mAudioSource.get()) { - mAudioSource->stop(); - mAudioSource.clear(); - } - - mNativeWindowClient.clear(); - mNativeWindow.clear(); -} - bool OmxDecoder::SetVideoFormat() { const char *componentName; @@ -723,8 +699,7 @@ bool OmxDecoder::ReadAudio(AudioFrame *aFrame, int64_t aSeekTimeUs) return true; } -nsresult OmxDecoder::Play() -{ +nsresult OmxDecoder::Play() { if (!mPaused) { return NS_OK; } @@ -739,8 +714,7 @@ nsresult OmxDecoder::Play() return NS_OK; } -void OmxDecoder::Pause() -{ +void OmxDecoder::Pause() { if (mPaused) { return; } diff --git a/content/media/omx/OmxDecoder.h b/content/media/omx/OmxDecoder.h index 6a0b29eeaa4..79f4733b6b9 100644 --- a/content/media/omx/OmxDecoder.h +++ b/content/media/omx/OmxDecoder.h @@ -12,7 +12,6 @@ #include "MPAPI.h" #include "MediaResource.h" #include "AbstractMediaDecoder.h" -#include "OMXCodecProxy.h" namespace android { class OmxDecoder; @@ -73,7 +72,7 @@ private: MediaStreamSource &operator=(const MediaStreamSource &); }; -class OmxDecoder : public OMXCodecProxy::EventListener { +class OmxDecoder : public RefBase { typedef MPAPI::AudioFrame AudioFrame; typedef MPAPI::VideoFrame VideoFrame; typedef mozilla::MediaResource MediaResource; @@ -94,7 +93,7 @@ class OmxDecoder : public OMXCodecProxy::EventListener { sp mNativeWindow; sp mNativeWindowClient; sp mVideoTrack; - sp mVideoSource; + sp mVideoSource; sp mAudioTrack; sp mAudioSource; int32_t mVideoWidth; @@ -163,15 +162,7 @@ public: OmxDecoder(MediaResource *aResource, AbstractMediaDecoder *aDecoder); ~OmxDecoder(); - // MediaResourceManagerClient::EventListener - virtual void statusChanged(); - bool Init(); - bool TryLoad(); - bool IsDormantNeeded(); - bool IsWaitingMediaResources(); - bool AllocateMediaResources(); - void ReleaseMediaResources(); bool SetVideoFormat(); bool SetAudioFormat(); diff --git a/content/media/omx/mediaresourcemanager/IMediaResourceManagerClient.cpp b/content/media/omx/mediaresourcemanager/IMediaResourceManagerClient.cpp deleted file mode 100644 index ae5dc2983a0..00000000000 --- a/content/media/omx/mediaresourcemanager/IMediaResourceManagerClient.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "IMediaResourceManagerClient" -#include - -#include -#include - -#include - -#include "IMediaResourceManagerClient.h" - -namespace android { - -enum { - STATUS_CHANGED = IBinder::FIRST_CALL_TRANSACTION -}; - -class BpMediaResourceManagerClient : public BpInterface -{ -public: - BpMediaResourceManagerClient(const sp& impl) - : BpInterface(impl) - { - } - - void statusChanged(int event) - { - Parcel data, reply; - data.writeInterfaceToken(IMediaResourceManagerClient::getInterfaceDescriptor()); - data.writeInt32(event); - remote()->transact(STATUS_CHANGED, data, &reply, IBinder::FLAG_ONEWAY); - } -}; - -IMPLEMENT_META_INTERFACE(MediaResourceManagerClient, "android.media.IMediaResourceManagerClient"); - -// ---------------------------------------------------------------------- - -status_t BnMediaResourceManagerClient::onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) -{ - switch(code) { - case STATUS_CHANGED: { - CHECK_INTERFACE(IMediaResourceManagerClient, data, reply); - int event = data.readInt32(); - statusChanged(event); - return NO_ERROR; - } break; - default: - return BBinder::onTransact(code, data, reply, flags); - } -} - -// ---------------------------------------------------------------------------- - -}; // namespace android diff --git a/content/media/omx/mediaresourcemanager/IMediaResourceManagerClient.h b/content/media/omx/mediaresourcemanager/IMediaResourceManagerClient.h deleted file mode 100644 index fdb0e5cc201..00000000000 --- a/content/media/omx/mediaresourcemanager/IMediaResourceManagerClient.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef ANDROID_IMEDIARESOURCEMANAGERCLIENT_H -#define ANDROID_IMEDIARESOURCEMANAGERCLIENT_H - -#include -#include - -namespace android { - -// ---------------------------------------------------------------------------- - -class IMediaResourceManagerClient : public IInterface -{ -public: - DECLARE_META_INTERFACE(MediaResourceManagerClient); - - // Notifies a change of media resource request status. - virtual void statusChanged(int event) = 0; - -}; - - -// ---------------------------------------------------------------------------- - -class BnMediaResourceManagerClient : public BnInterface -{ -public: - virtual status_t onTransact( uint32_t code, - const Parcel& data, - Parcel* reply, - uint32_t flags = 0); -}; - -// ---------------------------------------------------------------------------- - -}; // namespace android - -#endif // ANDROID_IMEDIARESOURCEMANAGERCLIENT_H diff --git a/content/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.cpp b/content/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.cpp deleted file mode 100644 index 832a7f395f9..00000000000 --- a/content/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* -** Copyright 2010, The Android Open Source Project -** Copyright 2013, Mozilla Foundation -** -** 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 "IMediaResourceManagerDeathNotifier" -#include - -#include -#include - -#include "IMediaResourceManagerDeathNotifier.h" - -namespace android { - -// client singleton for binder interface to services -Mutex IMediaResourceManagerDeathNotifier::sServiceLock; -sp IMediaResourceManagerDeathNotifier::sMediaResourceManagerService; -sp IMediaResourceManagerDeathNotifier::sDeathNotifier; -SortedVector< wp > IMediaResourceManagerDeathNotifier::sObitRecipients; - -// establish binder interface to MediaResourceManagerService -/*static*/const sp& -IMediaResourceManagerDeathNotifier::getMediaResourceManagerService() -{ - LOGV("getMediaResourceManagerService"); - Mutex::Autolock _l(sServiceLock); - if (sMediaResourceManagerService.get() == 0) { - sp sm = defaultServiceManager(); - sp binder; - do { - binder = sm->getService(String16("media.resource_manager")); - if (binder != 0) { - break; - } - LOGW("Media resource manager service not published, waiting..."); - usleep(500000); // 0.5 s - } while(true); - - if (sDeathNotifier == NULL) { - sDeathNotifier = new DeathNotifier(); - } - binder->linkToDeath(sDeathNotifier); - sMediaResourceManagerService = interface_cast(binder); - } - LOGE_IF(sMediaResourceManagerService == 0, "no media player service!?"); - return sMediaResourceManagerService; -} - -/*static*/ void -IMediaResourceManagerDeathNotifier::addObitRecipient(const wp& recipient) -{ - LOGV("addObitRecipient"); - Mutex::Autolock _l(sServiceLock); - sObitRecipients.add(recipient); -} - -/*static*/ void -IMediaResourceManagerDeathNotifier::removeObitRecipient(const wp& recipient) -{ - LOGV("removeObitRecipient"); - Mutex::Autolock _l(sServiceLock); - sObitRecipients.remove(recipient); -} - -void -IMediaResourceManagerDeathNotifier::DeathNotifier::binderDied(const wp& who) -{ - LOGW("media server died"); - - // Need to do this with the lock held - SortedVector< wp > list; - { - Mutex::Autolock _l(sServiceLock); - sMediaResourceManagerService.clear(); - list = sObitRecipients; - } - - // Notify application when media server dies. - // Don't hold the static lock during callback in case app - // makes a call that needs the lock. - size_t count = list.size(); - for (size_t iter = 0; iter < count; ++iter) { - sp notifier = list[iter].promote(); - if (notifier != 0) { - notifier->died(); - } - } -} - -IMediaResourceManagerDeathNotifier::DeathNotifier::~DeathNotifier() -{ - LOGV("DeathNotifier::~DeathNotifier"); - Mutex::Autolock _l(sServiceLock); - sObitRecipients.clear(); - if (sMediaResourceManagerService != 0) { - sMediaResourceManagerService->asBinder()->unlinkToDeath(this); - } -} - -}; // namespace android diff --git a/content/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.h b/content/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.h deleted file mode 100644 index e61377d7fbf..00000000000 --- a/content/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -** Copyright 2010, The Android Open Source Project -** Copyright 2013, Mozilla Foundation -** -** 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. -*/ - -#ifndef ANDROID_IMEDIARESOURCEMANAGERDEATHNOTIFIER_H -#define ANDROID_IMEDIARESOURCEMANAGERDEATHNOTIFIER_H - -#include -#include - -#include "IMediaResourceManagerService.h" - -namespace android { - -/** - * Handle MediaResourceManagerService's death notification. - * Made from android's IMediaDeathNotifier class. - */ -class IMediaResourceManagerDeathNotifier: virtual public RefBase -{ -public: - IMediaResourceManagerDeathNotifier() { addObitRecipient(this); } - virtual ~IMediaResourceManagerDeathNotifier() { removeObitRecipient(this); } - - virtual void died() = 0; - static const sp& getMediaResourceManagerService(); - -private: - IMediaResourceManagerDeathNotifier &operator=(const IMediaResourceManagerDeathNotifier &); - IMediaResourceManagerDeathNotifier(const IMediaResourceManagerDeathNotifier &); - - static void addObitRecipient(const wp& recipient); - static void removeObitRecipient(const wp& recipient); - - class DeathNotifier: public IBinder::DeathRecipient - { - public: - DeathNotifier() {} - virtual ~DeathNotifier(); - - virtual void binderDied(const wp& who); - }; - - friend class DeathNotifier; - - static Mutex sServiceLock; - static sp sMediaResourceManagerService; - static sp sDeathNotifier; - static SortedVector< wp > sObitRecipients; -}; - -}; // namespace android - -#endif // ANDROID_IMEDIARESOURCEMANAGERDEATHNOTIFIER_H diff --git a/content/media/omx/mediaresourcemanager/IMediaResourceManagerService.cpp b/content/media/omx/mediaresourcemanager/IMediaResourceManagerService.cpp deleted file mode 100644 index 5a6e7da6fce..00000000000 --- a/content/media/omx/mediaresourcemanager/IMediaResourceManagerService.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "IMediaResourceManagerService" - -#include -#include - -#include -#include - -#include "IMediaResourceManagerService.h" - -namespace android { - -/** - * Function ID used between BpMediaResourceManagerService and - * BnMediaResourceManagerService by using Binder ipc. - */ -enum { - REQUEST_MEDIA_RESOURCE = IBinder::FIRST_CALL_TRANSACTION, - DEREGISTER_CLIENT -}; - -class BpMediaResourceManagerService : public BpInterface -{ -public: - BpMediaResourceManagerService(const sp& impl) - : BpInterface(impl) - { - } - - virtual void requestMediaResource(const sp& client, int resourceType) - { - Parcel data, reply; - data.writeInterfaceToken(IMediaResourceManagerService::getInterfaceDescriptor()); - data.writeStrongBinder(client->asBinder()); - data.writeInt32(resourceType); - remote()->transact(REQUEST_MEDIA_RESOURCE, data, &reply); - } - - virtual status_t cancelClient(const sp& client) - { - Parcel data, reply; - data.writeInterfaceToken(IMediaResourceManagerService::getInterfaceDescriptor()); - data.writeStrongBinder(client->asBinder()); - remote()->transact(DEREGISTER_CLIENT, data, &reply); - return reply.readInt32(); - } -}; - -IMPLEMENT_META_INTERFACE(MediaResourceManagerService, "android.media.IMediaResourceManagerService"); - -// ---------------------------------------------------------------------- - -status_t BnMediaResourceManagerService::onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) -{ - switch(code) { - - case REQUEST_MEDIA_RESOURCE: { - CHECK_INTERFACE(IMediaResourceManagerService, data, reply); - sp client = interface_cast(data.readStrongBinder()); - int resourceType = data.readInt32(); - requestMediaResource(client, resourceType); - return NO_ERROR; - } break; - case DEREGISTER_CLIENT: { - CHECK_INTERFACE(IMediaResourceManagerService, data, reply); - sp client = interface_cast(data.readStrongBinder()); - cancelClient(client); - reply->writeInt32(NO_ERROR); - return NO_ERROR; - } break; - default: - return BBinder::onTransact(code, data, reply, flags); - } -} - -// ---------------------------------------------------------------------------- - -}; // namespace android diff --git a/content/media/omx/mediaresourcemanager/IMediaResourceManagerService.h b/content/media/omx/mediaresourcemanager/IMediaResourceManagerService.h deleted file mode 100644 index 4ce31e9e7f0..00000000000 --- a/content/media/omx/mediaresourcemanager/IMediaResourceManagerService.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef ANDROID_IMEDIARESOURCEMANAGERSERVICE_H -#define ANDROID_IMEDIARESOURCEMANAGERSERVICE_H - -#include -#include - -#include "IMediaResourceManagerClient.h" - - -namespace android { - -// ---------------------------------------------------------------------------- - -class IMediaResourceManagerService : public IInterface -{ -public: - DECLARE_META_INTERFACE(MediaResourceManagerService); - - // Request a media resource for IMediaResourceManagerClient. - virtual void requestMediaResource(const sp& client, int resourceType) = 0; - // Cancel a media resource request and a resource allocated to IMediaResourceManagerClient. - virtual status_t cancelClient(const sp& client) = 0; -}; - - -// ---------------------------------------------------------------------------- - -class BnMediaResourceManagerService : public BnInterface -{ -public: - virtual status_t onTransact( uint32_t code, - const Parcel& data, - Parcel* reply, - uint32_t flags = 0); -}; - -// ---------------------------------------------------------------------------- - -}; // namespace android - -#endif // ANDROID_IMEDIARESOURCEMANAGERSERVICE_H diff --git a/content/media/omx/mediaresourcemanager/Makefile.in b/content/media/omx/mediaresourcemanager/Makefile.in deleted file mode 100644 index fc56f8d6078..00000000000 --- a/content/media/omx/mediaresourcemanager/Makefile.in +++ /dev/null @@ -1,27 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this file, -# You can obtain one at http://mozilla.org/MPL/2.0/. - -DEPTH = @DEPTH@ -topsrcdir = @top_srcdir@ -srcdir = @srcdir@ -VPATH = @srcdir@ - -include $(DEPTH)/config/autoconf.mk - -LIBRARY_NAME = mediaresourcemanager - -FORCE_STATIC_LIB = 1 - -include $(topsrcdir)/config/rules.mk -include $(topsrcdir)/ipc/chromium/chromium-config.mk - -INCLUDES += \ - -I$(srcdir)/ \ - -I$(ANDROID_SOURCE)/frameworks/base/include/ \ - -I$(ANDROID_SOURCE)/frameworks/base/include/binder/ \ - -I$(ANDROID_SOURCE)/frameworks/base/include/utils/ \ - -I$(ANDROID_SOURCE)/frameworks/base/include/media/ \ - -I$(ANDROID_SOURCE)/frameworks/base/include/media/stagefright/openmax \ - -I$(ANDROID_SOURCE)/frameworks/base/media/libstagefright/include/ \ - $(NULL) diff --git a/content/media/omx/mediaresourcemanager/MediaResourceManagerClient.cpp b/content/media/omx/mediaresourcemanager/MediaResourceManagerClient.cpp deleted file mode 100644 index d39816c6956..00000000000 --- a/content/media/omx/mediaresourcemanager/MediaResourceManagerClient.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "MediaResourceManagerClient" - -#include - -#include "MediaResourceManagerClient.h" - -namespace android { - -MediaResourceManagerClient::MediaResourceManagerClient(const wp& listener) - : mEventListener(listener) -{ -} - -void MediaResourceManagerClient::statusChanged(int event) -{ - if (mEventListener != NULL) { - sp listener = mEventListener.promote(); - if (listener != NULL) { - listener->statusChanged(event); - } - } -} - -void MediaResourceManagerClient::died() -{ - sp listener = mEventListener.promote(); - if (listener != NULL) { - listener->statusChanged(CLIENT_STATE_SHUTDOWN); - } -} - -}; // namespace android - diff --git a/content/media/omx/mediaresourcemanager/MediaResourceManagerClient.h b/content/media/omx/mediaresourcemanager/MediaResourceManagerClient.h deleted file mode 100644 index 94748963574..00000000000 --- a/content/media/omx/mediaresourcemanager/MediaResourceManagerClient.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef ANDROID_MEDIARESOURCEMANAGERCLIENT_H -#define ANDROID_MEDIARESOURCEMANAGERCLIENT_H - -#include "IMediaResourceManagerClient.h" -#include "IMediaResourceManagerDeathNotifier.h" - -namespace android { - -class MediaResourceManagerClient: public BnMediaResourceManagerClient, - public virtual IMediaResourceManagerDeathNotifier -{ -public: - // Enumeration for the valid decoding states - enum State { - CLIENT_STATE_WAIT_FOR_RESOURCE, - CLIENT_STATE_RESOURCE_ASSIGNED, - CLIENT_STATE_SHUTDOWN - }; - // Enumeration for the resource types - enum ResourceType { - HW_VIDEO_DECODER, - HW_AUDIO_DECODER, - HW_CAMERA - }; - - struct EventListener : public virtual RefBase { - // Notifies a change of media resource request status. - virtual void statusChanged(int event) = 0; - }; - - MediaResourceManagerClient(const wp& listener); - - // DeathRecipient - void died(); - - // IMediaResourceManagerClient - virtual void statusChanged(int event); - -private: - wp mEventListener; -}; - -}; // namespace android - -#endif // ANDROID_IMEDIARESOURCEMANAGERCLIENT_H diff --git a/content/media/omx/mediaresourcemanager/MediaResourceManagerService.cpp b/content/media/omx/mediaresourcemanager/MediaResourceManagerService.cpp deleted file mode 100644 index 13e13cb8577..00000000000 --- a/content/media/omx/mediaresourcemanager/MediaResourceManagerService.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "MediaResourceManagerService" - -#include -#include -#include - -#include "MediaResourceManagerClient.h" -#include "MediaResourceManagerService.h" - -namespace android { - -int waitBeforeAdding(const android::String16& serviceName) -{ - android::sp sm = android::defaultServiceManager(); - for ( int i = 0 ; i < 5; i++ ) { - if ( sm->checkService ( serviceName ) != NULL ) { - sleep(1); - } - else { - //good to go; - return 0; - } - } - // time out failure - return -1; -} - -// Wait until service manager is started -void -waitServiceManager() -{ - android::sp sm; - do { - sm = android::defaultServiceManager(); - if (sm.get()) { - break; - } - usleep(50000); // 0.05 s - } while(true); -} - -/* static */ -void MediaResourceManagerService::instantiate() { - waitServiceManager(); - waitBeforeAdding( android::String16("media.resource_manager") ); - - defaultServiceManager()->addService( - String16("media.resource_manager"), new MediaResourceManagerService()); -} - -MediaResourceManagerService::MediaResourceManagerService() - : mVideoDecoderCount(VIDEO_DECODER_COUNT) -{ - mLooper = new ALooper; - mLooper->setName("MediaResourceManagerService"); - - mReflector = new AHandlerReflector(this); - // Register AMessage handler to ALooper. - mLooper->registerHandler(mReflector); - // Start ALooper thread. - mLooper->start(); -} - -MediaResourceManagerService::~MediaResourceManagerService() -{ - // Unregister AMessage handler from ALooper. - mLooper->unregisterHandler(mReflector->id()); - // Stop ALooper thread. - mLooper->stop(); -} - -void MediaResourceManagerService::binderDied(const wp& who) -{ - if (who != NULL) { - sp binder = who.promote(); - if (binder != NULL) { - cancelClientLocked(binder); - } - } -} - -void MediaResourceManagerService::requestMediaResource(const sp& client, int resourceType) -{ - if (resourceType != MediaResourceManagerClient::HW_VIDEO_DECODER) { - // Support only HW_VIDEO_DECODER - return; - } - - { - Mutex::Autolock autoLock(mLock); - sp binder = client->asBinder(); - mVideoCodecRequestQueue.push_back(binder); - binder->linkToDeath(this); - } - - sp notify = - new AMessage(kNotifyRequest, mReflector->id()); - // Post AMessage to MediaResourceManagerService via ALooper. - notify->post(); -} - -status_t MediaResourceManagerService::cancelClient(const sp& client) -{ - { - Mutex::Autolock autoLock(mLock); - sp binder = client->asBinder(); - cancelClientLocked(binder); - } - - sp notify = - new AMessage(kNotifyRequest, mReflector->id()); - // Post AMessage to MediaResourceManagerService via ALooper. - notify->post(); - - return NO_ERROR; -} - -// Called on ALooper thread. -void MediaResourceManagerService::onMessageReceived(const sp &msg) -{ - Mutex::Autolock autoLock(mLock); - - // Exit if no request. - if (mVideoCodecRequestQueue.empty()) { - return; - } - - // Check if resource is available - int found = -1; - for (int i=0 ; i client = interface_cast(mVideoDecoderSlots[found].mClient); - client->statusChanged(MediaResourceManagerClient::CLIENT_STATE_RESOURCE_ASSIGNED); -} - -void MediaResourceManagerService::cancelClientLocked(const sp& binder) -{ - // Clear the request from request queue. - Fifo::iterator it(mVideoCodecRequestQueue.begin()); - while (it != mVideoCodecRequestQueue.end()) { - if (*it == binder) { - *it = NULL; - continue; - } - it++; - } - - // Clear the client from the resource - for (int i=0 ; iunlinkToDeath(this); -} - -}; // namespace android - diff --git a/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h b/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h deleted file mode 100644 index af4755030e4..00000000000 --- a/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h +++ /dev/null @@ -1,95 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef ANDROID_MEDIARESOURCEMANAGERSERVICE_H -#define ANDROID_MEDIARESOURCEMANAGERSERVICE_H - -#include -#include -#include -#include -#include - -#include "IMediaResourceManagerClient.h" -#include "IMediaResourceManagerService.h" - -namespace android { - -/** - * Manage permissions of using media resources(hw decoder, hw encoder, camera) - * XXX Current implementaion support only one hw video decoder. - * Need to extend to support multiple instance and other resources. - */ -class MediaResourceManagerService: public BnMediaResourceManagerService, - public IBinder::DeathRecipient -{ -public: - // The maximum number of hardware decoders available. - enum { VIDEO_DECODER_COUNT = 1 }; - - enum { - kNotifyRequest = 'noti' - }; - - // Instantiate MediaResourceManagerService and register to service manager. - // If service manager is not present, wait until service manager becomes present. - static void instantiate(); - - // DeathRecipient - virtual void binderDied(const wp& who); - - // derived from IMediaResourceManagerService - virtual void requestMediaResource(const sp& client, int resourceType); - virtual status_t cancelClient(const sp& client); - - // Receive a message from AHandlerReflector. - // Called on ALooper thread. - void onMessageReceived(const sp &msg); - -protected: - MediaResourceManagerService(); - virtual ~MediaResourceManagerService(); - -protected: - // Represent a media resouce. - // Hold a IMediaResourceManagerClient that got a media resource as IBinder. - struct ResourceSlot { - ResourceSlot () - { - } - sp mClient; - }; - - void cancelClientLocked(const sp& binder); - - // mVideoDecoderSlots is the array of slots that represent a media resource. - ResourceSlot mVideoDecoderSlots[VIDEO_DECODER_COUNT]; - // The maximum number of hardware decoders available on the device. - int mVideoDecoderCount; - - // The lock protects mVideoDecoderSlots and mVideoCodecRequestQueue called - // from multiple threads. - Mutex mLock; - typedef Vector > Fifo; - // Queue of media resource requests. - // Hold IMediaResourceManagerClient that requesting a media resource as IBinder. - Fifo mVideoCodecRequestQueue; - - // ALooper is a message loop used in stagefright. - // It creates a thread for messages and handles messages in the thread. - // ALooper is a clone of Looper in android Java. - // http://developer.android.com/reference/android/os/Looper.html - sp mLooper; - // deliver a message to a wrapped object(OmxDecoder). - // AHandlerReflector is similar to Handler in android Java. - // http://developer.android.com/reference/android/os/Handler.html - sp > mReflector; - -}; - -}; // namespace android - -#endif // ANDROID_MEDIARESOURCEMANAGERSERVICE_H diff --git a/content/media/omx/mediaresourcemanager/moz.build b/content/media/omx/mediaresourcemanager/moz.build deleted file mode 100644 index e759be0a577..00000000000 --- a/content/media/omx/mediaresourcemanager/moz.build +++ /dev/null @@ -1,16 +0,0 @@ -# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -MODULE = 'content' - -CPP_SOURCES += [ - 'IMediaResourceManagerClient.cpp', - 'IMediaResourceManagerDeathNotifier.cpp', - 'IMediaResourceManagerService.cpp', - 'MediaResourceManagerClient.cpp', - 'MediaResourceManagerService.cpp', -] - diff --git a/content/media/omx/moz.build b/content/media/omx/moz.build index 4ad2d79a184..57aa713dcf1 100644 --- a/content/media/omx/moz.build +++ b/content/media/omx/moz.build @@ -15,6 +15,5 @@ CPP_SOURCES += [ 'MediaOmxDecoder.cpp', 'MediaOmxReader.cpp', 'OmxDecoder.cpp', - 'OMXCodecProxy.cpp', ] diff --git a/layout/build/Makefile.in b/layout/build/Makefile.in index 9d7a855a8bc..b3feaf93a87 100644 --- a/layout/build/Makefile.in +++ b/layout/build/Makefile.in @@ -115,7 +115,6 @@ ifdef MOZ_OMX_DECODER #{ # include OMX decoder SHARED_LIBRARY_LIBS += \ $(DEPTH)/content/media/omx/$(LIB_PREFIX)gkconomx_s.$(LIB_SUFFIX) \ - $(DEPTH)/content/media/omx/mediaresourcemanager/$(LIB_PREFIX)mediaresourcemanager.$(LIB_SUFFIX) \ $(NULL) endif #} diff --git a/widget/gonk/Makefile.in b/widget/gonk/Makefile.in index 71f3246bffb..2e18994c53f 100644 --- a/widget/gonk/Makefile.in +++ b/widget/gonk/Makefile.in @@ -43,7 +43,6 @@ LOCAL_INCLUDES += \ -I$(topsrcdir)/content/events/src \ -I$(topsrcdir)/gfx/skia/include/core \ -I$(topsrcdir)/gfx/skia/include/config \ - -I$(topsrcdir)/content/media/omx/mediaresourcemanager \ -I$(srcdir) \ $(NULL) diff --git a/widget/gonk/nsAppShell.cpp b/widget/gonk/nsAppShell.cpp index 454c7debf0e..a42bd6c8432 100644 --- a/widget/gonk/nsAppShell.cpp +++ b/widget/gonk/nsAppShell.cpp @@ -30,7 +30,6 @@ #include "base/basictypes.h" #include "nscore.h" -#include "MediaResourceManagerService.h" #include "mozilla/FileUtils.h" #include "mozilla/Hal.h" #include "mozilla/Mutex.h" @@ -640,10 +639,6 @@ nsAppShell::Init() InitGonkMemoryPressureMonitoring(); - if (XRE_GetProcessType() == GeckoProcessType_Default) { - android::MediaResourceManagerService::instantiate(); - } - nsCOMPtr obsServ = GetObserverService(); if (obsServ) { obsServ->AddObserver(this, "browser-ui-startup-complete", false);