From b12b12f8f4118d4b26b0da327379c6a2f022764b Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 17 Oct 2021 04:45:11 +0100 Subject: [PATCH] Add Apple ADC algorithm. --- CMakeLists.txt | 2 +- adc.c | 125 +++++++++++++++++++++++++++++++++++++++++++ adc.h | 17 ++++++ tests/CMakeLists.txt | 5 +- tests/adc.cpp | 79 +++++++++++++++++++++++++++ tests/data/adc.bin | Bin 0 -> 34367 bytes 6 files changed, 226 insertions(+), 2 deletions(-) create mode 100644 adc.c create mode 100644 adc.h create mode 100644 tests/adc.cpp create mode 100644 tests/data/adc.bin diff --git a/CMakeLists.txt b/CMakeLists.txt index 4aebc71..faea6c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,6 @@ if("${CMAKE_BUILD_TYPE}" MATCHES "Release") endif() endif() -add_library("Aaru.Compression.Native" SHARED library.c apple_rle.c apple_rle.h) +add_library("Aaru.Compression.Native" SHARED library.c apple_rle.c apple_rle.h adc.c adc.h) add_subdirectory(tests) diff --git a/adc.c b/adc.c new file mode 100644 index 0000000..a673c15 --- /dev/null +++ b/adc.c @@ -0,0 +1,125 @@ +// +// Created by claunia on 17/10/21. +// + +#include +#include + +#include "library.h" +#include "adc.h" + +FORCE_INLINE int GetChunkType(uint8_t byt) +{ + if(byt & 0x80) return ADC_PLAIN; + if(byt & 0x40) return ADC_THREE_BYTE; + return ADC_TWO_BYTE; +} + +FORCE_INLINE int GetChunkSize(uint8_t byt) +{ + switch(GetChunkType(byt)) + { + case ADC_PLAIN: return (byt & 0x7F) + 1; + case ADC_TWO_BYTE: return ((byt & 0x3F) >> 2) + 3; + case ADC_THREE_BYTE: return (byt & 0x3F) + 4; + default: return -1; + } +} + +FORCE_INLINE int GetOffset(uint8_t chunk[]) +{ + switch(GetChunkType(chunk[0])) + { + case ADC_PLAIN: return 0; + case ADC_TWO_BYTE: return ((chunk[0] & 0x03) << 8) + chunk[1]; + case ADC_THREE_BYTE: return (chunk[1] << 8) + chunk[2]; + default: return -1; + } +} + +AARU_EXPORT int32_t AARU_CALL adc_decode_buffer(uint8_t* dst_buffer, + int32_t dst_size, + const uint8_t* src_buffer, + int32_t src_size) +{ + int inputPosition = 0; + int chunkSize; + int offset; + int chunkType; + int outPosition = 0; + uint8_t temp[3]; + uint8_t readByte; + uint8_t lastByte; + int i; + + while(inputPosition < src_size) + { + readByte = src_buffer[inputPosition++]; + + chunkType = GetChunkType(readByte); + + switch(chunkType) + { + case ADC_PLAIN: + chunkSize = GetChunkSize(readByte); + if(outPosition + chunkSize > dst_size) goto finished; + memcpy(dst_buffer + outPosition, src_buffer + inputPosition, chunkSize); + outPosition += chunkSize; + inputPosition += chunkSize; + break; + case ADC_TWO_BYTE: + chunkSize = GetChunkSize(readByte); + temp[0] = readByte; + temp[1] = src_buffer[inputPosition++]; + offset = GetOffset(temp); + if(outPosition + chunkSize > dst_size) goto finished; + if(offset == 0) + { + lastByte = dst_buffer[outPosition - 1]; + for(i = 0; i < chunkSize; i++) + { + dst_buffer[outPosition] = lastByte; + outPosition++; + } + } + else + { + for(i = 0; i < chunkSize; i++) + { + dst_buffer[outPosition] = dst_buffer[outPosition - offset - 1]; + outPosition++; + } + } + break; + case ADC_THREE_BYTE: + chunkSize = GetChunkSize(readByte); + temp[0] = readByte; + temp[1] = src_buffer[inputPosition++]; + temp[2] = src_buffer[inputPosition++]; + offset = GetOffset(temp); + + if(outPosition + chunkSize > dst_size) goto finished; + if(offset == 0) + { + lastByte = dst_buffer[outPosition - 1]; + for(i = 0; i < chunkSize; i++) + { + dst_buffer[outPosition] = lastByte; + outPosition++; + } + } + else + { + for(i = 0; i < chunkSize; i++) + { + dst_buffer[outPosition] = dst_buffer[outPosition - offset - 1]; + outPosition++; + } + } + break; + } + } + +finished: + return outPosition; +} \ No newline at end of file diff --git a/adc.h b/adc.h new file mode 100644 index 0000000..ef1e632 --- /dev/null +++ b/adc.h @@ -0,0 +1,17 @@ +// +// Created by claunia on 17/10/21. +// + +#ifndef AARU_COMPRESSION_NATIVE__ADC_H_ +#define AARU_COMPRESSION_NATIVE__ADC_H_ + +#define ADC_PLAIN 1 +#define ADC_TWO_BYTE 2 +#define ADC_THREE_BYTE 3 + +AARU_EXPORT int32_t AARU_CALL adc_decode_buffer(uint8_t* dst_buffer, + int32_t dst_size, + const uint8_t* src_buffer, + int32_t src_size); + +#endif // AARU_COMPRESSION_NATIVE__ADC_H_ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 324d45d..5f41b5a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,7 +12,10 @@ include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR}) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data/apple_rle.bin DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/data/) +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data/adc.bin + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/data/) + # 'Google_Tests_run' is the target name # 'test1.cpp tests2.cpp' are source files with tests -add_executable(tests_run apple_rle.cpp crc32.c crc32.h) +add_executable(tests_run apple_rle.cpp crc32.c crc32.h adc.cpp) target_link_libraries(tests_run gtest gtest_main "Aaru.Compression.Native") diff --git a/tests/adc.cpp b/tests/adc.cpp new file mode 100644 index 0000000..d6c0e4c --- /dev/null +++ b/tests/adc.cpp @@ -0,0 +1,79 @@ +/* + * This file is part of the Aaru Data Preservation Suite. + * Copyright (c) 2019-2021 Natalia Portillo. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include +#include +#include + +#include "../library.h" +#include "../adc.h" +#include "crc32.h" +#include "gtest/gtest.h" + +#define EXPECTED_CRC32 0x5a5a7388 + +static const uint8_t* buffer; + +class adcFixture : public ::testing::Test +{ + public: + adcFixture() + { + // initialization; + // can also be done in SetUp() + } + + protected: + void SetUp() + { + char path[PATH_MAX]; + char filename[PATH_MAX]; + + getcwd(path, PATH_MAX); + snprintf(filename, PATH_MAX, "%s/data/adc.bin", path); + + FILE* file = fopen(filename, "rb"); + buffer = (const uint8_t*)malloc(34367); + fread((void*)buffer, 1, 34367, file); + fclose(file); + } + + void TearDown() { free((void*)buffer); } + + ~adcFixture() + { + // resources cleanup, no exceptions allowed + } + + // shared user data +}; + +TEST_F(adcFixture, adc) +{ + auto* outBuf = (uint8_t*)malloc(327680); + + auto decoded = adc_decode_buffer(outBuf, 327680, buffer, 34367); + + EXPECT_EQ(decoded, 262144); + + auto crc = crc32_data(outBuf, 262144); + + free(outBuf); + + EXPECT_EQ(crc, EXPECTED_CRC32); +} diff --git a/tests/data/adc.bin b/tests/data/adc.bin new file mode 100644 index 0000000000000000000000000000000000000000..c9074a2b90a7ca5e424a7cf8899510a61642ff6e GIT binary patch literal 34367 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 literal 0 HcmV?d00001