mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 18:55:30 +00:00
Bug 1401471. P1 - make StreamAction a struct so we can associate data with each action in the future. r=gerald
MozReview-Commit-ID: A0ZpunJgNYm --HG-- extra : rebase_source : 3061d04f6e44d8a818ec08d59b0365b3baac5da1 extra : intermediate-source : 907b58682e04f5ee18256d5b85eae0662b83f727 extra : source : 2b76eb41fe275e65833d65a2217955e5761ad994
This commit is contained in:
parent
ca87557a06
commit
8de2a1f57f
@ -1123,13 +1123,23 @@ MediaCache::PredictNextUseForIncomingData(MediaCacheStream* aStream)
|
||||
std::min<int64_t>(millisecondsAhead, INT32_MAX));
|
||||
}
|
||||
|
||||
enum StreamAction { NONE, SEEK, SEEK_AND_RESUME, RESUME, SUSPEND };
|
||||
|
||||
void
|
||||
MediaCache::Update()
|
||||
{
|
||||
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
||||
|
||||
struct StreamAction
|
||||
{
|
||||
enum
|
||||
{
|
||||
NONE,
|
||||
SEEK,
|
||||
SEEK_AND_RESUME,
|
||||
RESUME,
|
||||
SUSPEND
|
||||
} mTag = NONE;
|
||||
};
|
||||
|
||||
// The action to use for each stream. We store these so we can make
|
||||
// decisions while holding the cache lock but implement those decisions
|
||||
// without holding the cache lock, since we need to call out to
|
||||
@ -1250,7 +1260,7 @@ MediaCache::Update()
|
||||
int32_t readaheadLimit = Preferences::GetInt("media.cache_readahead_limit", 30);
|
||||
|
||||
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
||||
actions.AppendElement(NONE);
|
||||
actions.AppendElement(StreamAction{});
|
||||
|
||||
MediaCacheStream* stream = mStreams[i];
|
||||
if (stream->mClosed) {
|
||||
@ -1388,15 +1398,17 @@ MediaCache::Update()
|
||||
// in mPartialBlockBuffer.
|
||||
stream->mChannelOffset =
|
||||
OffsetToBlockIndexUnchecked(desiredOffset) * BLOCK_SIZE;
|
||||
actions[i] = stream->mCacheSuspended ? SEEK_AND_RESUME : SEEK;
|
||||
actions[i].mTag = stream->mCacheSuspended
|
||||
? StreamAction::SEEK_AND_RESUME
|
||||
: StreamAction::SEEK;
|
||||
// mChannelOffset is updated to a new position. We don't want data from
|
||||
// the old channel to be written to the wrong position. 0 is a sentinel
|
||||
// value which will not match any ID passed to NotifyDataReceived().
|
||||
stream->mLoadID = 0;
|
||||
} else if (enableReading && stream->mCacheSuspended) {
|
||||
actions[i] = RESUME;
|
||||
actions[i].mTag = StreamAction::RESUME;
|
||||
} else if (!enableReading && !stream->mCacheSuspended) {
|
||||
actions[i] = SUSPEND;
|
||||
actions[i].mTag = StreamAction::SUSPEND;
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG
|
||||
@ -1417,47 +1429,50 @@ MediaCache::Update()
|
||||
// being set correctly for all streams.
|
||||
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
||||
MediaCacheStream* stream = mStreams[i];
|
||||
switch (actions[i]) {
|
||||
case SEEK:
|
||||
case SEEK_AND_RESUME:
|
||||
stream->mCacheSuspended = false;
|
||||
stream->mChannelEnded = false;
|
||||
break;
|
||||
case RESUME:
|
||||
stream->mCacheSuspended = false;
|
||||
break;
|
||||
case SUSPEND:
|
||||
stream->mCacheSuspended = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
switch (actions[i].mTag) {
|
||||
case StreamAction::SEEK:
|
||||
case StreamAction::SEEK_AND_RESUME:
|
||||
stream->mCacheSuspended = false;
|
||||
stream->mChannelEnded = false;
|
||||
break;
|
||||
case StreamAction::RESUME:
|
||||
stream->mCacheSuspended = false;
|
||||
break;
|
||||
case StreamAction::SUSPEND:
|
||||
stream->mCacheSuspended = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
||||
MediaCacheStream* stream = mStreams[i];
|
||||
nsresult rv;
|
||||
switch (actions[i]) {
|
||||
case SEEK:
|
||||
case SEEK_AND_RESUME:
|
||||
LOG("Stream %p CacheSeek to %" PRId64 " (resume=%d)", stream,
|
||||
stream->mChannelOffset, actions[i] == SEEK_AND_RESUME);
|
||||
rv = stream->mClient->CacheClientSeek(stream->mChannelOffset,
|
||||
actions[i] == SEEK_AND_RESUME);
|
||||
break;
|
||||
case RESUME:
|
||||
LOG("Stream %p Resumed", stream);
|
||||
rv = stream->mClient->CacheClientResume();
|
||||
QueueSuspendedStatusUpdate(stream->mResourceID);
|
||||
break;
|
||||
case SUSPEND:
|
||||
LOG("Stream %p Suspended", stream);
|
||||
rv = stream->mClient->CacheClientSuspend();
|
||||
QueueSuspendedStatusUpdate(stream->mResourceID);
|
||||
break;
|
||||
default:
|
||||
rv = NS_OK;
|
||||
break;
|
||||
switch (actions[i].mTag) {
|
||||
case StreamAction::SEEK:
|
||||
case StreamAction::SEEK_AND_RESUME:
|
||||
LOG("Stream %p CacheSeek to %" PRId64 " (resume=%d)",
|
||||
stream,
|
||||
stream->mChannelOffset,
|
||||
actions[i].mTag == StreamAction::SEEK_AND_RESUME);
|
||||
rv = stream->mClient->CacheClientSeek(stream->mChannelOffset,
|
||||
actions[i].mTag ==
|
||||
StreamAction::SEEK_AND_RESUME);
|
||||
break;
|
||||
case StreamAction::RESUME:
|
||||
LOG("Stream %p Resumed", stream);
|
||||
rv = stream->mClient->CacheClientResume();
|
||||
QueueSuspendedStatusUpdate(stream->mResourceID);
|
||||
break;
|
||||
case StreamAction::SUSPEND:
|
||||
LOG("Stream %p Suspended", stream);
|
||||
rv = stream->mClient->CacheClientSuspend();
|
||||
QueueSuspendedStatusUpdate(stream->mResourceID);
|
||||
break;
|
||||
default:
|
||||
rv = NS_OK;
|
||||
break;
|
||||
}
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
|
Loading…
Reference in New Issue
Block a user