| # Copyright (c) 2021, Alliance for Open Media. All rights reserved | |
| # | |
| # This source code is subject to the terms of the BSD 2 Clause License and | |
| # the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License | |
| # was not distributed with this source code in the LICENSE file, you can | |
| # obtain it at www.aomedia.org/license/software. If the Alliance for Open | |
| # Media Patent License 1.0 was not distributed with this source code in the | |
| # PATENTS file, you can obtain it at www.aomedia.org/license/patent. | |
| # | |
| import os | |
| import sys | |
| def is_code_file(filename): | |
| return filename.endswith(".c") or filename.endswith(".h") | |
| def is_simd_file(filename): | |
| simd_keywords = [ | |
| "avx2", "sse2", "sse3", "ssse3", "sse4", "dspr2", "neon", "msa", "simd", | |
| "x86" | |
| ] | |
| for keyword in simd_keywords: | |
| if filename.find(keyword) >= 0: | |
| return True | |
| return False | |
| def get_code_file_list(path, exclude_file_set): | |
| code_file_list = [] | |
| for cur_dir, sub_dir, file_list in os.walk(path): | |
| for filename in file_list: | |
| if is_code_file(filename) and not is_simd_file( | |
| filename) and filename not in exclude_file_set: | |
| file_path = os.path.join(cur_dir, filename) | |
| code_file_list.append(file_path) | |
| return code_file_list | |
| def av1_exclude_file_set(): | |
| exclude_file_set = { | |
| "cfl_ppc.c", | |
| "ppc_cpudetect.c", | |
| } | |
| return exclude_file_set | |
| def get_av1_pp_command(fake_header_dir, code_file_list): | |
| pre_command = "gcc -w -nostdinc -E -I./ -I../ -I" + fake_header_dir + (" " | |
| "-D'ATTRIBUTE_PACKED='" | |
| " " | |
| "-D'__attribute__(x)='" | |
| " " | |
| "-D'__inline__='" | |
| " " | |
| "-D'float_t=float'" | |
| " " | |
| "-D'DECLARE_ALIGNED(n," | |
| " typ," | |
| " " | |
| "val)=typ" | |
| " val'" | |
| " " | |
| "-D'volatile='" | |
| " " | |
| "-D'AV1_K_MEANS_DIM=2'" | |
| " " | |
| "-D'INLINE='" | |
| " " | |
| "-D'AOM_INLINE='" | |
| " " | |
| "-D'AOM_FORCE_INLINE='" | |
| " " | |
| "-D'inline='" | |
| ) | |
| return pre_command + " " + " ".join(code_file_list) | |
| def modify_av1_rtcd(build_dir): | |
| av1_rtcd = os.path.join(build_dir, "config/av1_rtcd.h") | |
| fp = open(av1_rtcd) | |
| string = fp.read() | |
| fp.close() | |
| new_string = string.replace("#ifdef RTCD_C", "#if 0") | |
| fp = open(av1_rtcd, "w") | |
| fp.write(new_string) | |
| fp.close() | |
| def preprocess_av1(aom_dir, build_dir, fake_header_dir): | |
| cur_dir = os.getcwd() | |
| output = os.path.join(cur_dir, "av1_pp.c") | |
| path_list = [ | |
| os.path.join(aom_dir, "av1/encoder"), | |
| os.path.join(aom_dir, "av1/common") | |
| ] | |
| code_file_list = [] | |
| for path in path_list: | |
| path = os.path.realpath(path) | |
| code_file_list.extend(get_code_file_list(path, av1_exclude_file_set())) | |
| modify_av1_rtcd(build_dir) | |
| cmd = get_av1_pp_command(fake_header_dir, code_file_list) + " >" + output | |
| os.chdir(build_dir) | |
| os.system(cmd) | |
| os.chdir(cur_dir) | |
| if __name__ == "__main__": | |
| aom_dir = sys.argv[1] | |
| build_dir = sys.argv[2] | |
| fake_header_dir = sys.argv[3] | |
| preprocess_av1(aom_dir, build_dir, fake_header_dir) |