This commit is contained in:
Wes Kocher 2014-04-02 19:06:17 -07:00
Родитель 12bd9435bc 66a91c7f58
Коммит b42cc30cf7
20 изменённых файлов: 281 добавлений и 145 удалений

Просмотреть файл

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia.git" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d11f524d00cacf5ba0dfbf25e4aa2158b1c3a036"/> <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d11f524d00cacf5ba0dfbf25e4aa2158b1c3a036"/>

Просмотреть файл

@ -12,12 +12,12 @@
<!--original fetch url was https://git.mozilla.org/releases--> <!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<!-- B2G specific things. --> <!-- B2G specific things. -->
<project name="platform_build" path="build" remote="b2g" revision="15d69a6789c638709911507f74d25c0425963636"> <project name="platform_build" path="build" remote="b2g" revision="f6a198295f65ac38f8511803654a3583a1c666af">
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="70b698c2e8d1764a1e27527a102df6452e405b9a"/> <project name="moztt" path="external/moztt" remote="b2g" revision="70b698c2e8d1764a1e27527a102df6452e405b9a"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="89c5816399e71bda92a8959b5b771c04d6672ea3"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="89c5816399e71bda92a8959b5b771c04d6672ea3"/>

Просмотреть файл

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="a9e08b91e9cd1f0930f16cfc49ec72f63575d5fe"> <project name="platform_build" path="build" remote="b2g" revision="a9e08b91e9cd1f0930f16cfc49ec72f63575d5fe">
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="70b698c2e8d1764a1e27527a102df6452e405b9a"/> <project name="moztt" path="external/moztt" remote="b2g" revision="70b698c2e8d1764a1e27527a102df6452e405b9a"/>

Просмотреть файл

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia.git" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d11f524d00cacf5ba0dfbf25e4aa2158b1c3a036"/> <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d11f524d00cacf5ba0dfbf25e4aa2158b1c3a036"/>

Просмотреть файл

@ -4,6 +4,6 @@
"remote": "", "remote": "",
"branch": "" "branch": ""
}, },
"revision": "c23b496987e1e356c1cf7cc848c69511f6db041a", "revision": "f2784b078a4b58c1f0af8238d5325d0f05dc9fc0",
"repo_path": "/integration/gaia-central" "repo_path": "/integration/gaia-central"
} }

Просмотреть файл

@ -17,7 +17,7 @@
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia.git" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/>

Просмотреть файл

@ -15,7 +15,7 @@
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia.git" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/>

Просмотреть файл

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia.git" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/>

Просмотреть файл

@ -17,7 +17,7 @@
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia.git" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/>

Просмотреть файл

@ -12,12 +12,12 @@
<!--original fetch url was https://git.mozilla.org/releases--> <!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<!-- B2G specific things. --> <!-- B2G specific things. -->
<project name="platform_build" path="build" remote="b2g" revision="15d69a6789c638709911507f74d25c0425963636"> <project name="platform_build" path="build" remote="b2g" revision="f6a198295f65ac38f8511803654a3583a1c666af">
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="70b698c2e8d1764a1e27527a102df6452e405b9a"/> <project name="moztt" path="external/moztt" remote="b2g" revision="70b698c2e8d1764a1e27527a102df6452e405b9a"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="89c5816399e71bda92a8959b5b771c04d6672ea3"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="89c5816399e71bda92a8959b5b771c04d6672ea3"/>

Просмотреть файл

@ -17,7 +17,7 @@
<copyfile dest="Makefile" src="core/root.mk"/> <copyfile dest="Makefile" src="core/root.mk"/>
</project> </project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="04d96dd43e2c5c673a0c73b5a65faeb115c2065f"/> <project name="gaia.git" path="gaia" remote="mozillaorg" revision="f64a5aec7d8138d85de6862b8c6b999abc55acca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="266bca6e60dad43e395f38b66edabe8bdc882334"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1f6a1fe07f81c5bc5e1d079c9b60f7f78ca2bf4f"/>

Просмотреть файл

@ -160,6 +160,7 @@ MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder,
bool aRealTime) : bool aRealTime) :
mDecoder(aDecoder), mDecoder(aDecoder),
mState(DECODER_STATE_DECODING_METADATA), mState(DECODER_STATE_DECODING_METADATA),
mInRunningStateMachine(false),
mSyncPointInMediaStream(-1), mSyncPointInMediaStream(-1),
mSyncPointInDecodedStream(-1), mSyncPointInDecodedStream(-1),
mResetPlayStartTime(false), mResetPlayStartTime(false),
@ -191,10 +192,7 @@ MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder,
mDispatchedEventToDecode(false), mDispatchedEventToDecode(false),
mStopAudioThread(true), mStopAudioThread(true),
mQuickBuffering(false), mQuickBuffering(false),
mIsRunning(false),
mRunAgain(false),
mMinimizePreroll(false), mMinimizePreroll(false),
mDispatchedRunEvent(false),
mDecodeThreadWaiting(false), mDecodeThreadWaiting(false),
mRealTime(aRealTime), mRealTime(aRealTime),
mEventManager(aDecoder), mEventManager(aDecoder),
@ -1047,6 +1045,12 @@ nsresult MediaDecoderStateMachine::Init(MediaDecoderStateMachine* aCloneDonor)
mStateMachineThreadPool = stateMachinePool; mStateMachineThreadPool = stateMachinePool;
nsresult rv;
mTimer = do_CreateInstance("@mozilla.org/timer;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = mTimer->SetTarget(GetStateMachineThread());
NS_ENSURE_SUCCESS(rv, rv);
return mReader->Init(cloneReader); return mReader->Init(cloneReader);
} }
@ -2700,42 +2704,21 @@ nsresult MediaDecoderStateMachine::GetBuffered(dom::TimeRanges* aBuffered) {
return res; return res;
} }
nsresult MediaDecoderStateMachine::Run()
{
ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
NS_ASSERTION(OnStateMachineThread(), "Should be on state machine thread.");
return CallRunStateMachine();
}
nsresult MediaDecoderStateMachine::CallRunStateMachine() nsresult MediaDecoderStateMachine::CallRunStateMachine()
{ {
AssertCurrentThreadInMonitor(); AssertCurrentThreadInMonitor();
NS_ASSERTION(OnStateMachineThread(), "Should be on state machine thread."); NS_ASSERTION(OnStateMachineThread(), "Should be on state machine thread.");
// This will be set to true by ScheduleStateMachine() if it's called
// while we're in RunStateMachine().
mRunAgain = false;
// Set to true whenever we dispatch an event to run this state machine.
// This flag prevents us from dispatching
mDispatchedRunEvent = false;
// If audio is being captured, stop the audio thread if it's running // If audio is being captured, stop the audio thread if it's running
if (mAudioCaptured) { if (mAudioCaptured) {
StopAudioThread(); StopAudioThread();
} }
MOZ_ASSERT(!mInRunningStateMachine, "State machine cycles must run in sequence!");
mTimeout = TimeStamp(); mTimeout = TimeStamp();
mInRunningStateMachine = true;
mIsRunning = true;
nsresult res = RunStateMachine(); nsresult res = RunStateMachine();
mIsRunning = false; mInRunningStateMachine = false;
if (mRunAgain && !mDispatchedRunEvent) {
mDispatchedRunEvent = true;
return GetStateMachineThread()->Dispatch(this, NS_DISPATCH_NORMAL);
}
return res; return res;
} }
@ -2750,16 +2733,7 @@ void MediaDecoderStateMachine::TimeoutExpired()
{ {
ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
NS_ASSERTION(OnStateMachineThread(), "Must be on state machine thread"); NS_ASSERTION(OnStateMachineThread(), "Must be on state machine thread");
if (mIsRunning) { CallRunStateMachine();
mRunAgain = true;
} else if (!mDispatchedRunEvent) {
// We don't have an event dispatched to run the state machine, so we
// can just run it from here.
CallRunStateMachine();
}
// Otherwise, an event has already been dispatched to run the state machine
// as soon as possible. Nothing else needed to do, the state machine is
// going to run anyway.
} }
void MediaDecoderStateMachine::ScheduleStateMachineWithLockAndWakeDecoder() { void MediaDecoderStateMachine::ScheduleStateMachineWithLockAndWakeDecoder() {
@ -2779,60 +2753,25 @@ nsresult MediaDecoderStateMachine::ScheduleStateMachine(int64_t aUsecs) {
aUsecs = std::max<int64_t>(aUsecs, 0); aUsecs = std::max<int64_t>(aUsecs, 0);
TimeStamp timeout = TimeStamp::Now() + UsecsToDuration(aUsecs); TimeStamp timeout = TimeStamp::Now() + UsecsToDuration(aUsecs);
if (!mTimeout.IsNull()) { if (!mTimeout.IsNull() && timeout >= mTimeout) {
if (timeout >= mTimeout) { // We've already scheduled a timer set to expire at or before this time,
// We've already scheduled a timer set to expire at or before this time, // or have an event dispatched to run the state machine.
// or have an event dispatched to run the state machine. return NS_OK;
return NS_OK;
}
if (mTimer) {
// We've been asked to schedule a timer to run before an existing timer.
// Cancel the existing timer.
mTimer->Cancel();
}
} }
uint32_t ms = static_cast<uint32_t>((aUsecs / USECS_PER_MS) & 0xFFFFFFFF); uint32_t ms = static_cast<uint32_t>((aUsecs / USECS_PER_MS) & 0xFFFFFFFF);
if (mRealTime && ms > 40) if (mRealTime && ms > 40) {
ms = 40; ms = 40;
if (ms == 0) {
if (mIsRunning) {
// We're currently running this state machine on the state machine
// thread. Signal it to run again once it finishes its current cycle.
mRunAgain = true;
return NS_OK;
} else if (!mDispatchedRunEvent) {
// We're not currently running this state machine on the state machine
// thread. Dispatch an event to run one cycle of the state machine.
mDispatchedRunEvent = true;
return GetStateMachineThread()->Dispatch(this, NS_DISPATCH_NORMAL);
}
// We're not currently running this state machine on the state machine
// thread, but something has already dispatched an event to run it again,
// so just exit; it's going to run real soon.
return NS_OK;
} }
// Since there is already a pending task that will run immediately,
// we don't need to schedule a timer task.
if (mRunAgain) {
return NS_OK;
}
mTimeout = timeout; mTimeout = timeout;
// Cancel existing timer if any since we are going to schedule a new one.
nsresult res; mTimer->Cancel();
if (!mTimer) { nsresult rv = mTimer->InitWithFuncCallback(mozilla::TimeoutExpired,
mTimer = do_CreateInstance("@mozilla.org/timer;1", &res); this,
if (NS_FAILED(res)) return res; ms,
mTimer->SetTarget(GetStateMachineThread()); nsITimer::TYPE_ONE_SHOT);
} NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
res = mTimer->InitWithFuncCallback(mozilla::TimeoutExpired,
this,
ms,
nsITimer::TYPE_ONE_SHOT);
return res;
} }
bool MediaDecoderStateMachine::OnDecodeThread() const bool MediaDecoderStateMachine::OnDecodeThread() const

Просмотреть файл

@ -113,8 +113,9 @@ class SharedThreadPool;
See MediaDecoder.h for more details. See MediaDecoder.h for more details.
*/ */
class MediaDecoderStateMachine : public nsRunnable class MediaDecoderStateMachine
{ {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDecoderStateMachine)
public: public:
typedef MediaDecoder::DecodedStreamData DecodedStreamData; typedef MediaDecoder::DecodedStreamData DecodedStreamData;
MediaDecoderStateMachine(MediaDecoder* aDecoder, MediaDecoderStateMachine(MediaDecoder* aDecoder,
@ -227,9 +228,6 @@ public:
// the main thread. // the main thread.
void StartBuffering(); void StartBuffering();
// State machine thread run function. Defers to RunStateMachine().
NS_IMETHOD Run() MOZ_OVERRIDE;
// This is called on the state machine thread and audio thread. // This is called on the state machine thread and audio thread.
// The decoder monitor must be obtained before calling this. // The decoder monitor must be obtained before calling this.
bool HasAudio() const { bool HasAudio() const {
@ -646,7 +644,7 @@ private:
bool IsStateMachineScheduled() const { bool IsStateMachineScheduled() const {
AssertCurrentThreadInMonitor(); AssertCurrentThreadInMonitor();
return !mTimeout.IsNull() || mRunAgain; return !mTimeout.IsNull();
} }
// Returns true if we're not playing and the decode thread has filled its // Returns true if we're not playing and the decode thread has filled its
@ -682,15 +680,17 @@ private:
RefPtr<SharedThreadPool> mStateMachineThreadPool; RefPtr<SharedThreadPool> mStateMachineThreadPool;
// Timer to call the state machine Run() method. Used by // Timer to run the state machine cycles. Used by
// ScheduleStateMachine(). Access protected by decoder monitor. // ScheduleStateMachine(). Access protected by decoder monitor.
nsCOMPtr<nsITimer> mTimer; nsCOMPtr<nsITimer> mTimer;
// Timestamp at which the next state machine Run() method will be called. // Timestamp at which the next state machine cycle will run.
// If this is non-null, a call to Run() is scheduled, either by a timer, // Access protected by decoder monitor.
// or via an event. Access protected by decoder monitor.
TimeStamp mTimeout; TimeStamp mTimeout;
// Used to check if there are state machine cycles are running in sequence.
DebugOnly<bool> mInRunningStateMachine;
// The time that playback started from the system clock. This is used for // The time that playback started from the system clock. This is used for
// timing the presentation of video frames when there's no audio. // timing the presentation of video frames when there's no audio.
// Accessed only via the state machine thread. // Accessed only via the state machine thread.
@ -920,14 +920,6 @@ private:
// Synchronised via decoder monitor. // Synchronised via decoder monitor.
bool mQuickBuffering; bool mQuickBuffering;
// True if the shared state machine thread is currently running this
// state machine.
bool mIsRunning;
// True if we should run the state machine again once the current
// state machine run has finished.
bool mRunAgain;
// True if we should not decode/preroll unnecessary samples, unless we're // True if we should not decode/preroll unnecessary samples, unless we're
// played. "Prerolling" in this context refers to when we decode and // played. "Prerolling" in this context refers to when we decode and
// buffer decoded samples in advance of when they're needed for playback. // buffer decoded samples in advance of when they're needed for playback.
@ -940,13 +932,6 @@ private:
// memory and CPU overhead. // memory and CPU overhead.
bool mMinimizePreroll; bool mMinimizePreroll;
// True if we've dispatched an event to run the state machine. It's
// imperative that we don't dispatch multiple events to run the state
// machine at the same time, as our code assume all events are synchronous.
// If we dispatch multiple events, the second event can run while the
// first is shutting down a thread, causing inconsistent state.
bool mDispatchedRunEvent;
// True if the decode thread has gone filled its buffers and is now // True if the decode thread has gone filled its buffers and is now
// waiting to be awakened before it continues decoding. Synchronized // waiting to be awakened before it continues decoding. Synchronized
// by the decoder monitor. // by the decoder monitor.

Просмотреть файл

@ -35,6 +35,9 @@ const BDADDR_ANY = "00:00:00:00:00:00";
const BDADDR_ALL = "ff:ff:ff:ff:ff:ff"; const BDADDR_ALL = "ff:ff:ff:ff:ff:ff";
const BDADDR_LOCAL = "ff:ff:ff:00:00:00"; const BDADDR_LOCAL = "ff:ff:ff:00:00:00";
// A user friendly name for remote BT device.
const REMOTE_DEVICE_NAME = "Remote BT Device";
let Promise = let Promise =
SpecialPowers.Cu.import("resource://gre/modules/Promise.jsm").Promise; SpecialPowers.Cu.import("resource://gre/modules/Promise.jsm").Promise;
@ -77,6 +80,70 @@ function runEmulatorCmdSafe(aCommand) {
return deferred.promise; return deferred.promise;
} }
/**
* Add a Bluetooth remote device to scatternet and set its properties.
*
* Use QEMU command 'bt remote add' to add a virtual Bluetooth remote
* and set its properties by setEmulatorDeviceProperty().
*
* Fulfill params:
* result -- bluetooth address of the remote device.
* Reject params: (none)
*
* @param aProperies
* A javascript object with zero or several properties for initializing
* the remote device. By now, the properies could be 'name' or
* 'discoverable'. It valid to put a null object or a javascript object
* which don't have any properies.
*
* @return A promise object.
*/
function addEmulatorRemoteDevice(aProperties) {
let address;
let promise = runEmulatorCmdSafe("bt remote add")
.then(function(aResults) {
address = aResults[0].toUpperCase();
});
for (let key in aProperties) {
let value = aProperties[key];
let propertyName = key;
promise = promise.then(function() {
return setEmulatorDeviceProperty(address, propertyName, value);
});
}
return promise.then(function() {
return address;
});
}
/**
* Remove Bluetooth remote devices in scatternet.
*
* Use QEMU command 'bt remote remove <addr>' to remove a specific virtual
* Bluetooth remote device in scatternet or remove them all by QEMU command
* 'bt remote remove BDADDR_ALL'.
*
* @param aAddress
* The string of Bluetooth address with format xx:xx:xx:xx:xx:xx.
*
* Fulfill params:
* result -- an array of emulator response lines.
* Reject params: (none)
*
* @return A promise object.
*/
function removeEmulatorRemoteDevice(aAddress) {
let cmd = "bt remote remove " + aAddress;
return runEmulatorCmdSafe(cmd)
.then(function(aResults) {
// 'bt remote remove <bd_addr>' returns a list of removed device one at a line.
// The last item is "OK".
return aResults.slice(0, -1);
});
}
/** /**
* Set a property for a Bluetooth device. * Set a property for a Bluetooth device.
* *
@ -126,6 +193,71 @@ function getEmulatorDeviceProperty(aAddress, aPropertyName) {
}); });
} }
/**
* Start dicovering Bluetooth devices.
*
* Allows the device's adapter to start seeking for remote devices.
*
* Fulfill params: (none)
* Reject params: a DOMError
*
* @param aAdapter
* A BluetoothAdapter which is used to interact with local BT dev
*
* @return A deferred promise.
*/
function startDiscovery(aAdapter) {
let deferred = Promise.defer();
let request = aAdapter.startDiscovery();
request.onsuccess = function () {
log(" Start discovery - Success");
// TODO (bug 892207): Make Bluetooth APIs available for 3rd party apps.
// Currently, discovering state wouldn't change immediately here.
// We would turn on this check when the redesigned API are landed.
// is(aAdapter.discovering, true, "BluetoothAdapter.discovering");
deferred.resolve();
}
request.onerror = function (aEvent) {
ok(false, "Start discovery - Fail");
deferred.reject(aEvent.target.error);
}
return deferred.promise;
}
/**
* Stop dicovering Bluetooth devices.
*
* Allows the device's adapter to stop seeking for remote devices.
*
* Fulfill params: (none)
* Reject params: a DOMError
*
* @param aAdapter
* A BluetoothAdapter which is used to interact with local BT device.
*
* @return A deferred promise.
*/
function stopDiscovery(aAdapter) {
let deferred = Promise.defer();
let request = aAdapter.stopDiscovery();
request.onsuccess = function () {
log(" Stop discovery - Success");
// TODO (bug 892207): Make Bluetooth APIs available for 3rd party apps.
// Currently, discovering state wouldn't change immediately here.
// We would turn on this check when the redesigned API are landed.
// is(aAdapter.discovering, false, "BluetoothAdapter.discovering");
deferred.resolve();
}
request.onerror = function (aEvent) {
ok(false, "Stop discovery - Fail");
deferred.reject(aEvent.target.error);
}
return deferred.promise;
}
/** /**
* Get mozSettings value specified by @aKey. * Get mozSettings value specified by @aKey.
* *

Просмотреть файл

@ -7,3 +7,4 @@ qemu = true
[test_dom_BluetoothManager_adapteradded.js] [test_dom_BluetoothManager_adapteradded.js]
[test_dom_BluetoothAdapter_setters.js] [test_dom_BluetoothAdapter_setters.js]
[test_dom_BluetoothAdapter_getters.js] [test_dom_BluetoothAdapter_getters.js]
[test_dom_BluetoothAdapter_discovery.js]

Просмотреть файл

@ -0,0 +1,47 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* vim: sw=2 ts=2 sts=2 et filetype=javascript
* 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/. */
///////////////////////////////////////////////////////////////////////////////
// Test Purpose:
// To verify that discovery process of BluetoothAdapter is correct.
// Use B2G emulator commands to add/remote remote devices to simulate
// discovering behavior.
//
// Test Coverage:
// - BluetoothAdapter.startDiscovery()
// - BluetoothAdapter.stopDiscovery()
// - BluetoothAdapter.ondevicefound()
// - BluetoothAdapter.discovering [Temporarily turned off until BT API update]
//
///////////////////////////////////////////////////////////////////////////////
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
startBluetoothTest(true, function testCaseMain(aAdapter) {
log("Testing the discovery process of BluetoothAdapter ...");
// The properties of remote device.
let theProperties = {
"name": REMOTE_DEVICE_NAME,
"discoverable": true
};
return Promise.resolve()
.then(() => removeEmulatorRemoteDevice(BDADDR_ALL))
.then(() => addEmulatorRemoteDevice(/*theProperties*/ null))
.then(function(aRemoteAddress) {
let promises = [];
promises.push(waitForAdapterEvent(aAdapter, "devicefound"));
promises.push(startDiscovery(aAdapter));
return Promise.all(promises)
.then(function(aResults) {
is(aResults[0].device.address, aRemoteAddress, "BluetoothDevice.address");
});
})
.then(() => stopDiscovery(aAdapter))
.then(() => removeEmulatorRemoteDevice(BDADDR_ALL));
});

Просмотреть файл

@ -15,12 +15,6 @@ function debug(msg) {
// mozbrowser API clients. // mozbrowser API clients.
docShell.isActive = true; docShell.isActive = true;
let infos = sendSyncMessage('browser-element-api:call',
{ 'msg_name': 'hello' })[0];
docShell.QueryInterface(Ci.nsIDocShellTreeItem).name = infos.name;
docShell.setFullscreenAllowed(infos.fullscreenAllowed);
function parentDocShell(docshell) { function parentDocShell(docshell) {
if (!docshell) { if (!docshell) {
return null; return null;
@ -57,3 +51,8 @@ if (!('BrowserElementIsPreloaded' in this)) {
} }
var BrowserElementIsReady = true; var BrowserElementIsReady = true;
let infos = sendSyncMessage('browser-element-api:call',
{ 'msg_name': 'hello' })[0];
docShell.QueryInterface(Ci.nsIDocShellTreeItem).name = infos.name;
docShell.setFullscreenAllowed(infos.fullscreenAllowed);

Просмотреть файл

@ -366,9 +366,11 @@ BrowserElementParent.prototype = {
return true; return true;
}, },
_recvHello: function(data) { _recvHello: function() {
debug("recvHello"); debug("recvHello");
this._ready = true;
// Inform our child if our owner element's document is invisible. Note // Inform our child if our owner element's document is invisible. Note
// that we must do so here, rather than in the BrowserElementParent // that we must do so here, rather than in the BrowserElementParent
// constructor, because the BrowserElementChild may not be initialized when // constructor, because the BrowserElementChild may not be initialized when
@ -382,7 +384,7 @@ BrowserElementParent.prototype = {
fullscreenAllowed: fullscreenAllowed:
this._frameElement.hasAttribute('allowfullscreen') || this._frameElement.hasAttribute('allowfullscreen') ||
this._frameElement.hasAttribute('mozallowfullscreen') this._frameElement.hasAttribute('mozallowfullscreen')
} };
}, },
_fireCtxMenuEvent: function(data) { _fireCtxMenuEvent: function(data) {
@ -724,15 +726,31 @@ BrowserElementParent.prototype = {
} else { } else {
let reqOld = XPCNativeWrapper.unwrap(activeInputFrame) let reqOld = XPCNativeWrapper.unwrap(activeInputFrame)
.setInputMethodActive(false); .setInputMethodActive(false);
reqOld.onsuccess = function() {
activeInputFrame = null; // We wan't to continue regardless whether this req succeeded
this._sendSetInputMethodActiveDOMRequest(req, isActive); reqOld.onsuccess = reqOld.onerror = function() {
let setActive = function() {
activeInputFrame = null;
this._sendSetInputMethodActiveDOMRequest(req, isActive);
}.bind(this);
if (this._ready) {
setActive();
return;
}
// Wait for the hello event from BrowserElementChild
let onReady = function(aMsg) {
if (this._isAlive() && (aMsg.data.msg_name === 'hello')) {
setActive();
this._mm.removeMessageListener('browser-element-api:call',
onReady);
}
}.bind(this);
this._mm.addMessageListener('browser-element-api:call', onReady);
}.bind(this); }.bind(this);
reqOld.onerror = function() {
Services.DOMRequest.fireErrorAsync(req,
'Failed to deactivate the old input method: ' +
reqOld.error + '.');
};
} }
} else { } else {
this._sendSetInputMethodActiveDOMRequest(req, isActive); this._sendSetInputMethodActiveDOMRequest(req, isActive);

Просмотреть файл

@ -50,17 +50,32 @@ function doFailToSetPreferredNetworkType(preferredNetworkType, expectedError, ca
}; };
} }
function getSupportedNetworkTypesFromSystemProperties(clientId, callback) {
let key = "ro.moz.ril." + clientId + ".network_types";
runEmulatorShell(["getprop", key], function(results) {
let result = results[0];
if (!result || result === "") {
// Copied from GECKO_SUPPORTED_NETWORK_TYPES_DEFAULT in dom/system/gonk/ril_consts.js.
result = "wcdma,gsm";
}
callback(result.split(","));
});
}
/* Test supportedNetworkTypes */ /* Test supportedNetworkTypes */
taskHelper.push(function testSupportedNetworkTypes() { taskHelper.push(function testSupportedNetworkTypes() {
let supportedNetworkTypes = mobileConnection.supportedNetworkTypes; let supportedNetworkTypes = mobileConnection.supportedNetworkTypes;
ok(Array.isArray(supportedNetworkTypes), "supportedNetworkTypes should be an array"); ok(Array.isArray(supportedNetworkTypes), "supportedNetworkTypes should be an array");
ok(supportedNetworkTypes.indexOf("gsm") >= 0, "Should support 'gsm'");
ok(supportedNetworkTypes.indexOf("wcdma") >= 0, "Should support 'wcdma'");
ok(supportedNetworkTypes.indexOf("cdma") >= 0, "Should support 'cdma'");
ok(supportedNetworkTypes.indexOf("evdo") >= 0, "Should support 'evdo'");
taskHelper.runNext(); getSupportedNetworkTypesFromSystemProperties(0, function(testData) {
is(testData.length, supportedNetworkTypes.length);
for (let i = 0; i < testData.length; i++) {
ok(supportedNetworkTypes.indexOf(testData[i]) >= 0, "Should support '" + testData[i] + "'");
}
taskHelper.runNext();
});
}); });
/* Test switching to supported preferred types */ /* Test switching to supported preferred types */

Просмотреть файл

@ -430,7 +430,7 @@ this.RIL_PREFERRED_NETWORK_TYPE_TO_GECKO = [
GECKO_PREFERRED_NETWORK_TYPE_LTE_ONLY GECKO_PREFERRED_NETWORK_TYPE_LTE_ONLY
]; ];
this.GECKO_SUPPORTED_NETWORK_TYPES_DEFAULT = "gsm,wcdma,cdma,evdo"; this.GECKO_SUPPORTED_NETWORK_TYPES_DEFAULT = "gsm,wcdma";
this.GECKO_SUPPORTED_NETWORK_TYPES = [ this.GECKO_SUPPORTED_NETWORK_TYPES = [
"gsm", "gsm",
"wcdma", "wcdma",