From 8ca3dfd881424650951d1d72ee8809367b1c3d96 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Tue, 29 Dec 2015 03:48:19 -0800 Subject: nuplayer: Enable PCM offload for any source * Use the raw PCM format to perform the early open of the audio sink. This ensures that the renderer will do the same. * Fill in stubs for timestamp and position calculation. This fixes underruns and other issues. Change-Id: I8d761e523194cc12f387b4b2aa1594536e56da01 --- include/media/AudioTrack.h | 2 +- media/libavextensions/media/AVMediaExtensions.h | 29 ++++++++++++++++------ .../mediaplayerservice/AVNuUtils.cpp | 14 ++--------- media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 14 ++++++++--- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 191802d..6f07f98 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -624,7 +624,7 @@ private: */ status_t obtainBuffer(Buffer* audioBuffer, const struct timespec *requested, struct timespec *elapsed = NULL, size_t *nonContig = NULL); - friend struct ExtendedMediaUtils; + friend struct AVMediaUtils; public: /* Public API for TRANSFER_OBTAIN mode. diff --git a/media/libavextensions/media/AVMediaExtensions.h b/media/libavextensions/media/AVMediaExtensions.h index d48feec..9622253 100644 --- a/media/libavextensions/media/AVMediaExtensions.h +++ b/media/libavextensions/media/AVMediaExtensions.h @@ -47,18 +47,33 @@ struct AVMediaUtils { virtual bool AudioTrackIsPcmOffloaded(const audio_format_t format) { return audio_is_offload_pcm(format); } - virtual status_t AudioTrackGetPosition(AudioTrack* /*track*/, - uint32_t* /*position*/) { - return NO_INIT; + + virtual status_t AudioTrackGetPosition(AudioTrack* track, + uint32_t* position) { + uint32_t tempPos = (track->mState == AudioTrack::STATE_STOPPED || + track->mState == AudioTrack::STATE_FLUSHED) ? 0 : + track->updateAndGetPosition_l(); + *position = (tempPos / + (track->channelCount() * audio_bytes_per_sample(track->format()))); + return NO_ERROR; } - virtual status_t AudioTrackGetTimestamp(AudioTrack* /*track*/, - AudioTimestamp* /*timestamp*/) { - return NO_INIT; + virtual status_t AudioTrackGetTimestamp(AudioTrack* track, + AudioTimestamp* timestamp) { + if (!AudioTrackIsPcmOffloaded(track->format())) { + return NO_INIT; + } + uint32_t tempPos = (track->mState == AudioTrack::STATE_STOPPED || + track->mState == AudioTrack::STATE_FLUSHED) ? 0 : + track->updateAndGetPosition_l(); + timestamp->mPosition = (tempPos / (track->channelCount() * + audio_bytes_per_sample(track->format()))); + clock_gettime(CLOCK_MONOTONIC, ×tamp->mTime); + return NO_ERROR; } virtual size_t AudioTrackGetOffloadFrameCount(size_t frameCount) { - return frameCount; + return frameCount * 2; } virtual bool AudioTrackIsTrackOffloaded(audio_io_handle_t /*output*/) { diff --git a/media/libavextensions/mediaplayerservice/AVNuUtils.cpp b/media/libavextensions/mediaplayerservice/AVNuUtils.cpp index 34abd0a..5f146c7 100644 --- a/media/libavextensions/mediaplayerservice/AVNuUtils.cpp +++ b/media/libavextensions/mediaplayerservice/AVNuUtils.cpp @@ -55,21 +55,11 @@ namespace android { static bool is24bitPCMOffloadEnabled() { - char propPCMOfload[PROPERTY_VALUE_MAX] = {0}; - property_get("audio.offload.pcm.24bit.enable", propPCMOfload, "0"); - if (!strncmp(propPCMOfload, "true", 4) || atoi(propPCMOfload)) - return true; - else - return false; + return property_get_bool("audio.offload.pcm.24bit.enable", false); } static bool is16bitPCMOffloadEnabled() { - char propPCMOfload[PROPERTY_VALUE_MAX] = {0}; - property_get("audio.offload.pcm.16bit.enable", propPCMOfload, "0"); - if (!strncmp(propPCMOfload, "true", 4) || atoi(propPCMOfload)) - return true; - else - return false; + return property_get_bool("audio.offload.pcm.16bit.enable", false); } sp AVNuUtils::createPCMMetaFromSource(const sp &sMeta) { diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index ee63a6e..c87208c 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -1488,16 +1488,22 @@ void NuPlayer::postScanSources() { void NuPlayer::tryOpenAudioSinkForOffload(const sp &format, bool hasVideo) { // Note: This is called early in NuPlayer to determine whether offloading // is possible; otherwise the decoders call the renderer openAudioSink directly. - + sp audioMeta = mSource->getFormatMeta(true /* audio */); + sp pcmFormat; + if (mOffloadDecodedPCM) { + sp pcm = AVNuUtils::get()->createPCMMetaFromSource(audioMeta); + audioMeta = pcm; + convertMetaDataToMessage(pcm, &pcmFormat); + } status_t err = mRenderer->openAudioSink( - format, true /* offloadOnly */, hasVideo, AUDIO_OUTPUT_FLAG_NONE, &mOffloadAudio, mSource->isStreaming()); + mOffloadDecodedPCM ? pcmFormat : format, + true /* offloadOnly */, hasVideo, AUDIO_OUTPUT_FLAG_NONE, + &mOffloadAudio, mSource->isStreaming()); if (err != OK) { // Any failure we turn off mOffloadAudio. mOffloadAudio = false; mOffloadDecodedPCM = false; } else if (mOffloadAudio) { - sp audioMeta = - mSource->getFormatMeta(true /* audio */); sendMetaDataToHal(mAudioSink, audioMeta); } } -- cgit v1.1