Snap for 9000401 from 99e7cc494a91d308b42361d113443fdb35d34804 to mainline-permission-release
Change-Id: Ifaec85581ae3cdb5aa8dd3fa8a64706b9d885617
diff --git a/media/codec2/hidl/1.0/utils/types.cpp b/media/codec2/hidl/1.0/utils/types.cpp
index 5c24bd7..35a3b53 100644
--- a/media/codec2/hidl/1.0/utils/types.cpp
+++ b/media/codec2/hidl/1.0/utils/types.cpp
@@ -1447,6 +1447,10 @@
bool objcpy(C2BaseBlock* d, const BaseBlock& s) {
switch (s.getDiscriminator()) {
case BaseBlock::hidl_discriminator::nativeBlock: {
+ if (s.nativeBlock() == nullptr) {
+ LOG(ERROR) << "Null BaseBlock::nativeBlock handle";
+ return false;
+ }
native_handle_t* sHandle =
native_handle_clone(s.nativeBlock());
if (sHandle == nullptr) {
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index cb050f9..45fac76 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -1946,12 +1946,27 @@
int32_t numChannels;
CHECK(format->findInt32("channel-count", &numChannels));
- int32_t rawChannelMask;
- audio_channel_mask_t channelMask =
- format->findInt32("channel-mask", &rawChannelMask) ?
- static_cast<audio_channel_mask_t>(rawChannelMask)
- // signal to the AudioSink to derive the mask from count.
- : CHANNEL_MASK_USE_CHANNEL_ORDER;
+ // channel mask info as read from the audio format
+ int32_t channelMaskFromFormat;
+ // channel mask to use for native playback
+ audio_channel_mask_t channelMask;
+ if (format->findInt32("channel-mask", &channelMaskFromFormat)) {
+ // KEY_CHANNEL_MASK follows the android.media.AudioFormat java mask
+ // which is left-bitshifted by 2 relative to the native mask
+ if ((channelMaskFromFormat & 0b11) != 0) {
+ // received an unexpected mask (supposed to follow AudioFormat constants
+ // for output masks with the 2 least-significant bits at 0), but
+ // it may come from an extractor that uses native masks: keeping
+ // the mask as given is ok as it contains at least mono or stereo
+ // and potentially the haptic channels
+ channelMask = static_cast<audio_channel_mask_t>(channelMaskFromFormat);
+ } else {
+ channelMask = static_cast<audio_channel_mask_t>(channelMaskFromFormat >> 2);
+ }
+ } else {
+ // no mask found: the mask will be derived from the channel count
+ channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER;
+ }
int32_t sampleRate;
CHECK(format->findInt32("sample-rate", &sampleRate));