diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2020-05-02 02:07:05 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2020-05-02 02:07:05 +0000 |
commit | 9a9f73e24d15e84b8dc6fa19697282455ccc1ebe (patch) | |
tree | f7415119aafa57dc0d279e55f1dbb7a81f8dafce | |
parent | 344e643d6defaced02b658fbd57ba890c4abbfeb (diff) | |
parent | ae56a5c61697ee3f84a42342048516b9f6d9f52c (diff) | |
download | tremolo-9a9f73e24d15e84b8dc6fa19697282455ccc1ebe.tar.gz |
Snap for 6454413 from ae56a5c61697ee3f84a42342048516b9f6d9f52c to rvc-d1-release
Change-Id: I810353b34eec08de0e800345d3f4ace8e218b0ab
-rw-r--r-- | TEST_MAPPING | 6 | ||||
-rw-r--r-- | Tremolo/floor0.c | 17 | ||||
-rw-r--r-- | tests/Android.bp | 34 | ||||
-rw-r--r-- | tests/test_floor0.cpp | 109 |
4 files changed, 161 insertions, 5 deletions
diff --git a/TEST_MAPPING b/TEST_MAPPING new file mode 100644 index 0000000..fed9cac --- /dev/null +++ b/TEST_MAPPING @@ -0,0 +1,6 @@ +{ + "presubmit": [ + { "name": "oob_oggpack_look" } + ] +} + diff --git a/Tremolo/floor0.c b/Tremolo/floor0.c index b6ece29..7e74d1e 100644 --- a/Tremolo/floor0.c +++ b/Tremolo/floor0.c @@ -402,13 +402,20 @@ ogg_int32_t *floor0_inverse1(vorbis_dsp_state *vd,vorbis_info_floor *i, ogg_int32_t *lsp){ vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; int j,k; - - int ampraw=oggpack_read(&vd->opb,info->ampbits); + uint64_t ampraw; + if(info->ampbits<=32){ + ampraw=oggpack_read(&vd->opb,info->ampbits); + }else{ + //max value possible for info->ampbits is 63 + ampraw=oggpack_read(&vd->opb,info->ampbits-32); + ampraw<<=32; + ampraw|=oggpack_read(&vd->opb,32); + } if(ampraw>0){ /* also handles the -1 out of data case */ - long maxval=(1<<info->ampbits)-1; - int amp=((ampraw*info->ampdB)<<4)/maxval; + uint64_t maxval=(1<<info->ampbits)-1; + float ampRatio=(float)ampraw/maxval; + int amp=ampRatio*(info->ampdB<<4); int booknum=oggpack_read(&vd->opb,_ilog(info->numbooks)); - if(booknum!=-1 && booknum<info->numbooks){ /* be paranoid */ codec_setup_info *ci=(codec_setup_info *)vd->vi->codec_setup; codebook *b=ci->book_param+info->books[booknum]; diff --git a/tests/Android.bp b/tests/Android.bp new file mode 100644 index 0000000..a27c234 --- /dev/null +++ b/tests/Android.bp @@ -0,0 +1,34 @@ +cc_test { + name: "oob_oggpack_look", + gtest: true, + test_suites: ["device-tests"], + + srcs: ["test_floor0.cpp"], + + // compile_multilib: "64", + + static_libs: [ + "libvorbisidec", + "liblog", + ], + + shared_libs: [ + "libutils", + "liblog", + ], + + cflags: [ + "-Wall", + "-Werror", + ], + + sanitize: { + integer_overflow: true, + misc_undefined: ["bounds"], + diag: { + integer_overflow: true, + undefined: true, + misc_undefined: ["bounds"], + }, + }, +} diff --git a/tests/test_floor0.cpp b/tests/test_floor0.cpp new file mode 100644 index 0000000..a3a8eb3 --- /dev/null +++ b/tests/test_floor0.cpp @@ -0,0 +1,109 @@ +/* + * test case not really written for gtest, but wrapped so it'll cooperate. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "Utils_test" + +#include <gtest/gtest.h> + +#include <string.h> +#define REF_COUNT 1 +#define DECODE_PACKET 1 + +extern "C" { +#include <Tremolo/codec_internal.h> + +int _vorbis_unpack_books(vorbis_info *vi, oggpack_buffer *opb); +int _vorbis_unpack_info(vorbis_info *vi, oggpack_buffer *opb); +int _vorbis_unpack_comment(vorbis_comment *vc, oggpack_buffer *opb); +} + +const uint8_t packInfoData[] = { 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0xBB, 0x00, + 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xBB, 0x01, 0xFF, 0xFF, 0xFF, 0xFF }; + +unsigned char unpackBookData[] = { 0x00, 0x42, 0x43, 0x56, 0x1E, 0x00, 0x10, + 0x00, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x10, 0x0A, 0xFF, 0x00, 0x00, + 0x00, 0x06, 0xD0, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1D, 0x00, 0x00, 0x00, + 0x2C, 0x00, 0x03, 0x3C, 0x51, 0x04, 0x34, 0x4F, 0x04, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xCB, 0x00, 0x40, 0x00, 0x00, 0x01, 0x4F, 0xF4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF }; + +unsigned char bufData[] = { 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xE7, + 0x00, 0x00, 0xE9, 0x00 }; + +static void makeBitReader(const void *data, size_t size, ogg_buffer *buf, + ogg_reference *ref, oggpack_buffer *bits) { + buf->data = (uint8_t *) data; + buf->size = size; + buf->refcount = REF_COUNT; + + ref->buffer = buf; + ref->length = size; + oggpack_readinit(bits, ref); +} + +// below here is where we're trying to bridge the gtest and non-gtest world + +namespace android { + +class Floor0Test : public ::testing::Test { +}; + +// +// the test, since it compiles with ubsan, should fault and die if the patch +// is not in place. at least that's the idea. +TEST_F(Floor0Test, Test1) { + + ogg_buffer buf; + ogg_reference ref; + oggpack_buffer bits; + + memset(&buf, 0, sizeof(ogg_buffer)); + memset(&ref, 0, sizeof(ogg_reference)); + memset(&bits, 0, sizeof(oggpack_buffer)); + + makeBitReader(packInfoData, sizeof(packInfoData), &buf, &ref, &bits); + + vorbis_info *mVi = new vorbis_info; + vorbis_info_init(mVi); + + int ret = _vorbis_unpack_info(mVi, &bits); + if (!ret) { + memset(&buf, 0, sizeof(ogg_buffer)); + memset(&ref, 0, sizeof(ogg_reference)); + memset(&bits, 0, sizeof(oggpack_buffer)); + + makeBitReader(unpackBookData, sizeof(unpackBookData), &buf, &ref, + &bits); + + ret = _vorbis_unpack_books(mVi, &bits); + if (!ret) { + ogg_packet pack; + memset(&pack, 0, sizeof(ogg_packet)); + memset(&buf, 0, sizeof(ogg_buffer)); + memset(&ref, 0, sizeof(ogg_reference)); + + vorbis_dsp_state *mState = new vorbis_dsp_state; + vorbis_dsp_init(mState, mVi); + + buf.data = bufData; + buf.size = sizeof(bufData); + buf.refcount = REF_COUNT; + + ref.buffer = &buf; + ref.length = buf.size; + + pack.packet = &ref; + pack.bytes = ref.length; + + vorbis_dsp_synthesis(mState, &pack, DECODE_PACKET); + } + } +} + +} // namespace android |