Loading media/libstagefright/MediaSync.cpp +29 −13 Original line number Original line Diff line number Diff line Loading @@ -195,13 +195,14 @@ status_t MediaSync::updateQueuedAudioData( int64_t numFrames = sizeInBytes / mAudioTrack->frameSize(); int64_t numFrames = sizeInBytes / mAudioTrack->frameSize(); int64_t maxMediaTimeUs = presentationTimeUs int64_t maxMediaTimeUs = presentationTimeUs + getDurationIfPlayedAtNativeSampleRate_l(numFrames); + getDurationIfPlayedAtNativeSampleRate_l(numFrames); mNumFramesWritten += numFrames; int64_t nowUs = ALooper::GetNowUs(); int64_t nowUs = ALooper::GetNowUs(); int64_t nowMediaUs = maxMediaTimeUs int64_t nowMediaUs = presentationTimeUs - getDurationIfPlayedAtNativeSampleRate_l(mNumFramesWritten) - getDurationIfPlayedAtNativeSampleRate_l(mNumFramesWritten) + getPlayedOutAudioDurationMedia_l(nowUs); + getPlayedOutAudioDurationMedia_l(nowUs); mNumFramesWritten += numFrames; int64_t oldRealTime = -1; int64_t oldRealTime = -1; if (mNextBufferItemMediaUs != -1) { if (mNextBufferItemMediaUs != -1) { oldRealTime = getRealTime(mNextBufferItemMediaUs, nowUs); oldRealTime = getRealTime(mNextBufferItemMediaUs, nowUs); Loading @@ -212,12 +213,13 @@ status_t MediaSync::updateQueuedAudioData( if (oldRealTime != -1) { if (oldRealTime != -1) { int64_t newRealTime = getRealTime(mNextBufferItemMediaUs, nowUs); int64_t newRealTime = getRealTime(mNextBufferItemMediaUs, nowUs); if (newRealTime < oldRealTime) { if (newRealTime >= oldRealTime) { mNextBufferItemMediaUs = -1; return OK; onDrainVideo_l(); } } } } mNextBufferItemMediaUs = -1; onDrainVideo_l(); return OK; return OK; } } Loading Loading @@ -316,12 +318,12 @@ void MediaSync::onDrainVideo_l() { return; return; } } int64_t nowUs = ALooper::GetNowUs(); while (!mBufferItems.empty()) { while (!mBufferItems.empty()) { int64_t nowUs = ALooper::GetNowUs(); BufferItem *bufferItem = &*mBufferItems.begin(); BufferItem *bufferItem = &*mBufferItems.begin(); int64_t itemMediaUs = bufferItem->mTimestamp / 1000; int64_t itemMediaUs = bufferItem->mTimestamp / 1000; int64_t itemRealUs = getRealTime(itemMediaUs, nowUs); int64_t itemRealUs = getRealTime(itemMediaUs, nowUs); if (itemRealUs <= nowUs) { if (itemRealUs <= nowUs) { if (mHasAudio) { if (mHasAudio) { if (nowUs - itemRealUs <= kMaxAllowedVideoLateTimeUs) { if (nowUs - itemRealUs <= kMaxAllowedVideoLateTimeUs) { Loading @@ -341,15 +343,13 @@ void MediaSync::onDrainVideo_l() { } } mBufferItems.erase(mBufferItems.begin()); mBufferItems.erase(mBufferItems.begin()); if (mBufferItems.empty()) { mNextBufferItemMediaUs = -1; mNextBufferItemMediaUs = -1; } } else { } else { if (mNextBufferItemMediaUs == -1 if (mNextBufferItemMediaUs == -1 || mNextBufferItemMediaUs != itemMediaUs) { || mNextBufferItemMediaUs > itemMediaUs) { sp<AMessage> msg = new AMessage(kWhatDrainVideo, this); sp<AMessage> msg = new AMessage(kWhatDrainVideo, this); msg->post(itemRealUs - nowUs); msg->post(itemRealUs - nowUs); mNextBufferItemMediaUs = itemMediaUs; } } break; break; } } Loading Loading @@ -395,8 +395,10 @@ void MediaSync::onFrameAvailableFromInput() { } } mBufferItems.push_back(bufferItem); mBufferItems.push_back(bufferItem); if (mBufferItems.size() == 1) { onDrainVideo_l(); onDrainVideo_l(); } } } void MediaSync::renderOneBufferItem_l( const BufferItem &bufferItem) { void MediaSync::renderOneBufferItem_l( const BufferItem &bufferItem) { IGraphicBufferProducer::QueueBufferInput queueInput( IGraphicBufferProducer::QueueBufferInput queueInput( Loading Loading @@ -499,6 +501,20 @@ void MediaSync::onMessageReceived(const sp<AMessage> &msg) { case kWhatDrainVideo: case kWhatDrainVideo: { { Mutex::Autolock lock(mMutex); Mutex::Autolock lock(mMutex); if (mNextBufferItemMediaUs != -1) { int64_t nowUs = ALooper::GetNowUs(); int64_t itemRealUs = getRealTime(mNextBufferItemMediaUs, nowUs); // The message could arrive earlier than expected due to // various reasons, e.g., media clock has been changed because // of new anchor time or playback rate. In such cases, the // message needs to be re-posted. if (itemRealUs > nowUs) { msg->post(itemRealUs - nowUs); break; } } onDrainVideo_l(); onDrainVideo_l(); break; break; } } Loading Loading
media/libstagefright/MediaSync.cpp +29 −13 Original line number Original line Diff line number Diff line Loading @@ -195,13 +195,14 @@ status_t MediaSync::updateQueuedAudioData( int64_t numFrames = sizeInBytes / mAudioTrack->frameSize(); int64_t numFrames = sizeInBytes / mAudioTrack->frameSize(); int64_t maxMediaTimeUs = presentationTimeUs int64_t maxMediaTimeUs = presentationTimeUs + getDurationIfPlayedAtNativeSampleRate_l(numFrames); + getDurationIfPlayedAtNativeSampleRate_l(numFrames); mNumFramesWritten += numFrames; int64_t nowUs = ALooper::GetNowUs(); int64_t nowUs = ALooper::GetNowUs(); int64_t nowMediaUs = maxMediaTimeUs int64_t nowMediaUs = presentationTimeUs - getDurationIfPlayedAtNativeSampleRate_l(mNumFramesWritten) - getDurationIfPlayedAtNativeSampleRate_l(mNumFramesWritten) + getPlayedOutAudioDurationMedia_l(nowUs); + getPlayedOutAudioDurationMedia_l(nowUs); mNumFramesWritten += numFrames; int64_t oldRealTime = -1; int64_t oldRealTime = -1; if (mNextBufferItemMediaUs != -1) { if (mNextBufferItemMediaUs != -1) { oldRealTime = getRealTime(mNextBufferItemMediaUs, nowUs); oldRealTime = getRealTime(mNextBufferItemMediaUs, nowUs); Loading @@ -212,12 +213,13 @@ status_t MediaSync::updateQueuedAudioData( if (oldRealTime != -1) { if (oldRealTime != -1) { int64_t newRealTime = getRealTime(mNextBufferItemMediaUs, nowUs); int64_t newRealTime = getRealTime(mNextBufferItemMediaUs, nowUs); if (newRealTime < oldRealTime) { if (newRealTime >= oldRealTime) { mNextBufferItemMediaUs = -1; return OK; onDrainVideo_l(); } } } } mNextBufferItemMediaUs = -1; onDrainVideo_l(); return OK; return OK; } } Loading Loading @@ -316,12 +318,12 @@ void MediaSync::onDrainVideo_l() { return; return; } } int64_t nowUs = ALooper::GetNowUs(); while (!mBufferItems.empty()) { while (!mBufferItems.empty()) { int64_t nowUs = ALooper::GetNowUs(); BufferItem *bufferItem = &*mBufferItems.begin(); BufferItem *bufferItem = &*mBufferItems.begin(); int64_t itemMediaUs = bufferItem->mTimestamp / 1000; int64_t itemMediaUs = bufferItem->mTimestamp / 1000; int64_t itemRealUs = getRealTime(itemMediaUs, nowUs); int64_t itemRealUs = getRealTime(itemMediaUs, nowUs); if (itemRealUs <= nowUs) { if (itemRealUs <= nowUs) { if (mHasAudio) { if (mHasAudio) { if (nowUs - itemRealUs <= kMaxAllowedVideoLateTimeUs) { if (nowUs - itemRealUs <= kMaxAllowedVideoLateTimeUs) { Loading @@ -341,15 +343,13 @@ void MediaSync::onDrainVideo_l() { } } mBufferItems.erase(mBufferItems.begin()); mBufferItems.erase(mBufferItems.begin()); if (mBufferItems.empty()) { mNextBufferItemMediaUs = -1; mNextBufferItemMediaUs = -1; } } else { } else { if (mNextBufferItemMediaUs == -1 if (mNextBufferItemMediaUs == -1 || mNextBufferItemMediaUs != itemMediaUs) { || mNextBufferItemMediaUs > itemMediaUs) { sp<AMessage> msg = new AMessage(kWhatDrainVideo, this); sp<AMessage> msg = new AMessage(kWhatDrainVideo, this); msg->post(itemRealUs - nowUs); msg->post(itemRealUs - nowUs); mNextBufferItemMediaUs = itemMediaUs; } } break; break; } } Loading Loading @@ -395,8 +395,10 @@ void MediaSync::onFrameAvailableFromInput() { } } mBufferItems.push_back(bufferItem); mBufferItems.push_back(bufferItem); if (mBufferItems.size() == 1) { onDrainVideo_l(); onDrainVideo_l(); } } } void MediaSync::renderOneBufferItem_l( const BufferItem &bufferItem) { void MediaSync::renderOneBufferItem_l( const BufferItem &bufferItem) { IGraphicBufferProducer::QueueBufferInput queueInput( IGraphicBufferProducer::QueueBufferInput queueInput( Loading Loading @@ -499,6 +501,20 @@ void MediaSync::onMessageReceived(const sp<AMessage> &msg) { case kWhatDrainVideo: case kWhatDrainVideo: { { Mutex::Autolock lock(mMutex); Mutex::Autolock lock(mMutex); if (mNextBufferItemMediaUs != -1) { int64_t nowUs = ALooper::GetNowUs(); int64_t itemRealUs = getRealTime(mNextBufferItemMediaUs, nowUs); // The message could arrive earlier than expected due to // various reasons, e.g., media clock has been changed because // of new anchor time or playback rate. In such cases, the // message needs to be re-posted. if (itemRealUs > nowUs) { msg->post(itemRealUs - nowUs); break; } } onDrainVideo_l(); onDrainVideo_l(); break; break; } } Loading