Repository navigation
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
181 lines (145 loc) · 6.02 KB
/
Copy pathCMakeLists.txt
File metadata and controls
181 lines (145 loc) · 6.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
cmake_minimum_required(VERSION 3.16)
project(subcodec C CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# OpenH264 root — sibling directory in telegram-ios/third-party/
set(OH264_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../openh264/third_party/openh264/src/codec"
CACHE PATH "Path to OpenH264 codec source directory")
if(NOT EXISTS "${OH264_ROOT}/api/wels/codec_api.h")
message(FATAL_ERROR "OpenH264 not found at ${OH264_ROOT}. "
"Expected sibling directory: ../openh264/third_party/openh264/src/codec/")
endif()
# Find FFmpeg via pkg-config (required)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET
libavcodec
libavformat
libavutil
libswscale
)
# --- OpenH264 (from sibling directory) ---
# Common sources (shared by encoder and decoder)
file(GLOB OH264_COMMON_SOURCES ${OH264_ROOT}/common/src/*.cpp)
list(FILTER OH264_COMMON_SOURCES EXCLUDE REGEX "(_neon|_mmi|_msa|_lsx|_lasx)")
add_library(oh264_common STATIC ${OH264_COMMON_SOURCES})
set_target_properties(oh264_common PROPERTIES CXX_STANDARD 11)
target_compile_options(oh264_common PRIVATE -w)
target_include_directories(oh264_common PUBLIC
${OH264_ROOT}/api/wels
${OH264_ROOT}/common/inc
)
# Processing sources
file(GLOB_RECURSE OH264_PROCESSING_SOURCES ${OH264_ROOT}/processing/src/*.cpp)
list(FILTER OH264_PROCESSING_SOURCES EXCLUDE REGEX "(_neon|_mmi|_msa|_lsx|_lasx|loongarch)")
add_library(oh264_processing STATIC ${OH264_PROCESSING_SOURCES})
set_target_properties(oh264_processing PROPERTIES CXX_STANDARD 11)
target_compile_options(oh264_processing PRIVATE -w)
target_link_libraries(oh264_processing PRIVATE oh264_common)
target_include_directories(oh264_processing PRIVATE
${OH264_ROOT}/processing/interface
${OH264_ROOT}/processing/src/common
)
# Encoder sources
file(GLOB OH264_ENCODER_SOURCES ${OH264_ROOT}/encoder/core/src/*.cpp)
list(FILTER OH264_ENCODER_SOURCES EXCLUDE REGEX "(_neon|_mmi|_msa|_lsx|_lasx)")
list(APPEND OH264_ENCODER_SOURCES ${OH264_ROOT}/encoder/plus/src/welsEncoderExt.cpp)
add_library(oh264_encoder STATIC ${OH264_ENCODER_SOURCES})
set_target_properties(oh264_encoder PROPERTIES CXX_STANDARD 11)
target_compile_options(oh264_encoder PRIVATE -w)
target_link_libraries(oh264_encoder PRIVATE oh264_common oh264_processing)
target_include_directories(oh264_encoder PRIVATE
${OH264_ROOT}/encoder/core/inc
${OH264_ROOT}/encoder/plus/inc
${OH264_ROOT}/processing/interface
)
# Decoder sources
file(GLOB OH264_DECODER_SOURCES
${OH264_ROOT}/decoder/core/src/*.cpp
${OH264_ROOT}/decoder/plus/src/*.cpp
)
list(FILTER OH264_DECODER_SOURCES EXCLUDE REGEX "(_neon|_mmi|_msa|_lsx|_lasx|DllEntry)")
add_library(oh264_decoder STATIC ${OH264_DECODER_SOURCES})
set_target_properties(oh264_decoder PROPERTIES CXX_STANDARD 11)
target_compile_options(oh264_decoder PRIVATE -w)
target_link_libraries(oh264_decoder PRIVATE oh264_common)
target_include_directories(oh264_decoder PRIVATE
${OH264_ROOT}/decoder/core/inc
${OH264_ROOT}/decoder/plus/inc
)
# Umbrella interface library
add_library(openh264 INTERFACE)
target_link_libraries(openh264 INTERFACE oh264_encoder oh264_decoder oh264_common oh264_processing)
target_include_directories(openh264 INTERFACE ${OH264_ROOT}/api/wels)
# --- Vendored h264bitstream ---
add_library(h264bitstream STATIC
third_party/h264bitstream/h264_stream.c
third_party/h264bitstream/h264_nal.c
third_party/h264bitstream/h264_sei.c
)
target_include_directories(h264bitstream PUBLIC third_party/h264bitstream)
# --- Core subcodec library ---
add_library(subcodec STATIC
src/frame_writer.cpp
src/cavlc.cpp
src/h264_parser.cpp
src/sprite_data.cpp
src/mbs_encode.cpp
src/mbs_mux_common.cpp
src/mux_surface.cpp
)
target_include_directories(subcodec PUBLIC src)
target_link_libraries(subcodec PUBLIC h264bitstream)
# --- Sprite encoder library (OpenH264 wrapper) ---
add_library(sprite_encode STATIC src/sprite_encode.cpp src/sprite_extractor.cpp)
target_compile_options(sprite_encode PRIVATE -w)
target_link_libraries(sprite_encode PUBLIC subcodec openh264)
target_include_directories(sprite_encode PUBLIC src)
# --- Tools (require FFmpeg) ---
add_executable(sprite_extract tools/sprite_extract.cpp)
target_link_libraries(sprite_extract sprite_encode PkgConfig::LIBAV)
add_executable(sprite_mux tools/sprite_mux.cpp)
target_link_libraries(sprite_mux subcodec)
target_include_directories(sprite_mux PRIVATE src)
add_executable(bench_profile tools/bench_profile.cpp)
target_link_libraries(bench_profile sprite_encode PkgConfig::LIBAV)
target_compile_options(bench_profile PRIVATE -w)
# --- Fixture generation ---
add_executable(generate_fixtures Tests/SubcodecTests/generate_fixtures.cpp)
set(FIXTURE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Tests/SubcodecTests/Fixtures)
add_custom_target(fixtures
COMMAND ${CMAKE_COMMAND} -E make_directory ${FIXTURE_DIR}
COMMAND $<TARGET_FILE:generate_fixtures> ${FIXTURE_DIR}
DEPENDS generate_fixtures
COMMENT "Generating YUV test fixtures in Tests/SubcodecTests/Fixtures/"
)
# --- Tests ---
# Core tests (link subcodec only)
set(CORE_TESTS
test_cavlc test_cavlc_read test_cavlc_split test_ct_lut
test_mb_p16x16 test_mb_i16x16
test_p_frame_ex test_idr_frame_ex test_h264_parse
test_mbs_format test_mbs_encode
test_bs_copy_bits test_ebsp_writer test_rbsp_writer
test_row_plans test_mux_perf
)
foreach(t ${CORE_TESTS})
add_executable(${t} test/${t}.cpp)
target_link_libraries(${t} subcodec)
target_include_directories(${t} PRIVATE src third_party/h264bitstream)
endforeach()
# E2E tests (link sprite_encode = subcodec + openh264)
set(E2E_TESTS
test_mux test_mux_surface test_mux_alpha
test_cavlc_diag test_sprite_extractor test_sprite_encode_alpha
test_high_profile test_ipcm test_resize
)
foreach(t ${E2E_TESTS})
add_executable(${t} test/${t}.cpp)
target_link_libraries(${t} sprite_encode)
endforeach()
# --- CTest registration ---
enable_testing()
foreach(t ${CORE_TESTS} ${E2E_TESTS})
add_test(NAME ${t} COMMAND ${t})
endforeach()