From 49bc03cfdc9f748c53bd989a3aaf4cd7ec4f4692 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 3 May 2017 11:33:26 -0700 Subject: alsa proxy: fix sampling rate checks in proxy_prepare() - proxy_prepare() should not alter the requested properties (format, sampling rate, channels) without notifying the caller. - It should not force the sampling rate to the max sampling rate supported by the profile but just limit it if the requested combination of sampling rate, channel count and format is not possible. Bug: 37949012 Test: verify capture over USB at various sampling rates Change-Id: Id79ca4fda86db1f756e171d131494c3f244b5f2c --- alsa_utils/alsa_device_proxy.c | 28 ++++++++++++++++++++++++---- alsa_utils/include/alsa_device_proxy.h | 2 +- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/alsa_utils/alsa_device_proxy.c b/alsa_utils/alsa_device_proxy.c index 9236a9b4..9b06d16f 100644 --- a/alsa_utils/alsa_device_proxy.c +++ b/alsa_utils/alsa_device_proxy.c @@ -39,9 +39,11 @@ static const unsigned format_byte_size_map[] = { 3, /* PCM_FORMAT_S24_3LE */ }; -void proxy_prepare(alsa_device_proxy * proxy, alsa_device_profile* profile, +int proxy_prepare(alsa_device_proxy * proxy, alsa_device_profile* profile, struct pcm_config * config) { + int ret = 0; + ALOGV("proxy_prepare(c:%d, d:%d)", profile->card, profile->device); proxy->profile = profile; @@ -53,17 +55,25 @@ void proxy_prepare(alsa_device_proxy * proxy, alsa_device_profile* profile, if (config->format != PCM_FORMAT_INVALID && profile_is_format_valid(profile, config->format)) { proxy->alsa_config.format = config->format; } else { + proxy->alsa_config.format = profile->default_config.format; ALOGW("Invalid format %d - using default %d.", config->format, profile->default_config.format); - proxy->alsa_config.format = profile->default_config.format; + // Indicate override when default format was not requested + if (config->format != PCM_FORMAT_INVALID) { + ret = -EINVAL; + } } if (config->rate != 0 && profile_is_sample_rate_valid(profile, config->rate)) { proxy->alsa_config.rate = config->rate; } else { + proxy->alsa_config.rate = profile->default_config.rate; ALOGW("Invalid sample rate %u - using default %u.", config->rate, profile->default_config.rate); - proxy->alsa_config.rate = profile->default_config.rate; + // Indicate override when default rate was not requested + if (config->rate != 0) { + ret = -EINVAL; + } } if (config->channels != 0 && profile_is_channel_count_valid(profile, config->channels)) { @@ -72,6 +82,10 @@ void proxy_prepare(alsa_device_proxy * proxy, alsa_device_profile* profile, proxy->alsa_config.channels = profile_get_closest_channel_count(profile, config->channels); ALOGW("Invalid channel count %u - using closest %u.", config->channels, proxy->alsa_config.channels); + // Indicate override when default channel count was not requested + if (config->channels != 0) { + ret = -EINVAL; + } } proxy->alsa_config.period_count = profile->default_config.period_count; @@ -98,8 +112,14 @@ void proxy_prepare(alsa_device_proxy * proxy, alsa_device_profile* profile, // us the highest working rate int max_rate_index = proxy_scan_rates(proxy, profile->sample_rates); if (max_rate_index >= 0) { - proxy->alsa_config.rate = profile->sample_rates[max_rate_index]; + if (proxy->alsa_config.rate > profile->sample_rates[max_rate_index]) { + ALOGW("Limiting samplnig rate from %u to %u.", + proxy->alsa_config.rate, profile->sample_rates[max_rate_index]); + proxy->alsa_config.rate = profile->sample_rates[max_rate_index]; + ret = -EINVAL; + } } + return ret; } int proxy_open(alsa_device_proxy * proxy) diff --git a/alsa_utils/include/alsa_device_proxy.h b/alsa_utils/include/alsa_device_proxy.h index 212ae4fa..677bb5ea 100644 --- a/alsa_utils/include/alsa_device_proxy.h +++ b/alsa_utils/include/alsa_device_proxy.h @@ -34,7 +34,7 @@ typedef struct { /* State */ -void proxy_prepare(alsa_device_proxy * proxy, alsa_device_profile * profile, +int proxy_prepare(alsa_device_proxy * proxy, alsa_device_profile * profile, struct pcm_config * config); int proxy_open(alsa_device_proxy * proxy); void proxy_close(alsa_device_proxy * proxy); -- cgit v1.2.3 From 9f8848fb479fe34cd6acd2718c94cd05b47d8166 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Thu, 4 May 2017 14:06:01 -0700 Subject: libaudioeffects: import/export libhardware_headers Required for #include . Test: build with BOARD_VNDK_VERSION=current Bug: 33241851 Change-Id: Ie5b69eddbc47f7de7f1def062e1da54f33a991c2 --- audio_effects/Android.bp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/audio_effects/Android.bp b/audio_effects/Android.bp index 9e88723c..e4e44b77 100644 --- a/audio_effects/Android.bp +++ b/audio_effects/Android.bp @@ -1,4 +1,6 @@ cc_library_headers { name: "libaudioeffects", + header_libs: ["libhardware_headers"], + export_header_lib_headers: ["libhardware_headers"], export_include_dirs: ["include"], } -- cgit v1.2.3 From abc7c4963b25567852b1cdcfbd90a1626dddb3ff Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Fri, 5 May 2017 09:36:03 -0700 Subject: Update path to camera ndk headers Test: generate-metadata Change-Id: Idcafb23a5483d77296003230ec75bcbdd393cf52 --- camera/docs/metadata-generate | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/camera/docs/metadata-generate b/camera/docs/metadata-generate index 0e4dfc29..49124218 100755 --- a/camera/docs/metadata-generate +++ b/camera/docs/metadata-generate @@ -21,7 +21,7 @@ # docs.html # ../src/camera_metadata_tag_info.c # ../src/camera_metadata_tags.h -# ../../../../frameworks/av/include/camera/ndk/NdkCameraMetadataTags.h +# ../../../../frameworks/av/camera/ndk/include/camera/NdkCameraMetadataTags.h # ../../../../frameworks/av/camera/ndk/impl/ACameraMetadata.cpp # ../../../../cts/tests/camera/src/android/hardware/camera2/cts/CaptureResultTest.java # ../../../../frameworks/base/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -38,7 +38,7 @@ fwkdir="$ANDROID_BUILD_TOP/frameworks/base/core/java/android/hardware/camera2/" fwkdir_html="$ANDROID_BUILD_TOP/frameworks/base/docs/html" ctsdir="$ANDROID_BUILD_TOP/cts/tests/camera/src/android/hardware/camera2/cts" outdir="$ANDROID_PRODUCT_OUT/obj/ETC/system-media-camera-docs_intermediates" -ndk_header_dir="$ANDROID_BUILD_TOP/frameworks/av/include/camera/ndk" +ndk_header_dir="$ANDROID_BUILD_TOP/frameworks/av/camera/ndk/include/camera" ndk_impl_dir="$ANDROID_BUILD_TOP/frameworks/av/camera/ndk/impl" device_info_dir="$ANDROID_BUILD_TOP/cts/tools/cts-device-info/"` `"src/com/android/cts/deviceinfo" -- cgit v1.2.3 From 0b47c6ef73b7ca796b506c9b3feb50343863ce9c Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Fri, 5 May 2017 11:03:56 -0700 Subject: Camera metadata: Fix validation alignment check, add more unit tests - Add unit test to ensure validate_camera_metadata_structure correctly reports VALIDATION_SHIFTED for all shifts - Fix alignment validation bug found by unit test - need to offset pointer on both sides of align check. Test: New unit test passes, no camera CTS regression Bug: 37980415 Change-Id: I08379bf3792b57c4eae129acc7aa4f22ab960657 --- camera/src/camera_metadata.c | 7 ++++--- camera/tests/camera_metadata_tests.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/camera/src/camera_metadata.c b/camera/src/camera_metadata.c index c79f61c0..dc800860 100644 --- a/camera/src/camera_metadata.c +++ b/camera/src/camera_metadata.c @@ -420,13 +420,14 @@ int validate_camera_metadata_structure(const camera_metadata_t *metadata, }; for (size_t i = 0; i < sizeof(alignments)/sizeof(alignments[0]); ++i) { - uintptr_t aligned_ptr = ALIGN_TO(metadata, alignments[i].alignment); + uintptr_t aligned_ptr = ALIGN_TO((uintptr_t) metadata + alignmentOffset, + alignments[i].alignment); if ((uintptr_t)metadata + alignmentOffset != aligned_ptr) { ALOGE("%s: Metadata pointer is not aligned (actual %p, " - "expected %p) to type %s", + "expected %p, offset %" PRIuPTR ") to type %s", __FUNCTION__, metadata, - (void*)aligned_ptr, alignments[i].name); + (void*)aligned_ptr, alignmentOffset, alignments[i].name); return CAMERA_METADATA_VALIDATION_ERROR; } } diff --git a/camera/tests/camera_metadata_tests.cpp b/camera/tests/camera_metadata_tests.cpp index 121ce19a..bcebf2e1 100644 --- a/camera/tests/camera_metadata_tests.cpp +++ b/camera/tests/camera_metadata_tests.cpp @@ -1870,3 +1870,37 @@ TEST(camera_metadata, data_alignment) { } } } + +TEST(camera_metadata, buffer_alignment) { + // Verify that misaligned metadata buffers only fail VALIDATION_SHIFTED, nothing else + const size_t entry_capacity = 50; + const size_t data_capacity = 450; + const size_t offsetRange = 16; + const uint32_t validAlignment = 8; + + camera_metadata_t *m = NULL; + m = allocate_camera_metadata(entry_capacity, data_capacity); + + add_test_metadata(m, 15); + + size_t m_size = get_camera_metadata_size(m); + size_t dst_size = m_size + offsetRange; + uint8_t *dst = new uint8_t[dst_size]; + + for (size_t i = 0; i < offsetRange; i++) { + memset(dst, 0, dst_size); + memcpy(dst + i, m, m_size); + camera_metadata_t *m_shifted = (camera_metadata_t*)(dst + i); + + int err = validate_camera_metadata_structure(m_shifted, &m_size); + if (i % validAlignment == 0) { + ASSERT_EQ(OK, err) << "For alignment shift " << i << ", expected OK" ; + } else { + ASSERT_EQ(CAMERA_METADATA_VALIDATION_SHIFTED, err) << + "For alignment shift " << i << ", expected VALIDATION_SHIFTED" ; + } + } + + delete[] dst; + FINISH_USING_CAMERA_METADATA(m); +} -- cgit v1.2.3 From 3282d30589e4be05b76ee3dc92f6cb3bba7e369d Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Fri, 5 May 2017 09:36:03 -0700 Subject: Update path to camera ndk headers Test: generate-metadata Change-Id: Idcafb23a5483d77296003230ec75bcbdd393cf52 (cherry picked from commit abc7c4963b25567852b1cdcfbd90a1626dddb3ff) --- camera/docs/metadata-generate | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/camera/docs/metadata-generate b/camera/docs/metadata-generate index 0e4dfc29..49124218 100755 --- a/camera/docs/metadata-generate +++ b/camera/docs/metadata-generate @@ -21,7 +21,7 @@ # docs.html # ../src/camera_metadata_tag_info.c # ../src/camera_metadata_tags.h -# ../../../../frameworks/av/include/camera/ndk/NdkCameraMetadataTags.h +# ../../../../frameworks/av/camera/ndk/include/camera/NdkCameraMetadataTags.h # ../../../../frameworks/av/camera/ndk/impl/ACameraMetadata.cpp # ../../../../cts/tests/camera/src/android/hardware/camera2/cts/CaptureResultTest.java # ../../../../frameworks/base/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -38,7 +38,7 @@ fwkdir="$ANDROID_BUILD_TOP/frameworks/base/core/java/android/hardware/camera2/" fwkdir_html="$ANDROID_BUILD_TOP/frameworks/base/docs/html" ctsdir="$ANDROID_BUILD_TOP/cts/tests/camera/src/android/hardware/camera2/cts" outdir="$ANDROID_PRODUCT_OUT/obj/ETC/system-media-camera-docs_intermediates" -ndk_header_dir="$ANDROID_BUILD_TOP/frameworks/av/include/camera/ndk" +ndk_header_dir="$ANDROID_BUILD_TOP/frameworks/av/camera/ndk/include/camera" ndk_impl_dir="$ANDROID_BUILD_TOP/frameworks/av/camera/ndk/impl" device_info_dir="$ANDROID_BUILD_TOP/cts/tools/cts-device-info/"` `"src/com/android/cts/deviceinfo" -- cgit v1.2.3 From a13604915308437438f1ff515a33be1c7e01b679 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Fri, 5 May 2017 09:36:03 -0700 Subject: Update path to camera ndk headers Test: generate-metadata Change-Id: Idcafb23a5483d77296003230ec75bcbdd393cf52 Merged-In: Idcafb23a5483d77296003230ec75bcbdd393cf52 (cherry picked from commit abc7c4963b25567852b1cdcfbd90a1626dddb3ff) --- camera/docs/metadata-generate | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/camera/docs/metadata-generate b/camera/docs/metadata-generate index 0e4dfc29..49124218 100755 --- a/camera/docs/metadata-generate +++ b/camera/docs/metadata-generate @@ -21,7 +21,7 @@ # docs.html # ../src/camera_metadata_tag_info.c # ../src/camera_metadata_tags.h -# ../../../../frameworks/av/include/camera/ndk/NdkCameraMetadataTags.h +# ../../../../frameworks/av/camera/ndk/include/camera/NdkCameraMetadataTags.h # ../../../../frameworks/av/camera/ndk/impl/ACameraMetadata.cpp # ../../../../cts/tests/camera/src/android/hardware/camera2/cts/CaptureResultTest.java # ../../../../frameworks/base/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -38,7 +38,7 @@ fwkdir="$ANDROID_BUILD_TOP/frameworks/base/core/java/android/hardware/camera2/" fwkdir_html="$ANDROID_BUILD_TOP/frameworks/base/docs/html" ctsdir="$ANDROID_BUILD_TOP/cts/tests/camera/src/android/hardware/camera2/cts" outdir="$ANDROID_PRODUCT_OUT/obj/ETC/system-media-camera-docs_intermediates" -ndk_header_dir="$ANDROID_BUILD_TOP/frameworks/av/include/camera/ndk" +ndk_header_dir="$ANDROID_BUILD_TOP/frameworks/av/camera/ndk/include/camera" ndk_impl_dir="$ANDROID_BUILD_TOP/frameworks/av/camera/ndk/impl" device_info_dir="$ANDROID_BUILD_TOP/cts/tools/cts-device-info/"` `"src/com/android/cts/deviceinfo" -- cgit v1.2.3