policy_hal: adjust bitrate restriction for wma
Adjust bitrate restriction for wma std.
Change-Id: Ia6ede71a8702fd04f06d701602473bc0146843f3
CRs-Fixed: 2044358
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index c258a39..fb14616 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -571,11 +571,35 @@
return false;
}
- if ((((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA) && (offloadInfo.bit_rate > MAX_BITRATE_WMA)) ||
- (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.bit_rate > MAX_BITRATE_WMA_PRO)) ||
- (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.bit_rate > MAX_BITRATE_WMA_LOSSLESS))){
- //Safely choose the min bitrate as threshold and leave the restriction to NT decoder as we can't distinguish wma pro and wma lossless here.
- ALOGD("offload disabled for WMA/WMA_PRO/WMA_LOSSLESS clips with bit rate over maximum supported value");
+ // check against wma std bit rate restriction
+ if ((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA) {
+ int32_t sr_id = -1;
+ uint32_t min_bitrate, max_bitrate;
+ for (int i = 0; i < WMA_STD_NUM_FREQ; i++) {
+ if (offloadInfo.sample_rate == wmaStdSampleRateTbl[i]) {
+ sr_id = i;
+ break;
+ }
+ }
+ if ((sr_id < 0) || (popcount(offloadInfo.channel_mask) > 2)
+ || (popcount(offloadInfo.channel_mask) <= 0)) {
+ ALOGE("invalid sample rate or channel count");
+ return false;
+ }
+
+ min_bitrate = wmaStdMinAvgByteRateTbl[sr_id][popcount(offloadInfo.channel_mask) - 1];
+ max_bitrate = wmaStdMaxAvgByteRateTbl[sr_id][popcount(offloadInfo.channel_mask) - 1];
+ if ((offloadInfo.bit_rate > max_bitrate) || (offloadInfo.bit_rate < min_bitrate)) {
+ ALOGD("offload disabled for WMA clips with unsupported bit rate");
+ ALOGD("bit_rate %d, max_bitrate %d, min_bitrate %d", offloadInfo.bit_rate, max_bitrate, min_bitrate);
+ return false;
+ }
+ }
+
+ // Safely choose the min bitrate as threshold and leave the restriction to NT decoder as we can't distinguish wma pro and wma lossless here.
+ if ((((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.bit_rate > MAX_BITRATE_WMA_PRO)) ||
+ (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.bit_rate > MAX_BITRATE_WMA_LOSSLESS))) {
+ ALOGD("offload disabled for WMA_PRO/WMA_LOSSLESS clips with bit rate over maximum supported value");
return false;
}
#endif
diff --git a/policy_hal/AudioPolicyManager.h b/policy_hal/AudioPolicyManager.h
index 3c01172..45e090e 100644
--- a/policy_hal/AudioPolicyManager.h
+++ b/policy_hal/AudioPolicyManager.h
@@ -32,6 +32,38 @@
#define AUDIO_FORMAT_APE 0x1D000000UL
#endif
+#define WMA_STD_NUM_FREQ 7
+#define WMA_STD_NUM_CHANNELS 2
+static uint32_t wmaStdSampleRateTbl[WMA_STD_NUM_FREQ] =
+{
+ 8000, 11025, 16000, 22050, 32000, 44100, 48000
+};
+
+static uint32_t wmaStdMinAvgByteRateTbl[WMA_STD_NUM_FREQ][WMA_STD_NUM_CHANNELS] =
+{
+ {128, 12000},
+ {8016, 8016},
+ {10000, 16000},
+ {16016, 20008},
+ {20000, 24000},
+ {20008, 31960},
+ {63000, 63000}
+};
+
+static uint32_t wmaStdMaxAvgByteRateTbl[WMA_STD_NUM_FREQ][WMA_STD_NUM_CHANNELS] =
+{
+ {8000, 12000},
+ {10168, 10168},
+ {16000, 20000},
+ {20008, 32048},
+ {20000, 48000},
+ {48024, 320032},
+ {256008, 256008}
+};
+
+#define MAX_BITRATE_WMA_PRO 1536000
+#define MAX_BITRATE_WMA_LOSSLESS 1152000
+
#ifndef AAC_ADTS_OFFLOAD_ENABLED
#define AUDIO_FORMAT_AAC_ADTS 0x1E000000UL
#endif
@@ -40,9 +72,6 @@
#define AUDIO_DEVICE_OUT_PROXY 0x1000000
#endif
-#define MAX_BITRATE_WMA 384000
-#define MAX_BITRATE_WMA_PRO 1536000
-#define MAX_BITRATE_WMA_LOSSLESS 1152000
// ----------------------------------------------------------------------------
class AudioPolicyManagerCustom: public AudioPolicyManager