summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/AudioTrack.h2
-rw-r--r--media/libavextensions/media/AVMediaExtensions.h29
-rw-r--r--media/libavextensions/mediaplayerservice/AVNuUtils.cpp14
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.cpp14
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, &timestamp->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<MetaData> AVNuUtils::createPCMMetaFromSource(const sp<MetaData> &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<AMessage> &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<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
+ sp<AMessage> pcmFormat;
+ if (mOffloadDecodedPCM) {
+ sp<MetaData> 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<MetaData> audioMeta =
- mSource->getFormatMeta(true /* audio */);
sendMetaDataToHal(mAudioSink, audioMeta);
}
}