[rust][bt-pacs] Parse Metadata Bug: b/308483293 Change-Id: I4529ae241c2203e37dc7fd5baa3237cb12e9a0e4 Reviewed-on: https://bluetooth-review.git.corp.google.com/c/bluetooth/+/1480 Reviewed-by: Dayeong Lee <dayeonglee@google.com>
diff --git a/rust/bt-pacs/src/lib.rs b/rust/bt-pacs/src/lib.rs index b371697..72e9ecf 100644 --- a/rust/bt-pacs/src/lib.rs +++ b/rust/bt-pacs/src/lib.rs
@@ -4,6 +4,7 @@ use bt_common::core::ltv::LtValue; use bt_common::generic_audio::codec_capabilities::CodecCapability; +use bt_common::generic_audio::metadata_ltv::Metadata; use bt_common::generic_audio::{AudioLocation, ContextType}; use bt_common::packet_encoding::Decodable; use bt_common::Uuid; @@ -52,7 +53,7 @@ pub codec_id: CodecId, pub codec_specific_capabilities: Vec<CodecCapability>, // TODO: Actually parse the metadata once Metadata - pub metadata: (), + pub metadata: Vec<Metadata>, } impl bt_common::packet_encoding::Decodable for PacRecord { @@ -72,20 +73,19 @@ let codec_specific_capabilities = results.into_iter().filter_map(Result::ok).collect(); idx += consumed; - let metadata_length = buf[idx]; + let metadata_length = buf[idx] as usize; idx += 1; - // TODO: Actually parse the Metadata when the type is included in bt_common - /* - let (results, consumed) = Metadatum::decode_all(&buf[idx..idx + metadata_length]); + if idx + metadata_length > buf.len() { + return Err(bt_common::packet_encoding::Error::UnexpectedDataLength); + } + let (results, consumed) = Metadata::decode_all(&buf[idx..idx + metadata_length]); if consumed != metadata_length { return Err(bt_common::packet_encoding::Error::UnexpectedDataLength); } - let metadata = results.into_iter().filter(Result::ok).collect(); + let metadata = results.into_iter().filter_map(Result::ok).collect(); idx += consumed; - */ - idx += metadata_length as usize; - Ok((Self { codec_id, codec_specific_capabilities, metadata: () }, idx)) + Ok((Self { codec_id, codec_specific_capabilities, metadata }, idx)) } } @@ -352,7 +352,7 @@ 0x00, // Len of metadata ]; - const MULTIPLE_PAC_COMPLEX: [u8; 35] = [ + const MULTIPLE_PAC_COMPLEX: [u8; 29] = [ 0x02, // Num of records; 2 0x05, // CodecID: codec MSBC, 0x00, 0x00, 0x00, 0x00, // CodecID: company and specific id (zero) @@ -362,9 +362,8 @@ 0x05, 0x04, // lt: Octets per codec frame 0x11, 0x00, // Minimum: 9 0x00, 0x10, // Maximum: 4096 - 0x0A, // Len of metadata: 10 - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x0A, // Metadata (not parsed at this time) + 0x04, // Len of metadata: 4 + 0x03, 0x01, 0x03, 0x00, // PreferredAudioContexts 0xFF, // CodecId: Vendor specific 0xE0, 0x00, // Google 0x01, 0x10, // ID 4097 @@ -486,6 +485,16 @@ ], ); + let metadata = &first.metadata; + + assert_eq!(metadata.len(), 1); + + let Metadata::PreferredAudioContexts(p) = &metadata[0] else { + panic!("expected PreferredAudioContexts, got {:?}", metadata[0]); + }; + + assert_eq!(p.len(), 2); + let second = &pac.capabilities[1]; assert_eq!( second.codec_id,