From 507cff9acf15d6bd2803d072f9cdba186018f295 Mon Sep 17 00:00:00 2001 From: Saketh Sathuvalli <100603@ittiam.com> Date: Sun, 16 Jun 2024 21:32:10 +0530 Subject: [PATCH] Update Makefiles README.md and BP document - #88 Significance: ------------- - Update documents and project makefiles in line with LC_LEVEL_4 changes. --- CMakeLists.txt | 6 ++++ README.md | 47 +++++++++++++++++++++++++---- build/makefile/Makefile_lib | 4 +++ docs/IA-MPEG-H-3D-Audio-Dec-BP.doc | Bin 123904 -> 125440 bytes 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64065d6..2184cb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,12 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_SUPPRESS_REGENERATION true) +option(LC_LEVEL_4 "Enables low complexity level 4 decoder" OFF) + +IF(LC_LEVEL_4) + ADD_DEFINITIONS(-DLC_LEVEL_4) +ENDIF() + # Add Library Target add_library ( ia_mpeghd_lib diff --git a/README.md b/README.md index 05cb9fe..ce1c859 100644 --- a/README.md +++ b/README.md @@ -57,9 +57,16 @@ Profile does not support scene-based audio/HOA. * These makefiles are common for Unix/MacOS builds. * If compiling for non-native platforms, ensure that the compiler and sysroot are updated. * Supported `arch` values are `x86`, `x86_64`, `armv7` and `armv8`. -* Build the library followed by the application using the below commands: +* Build the library with support upto low complexity profile level 3 using the below command: ``` $ make -f Makefile_lib clean all ARCH= +``` +* Build the library with support upto low complexity profile level 4 using the below command: +``` +$ make -f Makefile_lib clean all ARCH= LC_LEVEL_4=1 +``` +* Build the application using the below command: +``` $ make -f Makefile clean all ARCH= ``` @@ -72,36 +79,64 @@ Users can also use cmake to build for `x86`, `x86_64`, `armv7`, `armv8` and Wind ### Building for native platforms Run the following commands to build the MPEG-H 3D Audio Low Complexity Profile Decoder for native platform: -``` + Go to the root directory(libmpegh/) of the MPEG-H 3D Audio Low Complexity Profile Decoder. Create a new folder in the project root directory and move to the newly created folder. - +``` $ cd $ mkdir bin $ cd bin +``` + +Run the below command to configure the project for default build. The default build has support upto low complextiy profile level 3. +``` $ cmake .. +``` + +The build option LC_LEVEL_4 can be used to configure the project to support low complexity profile level 4. +Run the below command to configure the project to create a build that supports low complexity profile level 4. +``` +$ cmake .. -DLC_LEVEL_4=ON +``` + +To build the project run the below command. +``` $ cmake --build . ``` ### Cross-compiling Run the following commands to cross compile for `x86`, `ARMv7` or `ARMv8`: -``` Go to the root directory(libmpegh/) of the MPEG-H 3D Audio Low Complexity Profile Decoder. Create a new folder in the project root directory and move to the newly created folder. +``` $ cd $ mkdir bin $ cd bin +``` + +Run the below command to configure the project for default build. The default build has support upto low complextiy profile level 3. +``` $ cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain_.cmake +``` + +The build option LC_LEVEL_4 can be used to configure the project to support low complexity profile level 4. +Run the below command to configure the project to create a build that supports low complexity profile level 4. +``` +$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain_.cmake -DLC_LEVEL_4=ON +``` + +To build the project run the below command. +``` $ cmake --build . ``` ### Creating MSVS project files To create MSVS project files for the MPEG-H 3D Audio Low Complexity Profile decoder from cmake, run the following commands: -``` Go to the root directory(libmpegh/) of the MPEG-H 3D Audio Low Complexity Profile Decoder. Create a new folder in the project root directory and move to the newly created folder. +``` $ cd $ mkdir bin $ cd bin @@ -267,7 +302,7 @@ Brief description about documents present in `docs` folder * [`IA-MPEG-H-3D-Audio-Dec-API.doc`](docs/IA-MPEG-H-3D-Audio-Dec-API.doc) - Describes Application Program Interface for the MPEG-H 3D Audio Low Complexity Profile Decoder. * [`IA-MPEG-H-3D-Audio-Dec-BP.doc`](docs/IA-MPEG-H-3D-Audio-Dec-BP.doc) - Describes the build procedure for the MPEG-H 3D Audio Low Complexity Profile Decoder on Unix/MacOS platforms. -* [`IA-MPEG-H-3D-Audio-Dec-DS.doc`](docs/IA-MPEG-H-3D-Audio-Dec-DS.doc) - Describes features supported by the MPEG-H 3D Audio Low Complexity Profile Decoder, memory requirements and computational complexity on `x86`, `x86_64`, `armv7` and `armv8` platforms. +* [`IA-MPEG-H-3D-Audio-Dec-DS.doc`](docs/IA-MPEG-H-3D-Audio-Dec-DS.doc) - Describes features supported by the MPEG-H 3D Audio Low Complexity Profile Decoder, memory requirements and computational complexity on `x86`, `x86_64`, `armv7` and `armv8` platforms. The details presented in the data sheet document are for low complexity profile level 3 decoder. The memory requirements and complexity are slightly higher for low complexity profile level 4 decoder. * [`IA-MPEG-H-3D-Audio-Dec-GSG.doc`](docs/IA-MPEG-H-3D-Audio-Dec-GSG.doc) - Getting Started Guide for the MPEG-H 3D Audio Low Complexity Profile Decoder. * [`IA-MPEG-H-3D-Audio-Dec-TR.doc`](docs/IA-MPEG-H-3D-Audio-Dec-TR.doc) - Documents the conformance test report for the MPEG-H 3D Audio Low Complexity Profile decoder on `x86`, `x86_64`, `armv7` and `armv8` platforms. diff --git a/build/makefile/Makefile_lib b/build/makefile/Makefile_lib index 1bdfe07..e550a09 100644 --- a/build/makefile/Makefile_lib +++ b/build/makefile/Makefile_lib @@ -113,6 +113,10 @@ ifneq ($(ARCH), armv7) INCLUDES += -I$(PATH_PLAT) endif +ifeq ($(LC_LEVEL_4), 1) +CFLAGS += -DLC_LEVEL_4 +endif + INCLUDES += -I$(PATH_DEC) -I$(PATH_TEST) OBJS_LIBS = $(SRCS_LIBS:.c=.o) diff --git a/docs/IA-MPEG-H-3D-Audio-Dec-BP.doc b/docs/IA-MPEG-H-3D-Audio-Dec-BP.doc index 1b8cf6d49a7bdd14758d8f432ac753ef989fab44..8b9d4d1bb2723f72522df8c0e0e0c7f350fc6430 100644 GIT binary patch delta 19819 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