Loading media/codec2/sfplugin/CCodecConfig.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -362,7 +362,10 @@ void CCodecConfig::initializeStandardParams() { .limitTo(D::OUTPUT & D::READ)); add(ConfigMapper(KEY_BIT_RATE, C2_PARAMKEY_BITRATE, "value") .limitTo(D::ENCODER & D::OUTPUT)); .limitTo(D::ENCODER & D::CODED)); // Some audio decoders require bitrate information to be set add(ConfigMapper(KEY_BIT_RATE, C2_PARAMKEY_BITRATE, "value") .limitTo(D::AUDIO & D::DECODER & D::CODED)); // we also need to put the bitrate in the max bitrate field add(ConfigMapper(KEY_MAX_BIT_RATE, C2_PARAMKEY_BITRATE, "value") .limitTo(D::ENCODER & D::READ & D::OUTPUT)); Loading media/libstagefright/FrameDecoder.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ sp<IMemory> allocVideoFrame(const sp<MetaData>& trackMeta, return NULL; } sp<IMemory> frameMem = new MemoryBase(heap, 0, size); if (frameMem == NULL) { if (frameMem == NULL || frameMem->unsecurePointer() == NULL) { ALOGE("not enough memory for VideoFrame size=%zu", size); return NULL; } Loading services/audioflinger/PlaybackTracks.h +5 −0 Original line number Diff line number Diff line Loading @@ -219,6 +219,10 @@ protected: void flushAck(); bool isResumePending(); void resumeAck(); // For direct or offloaded tracks ensure that the pause state is acknowledged // by the playback thread in case of an immediate flush. bool isPausePending() const { return mPauseHwPending; } void pauseAck(); void updateTrackFrameInfo(int64_t trackFramesReleased, int64_t sinkFramesWritten, uint32_t halSampleRate, const ExtendedTimestamp &timeStamp); Loading Loading @@ -314,6 +318,7 @@ private: sp<AudioTrackServerProxy> mAudioTrackServerProxy; bool mResumeToStopping; // track was paused in stopping state. bool mFlushHwPending; // track requests for thread flush bool mPauseHwPending = false; // direct/offload track request for thread pause audio_output_flags_t mFlags; // If the last track change was notified to the client with readAndClearHasChanged std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT; Loading services/audioflinger/Threads.cpp +18 −4 Original line number Diff line number Diff line Loading @@ -5880,8 +5880,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep sp<Track> l = mActiveTracks.getLatest(); bool last = l.get() == track; if (track->isPausePending()) { track->pauseAck(); // It is possible a track might have been flushed or stopped. // Other operations such as flush pending might occur on the next prepare. if (track->isPausing()) { track->setPaused(); } // Always perform pause, as an immediate flush will change // the pause state to be no longer isPausing(). if (mHwSupportsPause && last && !mHwPaused) { doHwPause = true; mHwPaused = true; Loading Loading @@ -6423,8 +6430,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr continue; } if (track->isPausePending()) { track->pauseAck(); // It is possible a track might have been flushed or stopped. // Other operations such as flush pending might occur on the next prepare. if (track->isPausing()) { track->setPaused(); } // Always perform pause if last, as an immediate flush will change // the pause state to be no longer isPausing(). if (last) { if (mHwSupportsPause && !mHwPaused) { doHwPause = true; Loading services/audioflinger/Tracks.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -1219,6 +1219,9 @@ void AudioFlinger::PlaybackThread::Track::pause() mState = PAUSING; ALOGV("%s(%d): ACTIVE/RESUMING => PAUSING on thread %d", __func__, mId, (int)mThreadIoHandle); if (isOffloadedOrDirect()) { mPauseHwPending = true; } playbackThread->broadcast_l(); break; Loading Loading @@ -1306,6 +1309,11 @@ void AudioFlinger::PlaybackThread::Track::flushAck() mFlushHwPending = false; } void AudioFlinger::PlaybackThread::Track::pauseAck() { mPauseHwPending = false; } void AudioFlinger::PlaybackThread::Track::reset() { // Do not reset twice to avoid discarding data written just after a flush and before Loading Loading
media/codec2/sfplugin/CCodecConfig.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -362,7 +362,10 @@ void CCodecConfig::initializeStandardParams() { .limitTo(D::OUTPUT & D::READ)); add(ConfigMapper(KEY_BIT_RATE, C2_PARAMKEY_BITRATE, "value") .limitTo(D::ENCODER & D::OUTPUT)); .limitTo(D::ENCODER & D::CODED)); // Some audio decoders require bitrate information to be set add(ConfigMapper(KEY_BIT_RATE, C2_PARAMKEY_BITRATE, "value") .limitTo(D::AUDIO & D::DECODER & D::CODED)); // we also need to put the bitrate in the max bitrate field add(ConfigMapper(KEY_MAX_BIT_RATE, C2_PARAMKEY_BITRATE, "value") .limitTo(D::ENCODER & D::READ & D::OUTPUT)); Loading
media/libstagefright/FrameDecoder.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ sp<IMemory> allocVideoFrame(const sp<MetaData>& trackMeta, return NULL; } sp<IMemory> frameMem = new MemoryBase(heap, 0, size); if (frameMem == NULL) { if (frameMem == NULL || frameMem->unsecurePointer() == NULL) { ALOGE("not enough memory for VideoFrame size=%zu", size); return NULL; } Loading
services/audioflinger/PlaybackTracks.h +5 −0 Original line number Diff line number Diff line Loading @@ -219,6 +219,10 @@ protected: void flushAck(); bool isResumePending(); void resumeAck(); // For direct or offloaded tracks ensure that the pause state is acknowledged // by the playback thread in case of an immediate flush. bool isPausePending() const { return mPauseHwPending; } void pauseAck(); void updateTrackFrameInfo(int64_t trackFramesReleased, int64_t sinkFramesWritten, uint32_t halSampleRate, const ExtendedTimestamp &timeStamp); Loading Loading @@ -314,6 +318,7 @@ private: sp<AudioTrackServerProxy> mAudioTrackServerProxy; bool mResumeToStopping; // track was paused in stopping state. bool mFlushHwPending; // track requests for thread flush bool mPauseHwPending = false; // direct/offload track request for thread pause audio_output_flags_t mFlags; // If the last track change was notified to the client with readAndClearHasChanged std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT; Loading
services/audioflinger/Threads.cpp +18 −4 Original line number Diff line number Diff line Loading @@ -5880,8 +5880,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep sp<Track> l = mActiveTracks.getLatest(); bool last = l.get() == track; if (track->isPausePending()) { track->pauseAck(); // It is possible a track might have been flushed or stopped. // Other operations such as flush pending might occur on the next prepare. if (track->isPausing()) { track->setPaused(); } // Always perform pause, as an immediate flush will change // the pause state to be no longer isPausing(). if (mHwSupportsPause && last && !mHwPaused) { doHwPause = true; mHwPaused = true; Loading Loading @@ -6423,8 +6430,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr continue; } if (track->isPausePending()) { track->pauseAck(); // It is possible a track might have been flushed or stopped. // Other operations such as flush pending might occur on the next prepare. if (track->isPausing()) { track->setPaused(); } // Always perform pause if last, as an immediate flush will change // the pause state to be no longer isPausing(). if (last) { if (mHwSupportsPause && !mHwPaused) { doHwPause = true; Loading
services/audioflinger/Tracks.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -1219,6 +1219,9 @@ void AudioFlinger::PlaybackThread::Track::pause() mState = PAUSING; ALOGV("%s(%d): ACTIVE/RESUMING => PAUSING on thread %d", __func__, mId, (int)mThreadIoHandle); if (isOffloadedOrDirect()) { mPauseHwPending = true; } playbackThread->broadcast_l(); break; Loading Loading @@ -1306,6 +1309,11 @@ void AudioFlinger::PlaybackThread::Track::flushAck() mFlushHwPending = false; } void AudioFlinger::PlaybackThread::Track::pauseAck() { mPauseHwPending = false; } void AudioFlinger::PlaybackThread::Track::reset() { // Do not reset twice to avoid discarding data written just after a flush and before Loading