1*ba62d9d3SAndroid Build Coastguard Workerimport os,sys,shutil,time
2*ba62d9d3SAndroid Build Coastguard Workerimport argparse
3*ba62d9d3SAndroid Build Coastguard Worker
4*ba62d9d3SAndroid Build Coastguard Workerdef find_files(top, extensions=('.c', '.cpp', '.h'), exclude=('ult', 'googletest', 'classtrace', '.git')):
5*ba62d9d3SAndroid Build Coastguard Worker    res = []
6*ba62d9d3SAndroid Build Coastguard Worker    for root, dirs, files in os.walk(top):
7*ba62d9d3SAndroid Build Coastguard Worker        dirs[:] = [d for d in dirs if d not in exclude]
8*ba62d9d3SAndroid Build Coastguard Worker        #hard code to exclude mos_ file and _utils
9*ba62d9d3SAndroid Build Coastguard Worker        files = [os.path.join(root, file) for file in files if os.path.splitext(file)[1] in extensions and not file.startswith('mos_') and not file.startswith('mhw_') and not file.startswith('media_') and not file.endswith('_utils.h')]
10*ba62d9d3SAndroid Build Coastguard Worker        res.extend(files)
11*ba62d9d3SAndroid Build Coastguard Worker    return res
12*ba62d9d3SAndroid Build Coastguard Worker
13*ba62d9d3SAndroid Build Coastguard Workerdef chk_ADD_TRACE(file_path, class_info):
14*ba62d9d3SAndroid Build Coastguard Worker    with open(file_path, 'r', errors="ignore") as fh:
15*ba62d9d3SAndroid Build Coastguard Worker        #print(file_path)
16*ba62d9d3SAndroid Build Coastguard Worker        lines = fh.readlines()
17*ba62d9d3SAndroid Build Coastguard Worker        for line in lines:
18*ba62d9d3SAndroid Build Coastguard Worker            if line.find('MEDIA_CLASS_DEFINE_END') > -1:
19*ba62d9d3SAndroid Build Coastguard Worker                class_name = line.split('MEDIA_CLASS_DEFINE_END')[1][1:-2]
20*ba62d9d3SAndroid Build Coastguard Worker                if class_name not in class_info:
21*ba62d9d3SAndroid Build Coastguard Worker                    class_info[class_name] = [file_path]
22*ba62d9d3SAndroid Build Coastguard Worker                else:
23*ba62d9d3SAndroid Build Coastguard Worker                    class_info[class_name].append(file_path)
24*ba62d9d3SAndroid Build Coastguard Worker
25*ba62d9d3SAndroid Build Coastguard Workerdef genHeaderFile(top, offset_head_file):
26*ba62d9d3SAndroid Build Coastguard Worker    with open(offset_head_file, 'r') as fh:
27*ba62d9d3SAndroid Build Coastguard Worker        lines = fh.readlines()
28*ba62d9d3SAndroid Build Coastguard Worker        #the head file is not the origin/empty file, already has the offset info and do not need re-generate.
29*ba62d9d3SAndroid Build Coastguard Worker        if str(lines).count('#define OFFSET_') > 0:
30*ba62d9d3SAndroid Build Coastguard Worker            return
31*ba62d9d3SAndroid Build Coastguard Worker
32*ba62d9d3SAndroid Build Coastguard Worker    files = find_files(top, ('.h'))
33*ba62d9d3SAndroid Build Coastguard Worker    files.sort()
34*ba62d9d3SAndroid Build Coastguard Worker
35*ba62d9d3SAndroid Build Coastguard Worker    class_info = {}
36*ba62d9d3SAndroid Build Coastguard Worker    for file_name in files:
37*ba62d9d3SAndroid Build Coastguard Worker        chk_ADD_TRACE(file_name, class_info)
38*ba62d9d3SAndroid Build Coastguard Worker
39*ba62d9d3SAndroid Build Coastguard Worker    class_list = list(class_info.keys())
40*ba62d9d3SAndroid Build Coastguard Worker    class_list.sort()
41*ba62d9d3SAndroid Build Coastguard Worker
42*ba62d9d3SAndroid Build Coastguard Worker    with open(offset_head_file, 'w') as fh:
43*ba62d9d3SAndroid Build Coastguard Worker        fh.write('#ifndef __TRACE_OFFSET_H__\n')
44*ba62d9d3SAndroid Build Coastguard Worker        fh.write('#define __TRACE_OFFSET_H__\n')
45*ba62d9d3SAndroid Build Coastguard Worker        fh.write('enum {\n')
46*ba62d9d3SAndroid Build Coastguard Worker        for idx, class_name in enumerate(class_list):
47*ba62d9d3SAndroid Build Coastguard Worker            org_files = list(set(class_info[class_name]))
48*ba62d9d3SAndroid Build Coastguard Worker            org_files.sort()
49*ba62d9d3SAndroid Build Coastguard Worker            #for org_file in org_files:
50*ba62d9d3SAndroid Build Coastguard Worker            #    fh.write("  //%s\n"%org_file)
51*ba62d9d3SAndroid Build Coastguard Worker            fh.write("  OFFSET_%s,\n"%(class_name))
52*ba62d9d3SAndroid Build Coastguard Worker        fh.write('};\n')
53*ba62d9d3SAndroid Build Coastguard Worker        fh.write('#endif //__TRACE_OFFSET_H__\n')
54*ba62d9d3SAndroid Build Coastguard Worker
55*ba62d9d3SAndroid Build Coastguard Worker
56*ba62d9d3SAndroid Build Coastguard Workerif __name__ == "__main__":
57*ba62d9d3SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser(description='Command line inputs for checking script',argument_default=argparse.SUPPRESS)
58*ba62d9d3SAndroid Build Coastguard Worker    parser.add_argument('-w', '--workspace', help='workspace of driver, ', required=True)
59*ba62d9d3SAndroid Build Coastguard Worker    parser.add_argument('-f', '--headfile', help='the abs path of media_trace_offset.h', required=True)
60*ba62d9d3SAndroid Build Coastguard Worker    args = parser.parse_args()
61*ba62d9d3SAndroid Build Coastguard Worker    time_start = time.time()
62*ba62d9d3SAndroid Build Coastguard Worker    genHeaderFile(args.workspace, args.headfile)
63*ba62d9d3SAndroid Build Coastguard Worker    print("generate offset spend %0.4f s"%(time.time() - time_start))
64