From 9ee64f139ceff98ea5f9afcc2eaab42901922d56 Mon Sep 17 00:00:00 2001 From: Previr Rangroo Date: Tue, 28 Nov 2017 17:55:36 +1100 Subject: [PATCH 1/2] Add presentation API interface This adds AudioPresentationInfo interface to enable applications to query and receive audio presentation information from multiplexed data sources (e.g. MP4 or MPEG2-TS). Bug: 63901775 Test: make Change-Id: I3156cc8594ae153fe8cd2dedc191bfab207f5203 Signed-off-by: Previr Rangroo --- include/media/AudioPresentationInfo.h | 79 +++++++++++++++++++ media/libstagefright/Android.bp | 1 + .../libstagefright/AudioPresentationInfo.cpp | 45 +++++++++++ 3 files changed, 125 insertions(+) create mode 100644 include/media/AudioPresentationInfo.h create mode 100644 media/libstagefright/AudioPresentationInfo.cpp diff --git a/include/media/AudioPresentationInfo.h b/include/media/AudioPresentationInfo.h new file mode 100644 index 0000000000..e91a992950 --- /dev/null +++ b/include/media/AudioPresentationInfo.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef AUDIO_PRESENTATION_INFO_H_ +#define AUDIO_PRESENTATION_INFO_H_ + +#include +#include + +#include +#include +#include +#include + +namespace android { + +enum mastering_indication { + MASTERING_NOT_INDICATED, + MASTERED_FOR_STEREO, + MASTERED_FOR_SURROUND, + MASTERED_FOR_3D, + MASTERED_FOR_HEADPHONE, +}; + +struct AudioPresentation : public RefBase { + int32_t mPresentationId; + int32_t mProgramId; + KeyedVector mLabels; + String8 mLanguage; + int32_t mMasteringIndication; + bool mAudioDescriptionAvailable; + bool mSpokenSubtitlesAvailable; + bool mDialogueEnhancementAvailable; + + AudioPresentation() { + mPresentationId = -1; + mProgramId = -1; + mLanguage = ""; + mMasteringIndication = MASTERING_NOT_INDICATED; + mAudioDescriptionAvailable = false; + mSpokenSubtitlesAvailable = false; + mDialogueEnhancementAvailable = false; + } +}; + +typedef Vector> AudioPresentations; + +class AudioPresentationInfo : public RefBase { + public: + AudioPresentationInfo(); + + ~AudioPresentationInfo(); + + void addPresentation(sp presentation); + + size_t countPresentations() const; + + const sp getPresentation(size_t index) const; + + private: + AudioPresentations mPresentations; +}; + +} // namespace android + +#endif // AUDIO_PRESENTATION_INFO_H_ diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp index 01f73a14e5..6da1940438 100644 --- a/media/libstagefright/Android.bp +++ b/media/libstagefright/Android.bp @@ -35,6 +35,7 @@ cc_library_shared { "AACWriter.cpp", "AMRWriter.cpp", "AudioPlayer.cpp", + "AudioPresentationInfo.cpp", "AudioSource.cpp", "BufferImpl.cpp", "CCodec.cpp", diff --git a/media/libstagefright/AudioPresentationInfo.cpp b/media/libstagefright/AudioPresentationInfo.cpp new file mode 100644 index 0000000000..86e1859ce8 --- /dev/null +++ b/media/libstagefright/AudioPresentationInfo.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// #define LOG_NDEBUG 0 +#define LOG_TAG "AudioPresentationInfo" + +#include + +namespace android { + +AudioPresentationInfo::AudioPresentationInfo() { +} + +AudioPresentationInfo::~AudioPresentationInfo() { + mPresentations.clear(); +} + +void AudioPresentationInfo::addPresentation(sp presentation) { + mPresentations.push(presentation); +} + +size_t AudioPresentationInfo::countPresentations() const { + return mPresentations.size(); +} + +// Returns an AudioPresentation for the given valid index +// index must be >=0 and < countPresentations() +const sp AudioPresentationInfo::getPresentation(size_t index) const { + return mPresentations[index]; +} + +} // namespace android From a70eef730d7665c9f4b2dfd25faf072785f80a2d Mon Sep 17 00:00:00 2001 From: Dean Wheatley Date: Thu, 4 Jan 2018 14:23:50 +1100 Subject: [PATCH 2/2] Audio presentation selection for AudioTrack native Bug: 63901775 Test: make Change-Id: I63c9bdef880c7c387fd05f093b8d1094307a2754 Signed-off-by: Previr Rangroo --- media/libaudioclient/AudioTrack.cpp | 12 ++++++++++++ media/libaudioclient/include/media/AudioParameter.h | 6 ++++++ media/libaudioclient/include/media/AudioTrack.h | 3 +++ media/libmedia/AudioParameter.cpp | 2 ++ 4 files changed, 23 insertions(+) diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp index a3c66fe700..5e7cda7d87 100644 --- a/media/libaudioclient/AudioTrack.cpp +++ b/media/libaudioclient/AudioTrack.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -2342,6 +2343,17 @@ status_t AudioTrack::setParameters(const String8& keyValuePairs) return mAudioTrack->setParameters(keyValuePairs); } +status_t AudioTrack::selectPresentation(int presentationId, int programId) +{ + AutoMutex lock(mLock); + AudioParameter param = AudioParameter(); + param.addInt(String8(AudioParameter::keyPresentationId), presentationId); + param.addInt(String8(AudioParameter::keyProgramId), programId); + ALOGV("PresentationId/ProgramId[%s]",param.toString().string()); + + return mAudioTrack->setParameters(param.toString()); +} + VolumeShaper::Status AudioTrack::applyVolumeShaper( const sp& configuration, const sp& operation) diff --git a/media/libaudioclient/include/media/AudioParameter.h b/media/libaudioclient/include/media/AudioParameter.h index 1ace607a2c..59ac1db998 100644 --- a/media/libaudioclient/include/media/AudioParameter.h +++ b/media/libaudioclient/include/media/AudioParameter.h @@ -58,6 +58,12 @@ public: static const char * const keyMonoOutput; static const char * const keyStreamHwAvSync; + // keys for presentation selection + // keyPresentationId: Audio presentation identifier + // keyProgramId: Audio presentation program identifier + static const char * const keyPresentationId; + static const char * const keyProgramId; + // keyStreamConnect / Disconnect: value is an int in audio_devices_t static const char * const keyStreamConnect; static const char * const keyStreamDisconnect; diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h index c146db95e1..7c8a0fa79d 100644 --- a/media/libaudioclient/include/media/AudioTrack.h +++ b/media/libaudioclient/include/media/AudioTrack.h @@ -760,6 +760,9 @@ public: /* Gets the volume shaper state */ sp getVolumeShaperState(int id); + /* Selects the presentation (if available) */ + status_t selectPresentation(int presentationId, int programId); + /* Get parameters */ String8 getParameters(const String8& keys); diff --git a/media/libmedia/AudioParameter.cpp b/media/libmedia/AudioParameter.cpp index 65fc70b89b..cb0e927209 100644 --- a/media/libmedia/AudioParameter.cpp +++ b/media/libmedia/AudioParameter.cpp @@ -34,6 +34,8 @@ const char * const AudioParameter::keyInputSource = AUDIO_PARAMETER_STREAM_INPUT const char * const AudioParameter::keyScreenState = AUDIO_PARAMETER_KEY_SCREEN_STATE; const char * const AudioParameter::keyBtNrec = AUDIO_PARAMETER_KEY_BT_NREC; const char * const AudioParameter::keyHwAvSync = AUDIO_PARAMETER_HW_AV_SYNC; +const char * const AudioParameter::keyPresentationId = AUDIO_PARAMETER_STREAM_PRESENTATION_ID; +const char * const AudioParameter::keyProgramId = AUDIO_PARAMETER_STREAM_PROGRAM_ID; const char * const AudioParameter::keyMonoOutput = AUDIO_PARAMETER_MONO_OUTPUT; const char * const AudioParameter::keyStreamHwAvSync = AUDIO_PARAMETER_STREAM_HW_AV_SYNC; const char * const AudioParameter::keyStreamConnect = AUDIO_PARAMETER_DEVICE_CONNECT;