| # 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) |