summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2014-12-19 17:55:56 -0800
committerAndy Hung <hunga@google.com>2014-12-19 18:15:33 -0800
commitf0e83644637bd05852c244df481f21a0d435ff66 (patch)
tree1906a30a9d09e3def397d39fba5d64deadc78ae5 /media
parente48cf5b8f823c30af93577c1e380d752ac69b871 (diff)
downloadframeworks_av-f0e83644637bd05852c244df481f21a0d435ff66.zip
frameworks_av-f0e83644637bd05852c244df481f21a0d435ff66.tar.gz
frameworks_av-f0e83644637bd05852c244df481f21a0d435ff66.tar.bz2
NuPlayer: Do not recreate AudioTrack if not needed
On output format change from the decoder, check if a new audio track is really needed. This prevents excessive track creation/destruction during seeks. Bug: 18817027 Change-Id: I4290dcb90cb35bc1303b025e162f6b813d49a05b
Diffstat (limited to 'media')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp29
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h10
2 files changed, 39 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 21b74ee..73f9c15 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -39,6 +39,15 @@ namespace android {
static const int64_t kOffloadPauseMaxUs = 10000000ll;
// static
+const NuPlayer::Renderer::PcmInfo NuPlayer::Renderer::AUDIO_PCMINFO_INITIALIZER = {
+ AUDIO_CHANNEL_NONE,
+ AUDIO_OUTPUT_FLAG_NONE,
+ AUDIO_FORMAT_INVALID,
+ 0, // mNumChannels
+ 0 // mSampleRate
+};
+
+// static
const int64_t NuPlayer::Renderer::kMinPositionUpdateDelayUs = 100000ll;
NuPlayer::Renderer::Renderer(
@@ -75,6 +84,7 @@ NuPlayer::Renderer::Renderer(
mAudioOffloadPauseTimeoutGeneration(0),
mAudioOffloadTornDown(false),
mCurrentOffloadInfo(AUDIO_INFO_INITIALIZER),
+ mCurrentPcmInfo(AUDIO_PCMINFO_INITIALIZER),
mTotalBuffersQueued(0),
mLastAudioBufferDrained(0) {
}
@@ -1395,6 +1405,8 @@ status_t NuPlayer::Renderer::onOpenAudioSink(
// no change from previous configuration, everything ok.
return OK;
}
+ mCurrentPcmInfo = AUDIO_PCMINFO_INITIALIZER;
+
ALOGV("openAudioSink: try to open AudioSink in offload mode");
uint32_t offloadFlags = flags;
offloadFlags |= AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
@@ -1436,6 +1448,20 @@ status_t NuPlayer::Renderer::onOpenAudioSink(
ALOGV("openAudioSink: open AudioSink in NON-offload mode");
uint32_t pcmFlags = flags;
pcmFlags &= ~AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
+
+ const PcmInfo info = {
+ (audio_channel_mask_t)channelMask,
+ (audio_output_flags_t)pcmFlags,
+ AUDIO_FORMAT_PCM_16_BIT, // TODO: change to audioFormat
+ numChannels,
+ sampleRate
+ };
+ if (memcmp(&mCurrentPcmInfo, &info, sizeof(info)) == 0) {
+ ALOGV("openAudioSink: no change in pcm mode");
+ // no change from previous configuration, everything ok.
+ return OK;
+ }
+
audioSinkChanged = true;
mAudioSink->close();
mCurrentOffloadInfo = AUDIO_INFO_INITIALIZER;
@@ -1450,8 +1476,10 @@ status_t NuPlayer::Renderer::onOpenAudioSink(
(audio_output_flags_t)pcmFlags);
if (err != OK) {
ALOGW("openAudioSink: non offloaded open failed status: %d", err);
+ mCurrentPcmInfo = AUDIO_PCMINFO_INITIALIZER;
return err;
}
+ mCurrentPcmInfo = info;
mAudioSink->start();
}
if (audioSinkChanged) {
@@ -1466,6 +1494,7 @@ status_t NuPlayer::Renderer::onOpenAudioSink(
void NuPlayer::Renderer::onCloseAudioSink() {
mAudioSink->close();
mCurrentOffloadInfo = AUDIO_INFO_INITIALIZER;
+ mCurrentPcmInfo = AUDIO_PCMINFO_INITIALIZER;
}
} // namespace android
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
index 406c64c..caa2bb3 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
@@ -180,6 +180,16 @@ private:
bool mAudioOffloadTornDown;
audio_offload_info_t mCurrentOffloadInfo;
+ struct PcmInfo {
+ audio_channel_mask_t mChannelMask;
+ audio_output_flags_t mFlags;
+ audio_format_t mFormat;
+ int32_t mNumChannels;
+ int32_t mSampleRate;
+ };
+ PcmInfo mCurrentPcmInfo;
+ static const PcmInfo AUDIO_PCMINFO_INITIALIZER;
+
int32_t mTotalBuffersQueued;
int32_t mLastAudioBufferDrained;