Enable CWG-E135, ML based partition pruning in compile time.
Enables CWG-E135 by default in compile time and fixes the following build issues:
- Fixed warnings in CWG-E135 implementation;
- TFlite is only compiled as part of the encoder;
- The experiment is disabled for ARM, PPC and Windows builds until compilation issues are resolved;
- Werror is disabled for anything but AVM authored code;
- Wcomment is disabled in the TFLite includes;
- Run static analyzer only on AVM code
- Disable saving of unncessary artifacts.
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e105588..41d76d4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -269,11 +269,6 @@
- cmake --build aom_build --target dist
- DESTDIR="${CI_PROJECT_DIR}/${INSTALLROOT_FOLDER}" cmake --build aom_build --target install/strip
needs: []
- artifacts:
- expire_in: 1 day
- paths:
- - ${CI_PROJECT_DIR}/aom_build/dist/*
- - ${CI_PROJECT_DIR}/installroot/*
Build (generic-gnu):
extends: .build-common
@@ -359,6 +354,7 @@
CMAKE_FLAGS: >-
-DENABLE_CCACHE=1
-DENABLE_DOCS=0
+ -DCONFIG_ML_PART_SPLIT=0
-DCMAKE_TOOLCHAIN_FILE=build/cmake/toolchains/arm64-linux-gcc.cmake
Build (armv7-linux-gcc):
@@ -380,12 +376,14 @@
CMAKE_FLAGS: >-
-DENABLE_CCACHE=1
-DENABLE_DOCS=0
+ -DCONFIG_ML_PART_SPLIT=0
-DCMAKE_TOOLCHAIN_FILE=build/cmake/toolchains/armv7-linux-gcc.cmake
Build (ppc-linux-gcc):
extends: .build-common
variables:
EXTRA_CMAKE_FLAGS: >-
+ -DCONFIG_ML_PART_SPLIT=0
-DCROSS=powerpc64le-linux-gnu-
-DCMAKE_TOOLCHAIN_FILE=build/cmake/toolchains/ppc-linux-gcc.cmake
@@ -405,6 +403,7 @@
- no-examples
variables:
EXTRA_CMAKE_FLAGS: >-
+ -DCONFIG_ML_PART_SPLIT=0
-DCMAKE_TOOLCHAIN_FILE=build/cmake/toolchains/x86-mingw-gcc.cmake
Build (x86_64-mingw-gcc):
@@ -423,6 +422,7 @@
- no-examples
variables:
EXTRA_CMAKE_FLAGS: >-
+ -DCONFIG_ML_PART_SPLIT=0
-DCMAKE_TOOLCHAIN_FILE=build/cmake/toolchains/x86_64-mingw-gcc.cmake
Build Documentation:
@@ -459,7 +459,6 @@
script:
- git fetch --unshallow
- cmake -B aom_example_build
- -DCMAKE_BUILD_TYPE=RelWithDebInfo
-DENABLE_ASSERTS=1
-DENABLE_EXAMPLES=1
-DBUILD_SHARED_LIBS=0
@@ -676,12 +675,12 @@
AOMENC_LIMIT: 30
AOMENC_QP: 210
AOMENC_INPUT: Vertical_Bayshore_270x480_2997.y4m
- AOMENC: installroot/usr/local/bin/aomenc
+ AOMENC: aom_example_build/aomenc
before_script:
- curl -s -S -f -O https://gitlab.com/AOMediaCodec/aom-testing/-/raw/master/test-files/${AOMENC_INPUT}.xz
- unxz ${AOMENC_INPUT}.xz
needs:
- - 'Build (x86_64-linux-gcc): [encode-only]'
+ - 'Example Build (x86_64-gcc)'
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_PIPELINE_SOURCE == "schedule"'
@@ -816,7 +815,7 @@
interruptible: true
variables:
AOMENC_LIMIT: 30 # Should match the same variable in `.enc-run-common`
- AOMDEC: installroot/usr/local/bin/aomdec
+ AOMDEC: aom_example_build/aomdec
script:
- ${AOMDEC} ${AOMENC_OUTPUT}.obu -o ${AOMDEC_OUTPUT}.decoded.y4m --summary
2>&1 | tee "${AOMDEC_OUTPUT}.summary.log"
@@ -848,7 +847,7 @@
AOMDEC_OUTPUT: dec-all-intra
needs:
- 'Enc Run (All-intra)'
- - 'Build (x86_64-linux-gcc): [decode-only]'
+ - 'Example Build (x86_64-gcc)'
Dec Run (Random Access):
@@ -858,7 +857,7 @@
AOMDEC_OUTPUT: dec-random-access
needs:
- 'Enc Run (Random Access)'
- - 'Build (x86_64-linux-gcc): [decode-only]'
+ - 'Example Build (x86_64-gcc)'
Dec Run (Low-delay):
@@ -868,7 +867,7 @@
AOMDEC_OUTPUT: dec-low-delay
needs:
- 'Enc Run (Low-delay)'
- - 'Build (x86_64-linux-gcc): [decode-only]'
+ - 'Example Build (x86_64-gcc)'
Enc compare:
@@ -935,7 +934,7 @@
- mkdir output-${ANALYZER_MODE}
- |
scan_build() {
- scan-build --exclude third_party -o output-${ANALYZER_MODE} -analyzer-config mode=${ANALYZER_MODE} $*
+ scan-build --exclude third_party --exclude _deps --exclude xnnpack --exclude flatbuffers --exclude cpuinfo --exclude abseil-cpp --exclude eigen --exclude ruy --exclude pthreadpool-source -o output-${ANALYZER_MODE} -analyzer-config mode=${ANALYZER_MODE} $*
}
- scan_build cmake -B aom_build -GNinja -DCMAKE_BUILD_TYPE=Debug
- scan_build --status-bugs cmake --build aom_build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 550600d..7a0a446 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -840,7 +840,7 @@
endif()
endif()
-if(CONFIG_TENSORFLOW_LITE)
+if(CONFIG_TENSORFLOW_LITE AND CONFIG_AV1_ENCODER)
if(ENABLE_EXAMPLES)
add_executable(tf_lite_model "${AOM_ROOT}/examples/tf_lite_model.cc")
list(APPEND AOM_EXAMPLE_TARGETS tf_lite_model)
@@ -848,7 +848,9 @@
add_executable(cnn_restore_y4m
"${AOM_ROOT}/examples/cnn_restore/cnn_restore_y4m.cc")
list(APPEND AOM_APP_TARGETS cnn_restore_y4m)
+ endif()
+ if(ENABLE_EXAMPLES OR ENABLE_TOOLS)
foreach(aom_app ${AOM_APP_TARGETS})
add_dependencies(${aom_app} tensorflow-lite)
target_link_libraries(${aom_app} PRIVATE tensorflow-lite)
@@ -1059,5 +1061,14 @@
endif()
endforeach()
+if(ENABLE_WERROR)
+ foreach(aom_app ${AOM_APP_TARGETS})
+ target_compile_options(${aom_app} PRIVATE "-Werror" "-Wno-error=comment")
+ endforeach()
+ foreach(aom_lib ${AOM_LIB_TARGETS})
+ target_compile_options(${aom_lib} PRIVATE "-Werror" "-Wno-error=comment")
+ endforeach()
+endif()
+
# Generate aom.pc and setup install rule.
setup_aom_install_targets()
diff --git a/av1/encoder/partition_strategy.c b/av1/encoder/partition_strategy.c
index 4fe7e38..5b493af 100644
--- a/av1/encoder/partition_strategy.c
+++ b/av1/encoder/partition_strategy.c
@@ -2428,20 +2428,20 @@
}
}
-static double log_mag(MV mv) {
+static float log_mag(MV mv) {
double mag = sqrt(mv.col * mv.col + mv.row * mv.row);
- return logf(1.0f + mag);
+ return (float)logl(1.0f + mag);
}
-static double angle_rad(MV mv) {
+static float angle_rad(MV mv) {
double mag = sqrt(mv.col * mv.col + mv.row * mv.row);
- return mag == 0 ? 0 : asin(mv.row / mag);
+ return (float)(mag == 0 ? 0 : asin(mv.row / mag));
}
struct ResidualStats {
int q_coeff_max;
int q_coeff_nonz;
- double psnr;
+ float psnr;
int satdq;
int satd;
};
@@ -2515,7 +2515,7 @@
}
double mse =
((double)sse) / (block_size_high[bsize] * block_size_wide[bsize]);
- ret.psnr = sse == 0 ? 70 : AOMMIN(70, 20 * log10(255 / sqrt(mse)));
+ ret.psnr = (float)(sse == 0 ? 70 : AOMMIN(70, 20 * log10(255 / sqrt(mse))));
// TODO: figure out the way to do it w/o allocations
p->coeff = NULL;
@@ -2532,7 +2532,6 @@
}
static struct ResidualStats compute_motion_data(AV1_COMP *const cpi,
- const TileInfo *const tile,
ThreadData *td, MACROBLOCK *x,
SimpleMotionData *sms,
int mi_row, int mi_col,
@@ -2584,8 +2583,8 @@
SimpleMotionData *blk_none =
av1_get_sms_data(cpi, tile_info, x, mi_row, mi_col, bsize);
- struct ResidualStats stats_none = compute_motion_data(
- cpi, tile_info, td, x, blk_none, mi_row, mi_col, bsize);
+ struct ResidualStats stats_none =
+ compute_motion_data(cpi, td, x, blk_none, mi_row, mi_col, bsize);
BLOCK_SIZE subsize_sq = get_partition_subsize(
get_partition_subsize(bsize, PARTITION_HORZ), PARTITION_VERT);
@@ -2599,21 +2598,20 @@
int h_sub_mi = mi_size_high[subsize_sq];
SimpleMotionData *blk_sq_0 =
av1_get_sms_data(cpi, tile_info, x, mi_row, mi_col, subsize_sq);
- struct ResidualStats stats_sq_0 = compute_motion_data(
- cpi, tile_info, td, x, blk_sq_0, mi_row, mi_col, subsize_sq);
+ struct ResidualStats stats_sq_0 =
+ compute_motion_data(cpi, td, x, blk_sq_0, mi_row, mi_col, subsize_sq);
SimpleMotionData *blk_sq_1 = av1_get_sms_data(
cpi, tile_info, x, mi_row, mi_col + w_sub_mi, subsize_sq);
struct ResidualStats stats_sq_1 = compute_motion_data(
- cpi, tile_info, td, x, blk_sq_1, mi_row, mi_col + w_sub_mi, subsize_sq);
+ cpi, td, x, blk_sq_1, mi_row, mi_col + w_sub_mi, subsize_sq);
SimpleMotionData *blk_sq_2 = av1_get_sms_data(
cpi, tile_info, x, mi_row + h_sub_mi, mi_col, subsize_sq);
struct ResidualStats stats_sq_2 = compute_motion_data(
- cpi, tile_info, td, x, blk_sq_2, mi_row + h_sub_mi, mi_col, subsize_sq);
+ cpi, td, x, blk_sq_2, mi_row + h_sub_mi, mi_col, subsize_sq);
SimpleMotionData *blk_sq_3 = av1_get_sms_data(
cpi, tile_info, x, mi_row + h_sub_mi, mi_col + w_sub_mi, subsize_sq);
- struct ResidualStats stats_sq_3 =
- compute_motion_data(cpi, tile_info, td, x, blk_sq_3, mi_row + h_sub_mi,
- mi_col + w_sub_mi, subsize_sq);
+ struct ResidualStats stats_sq_3 = compute_motion_data(
+ cpi, td, x, blk_sq_3, mi_row + h_sub_mi, mi_col + w_sub_mi, subsize_sq);
if (out_features) {
int blk_area = block_size_wide[bsize] * block_size_high[bsize];
diff --git a/av1/encoder/simple_intrapred_tflite_model_128x128.h b/av1/encoder/simple_intrapred_tflite_model_128x128.h
index a8a4e5f..1d5b883 100644
--- a/av1/encoder/simple_intrapred_tflite_model_128x128.h
+++ b/av1/encoder/simple_intrapred_tflite_model_128x128.h
@@ -11,10 +11,10 @@
const struct ModelParams
a3_qp96_128_160_luma_BLOCK_128X128_intra_tflite_params[] = {
- { 0.3, 0.98, 60, 116 },
- { 0.4, 0.97, 60, 116 },
- { 0.5, 0.95, 60, 116 },
- { 0.7, 0.95, 60, 116 }
+ { 0.3f, 0.98f, 60, 116 },
+ { 0.4f, 0.97f, 60, 116 },
+ { 0.5f, 0.95f, 60, 116 },
+ { 0.7f, 0.95f, 60, 116 }
};
unsigned char a3_qp96_128_160_luma_BLOCK_128X128_intra_tflite[] = {
diff --git a/av1/encoder/simple_intrapred_tflite_model_16x16.h b/av1/encoder/simple_intrapred_tflite_model_16x16.h
index 8bc0840..ddd1141 100644
--- a/av1/encoder/simple_intrapred_tflite_model_16x16.h
+++ b/av1/encoder/simple_intrapred_tflite_model_16x16.h
@@ -11,10 +11,10 @@
const struct ModelParams
a3_qp96_128_160_luma_BLOCK_16X16_intra_tflite_params[] = {
- { 0.002, 0.35, 60, 116 },
- { 0.005, 0.32, 60, 116 },
- { 0.01, 0.3, 60, 116 },
- { 0.01, 0.15, 60, 116 }
+ { 0.002f, 0.35f, 60, 116 },
+ { 0.005f, 0.32f, 60, 116 },
+ { 0.01f, 0.3f, 60, 116 },
+ { 0.01f, 0.15f, 60, 116 }
};
unsigned char a3_qp96_128_160_luma_BLOCK_16X16_intra_tflite[] = {
diff --git a/av1/encoder/simple_intrapred_tflite_model_32x32.h b/av1/encoder/simple_intrapred_tflite_model_32x32.h
index b1b11da..8cd791f 100644
--- a/av1/encoder/simple_intrapred_tflite_model_32x32.h
+++ b/av1/encoder/simple_intrapred_tflite_model_32x32.h
@@ -10,10 +10,10 @@
*/
const struct ModelParams
a3_qp96_128_160_luma_BLOCK_32X32_intra_tflite_params[] = {
- { 0.052, 0.45, 60, 116 },
- { 0.052, 0.45, 60, 116 },
- { 0.07, 0.44, 60, 116 },
- { 0.07, 0.25, 60, 116 }
+ { 0.052f, 0.45f, 60, 116 },
+ { 0.052f, 0.45f, 60, 116 },
+ { 0.07f, 0.44f, 60, 116 },
+ { 0.07f, 0.25f, 60, 116 }
};
unsigned char a3_qp96_128_160_luma_BLOCK_32X32_intra_tflite[] = {
diff --git a/av1/encoder/simple_intrapred_tflite_model_64x64.h b/av1/encoder/simple_intrapred_tflite_model_64x64.h
index 31b7740..8b3e7b4 100644
--- a/av1/encoder/simple_intrapred_tflite_model_64x64.h
+++ b/av1/encoder/simple_intrapred_tflite_model_64x64.h
@@ -10,10 +10,10 @@
*/
const struct ModelParams
a3_qp96_128_160_luma_BLOCK_64X64_intra_tflite_params[] = {
- { 0.03, 0.7, 60, 116 },
- { 0.1, 0.7, 60, 116 },
- { 0.2, 0.66, 60, 116 },
- { 0.25, 0.7, 60, 116 }
+ { 0.03f, 0.7f, 60, 116 },
+ { 0.1f, 0.7f, 60, 116 },
+ { 0.2f, 0.66f, 60, 116 },
+ { 0.25f, 0.7f, 60, 116 }
};
unsigned char a3_qp96_128_160_luma_BLOCK_64X64_intra_tflite[] = {
diff --git a/av1/encoder/sms_part_split_prune_tflite_model.h b/av1/encoder/sms_part_split_prune_tflite_model.h
index 25d5f4d..9b57204 100644
--- a/av1/encoder/sms_part_split_prune_tflite_model.h
+++ b/av1/encoder/sms_part_split_prune_tflite_model.h
@@ -9,31 +9,31 @@
* PATENTS file, you can obtain it at www.aomedia.org/license/patent.
*/
const struct ModelParams sms_part_split_prune_tflite_model_params_bs12[] = {
- { 0.0001, 0.95, 75, 150 },
- { 0.005, 0.9, 75, 150 },
- { 0.01, 0.85, 75, 150 },
- { 0.02, 0.8, 75, 150 }
+ { 0.0001f, 0.95f, 75, 150 },
+ { 0.005f, 0.9f, 75, 150 },
+ { 0.01f, 0.85f, 75, 150 },
+ { 0.02f, 0.8f, 75, 150 }
};
const struct ModelParams sms_part_split_prune_tflite_model_params_bs9[] = {
- { 0.001, 0.99, 75, 150 },
- { 0.005, 0.95, 75, 150 },
- { 0.02, 0.9, 75, 150 },
- { 0.04, 0.85, 75, 150 }
+ { 0.001f, 0.99f, 75, 150 },
+ { 0.005f, 0.95f, 75, 150 },
+ { 0.02f, 0.9f, 75, 150 },
+ { 0.04f, 0.85f, 75, 150 }
};
const struct ModelParams sms_part_split_prune_tflite_model_params_bs6[] = {
- { 0.01, 1, 75, 150 },
- { 0.02, 1, 75, 150 },
- { 0.05, 1, 75, 150 },
- { 0.1, 1, 75, 150 }
+ { 0.01f, 1.f, 75, 150 },
+ { 0.02f, 1.f, 75, 150 },
+ { 0.05f, 1.f, 75, 150 },
+ { 0.1f, 1.f, 75, 150 }
};
const struct ModelParams sms_part_split_prune_tflite_model_params_bs3[] = {
- { 0.05, 1, 75, 150 },
- { 0.1, 1, 75, 150 },
- { 0.25, 1, 75, 150 },
- { 0.35, 1, 75, 150 }
+ { 0.05f, 1.f, 75, 150 },
+ { 0.1f, 1.f, 75, 150 },
+ { 0.25f, 1.f, 75, 150 },
+ { 0.35f, 1.f, 75, 150 }
};
// git_part_prune_bs3_6_9_12_qp_110_135_160_nnz_psnr_vect_satdq_32_16_a2_a3_bs12_tflite_model.cc
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 8ce9dd4..425fec1 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1034,9 +1034,6 @@
if (cpi->speed >= 2) {
sf->part_sf.simple_motion_search_early_term_none = 1;
}
-#if CONFIG_ML_PART_SPLIT
- bool key_frame = cpi->common.current_frame.frame_type == KEY_FRAME;
-#endif // CONFIG_ML_PART_SPLIT
}
#endif // CONFIG_EXT_RECUR_PARTITIONS
diff --git a/av1/tflite_models/op_registrations.h b/av1/tflite_models/op_registrations.h
index c0133a9..7d4e0fa 100644
--- a/av1/tflite_models/op_registrations.h
+++ b/av1/tflite_models/op_registrations.h
@@ -20,15 +20,26 @@
// Since TF Lite is external code, instruct the compiler to
// ignore this warning when including it.
// Note that Clang supports this GCC pragma.
+#if defined(__GNUC__) || defined(__GNUG__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wcomment"
+#elif defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic warning "-Wunused-parameter"
+#pragma clang diagnostic warning "-Wcomment"
+#endif
#include "tensorflow/lite/kernels/builtin_op_kernels.h"
#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/model.h"
#include "tensorflow/lite/op_resolver.h"
+#if defined(__GNUC__) || defined(__GNUG__)
#pragma GCC diagnostic pop
+#elif defined(__clang__)
+#pragma clang diagnostic pop
+#endif
// Returns super-set of TF-lite ops required by CNN models for all QPs.
void RegisterSelectedOpsAllQps(::tflite::MutableOpResolver *resolver);
diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake
index 17f9b9d..3db8455 100644
--- a/build/cmake/aom_config_defaults.cmake
+++ b/build/cmake/aom_config_defaults.cmake
@@ -445,9 +445,8 @@
set_aom_config_var(CONFIG_SUBBLK_PAD 1
"Enable subblock padding for subblock mv refinement.")
-set_aom_config_var(
- CONFIG_ML_PART_SPLIT 0 "Partition SPLIT pruning/forcing for intra frames as
- predicted by ML.")
+set_aom_config_var(CONFIG_ML_PART_SPLIT 1
+ "Partition SPLIT pruning/forcing as predicted by ML.")
set_aom_config_var(
CONFIG_INTRA_TX_IST_PARSE 1
"Parsing dependency removal for intra tx type and IST set signaling.")
diff --git a/build/cmake/aom_configure.cmake b/build/cmake/aom_configure.cmake
index de5d718..591e6a6 100644
--- a/build/cmake/aom_configure.cmake
+++ b/build/cmake/aom_configure.cmake
@@ -338,10 +338,6 @@
add_cxx_flag_if_supported("-Wno-psabi")
endif()
- if(ENABLE_WERROR)
- add_compiler_flag_if_supported("-Werror")
- endif()
-
if(ENABLE_ASSERTS)
add_compiler_flag_if_supported("-UNDEBUG")
endif()
diff --git a/common/tf_lite_includes.h b/common/tf_lite_includes.h
index debacdd..dcfdaad 100644
--- a/common/tf_lite_includes.h
+++ b/common/tf_lite_includes.h
@@ -21,8 +21,15 @@
// Since TF Lite is external code, instruct the compiler to
// ignore this warning when including it.
// Note that Clang supports this GCC pragma.
+#if defined(__GNUC__) || defined(__GNUG__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wcomment"
+#elif defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic warning "-Wunused-parameter"
+#pragma clang diagnostic warning "-Wcomment"
+#endif
#include "tensorflow/lite/delegates/xnnpack/xnnpack_delegate.h"
#include "tensorflow/lite/kernels/builtin_op_kernels.h"
@@ -30,6 +37,10 @@
#include "tensorflow/lite/model.h"
#include "tensorflow/lite/op_resolver.h"
+#if defined(__GNUC__) || defined(__GNUG__)
#pragma GCC diagnostic pop
+#elif defined(__clang__)
+#pragma clang diagnostic pop
+#endif
#endif // AOM_COMMON_TF_LITE_INCLUDES_H_