Fix SAD validation condition

This CL fixes a bug in the condition for validating a Short Audio
Descriptor. Without this CL, valid SADs get dropped, while invalid SADs
get forwarded to the audio framework. With this CL, only valid SADs get
forwarded to the audio framework.

Test: atest and manual
Bug: 215186955

Change-Id: Idfdff2546cf2188e428f4e7b925d402ed9e0e46e
This commit is contained in:
daren.liao
2022-06-14 21:18:43 +08:00
committed by Nathalie Le Clair
parent 1d6e7107ec
commit 4ab2de10aa
3 changed files with 66 additions and 57 deletions

View File

@@ -337,6 +337,8 @@ final class Constants {
static final int AUDIO_CODEC_WMAPRO = 0xE; // Support WMA-Pro
static final int AUDIO_CODEC_MAX = 0xF;
static final int AUDIO_FORMAT_MASK = 0b0111_1000;
@StringDef({
AUDIO_DEVICE_ARC_IN,
AUDIO_DEVICE_SPDIF,

View File

@@ -200,8 +200,14 @@ final class RequestSadAction extends HdmiCecFeatureAction {
}
private boolean isValidCodec(byte codec) {
return Constants.AUDIO_CODEC_NONE < (codec & 0xFF)
&& (codec & 0xFF) <= Constants.AUDIO_CODEC_MAX;
// Bit 7 needs to be 0.
if ((codec & (1 << 7)) != 0) {
return false;
}
// Bit [6, 3] is the audio format code.
int audioFormatCode = (codec & Constants.AUDIO_FORMAT_MASK) >> 3;
return Constants.AUDIO_CODEC_NONE < audioFormatCode
&& audioFormatCode <= Constants.AUDIO_CODEC_MAX;
}
private void updateResult(byte[] sad) {

View File

@@ -295,10 +295,10 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_1 = new byte[]{
0x01, 0x18, 0x4A,
0x02, 0x64, 0x5A,
0x03, 0x4B, 0x00,
0x04, 0x20, 0x0A};
0x0F, 0x18, 0x4A,
0x17, 0x64, 0x5A,
0x1F, 0x4B, 0x00,
0x27, 0x20, 0x0A};
HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -310,10 +310,10 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_2 = new byte[]{
0x05, 0x18, 0x4A,
0x06, 0x64, 0x5A,
0x07, 0x4B, 0x00,
0x08, 0x20, 0x0A};
0x2F, 0x18, 0x4A,
0x37, 0x64, 0x5A,
0x3F, 0x4B, 0x00,
0x47, 0x20, 0x0A};
HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
@@ -325,10 +325,10 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_3 = new byte[]{
0x09, 0x18, 0x4A,
0x0A, 0x64, 0x5A,
0x0B, 0x4B, 0x00,
0x0C, 0x20, 0x0A};
0x4F, 0x18, 0x4A,
0x57, 0x64, 0x5A,
0x5F, 0x4B, 0x00,
0x67, 0x20, 0x0A};
HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
@@ -340,9 +340,9 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_4 = new byte[]{
0x0D, 0x18, 0x4A,
0x0E, 0x64, 0x5A,
0x0F, 0x4B, 0x00};
0x6F, 0x18, 0x4A,
0x77, 0x64, 0x5A,
0x7F, 0x4B, 0x00};
HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4);
assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
@@ -371,9 +371,9 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_1 = new byte[]{
0x01, 0x18, 0x4A,
0x03, 0x4B, 0x00,
0x04, 0x20, 0x0A};
0x0F, 0x18, 0x4A,
0x1F, 0x4B, 0x00,
0x27, 0x20, 0x0A};
HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -385,7 +385,7 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_2 = new byte[]{
0x08, 0x20, 0x0A};
0x2F, 0x20, 0x0A};
HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
@@ -397,10 +397,10 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_3 = new byte[]{
0x09, 0x18, 0x4A,
0x0A, 0x64, 0x5A,
0x0B, 0x4B, 0x00,
0x0C, 0x20, 0x0A};
0x4F, 0x18, 0x4A,
0x57, 0x64, 0x5A,
0x5F, 0x4B, 0x00,
0x67, 0x20, 0x0A};
HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
@@ -412,7 +412,7 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_4 = new byte[]{
0x0F, 0x4B, 0x00};
0x7F, 0x4B, 0x00};
HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4);
assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
@@ -440,11 +440,12 @@ public class RequestSadActionTest {
HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
// Negative values require explicit casting
byte[] sadsToRespond_1 = new byte[]{
0x20, 0x18, 0x4A,
0x21, 0x64, 0x5A,
0x22, 0x4B, 0x00,
0x23, 0x20, 0x0A};
(byte) 0x80, 0x18, 0x4A,
(byte) 0x82, 0x64, 0x5A,
(byte) 0x87, 0x4B, 0x00,
(byte) 0x8F, 0x20, 0x0A};
HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -456,10 +457,10 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_2 = new byte[]{
0x24, 0x18, 0x4A,
0x25, 0x64, 0x5A,
0x26, 0x4B, 0x00,
0x27, 0x20, 0x0A};
(byte) 0x92, 0x18, 0x4A,
(byte) 0x98, 0x64, 0x5A,
(byte) 0xA1, 0x4B, 0x00,
(byte) 0xA4, 0x20, 0x0A};
HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
@@ -471,10 +472,10 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_3 = new byte[]{
0x28, 0x18, 0x4A,
0x29, 0x64, 0x5A,
0x2A, 0x4B, 0x00,
0x2B, 0x20, 0x0A};
(byte) 0xB3, 0x18, 0x4A,
(byte) 0xBA, 0x64, 0x5A,
(byte) 0xCB, 0x4B, 0x00,
(byte) 0xCF, 0x20, 0x0A};
HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
@@ -486,9 +487,9 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_4 = new byte[]{
0x2C, 0x18, 0x4A,
0x2D, 0x64, 0x5A,
0x2E, 0x4B, 0x00};
(byte) 0xF0, 0x18, 0x4A,
(byte) 0xF1, 0x64, 0x5A,
(byte) 0xF3, 0x4B, 0x00};
HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4);
assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
@@ -510,10 +511,10 @@ public class RequestSadActionTest {
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_1 = new byte[]{
0x01, 0x18,
0x02, 0x64, 0x5A,
0x03, 0x4B, 0x00,
0x04, 0x20, 0x0A};
0x0F, 0x18,
0x17, 0x64, 0x5A,
0x1F, 0x4B, 0x00,
0x27, 0x20, 0x0A};
HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -580,10 +581,10 @@ public class RequestSadActionTest {
new int[]{Constants.AUDIO_CODEC_LPCM, Constants.AUDIO_CODEC_DD,
Constants.AUDIO_CODEC_MP3, Constants.AUDIO_CODEC_MPEG2});
byte[] sadsToRespond_1 = new byte[]{
0x01, 0x18, 0x4A,
0x02, 0x64, 0x5A,
0x04, 0x20, 0x0A,
0x05, 0x18, 0x4A};
0x0F, 0x18, 0x4A,
0x17, 0x64, 0x5A,
0x27, 0x20, 0x0A,
0x2F, 0x18, 0x4A};
HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1);
assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
@@ -596,10 +597,10 @@ public class RequestSadActionTest {
new int[]{Constants.AUDIO_CODEC_AAC, Constants.AUDIO_CODEC_DTS,
Constants.AUDIO_CODEC_ATRAC, Constants.AUDIO_CODEC_DDP});
byte[] sadsToRespond_2 = new byte[]{
0x06, 0x64, 0x5A,
0x07, 0x4B, 0x00,
0x08, 0x20, 0x0A,
0x09, 0x18, 0x4A};
0x37, 0x64, 0x5A,
0x3F, 0x4B, 0x00,
0x47, 0x20, 0x0A,
0x4F, 0x18, 0x4A};
HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
@@ -612,10 +613,10 @@ public class RequestSadActionTest {
new int[]{Constants.AUDIO_CODEC_DTSHD, Constants.AUDIO_CODEC_TRUEHD,
Constants.AUDIO_CODEC_DST, Constants.AUDIO_CODEC_MAX});
byte[] sadsToRespond_3 = new byte[]{
0x0B, 0x4B, 0x00,
0x0C, 0x20, 0x0A,
0x0D, 0x18, 0x4A,
0x0F, 0x4B, 0x00};
0x5F, 0x4B, 0x00,
0x67, 0x20, 0x0A,
0x6F, 0x18, 0x4A,
0x7F, 0x4B, 0x00};
HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
assertThat(mNativeWrapper.getResultMessages()).contains(expected3);