Compare commits
65 Commits
78fd7d7a04
...
aa69aa78ef
| Author | SHA1 | Date | |
|---|---|---|---|
| aa69aa78ef | |||
| 45c97e4503 | |||
| c6617b89cd | |||
| ab27c97e87 | |||
| 005edee91d | |||
| b9dffb66df | |||
| 9d12f5d1d1 | |||
| c4001d57ab | |||
| 3214a6a3a6 | |||
| 5595db7c81 | |||
| b2529089f4 | |||
| 3dcb272cec | |||
| a9aeefd106 | |||
| 1b3cd55505 | |||
| cb5f46c598 | |||
| f4be2ffaaa | |||
| b2b0b63fe0 | |||
| 4f36cf4957 | |||
| 55912abad0 | |||
| de764de607 | |||
| 4c8b320b4b | |||
| b30e6a5c73 | |||
| 4405c210de | |||
| 1672bb5a60 | |||
| 86452582f5 | |||
| 400327269a | |||
| 69b96cb60b | |||
| 41d8482faf | |||
| 2596a82c2c | |||
| ffd89c27c4 | |||
| a325dc2c9a | |||
| 8850df3983 | |||
| 912d8689f7 | |||
| bb6c627fad | |||
| 5f4e3897ac | |||
| e94db8b66c | |||
| 2c5855a497 | |||
| 8c2ed13f80 | |||
| b0efc341a9 | |||
| 9095fbf68c | |||
| 3b87f681cf | |||
| e3726e5a98 | |||
| e77c2cfea8 | |||
| ab4bbfac50 | |||
| 459b76db1d | |||
| 187e8042b8 | |||
| ebadec8fe1 | |||
| 08d58b2ccf | |||
| 60098ee01e | |||
| ba8f1e1821 | |||
| b4ec07c851 | |||
| 490c141ca8 | |||
| 52d30ee412 | |||
| f57807372d | |||
| 7fb7c4dcbe | |||
| a35cbb08ff | |||
| 26a7ad5d4b | |||
| b5c6d50022 | |||
| f092e2539d | |||
| 31b2d98625 | |||
| dcb95e3ccb | |||
| edb01463ff | |||
| b54c2936be | |||
| af67751937 | |||
| 28f1dd1bf8 |
@ -28,6 +28,38 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
|
|||||||
include(FindExternalLib)
|
include(FindExternalLib)
|
||||||
set(ARCH "x86")
|
set(ARCH "x86")
|
||||||
setup_external_libs(${ARCH})
|
setup_external_libs(${ARCH})
|
||||||
|
|
||||||
|
# Intel oneVPL / VA-API runtime. The shared libraries in lib/ are installed
|
||||||
|
# by setup_external_libs(); the VA-API driver plugin directory is installed
|
||||||
|
# separately because it must retain its dri layout.
|
||||||
|
set(INTEL_MEDIA_STACK_ROOT
|
||||||
|
"${PROJECT_SOURCE_DIR}/dependency/${ARCH}/third_party/intel-media-stack/vpl-2.17"
|
||||||
|
)
|
||||||
|
set(INTEL_MEDIA_DRIVER_DIR "${INTEL_MEDIA_STACK_ROOT}/lib/dri")
|
||||||
|
set(INTEL_IHD_DRIVER "${INTEL_MEDIA_DRIVER_DIR}/iHD_drv_video.so")
|
||||||
|
|
||||||
|
if(NOT EXISTS "${INTEL_IHD_DRIVER}")
|
||||||
|
message(FATAL_ERROR "Intel iHD VA-API driver not found: ${INTEL_IHD_DRIVER}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Intel media stack: ${INTEL_MEDIA_STACK_ROOT}")
|
||||||
|
install(
|
||||||
|
DIRECTORY "${INTEL_MEDIA_DRIVER_DIR}/"
|
||||||
|
DESTINATION lib/dri
|
||||||
|
)
|
||||||
|
install(CODE [=[
|
||||||
|
find_program(CMVR_PATCHELF_EXECUTABLE patchelf REQUIRED)
|
||||||
|
set(_cmvr_ihd_driver
|
||||||
|
"${CMAKE_INSTALL_PREFIX}/lib/dri/iHD_drv_video.so"
|
||||||
|
)
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${CMVR_PATCHELF_EXECUTABLE}"
|
||||||
|
--set-rpath "$ORIGIN/.."
|
||||||
|
"${_cmvr_ihd_driver}"
|
||||||
|
COMMAND_ERROR_IS_FATAL ANY
|
||||||
|
)
|
||||||
|
]=])
|
||||||
|
|
||||||
# 在调用 setup_external_libs 之后
|
# 在调用 setup_external_libs 之后
|
||||||
message(STATUS "CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}")
|
message(STATUS "CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}")
|
||||||
message(STATUS "CMAKE_SHARED_LINKER_FLAGS: ${CMAKE_SHARED_LINKER_FLAGS}")
|
message(STATUS "CMAKE_SHARED_LINKER_FLAGS: ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
|||||||
@ -62,14 +62,14 @@ int CameraCapture::initialize(const Config& config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int CameraCapture::init_device() {
|
int CameraCapture::init_device() {
|
||||||
AVInputFormat* input_fmt = nullptr;
|
// AVInputFormat* input_fmt = nullptr;
|
||||||
std::string device_path;
|
std::string device_path;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
input_fmt = av_find_input_format("dshow");
|
auto input_fmt = av_find_input_format("dshow");
|
||||||
device_path = "video=" + config_.device_name;
|
device_path = "video=" + config_.device_name;
|
||||||
#else
|
#else
|
||||||
input_fmt = av_find_input_format("v4l2");
|
auto input_fmt = av_find_input_format("v4l2");
|
||||||
device_path = config_.device_name;
|
device_path = config_.device_name;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
25
cmvr-es/config/certs/quic-test-ca.crt
Normal file
25
cmvr-es/config/certs/quic-test-ca.crt
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIEKzCCApOgAwIBAgIUTtZCyKM8INYxZKkfwbKdpHKLjn4wDQYJKoZIhvcNAQEL
|
||||||
|
BQAwHTEbMBkGA1UEAwwSQ01WUiBRVUlDIExvY2FsIENBMB4XDTI2MDcyNDA2NDQy
|
||||||
|
MFoXDTM2MDcyMTA2NDQyMFowHTEbMBkGA1UEAwwSQ01WUiBRVUlDIExvY2FsIENB
|
||||||
|
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAmq2rHldOobaemqNfWggS
|
||||||
|
OVj3inKy6AYjfgtcXUfKs48DDbpZ9gyEd/YPJXA8C2jGPXpxzgnc7a4UCUVQZ8ah
|
||||||
|
ddoJtFcC+Q6BgjeMVqUdUubu5Y9HpkfU3lvnp4KhzvOeFnkKtrCzYIPa2nK3zLc7
|
||||||
|
uCiuLlB+91KQSRXPFbc6N7H/EAfGmUHIwlZGysAkRN7b2TAoR4C7E96JLVtuUQsS
|
||||||
|
VtlEGpunSfuefFzeeZCMS6avLbB+a8Q6yUzLt6pqnheNsDB+jCCXodlJs5XS1AOB
|
||||||
|
W2GOpGFMj7dLoTD+eBIlAlrhWFcwKjzFmtp6LGl/Jy0O+E99X4TL72oNSOdTrO2O
|
||||||
|
iavXABz9IvWR2BrAyo5AKlTJqO6tmZw77iVti8jYi+HsXIVGQKMYwvv5k0jdHeIZ
|
||||||
|
FaDToUbFPP/zj0m8ZraMy+8eNAhScnx6Zs56fcncBuDti6pT+zKisjV1rH/sFvZY
|
||||||
|
wO1UvJlOEbvXrfYLPp58Aqe/toG2nV45a2Q4+x6AETV1AgMBAAGjYzBhMB0GA1Ud
|
||||||
|
DgQWBBRdHz+g2vVmqghDZi2kEHtZfoyHZzAfBgNVHSMEGDAWgBRdHz+g2vVmqghD
|
||||||
|
Zi2kEHtZfoyHZzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkq
|
||||||
|
hkiG9w0BAQsFAAOCAYEASuEoMFiVcg4iTMxO2kshFTJ6LIrqqGXBn+1j+yQ1ennG
|
||||||
|
mqPMo5fBOe/Kp3YWCnREQWu0+EEPEC9qWgIDOIm3v7ch4mZiW31GUOqae6bjprBe
|
||||||
|
er7ySElKGZ5GefKAq++we19A6WHnNxtNAT9BE1VSKUmkxEsnIkuwd+QMmQ9eaIRm
|
||||||
|
8RvzshWdUcyiBJg07sI3rPzPD/YpnfcYlAa2a0+oXJ3o3zlhdbs2S+9fIl+Y/zFN
|
||||||
|
wBaUV6ZNk0RFzOCA+jUq2jU5Y1pODcot3Mp2jCHzp4uTFyVqsoqc5USRB2TUILCP
|
||||||
|
acSbEjD9GnKaNU4miTcftnC85fnBAiZ5btZkXIs72ij+J3VW7QnbcFQG8bElngoR
|
||||||
|
mWizh6ByPQrsvyT0evJjdjpuOzILsVTAn64m0cYpnlR4g5orcEkIJHv4DzMhpXc2
|
||||||
|
CvpcWwk2vJrUuws/LGxDATTAcqtIUIxAkxffqUsdB/6j8fdykNCvXFwNh/uPcawd
|
||||||
|
4kzh6dr+RFzHSMQ6oN16
|
||||||
|
-----END CERTIFICATE-----
|
||||||
@ -149,4 +149,156 @@ arm {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
robot_arms {
|
||||||
|
id: "eyou_arm"
|
||||||
|
|
||||||
|
motor {
|
||||||
|
motor_system_id: "ethercat_motors"
|
||||||
|
motor_group_ids: "dual_arm_ethercat"
|
||||||
|
dof: 7
|
||||||
|
joint_names: "R_SHOULDER_P"
|
||||||
|
joint_names: "R_SHOULDER_R"
|
||||||
|
joint_names: "R_SHOULDER_Y"
|
||||||
|
joint_names: "R_ELBOW_R"
|
||||||
|
joint_names: "R_WRIST_P"
|
||||||
|
joint_names: "R_WRIST_Y"
|
||||||
|
joint_names: "R_WRIST_R"
|
||||||
|
upd_freq: 1000
|
||||||
|
buffer_size: 50
|
||||||
|
default_vel: 1.0
|
||||||
|
default_acc: 2.0
|
||||||
|
}
|
||||||
|
|
||||||
|
kinematics {
|
||||||
|
pinocchio_dls_ik_solver {
|
||||||
|
urdf_path: "model/xiaoyan_description/dual_arm.urdf"
|
||||||
|
base_frame_name: "PELVIS_S"
|
||||||
|
flange_frame_name: "R_WRIST_R_S"
|
||||||
|
tcp_frame_name: "R_FINGER_TIP_FIXED"
|
||||||
|
max_iters: 100
|
||||||
|
pos_eps: 1e-6
|
||||||
|
rot_eps: 1e-6
|
||||||
|
damping: 1e-6
|
||||||
|
joint_limit_policy {
|
||||||
|
limits {
|
||||||
|
enable: true
|
||||||
|
source: JOINT_LIMIT_SOURCE_CUSTOM
|
||||||
|
joints { joint_name: "R_SHOULDER_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "R_SHOULDER_R" q_lb: -0.78 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "R_SHOULDER_Y" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "R_ELBOW_R" q_lb: 0 q_ub: 2.05 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "R_WRIST_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "R_WRIST_Y" q_lb: -0.78 q_ub: 0.78 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "R_WRIST_R" q_lb: -0.57 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
||||||
|
}
|
||||||
|
soft_limit {
|
||||||
|
enable: true
|
||||||
|
margin_ratio: 0.01
|
||||||
|
min_margin_rad: 0.01
|
||||||
|
}
|
||||||
|
avoidance {
|
||||||
|
enable: false
|
||||||
|
gain: 0.2
|
||||||
|
margin_ratio: 0.15
|
||||||
|
max_push: 0.25
|
||||||
|
weight: 0.05
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
motion {
|
||||||
|
move_j {
|
||||||
|
toppra_joint_motion_planner {
|
||||||
|
path_type: TOPPRA_PATH_TYPE_QUINTIC
|
||||||
|
sample_period_s: 0.001
|
||||||
|
grid_size: 150
|
||||||
|
high_grid_size: 300
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
move_l {
|
||||||
|
pinocchio_cartesian_motion_planner {
|
||||||
|
sample_period_s: 0.001
|
||||||
|
position_gain: 4.0
|
||||||
|
rotation_gain: 4.0
|
||||||
|
line_deviation_check {
|
||||||
|
enable: true
|
||||||
|
line_deviation_warn_m: 0.01
|
||||||
|
line_deviation_stop_m: 0.03
|
||||||
|
line_direction_warn_deg: 20.0
|
||||||
|
line_direction_stop_deg: 45.0
|
||||||
|
line_direction_reset_deg: 10.0
|
||||||
|
line_check_min_distance_m: 0.01
|
||||||
|
}
|
||||||
|
joint_continuity_check {
|
||||||
|
enable: true
|
||||||
|
max_joint_delta_rad: 0.05
|
||||||
|
max_joint_velocity_rad_s: 10.0
|
||||||
|
max_joint_acceleration_rad_s2: 5000.0
|
||||||
|
}
|
||||||
|
cartesian_step_feasibility_check {
|
||||||
|
enable: true
|
||||||
|
min_linear_speed_ratio: 0.2
|
||||||
|
max_linear_direction_deviation_deg: 45.0
|
||||||
|
min_angular_speed_ratio: 0.2
|
||||||
|
max_angular_direction_deviation_deg: 45.0
|
||||||
|
min_desired_linear_speed: 1e-4
|
||||||
|
min_desired_angular_speed: 1e-4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
speed_l {
|
||||||
|
pinocchio_cartesian_motion_planner {
|
||||||
|
linear_velocity_max: 0.55
|
||||||
|
linear_acceleration_max: 5.0
|
||||||
|
linear_jerk_max: 10.0
|
||||||
|
angular_velocity_max: 1.0
|
||||||
|
angular_acceleration_max: 5.0
|
||||||
|
angular_jerk_max: 12.0
|
||||||
|
linear_target_replan_threshold: 1e-4
|
||||||
|
angular_target_replan_threshold: 1e-4
|
||||||
|
linear_reverse_cos_threshold: -0.8660254037844386
|
||||||
|
linear_reverse_switch_speed_threshold: 1e-3
|
||||||
|
enforce_joint_acceleration_limits: true
|
||||||
|
line_deviation_check {
|
||||||
|
enable: true
|
||||||
|
line_deviation_warn_m: 0.01
|
||||||
|
line_deviation_stop_m: 0.03
|
||||||
|
line_direction_warn_deg: 20.0
|
||||||
|
line_direction_stop_deg: 45.0
|
||||||
|
line_direction_reset_deg: 10.0
|
||||||
|
line_check_min_distance_m: 0.01
|
||||||
|
}
|
||||||
|
joint_velocity_check {
|
||||||
|
enable: true
|
||||||
|
max_joint_velocity_rad_s: 30.0
|
||||||
|
max_joint_acceleration_rad_s2: 10000.0
|
||||||
|
}
|
||||||
|
cartesian_velocity_feasibility_check {
|
||||||
|
enable: true
|
||||||
|
min_linear_speed_ratio: 0.2
|
||||||
|
max_linear_direction_deviation_deg: 5.0
|
||||||
|
min_angular_speed_ratio: 0.2
|
||||||
|
max_angular_direction_deviation_deg: 5.0
|
||||||
|
min_desired_linear_speed: 1e-4
|
||||||
|
min_desired_angular_speed: 1e-4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
speed_l_controller {
|
||||||
|
cartesian_velocity_controller {
|
||||||
|
control_period_s: 0.001
|
||||||
|
stop_twist_norm: 1e-9
|
||||||
|
stop_command_velocity_norm: 1e-3
|
||||||
|
stop_measured_velocity_norm: 1e-2
|
||||||
|
stop_acceleration: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
152
cmvr-es/config/devices/arm/arm_eyou_left.pb.txt
Normal file
152
cmvr-es/config/devices/arm/arm_eyou_left.pb.txt
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
arm {
|
||||||
|
robot_arms {
|
||||||
|
id: "eyou_left_arm"
|
||||||
|
|
||||||
|
motor {
|
||||||
|
motor_system_id: "ethercat_motors"
|
||||||
|
motor_group_ids: "dual_arm_ethercat"
|
||||||
|
dof: 7
|
||||||
|
joint_names: "L_SHOULDER_P"
|
||||||
|
joint_names: "L_SHOULDER_R"
|
||||||
|
joint_names: "L_SHOULDER_Y"
|
||||||
|
joint_names: "L_ELBOW_R"
|
||||||
|
joint_names: "L_WRIST_P"
|
||||||
|
joint_names: "L_WRIST_Y"
|
||||||
|
joint_names: "L_WRIST_R"
|
||||||
|
upd_freq: 1000
|
||||||
|
buffer_size: 50
|
||||||
|
default_vel: 1.0
|
||||||
|
default_acc: 2.0
|
||||||
|
}
|
||||||
|
|
||||||
|
kinematics {
|
||||||
|
pinocchio_dls_ik_solver {
|
||||||
|
urdf_path: "model/xiaoyan_description/dual_arm.urdf"
|
||||||
|
base_frame_name: "PELVIS_S"
|
||||||
|
flange_frame_name: "L_WRIST_R_S"
|
||||||
|
tcp_frame_name: "L_FINGER_TIP_FIXED"
|
||||||
|
max_iters: 100
|
||||||
|
pos_eps: 1e-6
|
||||||
|
rot_eps: 1e-6
|
||||||
|
damping: 1e-6
|
||||||
|
joint_limit_policy {
|
||||||
|
limits {
|
||||||
|
enable: true
|
||||||
|
source: JOINT_LIMIT_SOURCE_CUSTOM
|
||||||
|
joints { joint_name: "L_SHOULDER_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_SHOULDER_R" q_lb: -0.78 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_SHOULDER_Y" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_ELBOW_R" q_lb: 0 q_ub: 2.05 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_WRIST_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_WRIST_Y" q_lb: -0.78 q_ub: 0.78 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_WRIST_R" q_lb: -0.57 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
||||||
|
}
|
||||||
|
soft_limit {
|
||||||
|
enable: true
|
||||||
|
margin_ratio: 0.01
|
||||||
|
min_margin_rad: 0.01
|
||||||
|
}
|
||||||
|
avoidance {
|
||||||
|
enable: false
|
||||||
|
gain: 0.2
|
||||||
|
margin_ratio: 0.15
|
||||||
|
max_push: 0.25
|
||||||
|
weight: 0.05
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
motion {
|
||||||
|
move_j {
|
||||||
|
toppra_joint_motion_planner {
|
||||||
|
path_type: TOPPRA_PATH_TYPE_QUINTIC
|
||||||
|
sample_period_s: 0.001
|
||||||
|
grid_size: 150
|
||||||
|
high_grid_size: 300
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
move_l {
|
||||||
|
pinocchio_cartesian_motion_planner {
|
||||||
|
sample_period_s: 0.001
|
||||||
|
position_gain: 4.0
|
||||||
|
rotation_gain: 4.0
|
||||||
|
line_deviation_check {
|
||||||
|
enable: true
|
||||||
|
line_deviation_warn_m: 0.01
|
||||||
|
line_deviation_stop_m: 0.03
|
||||||
|
line_direction_warn_deg: 20.0
|
||||||
|
line_direction_stop_deg: 45.0
|
||||||
|
line_direction_reset_deg: 10.0
|
||||||
|
line_check_min_distance_m: 0.01
|
||||||
|
}
|
||||||
|
joint_continuity_check {
|
||||||
|
enable: true
|
||||||
|
max_joint_delta_rad: 0.05
|
||||||
|
max_joint_velocity_rad_s: 10.0
|
||||||
|
max_joint_acceleration_rad_s2: 5000.0
|
||||||
|
}
|
||||||
|
cartesian_step_feasibility_check {
|
||||||
|
enable: true
|
||||||
|
min_linear_speed_ratio: 0.2
|
||||||
|
max_linear_direction_deviation_deg: 45.0
|
||||||
|
min_angular_speed_ratio: 0.2
|
||||||
|
max_angular_direction_deviation_deg: 45.0
|
||||||
|
min_desired_linear_speed: 1e-4
|
||||||
|
min_desired_angular_speed: 1e-4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
speed_l {
|
||||||
|
pinocchio_cartesian_motion_planner {
|
||||||
|
linear_velocity_max: 0.55
|
||||||
|
linear_acceleration_max: 5.0
|
||||||
|
linear_jerk_max: 10.0
|
||||||
|
angular_velocity_max: 1.0
|
||||||
|
angular_acceleration_max: 5.0
|
||||||
|
angular_jerk_max: 12.0
|
||||||
|
linear_target_replan_threshold: 1e-4
|
||||||
|
angular_target_replan_threshold: 1e-4
|
||||||
|
linear_reverse_cos_threshold: -0.8660254037844386
|
||||||
|
linear_reverse_switch_speed_threshold: 1e-3
|
||||||
|
enforce_joint_acceleration_limits: true
|
||||||
|
line_deviation_check {
|
||||||
|
enable: true
|
||||||
|
line_deviation_warn_m: 0.01
|
||||||
|
line_deviation_stop_m: 0.03
|
||||||
|
line_direction_warn_deg: 20.0
|
||||||
|
line_direction_stop_deg: 45.0
|
||||||
|
line_direction_reset_deg: 10.0
|
||||||
|
line_check_min_distance_m: 0.01
|
||||||
|
}
|
||||||
|
joint_velocity_check {
|
||||||
|
enable: true
|
||||||
|
max_joint_velocity_rad_s: 30.0
|
||||||
|
max_joint_acceleration_rad_s2: 10000.0
|
||||||
|
}
|
||||||
|
cartesian_velocity_feasibility_check {
|
||||||
|
enable: true
|
||||||
|
min_linear_speed_ratio: 0.2
|
||||||
|
max_linear_direction_deviation_deg: 5.0
|
||||||
|
min_angular_speed_ratio: 0.2
|
||||||
|
max_angular_direction_deviation_deg: 5.0
|
||||||
|
min_desired_linear_speed: 1e-4
|
||||||
|
min_desired_angular_speed: 1e-4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
speed_l_controller {
|
||||||
|
cartesian_velocity_controller {
|
||||||
|
control_period_s: 0.001
|
||||||
|
stop_twist_norm: 1e-9
|
||||||
|
stop_command_velocity_norm: 1e-3
|
||||||
|
stop_measured_velocity_norm: 1e-2
|
||||||
|
stop_acceleration: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -101,27 +101,7 @@ camera {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cameras {
|
|
||||||
id: "left_eye_cam"
|
|
||||||
uvc {
|
|
||||||
usb: "/dev/uvc_left_camera"
|
|
||||||
camera_mode: CAMERA_MODE_VIDEO
|
|
||||||
capture {
|
|
||||||
width: 640
|
|
||||||
height: 480
|
|
||||||
fps: 30
|
|
||||||
stream_mode: STREAM_MODE_RGB
|
|
||||||
}
|
|
||||||
encoder {
|
|
||||||
width: 640
|
|
||||||
height: 480
|
|
||||||
fps: 30
|
|
||||||
codec: "H265"
|
|
||||||
enable_stream_timestamp: true
|
|
||||||
buffer_size: 30
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cameras {
|
cameras {
|
||||||
id: "cam5"
|
id: "cam5"
|
||||||
@ -185,4 +165,50 @@ camera {
|
|||||||
buffer_size: 30
|
buffer_size: 30
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cameras {
|
||||||
|
id: "real_cam1"
|
||||||
|
realsense {
|
||||||
|
serialNumber: "332522076896"
|
||||||
|
camera_mode: CAMERA_MODE_VIDEO
|
||||||
|
capture {
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
fps: 30
|
||||||
|
stream_mode: STREAM_MODE_RGBD
|
||||||
|
}
|
||||||
|
encoder {
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
fps: 30
|
||||||
|
codec: "h265_qsv"
|
||||||
|
enable_stream_timestamp: true
|
||||||
|
buffer_size: 30
|
||||||
|
}
|
||||||
|
align_mode: ALIGN_MODE_COLOR
|
||||||
|
sync: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cameras {
|
||||||
|
id: "usb_cam1"
|
||||||
|
uvc {
|
||||||
|
usb: "/dev/video0"
|
||||||
|
camera_mode: CAMERA_MODE_VIDEO
|
||||||
|
capture {
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
fps: 30
|
||||||
|
stream_mode: STREAM_MODE_RGB
|
||||||
|
}
|
||||||
|
encoder {
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
fps: 30
|
||||||
|
codec: "h265_qsv"
|
||||||
|
enable_stream_timestamp: true
|
||||||
|
buffer_size: 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ microphone {
|
|||||||
channels: 2
|
channels: 2
|
||||||
sampleRate: 48000
|
sampleRate: 48000
|
||||||
volume: 100
|
volume: 100
|
||||||
input_device: "default"
|
input_device: "plughw:CARD=XFMDPV0018,DEV=0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@ motor {
|
|||||||
id: "ethercat_motors"
|
id: "ethercat_motors"
|
||||||
|
|
||||||
motor_groups {
|
motor_groups {
|
||||||
id: "right_arm_ethercat"
|
id: "dual_arm_ethercat"
|
||||||
bus_type: MOTOR_BUS_ETHERCAT
|
bus_type: MOTOR_BUS_ETHERCAT
|
||||||
vendor: MOTOR_VENDOR_EYOU
|
vendor: MOTOR_VENDOR_EYOU
|
||||||
protocol: MOTOR_PROTOCOL_ETHERCAT_CIA402
|
protocol: MOTOR_PROTOCOL_ETHERCAT_CIA402
|
||||||
@ -38,13 +38,20 @@ motor {
|
|||||||
sync_monitor_period_ms: 1000
|
sync_monitor_period_ms: 1000
|
||||||
}
|
}
|
||||||
|
|
||||||
slaves { motor_id: 1 alias: 0 position: 0 }
|
slaves { motor_id: 1 alias: 0 position: 1 }
|
||||||
slaves { motor_id: 2 alias: 0 position: 1 }
|
slaves { motor_id: 2 alias: 0 position: 2 }
|
||||||
slaves { motor_id: 3 alias: 0 position: 2 }
|
slaves { motor_id: 3 alias: 0 position: 3 }
|
||||||
slaves { motor_id: 4 alias: 0 position: 3 }
|
slaves { motor_id: 4 alias: 0 position: 4 }
|
||||||
slaves { motor_id: 5 alias: 0 position: 4 }
|
slaves { motor_id: 5 alias: 0 position: 5 }
|
||||||
slaves { motor_id: 6 alias: 0 position: 5 }
|
slaves { motor_id: 6 alias: 0 position: 6 }
|
||||||
slaves { motor_id: 7 alias: 0 position: 6 }
|
slaves { motor_id: 7 alias: 0 position: 7 }
|
||||||
|
slaves { motor_id: 8 alias: 0 position: 8 }
|
||||||
|
slaves { motor_id: 9 alias: 0 position: 9 }
|
||||||
|
slaves { motor_id: 10 alias: 0 position: 10 }
|
||||||
|
slaves { motor_id: 11 alias: 0 position: 11 }
|
||||||
|
slaves { motor_id: 12 alias: 0 position: 12 }
|
||||||
|
slaves { motor_id: 13 alias: 0 position: 13 }
|
||||||
|
slaves { motor_id: 14 alias: 0 position: 14 }
|
||||||
}
|
}
|
||||||
|
|
||||||
joint_limits {
|
joint_limits {
|
||||||
@ -57,6 +64,13 @@ motor {
|
|||||||
joints { joint_name: "R_WRIST_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
joints { joint_name: "R_WRIST_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
joints { joint_name: "R_WRIST_Y" q_lb: -0.78 q_ub: 0.78 qd: 5.0 qdd: 10.0 }
|
joints { joint_name: "R_WRIST_Y" q_lb: -0.78 q_ub: 0.78 qd: 5.0 qdd: 10.0 }
|
||||||
joints { joint_name: "R_WRIST_R" q_lb: -0.57 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
joints { joint_name: "R_WRIST_R" q_lb: -0.57 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_SHOULDER_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_SHOULDER_R" q_lb: -0.78 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_SHOULDER_Y" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_ELBOW_R" q_lb: 0 q_ub: 2.05 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_WRIST_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_WRIST_Y" q_lb: -0.78 q_ub: 0.78 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "L_WRIST_R" q_lb: -0.57 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
motors {
|
motors {
|
||||||
@ -67,6 +81,13 @@ motor {
|
|||||||
motors { id: 5 joint_name: "R_WRIST_P" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
motors { id: 5 joint_name: "R_WRIST_P" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
motors { id: 6 joint_name: "R_WRIST_Y" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
motors { id: 6 joint_name: "R_WRIST_Y" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
motors { id: 7 joint_name: "R_WRIST_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
motors { id: 7 joint_name: "R_WRIST_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
|
motors { id: 8 joint_name: "L_SHOULDER_P" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
|
motors { id: 9 joint_name: "L_SHOULDER_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
|
motors { id: 10 joint_name: "L_SHOULDER_Y" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
|
motors { id: 11 joint_name: "L_ELBOW_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
|
motors { id: 12 joint_name: "L_WRIST_P" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
|
motors { id: 13 joint_name: "L_WRIST_Y" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
|
motors { id: 14 joint_name: "L_WRIST_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ motor {
|
|||||||
ethercat {
|
ethercat {
|
||||||
master_index: 0
|
master_index: 0
|
||||||
cycle_us: 1000
|
cycle_us: 1000
|
||||||
slave_op_timeout_ms: 15000
|
slave_op_timeout_ms: 20000
|
||||||
slave_state_poll_period_ms: 10
|
slave_state_poll_period_ms: 10
|
||||||
|
|
||||||
cia402 {
|
cia402 {
|
||||||
@ -42,15 +42,17 @@ motor {
|
|||||||
slaves { motor_id: 2 alias: 0 position: 1 }
|
slaves { motor_id: 2 alias: 0 position: 1 }
|
||||||
slaves { motor_id: 3 alias: 0 position: 2 }
|
slaves { motor_id: 3 alias: 0 position: 2 }
|
||||||
slaves { motor_id: 4 alias: 0 position: 3 }
|
slaves { motor_id: 4 alias: 0 position: 3 }
|
||||||
|
slaves { motor_id: 5 alias: 0 position: 4 }
|
||||||
}
|
}
|
||||||
|
|
||||||
joint_limits {
|
joint_limits {
|
||||||
enable: true
|
enable: true
|
||||||
source: JOINT_LIMIT_SOURCE_CUSTOM
|
source: JOINT_LIMIT_SOURCE_CUSTOM
|
||||||
joints { joint_name: "R_SHOULDER_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
joints { joint_name: "R_SHOULDER_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
joints { joint_name: "R_SHOULDER_R" q_lb: -0.78 q_ub: 1.57 qd: 5.0 qdd: 10.0 }
|
joints { joint_name: "R_SHOULDER_R" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
joints { joint_name: "R_SHOULDER_Y" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
joints { joint_name: "R_SHOULDER_Y" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
joints { joint_name: "R_ELBOW_R" q_lb: 0 q_ub: 2.05 qd: 5.0 qdd: 10.0 }
|
joints { joint_name: "R_ELBOW_R" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
|
joints { joint_name: "R_WRIST_P" q_lb: -3.14 q_ub: 3.14 qd: 5.0 qdd: 10.0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
motors {
|
motors {
|
||||||
@ -58,6 +60,7 @@ motor {
|
|||||||
motors { id: 2 joint_name: "R_SHOULDER_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
motors { id: 2 joint_name: "R_SHOULDER_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
motors { id: 3 joint_name: "R_SHOULDER_Y" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
motors { id: 3 joint_name: "R_SHOULDER_Y" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
motors { id: 4 joint_name: "R_ELBOW_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
motors { id: 4 joint_name: "R_ELBOW_R" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
|
motors { id: 5 joint_name: "R_WRIST_P" encoder_counts_per_rev: 65536 gear_ratio: 101.0 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -89,6 +89,20 @@ device_manager {
|
|||||||
enable: false
|
enable: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
devices {
|
||||||
|
id: "eyou_arm"
|
||||||
|
type: DEVICE_TYPE_ROBOT_ARM
|
||||||
|
config_file: "devices/arm/arm.pb.txt"
|
||||||
|
enable: false
|
||||||
|
}
|
||||||
|
|
||||||
|
devices {
|
||||||
|
id: "eyou_left_arm"
|
||||||
|
type: DEVICE_TYPE_ROBOT_ARM
|
||||||
|
config_file: "devices/arm/arm_eyou_left.pb.txt"
|
||||||
|
enable: false
|
||||||
|
}
|
||||||
|
|
||||||
devices {
|
devices {
|
||||||
id: "aubo_arm"
|
id: "aubo_arm"
|
||||||
type: DEVICE_TYPE_ROBOT_ARM
|
type: DEVICE_TYPE_ROBOT_ARM
|
||||||
@ -147,4 +161,20 @@ device_manager {
|
|||||||
# Host-development default: keep physical audio devices disabled.
|
# Host-development default: keep physical audio devices disabled.
|
||||||
enable: false
|
enable: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
devices {
|
||||||
|
id: "real_cam1"
|
||||||
|
type: DEVICE_TYPE_CAMERA
|
||||||
|
config_file: "devices/camera/camera.pb.txt"
|
||||||
|
# Host-development default: keep physical cameras disabled.
|
||||||
|
enable: false
|
||||||
|
}
|
||||||
|
devices {
|
||||||
|
id: "usb_cam1"
|
||||||
|
type: DEVICE_TYPE_CAMERA
|
||||||
|
config_file: "devices/camera/camera.pb.txt"
|
||||||
|
# Host-development default: keep physical cameras disabled.
|
||||||
|
enable: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,7 +27,6 @@ task_manager {
|
|||||||
type: TASK_TYPE_QUIC_EDGE
|
type: TASK_TYPE_QUIC_EDGE
|
||||||
run_mode: TASK_RUN_MODE_BLOCKING_SERVICE
|
run_mode: TASK_RUN_MODE_BLOCKING_SERVICE
|
||||||
config_file: "tasks/quic_edge_task/quic_edge_task.pb.txt"
|
config_file: "tasks/quic_edge_task/quic_edge_task.pb.txt"
|
||||||
# Host-development default: no QUIC Gateway or physical media devices.
|
|
||||||
enable: true
|
enable: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,10 +3,11 @@ quic_edge {
|
|||||||
|
|
||||||
# Task enablement is controlled by manager/task_manager.pb.txt. Configure a
|
# Task enablement is controlled by manager/task_manager.pb.txt. Configure a
|
||||||
# reachable QUIC Gateway and TLS policy before enabling the task there.
|
# reachable QUIC Gateway and TLS policy before enabling the task there.
|
||||||
server_host: "quic-gateway.example.com"
|
server_host: "192.168.0.222"
|
||||||
server_port: 4433
|
server_port: 4433
|
||||||
alpn: "cmvr-quic-edge/1"
|
alpn: "cmvr-quic-edge/1"
|
||||||
node_id: "cmvr-edge"
|
node_id: "cmvr-edge"
|
||||||
|
robot_id: "CN-CMVR-MBLRV1-AIMA-20260806-001"
|
||||||
software_version: "0.1"
|
software_version: "0.1"
|
||||||
|
|
||||||
# The existing cmvr-es gRPC server remains the robot-control endpoint. "auto"
|
# The existing cmvr-es gRPC server remains the robot-control endpoint. "auto"
|
||||||
@ -23,13 +24,26 @@ quic_edge {
|
|||||||
control_response_timeout_ms: 1000
|
control_response_timeout_ms: 1000
|
||||||
|
|
||||||
tls {
|
tls {
|
||||||
ca_file: "certs/quic_gateway_ca.pem"
|
ca_file: "certs/cmvr-quic-ca.crt"
|
||||||
certificate_file: "certs/cmvr_edge_cert.pem"
|
server_name: "192.168.0.222"
|
||||||
private_key_file: "certs/cmvr_edge_key.pem"
|
|
||||||
server_name: "quic-gateway.example.com"
|
|
||||||
allow_insecure: false
|
allow_insecure: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Additional platforms run concurrently with the primary endpoint above.
|
||||||
|
# Each one has an independent connection, registration, heartbeat ACK state
|
||||||
|
# and reconnect loop. Media forwarding is opt-in for additional platforms.
|
||||||
|
# platforms {
|
||||||
|
# id: "operations_backup"
|
||||||
|
# server_host: "192.168.0.223"
|
||||||
|
# server_port: 4433
|
||||||
|
# enable_media: false
|
||||||
|
# tls {
|
||||||
|
# ca_file: "certs/cmvr-quic-ca.crt"
|
||||||
|
# server_name: "192.168.0.223"
|
||||||
|
# allow_insecure: false
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
reconnect {
|
reconnect {
|
||||||
initial_delay_ms: 500
|
initial_delay_ms: 500
|
||||||
maximum_delay_ms: 30000
|
maximum_delay_ms: 30000
|
||||||
|
|||||||
@ -19,6 +19,7 @@ struct FfmpegEncoderInfo {
|
|||||||
bool bRunning = false;
|
bool bRunning = false;
|
||||||
AVCodecContext* codec_context = nullptr;
|
AVCodecContext* codec_context = nullptr;
|
||||||
AVFrame* frame = nullptr;
|
AVFrame* frame = nullptr;
|
||||||
|
AVFrame* transfer_frame = nullptr;
|
||||||
AVPacket* packet = nullptr;
|
AVPacket* packet = nullptr;
|
||||||
SwsContext* sws_context = nullptr;
|
SwsContext* sws_context = nullptr;
|
||||||
|
|
||||||
@ -42,6 +43,12 @@ public:
|
|||||||
std::vector<uint8_t>& encoded_frame,
|
std::vector<uint8_t>& encoded_frame,
|
||||||
bool& is_key,
|
bool& is_key,
|
||||||
const CameraStreamEncodeOptions& options = {});
|
const CameraStreamEncodeOptions& options = {});
|
||||||
|
|
||||||
|
static bool encode(std::shared_ptr<FfmpegEncoderInfo>& encoder,
|
||||||
|
const AVFrame* frame,
|
||||||
|
std::vector<uint8_t>& encoded_frame,
|
||||||
|
bool& is_key,
|
||||||
|
const CameraStreamEncodeOptions& options = {});
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace cmvr::device
|
} // namespace cmvr::device
|
||||||
|
|||||||
@ -6,6 +6,8 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include <libavutil/opt.h>
|
#include <libavutil/opt.h>
|
||||||
|
#include <libavutil/pixdesc.h>
|
||||||
|
#include <libavutil/hwcontext.h>
|
||||||
#include <opencv2/imgproc.hpp>
|
#include <opencv2/imgproc.hpp>
|
||||||
|
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
@ -48,6 +50,13 @@ void drawTimeStamp(cv::Mat& image)
|
|||||||
|
|
||||||
const AVCodec* findEncoder(const std::string& codec_name)
|
const AVCodec* findEncoder(const std::string& codec_name)
|
||||||
{
|
{
|
||||||
|
if (codec_name == "h264_qsv" || codec_name == "H264_QSV") {
|
||||||
|
return avcodec_find_encoder_by_name("h264_qsv");
|
||||||
|
}
|
||||||
|
if (codec_name == "hevc_qsv" || codec_name == "h265_qsv" ||
|
||||||
|
codec_name == "HEVC_QSV" || codec_name == "H265_QSV") {
|
||||||
|
return avcodec_find_encoder_by_name("hevc_qsv");
|
||||||
|
}
|
||||||
if (codec_name == "h264" || codec_name == "H264") {
|
if (codec_name == "h264" || codec_name == "H264") {
|
||||||
const AVCodec* codec = avcodec_find_encoder_by_name("libx264");
|
const AVCodec* codec = avcodec_find_encoder_by_name("libx264");
|
||||||
return codec ? codec : avcodec_find_encoder(AV_CODEC_ID_H264);
|
return codec ? codec : avcodec_find_encoder(AV_CODEC_ID_H264);
|
||||||
@ -73,6 +82,55 @@ AVPixelFormat sourcePixelFormat(const cv::Mat& frame)
|
|||||||
return AV_PIX_FMT_NONE;
|
return AV_PIX_FMT_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool encodePreparedFrame(FfmpegEncoderInfo& encoder,
|
||||||
|
std::vector<uint8_t>& encoded_frame,
|
||||||
|
bool& is_key)
|
||||||
|
{
|
||||||
|
encoder.frame->pts = encoder.frame_pts++;
|
||||||
|
int ret = avcodec_send_frame(encoder.codec_context, encoder.frame);
|
||||||
|
if (ret < 0) {
|
||||||
|
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
||||||
|
av_strerror(ret, errbuf, sizeof(errbuf));
|
||||||
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] error sending frame to encoder: " << errbuf;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ret = avcodec_receive_packet(encoder.codec_context, encoder.packet);
|
||||||
|
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ret < 0) {
|
||||||
|
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
||||||
|
av_strerror(ret, errbuf, sizeof(errbuf));
|
||||||
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] error receiving packet from encoder: " << errbuf;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (encoder.packet->flags & AV_PKT_FLAG_KEY) {
|
||||||
|
is_key = true;
|
||||||
|
}
|
||||||
|
encoded_frame.reserve(encoded_frame.size() + encoder.packet->size);
|
||||||
|
encoded_frame.insert(encoded_frame.end(),
|
||||||
|
encoder.packet->data,
|
||||||
|
encoder.packet->data + encoder.packet->size);
|
||||||
|
av_packet_unref(encoder.packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (encoded_frame.size() < 4) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool has_start_code =
|
||||||
|
(encoded_frame[0] == 0 && encoded_frame[1] == 0 && encoded_frame[2] == 1) ||
|
||||||
|
(encoded_frame[0] == 0 && encoded_frame[1] == 0 && encoded_frame[2] == 0 && encoded_frame[3] == 1);
|
||||||
|
if (!has_start_code) {
|
||||||
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] invalid frame: no NALU start code";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
FfmpegEncoderInfo::~FfmpegEncoderInfo()
|
FfmpegEncoderInfo::~FfmpegEncoderInfo()
|
||||||
@ -81,6 +139,10 @@ FfmpegEncoderInfo::~FfmpegEncoderInfo()
|
|||||||
av_frame_free(&frame);
|
av_frame_free(&frame);
|
||||||
frame = nullptr;
|
frame = nullptr;
|
||||||
}
|
}
|
||||||
|
if (transfer_frame) {
|
||||||
|
av_frame_free(&transfer_frame);
|
||||||
|
transfer_frame = nullptr;
|
||||||
|
}
|
||||||
if (packet) {
|
if (packet) {
|
||||||
av_packet_free(&packet);
|
av_packet_free(&packet);
|
||||||
packet = nullptr;
|
packet = nullptr;
|
||||||
@ -129,7 +191,17 @@ bool CameraStreamEncoder::init(std::shared_ptr<FfmpegEncoderInfo>& encoder,
|
|||||||
ctx->max_b_frames = 0;
|
ctx->max_b_frames = 0;
|
||||||
ctx->gop_size = 10;
|
ctx->gop_size = 10;
|
||||||
|
|
||||||
if (codec->id == AV_CODEC_ID_H264) {
|
const bool is_qsv = codec->name &&
|
||||||
|
(std::string(codec->name) == "h264_qsv" || std::string(codec->name) == "hevc_qsv");
|
||||||
|
|
||||||
|
if (is_qsv) {
|
||||||
|
// Feed system-memory NV12 frames to oneVPL/QSV. The QSV encoder
|
||||||
|
// performs the upload and hardware encoding internally.
|
||||||
|
ctx->pix_fmt = AV_PIX_FMT_NV12;
|
||||||
|
ctx->bit_rate = 4'000'000;
|
||||||
|
av_opt_set_int(ctx->priv_data, "async_depth", 1, 0);
|
||||||
|
av_opt_set_int(ctx->priv_data, "repeat_pps", 1, 0);
|
||||||
|
} else if (codec->id == AV_CODEC_ID_H264) {
|
||||||
av_opt_set(ctx->priv_data, "preset", "ultrafast", 0);
|
av_opt_set(ctx->priv_data, "preset", "ultrafast", 0);
|
||||||
av_opt_set(ctx->priv_data, "tune", "zerolatency", 0);
|
av_opt_set(ctx->priv_data, "tune", "zerolatency", 0);
|
||||||
av_opt_set(ctx->priv_data, "profile", "baseline", 0);
|
av_opt_set(ctx->priv_data, "profile", "baseline", 0);
|
||||||
@ -144,12 +216,14 @@ bool CameraStreamEncoder::init(std::shared_ptr<FfmpegEncoderInfo>& encoder,
|
|||||||
av_opt_set(ctx->priv_data, "no-open-gop", "1", 0);
|
av_opt_set(ctx->priv_data, "no-open-gop", "1", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!is_qsv) {
|
||||||
const AVPixelFormat* pix_fmts = codec->pix_fmts;
|
const AVPixelFormat* pix_fmts = codec->pix_fmts;
|
||||||
if (!pix_fmts) {
|
if (!pix_fmts) {
|
||||||
ctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
ctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
||||||
} else {
|
} else {
|
||||||
ctx->pix_fmt = pix_fmts[0];
|
ctx->pix_fmt = pix_fmts[0];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const int open_ret = avcodec_open2(ctx, codec, nullptr);
|
const int open_ret = avcodec_open2(ctx, codec, nullptr);
|
||||||
if (open_ret < 0) {
|
if (open_ret < 0) {
|
||||||
@ -179,9 +253,11 @@ bool CameraStreamEncoder::init(std::shared_ptr<FfmpegEncoderInfo>& encoder,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CMVR_LOG(INFO) << "[CameraStreamEncoder] initialized " << codec_name
|
const char* pixel_format_name = av_get_pix_fmt_name(ctx->pix_fmt);
|
||||||
|
CMVR_LOG(INFO) << "[CameraStreamEncoder] initialized " << codec->name
|
||||||
<< " encoder, size=" << width << "x" << height
|
<< " encoder, size=" << width << "x" << height
|
||||||
<< ", fps=" << fps;
|
<< ", fps=" << fps
|
||||||
|
<< ", pixel_format=" << (pixel_format_name ? pixel_format_name : "unknown");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,10 +292,8 @@ bool CameraStreamEncoder::encode(std::shared_ptr<FfmpegEncoderInfo>& encoder,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (encoder->sws_context) {
|
encoder->sws_context = sws_getCachedContext(encoder->sws_context,
|
||||||
sws_freeContext(encoder->sws_context);
|
frame_to_encode.cols,
|
||||||
}
|
|
||||||
encoder->sws_context = sws_getContext(frame_to_encode.cols,
|
|
||||||
frame_to_encode.rows,
|
frame_to_encode.rows,
|
||||||
src_pix_fmt,
|
src_pix_fmt,
|
||||||
encoder->codec_context->width,
|
encoder->codec_context->width,
|
||||||
@ -234,6 +308,14 @@ bool CameraStreamEncoder::encode(std::shared_ptr<FfmpegEncoderInfo>& encoder,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int writable_ret = av_frame_make_writable(encoder->frame);
|
||||||
|
if (writable_ret < 0) {
|
||||||
|
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
||||||
|
av_strerror(writable_ret, errbuf, sizeof(errbuf));
|
||||||
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] frame is not writable: " << errbuf;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const uint8_t* src_data[AV_NUM_DATA_POINTERS] = {frame_to_encode.data};
|
const uint8_t* src_data[AV_NUM_DATA_POINTERS] = {frame_to_encode.data};
|
||||||
int src_linesize[AV_NUM_DATA_POINTERS] = {static_cast<int>(frame_to_encode.step)};
|
int src_linesize[AV_NUM_DATA_POINTERS] = {static_cast<int>(frame_to_encode.step)};
|
||||||
|
|
||||||
@ -249,49 +331,125 @@ bool CameraStreamEncoder::encode(std::shared_ptr<FfmpegEncoderInfo>& encoder,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
encoder->frame->pts = encoder->frame_pts++;
|
return encodePreparedFrame(*encoder, encoded_frame, is_key);
|
||||||
int ret = avcodec_send_frame(encoder->codec_context, encoder->frame);
|
}
|
||||||
if (ret < 0) {
|
|
||||||
|
bool CameraStreamEncoder::encode(std::shared_ptr<FfmpegEncoderInfo>& encoder,
|
||||||
|
const AVFrame* frame,
|
||||||
|
std::vector<uint8_t>& encoded_frame,
|
||||||
|
bool& is_key,
|
||||||
|
const CameraStreamEncodeOptions& options)
|
||||||
|
{
|
||||||
|
encoded_frame.clear();
|
||||||
|
is_key = false;
|
||||||
|
if (!encoder || !encoder->codec_context || !encoder->frame || !encoder->packet || !frame) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const AVFrame* source_frame = frame;
|
||||||
|
if (frame->hw_frames_ctx) {
|
||||||
|
if (!encoder->transfer_frame) {
|
||||||
|
encoder->transfer_frame = av_frame_alloc();
|
||||||
|
}
|
||||||
|
if (!encoder->transfer_frame) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
av_frame_unref(encoder->transfer_frame);
|
||||||
|
const int transfer_ret = av_hwframe_transfer_data(encoder->transfer_frame, frame, 0);
|
||||||
|
if (transfer_ret < 0) {
|
||||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
||||||
av_strerror(ret, errbuf, sizeof(errbuf));
|
av_strerror(transfer_ret, errbuf, sizeof(errbuf));
|
||||||
CMVR_LOG(ERROR) << "[CameraStreamEncoder] error sending frame to encoder: " << errbuf;
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] failed to download hardware frame: " << errbuf;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
const int props_ret = av_frame_copy_props(encoder->transfer_frame, frame);
|
||||||
while (true) {
|
if (props_ret < 0) {
|
||||||
ret = avcodec_receive_packet(encoder->codec_context, encoder->packet);
|
|
||||||
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ret < 0) {
|
|
||||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
||||||
av_strerror(ret, errbuf, sizeof(errbuf));
|
av_strerror(props_ret, errbuf, sizeof(errbuf));
|
||||||
CMVR_LOG(ERROR) << "[CameraStreamEncoder] error receiving packet from encoder: " << errbuf;
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] failed to copy hardware frame properties: " << errbuf;
|
||||||
break;
|
return false;
|
||||||
|
}
|
||||||
|
source_frame = encoder->transfer_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (encoder->packet->flags & AV_PKT_FLAG_KEY) {
|
const auto source_format = static_cast<AVPixelFormat>(source_frame->format);
|
||||||
is_key = true;
|
if (source_format == AV_PIX_FMT_NONE) {
|
||||||
}
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] source frame has no pixel format";
|
||||||
encoded_frame.reserve(encoded_frame.size() + encoder->packet->size);
|
|
||||||
encoded_frame.insert(encoded_frame.end(),
|
|
||||||
encoder->packet->data,
|
|
||||||
encoder->packet->data + encoder->packet->size);
|
|
||||||
av_packet_unref(encoder->packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (encoded_frame.size() < 4) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool has_start_code =
|
const int writable_ret = av_frame_make_writable(encoder->frame);
|
||||||
(encoded_frame[0] == 0 && encoded_frame[1] == 0 && encoded_frame[2] == 1) ||
|
if (writable_ret < 0) {
|
||||||
(encoded_frame[0] == 0 && encoded_frame[1] == 0 && encoded_frame[2] == 0 && encoded_frame[3] == 1);
|
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
||||||
if (!has_start_code) {
|
av_strerror(writable_ret, errbuf, sizeof(errbuf));
|
||||||
CMVR_LOG(ERROR) << "[CameraStreamEncoder] invalid frame: no NALU start code";
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] frame is not writable: " << errbuf;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
int copy_ret = 0;
|
||||||
|
if (source_frame->width == encoder->codec_context->width
|
||||||
|
&& source_frame->height == encoder->codec_context->height
|
||||||
|
&& source_format == encoder->codec_context->pix_fmt) {
|
||||||
|
copy_ret = av_frame_copy(encoder->frame, source_frame);
|
||||||
|
} else {
|
||||||
|
encoder->sws_context = sws_getCachedContext(
|
||||||
|
encoder->sws_context,
|
||||||
|
source_frame->width,
|
||||||
|
source_frame->height,
|
||||||
|
source_format,
|
||||||
|
encoder->codec_context->width,
|
||||||
|
encoder->codec_context->height,
|
||||||
|
encoder->codec_context->pix_fmt,
|
||||||
|
SWS_BILINEAR,
|
||||||
|
nullptr,
|
||||||
|
nullptr,
|
||||||
|
nullptr);
|
||||||
|
if (!encoder->sws_context) {
|
||||||
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] failed to create native frame conversion context";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const int scaled_rows = sws_scale(
|
||||||
|
encoder->sws_context,
|
||||||
|
source_frame->data,
|
||||||
|
source_frame->linesize,
|
||||||
|
0,
|
||||||
|
source_frame->height,
|
||||||
|
encoder->frame->data,
|
||||||
|
encoder->frame->linesize);
|
||||||
|
copy_ret = scaled_rows == encoder->codec_context->height
|
||||||
|
? 0
|
||||||
|
: scaled_rows < 0 ? scaled_rows : AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
if (copy_ret < 0) {
|
||||||
|
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
|
||||||
|
av_strerror(copy_ret, errbuf, sizeof(errbuf));
|
||||||
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] failed to copy native frame: " << errbuf;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.draw_timestamp) {
|
||||||
|
const auto output_format = static_cast<AVPixelFormat>(encoder->frame->format);
|
||||||
|
if (output_format != AV_PIX_FMT_NV12 && output_format != AV_PIX_FMT_YUV420P) {
|
||||||
|
const char* format_name = av_get_pix_fmt_name(output_format);
|
||||||
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] cannot draw timestamp on pixel format "
|
||||||
|
<< (format_name ? format_name : "unknown");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!encoder->frame->data[0]
|
||||||
|
|| encoder->frame->linesize[0] < encoder->frame->width) {
|
||||||
|
CMVR_LOG(ERROR) << "[CameraStreamEncoder] invalid luma plane for timestamp";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
cv::Mat luma_plane(
|
||||||
|
encoder->frame->height,
|
||||||
|
encoder->frame->width,
|
||||||
|
CV_8UC1,
|
||||||
|
encoder->frame->data[0],
|
||||||
|
static_cast<size_t>(encoder->frame->linesize[0]));
|
||||||
|
drawTimeStamp(luma_plane);
|
||||||
|
}
|
||||||
|
|
||||||
|
return encodePreparedFrame(*encoder, encoded_frame, is_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace cmvr::device
|
} // namespace cmvr::device
|
||||||
|
|||||||
@ -314,8 +314,20 @@ bool RealsenseCamera::stop() {
|
|||||||
CMVR_LOG(WARNING) << "[RealsenseCamera] (stop): stopRecording failed: " << e.what();
|
CMVR_LOG(WARNING) << "[RealsenseCamera] (stop): stopRecording failed: " << e.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
std::shared_ptr<std::thread> stream_thread_to_join;
|
||||||
|
{
|
||||||
std::lock_guard lock(ctrl_mtx_);
|
std::lock_guard lock(ctrl_mtx_);
|
||||||
clear_error_();
|
clear_error_();
|
||||||
|
stream_count_ = 0;
|
||||||
|
state_.is_streaming = false;
|
||||||
|
state_.is_recording = false;
|
||||||
|
stream_thread_to_join = stream_thread_;
|
||||||
|
stream_thread_.reset();
|
||||||
|
}
|
||||||
|
if (stream_thread_to_join && stream_thread_to_join->joinable()) {
|
||||||
|
stream_thread_to_join->join();
|
||||||
|
}
|
||||||
|
std::lock_guard lock(ctrl_mtx_);
|
||||||
if (!state_.is_opened || !state_.is_initialized) {
|
if (!state_.is_opened || !state_.is_initialized) {
|
||||||
state_.is_opened = false;
|
state_.is_opened = false;
|
||||||
return true;
|
return true;
|
||||||
@ -524,9 +536,12 @@ void RealsenseCamera::startRecording(const std::string &video_path) {
|
|||||||
|
|
||||||
// 1. 确定编码格式对应的AVCodecID(H.264/H.265)
|
// 1. 确定编码格式对应的AVCodecID(H.264/H.265)
|
||||||
AVCodecID codec_id;
|
AVCodecID codec_id;
|
||||||
if (codec_ == "H264" || codec_ == "h264") {
|
if (codec_ == "H264" || codec_ == "h264" ||
|
||||||
|
codec_ == "H264_QSV" || codec_ == "h264_qsv") {
|
||||||
codec_id = AV_CODEC_ID_H264;
|
codec_id = AV_CODEC_ID_H264;
|
||||||
} else if (codec_ == "H265" || codec_ == "hevc") {
|
} else if (codec_ == "H265" || codec_ == "h265" || codec_ == "HEVC" || codec_ == "hevc" ||
|
||||||
|
codec_ == "H265_QSV" || codec_ == "h265_qsv" ||
|
||||||
|
codec_ == "HEVC_QSV" || codec_ == "hevc_qsv") {
|
||||||
codec_id = AV_CODEC_ID_HEVC;
|
codec_id = AV_CODEC_ID_HEVC;
|
||||||
} else {
|
} else {
|
||||||
state_.is_error = true;
|
state_.is_error = true;
|
||||||
@ -534,7 +549,8 @@ void RealsenseCamera::startRecording(const std::string &video_path) {
|
|||||||
CMVR_LOG(ERROR) << "[RealsenseCamera] (startRecording): " << state_.error_message;
|
CMVR_LOG(ERROR) << "[RealsenseCamera] (startRecording): " << state_.error_message;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const char* format_name = (codec_ == "H265" || codec_ == "h265" || codec_ == "HEVC" || codec_ == "hevc") ? "mp4" : "avi";
|
const bool is_hevc = codec_id == AV_CODEC_ID_HEVC;
|
||||||
|
const char* format_name = is_hevc ? "mp4" : "avi";
|
||||||
auto ret = avformat_alloc_output_context2(&format_context_, nullptr, format_name, output_path_.c_str());
|
auto ret = avformat_alloc_output_context2(&format_context_, nullptr, format_name, output_path_.c_str());
|
||||||
// 2. 创建输出格式上下文(封装器核心)
|
// 2. 创建输出格式上下文(封装器核心)
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@ -719,11 +735,15 @@ void RealsenseCamera::streaming_worker_() {
|
|||||||
|
|
||||||
bool success = false;
|
bool success = false;
|
||||||
is_streaming_running = true;
|
is_streaming_running = true;
|
||||||
|
uint64_t frame_sequence = 0;
|
||||||
|
const uint64_t stream_epoch = static_cast<uint64_t>(
|
||||||
|
std::chrono::duration_cast<std::chrono::nanoseconds>(
|
||||||
|
std::chrono::steady_clock::now().time_since_epoch()).count());
|
||||||
|
|
||||||
// 处于流传输或者录像状态时就不退出线程
|
// 处于流传输或者录像状态时就不退出线程
|
||||||
while (state_.is_streaming || state_.is_recording) {
|
while (state_.is_streaming || state_.is_recording) {
|
||||||
// 记录当前帧处理开始时间
|
// 记录当前帧处理开始时间
|
||||||
auto frame_start_time = std::chrono::high_resolution_clock::now();
|
const auto frame_start_time = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
rs2::frameset frames;
|
rs2::frameset frames;
|
||||||
frames = get_frameset(true);
|
frames = get_frameset(true);
|
||||||
@ -786,6 +806,20 @@ void RealsenseCamera::streaming_worker_() {
|
|||||||
// 深度图编码
|
// 深度图编码
|
||||||
// success = encodeFrameWithEncoder(depthEncoder_, frame_data.depthImage, frame_data.depthFrame, frame_data.depthKey);
|
// success = encodeFrameWithEncoder(depthEncoder_, frame_data.depthImage, frame_data.depthFrame, frame_data.depthKey);
|
||||||
if (success) {
|
if (success) {
|
||||||
|
const uint64_t sequence = frame_sequence++;
|
||||||
|
frame_data.stream_epoch = stream_epoch;
|
||||||
|
frame_data.sequence = sequence;
|
||||||
|
frame_data.source_timestamp = static_cast<uint64_t>(color_frame.get_timestamp());
|
||||||
|
frame_data.source_frame_number = color_frame.get_frame_number();
|
||||||
|
frame_data.capture_monotonic_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(
|
||||||
|
frame_start_time.time_since_epoch()).count();
|
||||||
|
frame_data.capture_utc_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch()).count();
|
||||||
|
frame_data.pts = static_cast<int64_t>(sequence);
|
||||||
|
frame_data.dts = frame_data.pts;
|
||||||
|
frame_data.time_base_num = 1;
|
||||||
|
frame_data.time_base_den = fps_;
|
||||||
|
frame_data.duration = 1;
|
||||||
frame_data.fps = fps_;
|
frame_data.fps = fps_;
|
||||||
frame_data.width = encode_width_;
|
frame_data.width = encode_width_;
|
||||||
frame_data.height = encode_height_;
|
frame_data.height = encode_height_;
|
||||||
@ -794,7 +828,7 @@ void RealsenseCamera::streaming_worker_() {
|
|||||||
}
|
}
|
||||||
// 计算从帧开始到现在的总耗时
|
// 计算从帧开始到现在的总耗时
|
||||||
auto total_duration = std::chrono::duration_cast<std::chrono::milliseconds>(
|
auto total_duration = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
std::chrono::high_resolution_clock::now() - frame_start_time
|
std::chrono::steady_clock::now() - frame_start_time
|
||||||
).count();
|
).count();
|
||||||
|
|
||||||
// 计算需要休眠的时间(确保总耗时达到frame_interval)
|
// 计算需要休眠的时间(确保总耗时达到frame_interval)
|
||||||
@ -961,12 +995,24 @@ bool RealsenseCamera::startStreaming()
|
|||||||
|
|
||||||
void RealsenseCamera::stopStreaming()
|
void RealsenseCamera::stopStreaming()
|
||||||
{
|
{
|
||||||
|
std::shared_ptr<std::thread> stream_thread_to_join;
|
||||||
|
{
|
||||||
std::lock_guard lock(ctrl_mtx_);
|
std::lock_guard lock(ctrl_mtx_);
|
||||||
|
if (stream_count_ > 0) {
|
||||||
stream_count_--;
|
stream_count_--;
|
||||||
|
}
|
||||||
if (stream_count_ == 0)
|
if (stream_count_ == 0)
|
||||||
{
|
{
|
||||||
// 当前已经没有正在使用的流了,编码采集线程状态修改
|
// 当前已经没有正在使用的流了,编码采集线程状态修改
|
||||||
state_.is_streaming = false;
|
state_.is_streaming = false;
|
||||||
|
if (!state_.is_recording) {
|
||||||
|
stream_thread_to_join = stream_thread_;
|
||||||
|
stream_thread_.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (stream_thread_to_join && stream_thread_to_join->joinable()) {
|
||||||
|
stream_thread_to_join->join();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,18 @@ add_library(uvc_camera SHARED src/uvc_camera.cpp)
|
|||||||
|
|
||||||
target_include_directories(uvc_camera PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(uvc_camera PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
target_link_libraries(uvc_camera PUBLIC glog opencv_core opencv_imgproc cmvr_es::proto cmvr_es::device::camera_stream_encoder)
|
target_link_libraries(uvc_camera PUBLIC
|
||||||
|
glog
|
||||||
|
opencv_core
|
||||||
|
opencv_imgproc
|
||||||
|
avcodec
|
||||||
|
avdevice
|
||||||
|
avformat
|
||||||
|
avutil
|
||||||
|
swscale
|
||||||
|
cmvr_es::proto
|
||||||
|
cmvr_es::device::camera_stream_encoder
|
||||||
|
)
|
||||||
|
|
||||||
add_library(cmvr_es::device::uvc_camera ALIAS uvc_camera)
|
add_library(cmvr_es::device::uvc_camera ALIAS uvc_camera)
|
||||||
install(TARGETS uvc_camera LIBRARY DESTINATION lib)
|
install(TARGETS uvc_camera LIBRARY DESTINATION lib)
|
||||||
|
|||||||
@ -5,6 +5,9 @@
|
|||||||
#ifndef CMVR_ES_UVC_CAMERA_H
|
#ifndef CMVR_ES_UVC_CAMERA_H
|
||||||
#define CMVR_ES_UVC_CAMERA_H
|
#define CMVR_ES_UVC_CAMERA_H
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <condition_variable>
|
||||||
|
|
||||||
#include "common/base/ring_buffer.h"
|
#include "common/base/ring_buffer.h"
|
||||||
#include "camera/abstract_camera.h"
|
#include "camera/abstract_camera.h"
|
||||||
#include "devices/camera/common/include/camera_stream_encoder.h"
|
#include "devices/camera/common/include/camera_stream_encoder.h"
|
||||||
@ -45,6 +48,16 @@ namespace cmvr::device {
|
|||||||
private:
|
private:
|
||||||
void streaming_worker_();
|
void streaming_worker_();
|
||||||
void recording_worker_();
|
void recording_worker_();
|
||||||
|
void cleanup_recording_resources_();
|
||||||
|
bool open_capture_();
|
||||||
|
void close_capture_();
|
||||||
|
void capture_worker_();
|
||||||
|
bool wait_for_capture_frame_(AVFrame* frame,
|
||||||
|
uint64_t& last_sequence,
|
||||||
|
int64_t& capture_monotonic_ns,
|
||||||
|
int64_t& capture_utc_ns);
|
||||||
|
bool convert_capture_frame_to_bgr_(const AVFrame* frame, cv::Mat& bgr_frame);
|
||||||
|
static int interrupt_capture_(void* opaque);
|
||||||
|
|
||||||
int fps_;
|
int fps_;
|
||||||
int width_;
|
int width_;
|
||||||
@ -52,7 +65,6 @@ namespace cmvr::device {
|
|||||||
int encode_width_;
|
int encode_width_;
|
||||||
int encode_height_;
|
int encode_height_;
|
||||||
std::string serial_;
|
std::string serial_;
|
||||||
cv::VideoCapture cap_;
|
|
||||||
size_t buffer_size_;
|
size_t buffer_size_;
|
||||||
std::string codec_;
|
std::string codec_;
|
||||||
bool enable_stream_timestamp_{false};
|
bool enable_stream_timestamp_{false};
|
||||||
@ -63,13 +75,24 @@ namespace cmvr::device {
|
|||||||
std::string current_video_path_;
|
std::string current_video_path_;
|
||||||
|
|
||||||
std::mutex ctrl_mtx_{};
|
std::mutex ctrl_mtx_{};
|
||||||
std::unique_ptr<cv::VideoWriter> video_writer_;
|
|
||||||
std::shared_ptr<std::thread> stream_thread_;
|
std::shared_ptr<std::thread> stream_thread_;
|
||||||
std::shared_ptr<std::thread> recording_thread_;
|
std::shared_ptr<std::thread> recording_thread_;
|
||||||
|
std::shared_ptr<std::thread> capture_thread_;
|
||||||
|
|
||||||
|
AVFormatContext* capture_format_context_ = nullptr;
|
||||||
cv::Mat latest_frame_; // 存储最新帧
|
AVCodecContext* capture_decoder_context_ = nullptr;
|
||||||
std::mutex frame_mutex_; // 保护最新帧的访问
|
AVBufferRef* capture_hw_device_context_ = nullptr;
|
||||||
|
SwsContext* capture_sws_context_ = nullptr;
|
||||||
|
int capture_video_stream_index_ = -1;
|
||||||
|
std::atomic<bool> capture_running_{false};
|
||||||
|
std::mutex capture_frame_mutex_;
|
||||||
|
std::mutex capture_conversion_mutex_;
|
||||||
|
std::condition_variable capture_frame_cv_;
|
||||||
|
AVFrame* latest_capture_frame_ = nullptr;
|
||||||
|
uint64_t latest_capture_sequence_ = 0;
|
||||||
|
int64_t latest_capture_monotonic_ns_ = 0;
|
||||||
|
int64_t latest_capture_utc_ns_ = 0;
|
||||||
|
std::string capture_error_;
|
||||||
|
|
||||||
std::string output_path_;
|
std::string output_path_;
|
||||||
bool is_recording_ = false;
|
bool is_recording_ = false;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -452,8 +452,8 @@ bool ffmpegMicroPhone::initFFmpeg()
|
|||||||
avdevice_register_all();
|
avdevice_register_all();
|
||||||
logSupportedAudioInputFormats();
|
logSupportedAudioInputFormats();
|
||||||
|
|
||||||
const char* input_format_name = "pulse";
|
const char* input_format_name = "alsa";
|
||||||
AVInputFormat* input_fmt = av_find_input_format(input_format_name);
|
const AVInputFormat* input_fmt = av_find_input_format(input_format_name);
|
||||||
if (!input_fmt) {
|
if (!input_fmt) {
|
||||||
input_format_name = "alsa";
|
input_format_name = "alsa";
|
||||||
input_fmt = av_find_input_format(input_format_name);
|
input_fmt = av_find_input_format(input_format_name);
|
||||||
|
|||||||
@ -7,10 +7,12 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include "devices/abstract_device.h"
|
#include "devices/abstract_device.h"
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "motor/motor_protocol_interface.h"
|
#include "motor/motor_protocol_interface.h"
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
namespace cmvr::device{
|
namespace cmvr::device{
|
||||||
|
|
||||||
@ -212,6 +214,11 @@ namespace cmvr::device{
|
|||||||
return protocol_->getQd(node_id_);
|
return protocol_->getQd(node_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the actual motor current in mA when supported by the driver.
|
||||||
|
virtual std::int16_t getCurrent() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 使用的通讯协议
|
// 使用的通讯协议
|
||||||
virtual void setProtocol(std::shared_ptr<MotorProtocolInterface> protocol) {
|
virtual void setProtocol(std::shared_ptr<MotorProtocolInterface> protocol) {
|
||||||
|
|||||||
@ -121,6 +121,12 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool readSdoString(int motor_id,
|
||||||
|
std::uint16_t index,
|
||||||
|
std::uint8_t subindex,
|
||||||
|
std::string& value,
|
||||||
|
std::size_t max_size = 128);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct PdoEntryRuntime {
|
struct PdoEntryRuntime {
|
||||||
EthercatPdoEntryConfig cfg;
|
EthercatPdoEntryConfig cfg;
|
||||||
|
|||||||
@ -1025,6 +1025,68 @@ bool EthercatMotorBusRuntime::readSdoRaw_(const int motor_id,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EthercatMotorBusRuntime::readSdoString(const int motor_id,
|
||||||
|
const std::uint16_t index,
|
||||||
|
const std::uint8_t subindex,
|
||||||
|
std::string& value,
|
||||||
|
const std::size_t max_size)
|
||||||
|
{
|
||||||
|
value.clear();
|
||||||
|
if (max_size == 0) {
|
||||||
|
CMVR_LOG(ERROR) << "[EthercatMotorBusRuntime] invalid SDO string buffer size: "
|
||||||
|
<< max_size << ", object=" << hexIndex_(index)
|
||||||
|
<< ":" << static_cast<int>(subindex)
|
||||||
|
<< ", motor_id=" << motor_id;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto slave_it = slaves_by_motor_id_.find(motor_id);
|
||||||
|
if (slave_it == slaves_by_motor_id_.end()) {
|
||||||
|
CMVR_LOG(ERROR) << "[EthercatMotorBusRuntime] missing motor for SDO string read: "
|
||||||
|
<< motor_id << ", object=" << hexIndex_(index)
|
||||||
|
<< ":" << static_cast<int>(subindex);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!master_) {
|
||||||
|
CMVR_LOG(ERROR) << "[EthercatMotorBusRuntime] runtime is not initialized for SDO string read: "
|
||||||
|
<< id_ << ", motor_id=" << motor_id
|
||||||
|
<< ", object=" << hexIndex_(index)
|
||||||
|
<< ":" << static_cast<int>(subindex);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::uint8_t> data(max_size);
|
||||||
|
std::size_t result_size = 0;
|
||||||
|
std::uint32_t abort_code = 0;
|
||||||
|
const auto& slave = slave_it->second;
|
||||||
|
const int result = ecrt_master_sdo_upload(
|
||||||
|
master_,
|
||||||
|
static_cast<std::uint16_t>(slave.cfg.position()),
|
||||||
|
index,
|
||||||
|
subindex,
|
||||||
|
data.data(),
|
||||||
|
data.size(),
|
||||||
|
&result_size,
|
||||||
|
&abort_code);
|
||||||
|
if (result != 0 || result_size > data.size()) {
|
||||||
|
CMVR_LOG(ERROR) << "[EthercatMotorBusRuntime] failed to read SDO string: "
|
||||||
|
<< "group=" << id_ << ", motor_id=" << motor_id
|
||||||
|
<< ", slave_position=" << slave.cfg.position()
|
||||||
|
<< ", object=" << hexIndex_(index)
|
||||||
|
<< ":" << static_cast<int>(subindex)
|
||||||
|
<< ", max_size=" << max_size
|
||||||
|
<< ", result=" << result
|
||||||
|
<< ", result_size=" << result_size
|
||||||
|
<< ", abort_code=" << hexIndex_(abort_code);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto string_end = std::find(data.begin(), data.begin() + result_size, 0);
|
||||||
|
value.assign(reinterpret_cast<const char*>(data.data()),
|
||||||
|
static_cast<std::size_t>(string_end - data.begin()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
std::uint32_t EthercatMotorBusRuntime::pdoEntryKey_(const std::uint16_t index,
|
std::uint32_t EthercatMotorBusRuntime::pdoEntryKey_(const std::uint16_t index,
|
||||||
const std::uint8_t subindex)
|
const std::uint8_t subindex)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -66,6 +66,7 @@ TEST(EthercatMotorBusRuntimeRealTest, InitStartAndReadStatusword)
|
|||||||
EXPECT_TRUE(runtime.hasPdoEntry(1, msgs::CIA402_STATUS_WORD_6041, 0x00));
|
EXPECT_TRUE(runtime.hasPdoEntry(1, msgs::CIA402_STATUS_WORD_6041, 0x00));
|
||||||
EXPECT_TRUE(runtime.hasPdoEntry(1, msgs::CIA402_OPERATION_MODE_6060, 0x00));
|
EXPECT_TRUE(runtime.hasPdoEntry(1, msgs::CIA402_OPERATION_MODE_6060, 0x00));
|
||||||
EXPECT_TRUE(runtime.hasPdoEntry(1, msgs::CIA402_MODE_DISPLAY_6061, 0x00));
|
EXPECT_TRUE(runtime.hasPdoEntry(1, msgs::CIA402_MODE_DISPLAY_6061, 0x00));
|
||||||
|
EXPECT_TRUE(runtime.hasPdoEntry(1, msgs::CIA402_ACTUAL_CURRENT_6078, 0x00));
|
||||||
|
|
||||||
const bool started = runtime.start();
|
const bool started = runtime.start();
|
||||||
EXPECT_TRUE(started);
|
EXPECT_TRUE(started);
|
||||||
@ -111,8 +112,13 @@ TEST(EthercatMotorBusRuntimeRealTest, InitStartAndReadStatusword)
|
|||||||
const auto mode_display =
|
const auto mode_display =
|
||||||
EthercatMotorBusRuntime::pdoReadValue<std::int8_t>(feedback_reads[1]);
|
EthercatMotorBusRuntime::pdoReadValue<std::int8_t>(feedback_reads[1]);
|
||||||
|
|
||||||
|
std::int16_t actual_current = 0;
|
||||||
|
EXPECT_TRUE(runtime.readPdo<std::int16_t>(
|
||||||
|
1, msgs::CIA402_ACTUAL_CURRENT_6078, 0x00, actual_current));
|
||||||
|
|
||||||
std::cout << "CIA402 statusword: 0x" << std::hex << statusword
|
std::cout << "CIA402 statusword: 0x" << std::hex << statusword
|
||||||
<< ", mode display: " << std::dec << static_cast<int>(mode_display)
|
<< ", mode display: " << std::dec << static_cast<int>(mode_display)
|
||||||
|
<< ", actual current raw: " << actual_current
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
const int hold_ms = 10000;
|
const int hold_ms = 10000;
|
||||||
|
|||||||
@ -62,6 +62,7 @@ inline EthercatPdoMapping createEyouCia402PdoMapping()
|
|||||||
entry(msgs::CIA402_ACTUAL_POSITION_6064, 0x00, 32, "Actual Position"),
|
entry(msgs::CIA402_ACTUAL_POSITION_6064, 0x00, 32, "Actual Position"),
|
||||||
entry(msgs::CIA402_ACTUAL_VELOCITY_606C, 0x00, 32, "Actual Velocity"),
|
entry(msgs::CIA402_ACTUAL_VELOCITY_606C, 0x00, 32, "Actual Velocity"),
|
||||||
entry(msgs::CIA402_ACTUAL_TORQUE_6077, 0x00, 16, "Actual Torque"),
|
entry(msgs::CIA402_ACTUAL_TORQUE_6077, 0x00, 16, "Actual Torque"),
|
||||||
|
entry(msgs::CIA402_ACTUAL_CURRENT_6078, 0x00, 16, "Actual Current"),
|
||||||
entry(msgs::CIA402_MODE_DISPLAY_6061, 0x00, 8, "Mode Of Operation Display"),
|
entry(msgs::CIA402_MODE_DISPLAY_6061, 0x00, 8, "Mode Of Operation Display"),
|
||||||
entry(msgs::CIA402_ERROR_CODE_603F, 0x00, 16, "Error Code"),
|
entry(msgs::CIA402_ERROR_CODE_603F, 0x00, 16, "Error Code"),
|
||||||
entry(0x0000, 0x00, 8, "Padding"),
|
entry(0x0000, 0x00, 8, "Padding"),
|
||||||
|
|||||||
@ -24,6 +24,7 @@ public:
|
|||||||
void setLimitQd(double qd) override;
|
void setLimitQd(double qd) override;
|
||||||
bool calibrateZeroQ() override;
|
bool calibrateZeroQ() override;
|
||||||
bool brakeRelease() override;
|
bool brakeRelease() override;
|
||||||
|
std::int16_t getCurrent() override;
|
||||||
|
|
||||||
static bool commandCyclicPositionsAtomic(
|
static bool commandCyclicPositionsAtomic(
|
||||||
const std::vector<std::shared_ptr<AbstractMotor>>& motors,
|
const std::vector<std::shared_ptr<AbstractMotor>>& motors,
|
||||||
@ -39,6 +40,7 @@ private:
|
|||||||
bool hasValidConversion_() const;
|
bool hasValidConversion_() const;
|
||||||
bool writeVendorPositionLimits_() const;
|
bool writeVendorPositionLimits_() const;
|
||||||
bool writeVendorVelocityLimit_() const;
|
bool writeVendorVelocityLimit_() const;
|
||||||
|
void configureCurrentConversion_();
|
||||||
std::int32_t radToCounts_(double angle_rad) const;
|
std::int32_t radToCounts_(double angle_rad) const;
|
||||||
std::uint32_t radPerSecToCounts_(double velocity_rad_s) const;
|
std::uint32_t radPerSecToCounts_(double velocity_rad_s) const;
|
||||||
|
|
||||||
@ -46,6 +48,7 @@ private:
|
|||||||
std::unique_ptr<EyouMotorAdapter> vendor_adapter_;
|
std::unique_ptr<EyouMotorAdapter> vendor_adapter_;
|
||||||
double encoder_counts_per_rev_{0.0};
|
double encoder_counts_per_rev_{0.0};
|
||||||
double gear_ratio_{0.0};
|
double gear_ratio_{0.0};
|
||||||
|
double current_scale_ma_per_count_{1.0};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace cmvr::device
|
} // namespace cmvr::device
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "devices/motor/bus_runtime/ethercat/include/ethercat_motor_bus_runtime.h"
|
#include "devices/motor/bus_runtime/ethercat/include/ethercat_motor_bus_runtime.h"
|
||||||
#include "devices/motor/drivers/ethercat_motor/include/vendor/motor_vendor_adapter.h"
|
#include "devices/motor/drivers/ethercat_motor/include/vendor/motor_vendor_adapter.h"
|
||||||
@ -24,6 +25,11 @@ public:
|
|||||||
std::int64_t counts_per_joint_revolution,
|
std::int64_t counts_per_joint_revolution,
|
||||||
std::int32_t& zeroed_position) override;
|
std::int32_t& zeroed_position) override;
|
||||||
bool brakeRelease(std::uint8_t node_id) override;
|
bool brakeRelease(std::uint8_t node_id) override;
|
||||||
|
bool readActualCurrent(std::uint8_t node_id,
|
||||||
|
std::int16_t& current_value) const;
|
||||||
|
bool readMotorIdentity(std::uint8_t node_id,
|
||||||
|
std::string& motor_model,
|
||||||
|
std::string& motor_version) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<EthercatMotorBusRuntime> bus_runtime_;
|
std::shared_ptr<EthercatMotorBusRuntime> bus_runtime_;
|
||||||
|
|||||||
@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
namespace cmvr::device::eyou {
|
namespace cmvr::device::eyou {
|
||||||
|
|
||||||
|
inline constexpr std::uint16_t EYOU_DEVICE_NAME_1008 = 0x1008;
|
||||||
|
inline constexpr std::uint16_t EYOU_SOFTWARE_VERSION_100A = 0x100A;
|
||||||
|
|
||||||
inline constexpr std::uint16_t EYOU_SOFT_LIMIT_STATE_2003 = 0x2003;
|
inline constexpr std::uint16_t EYOU_SOFT_LIMIT_STATE_2003 = 0x2003;
|
||||||
|
|
||||||
inline constexpr std::uint16_t EYOU_BRAKE_CONTROL_2014 = 0x2014;
|
inline constexpr std::uint16_t EYOU_BRAKE_CONTROL_2014 = 0x2014;
|
||||||
|
|||||||
@ -153,8 +153,11 @@ void Cia402StatusMonitor::reportStatuswordTransition_(
|
|||||||
const StatusSample& previous,
|
const StatusSample& previous,
|
||||||
const StatusSample& current) const
|
const StatusSample& current) const
|
||||||
{
|
{
|
||||||
const bool status_changed =
|
const bool device_state_changed =
|
||||||
!had_previous || !previous.read_ok ||
|
!had_previous || !previous.read_ok ||
|
||||||
|
(previous.statusword & 0x006F) != (current.statusword & 0x006F);
|
||||||
|
const bool status_changed =
|
||||||
|
device_state_changed ||
|
||||||
previous.status_problem != current.status_problem ||
|
previous.status_problem != current.status_problem ||
|
||||||
(previous.statusword & 0x0888) != (current.statusword & 0x0888);
|
(previous.statusword & 0x0888) != (current.statusword & 0x0888);
|
||||||
if (current.status_problem && status_changed) {
|
if (current.status_problem && status_changed) {
|
||||||
@ -178,9 +181,20 @@ void Cia402StatusMonitor::reportStatuswordTransition_(
|
|||||||
previous.status_problem) {
|
previous.status_problem) {
|
||||||
CMVR_LOG(INFO) << "[Cia402StatusMonitor] [statusword] recovered"
|
CMVR_LOG(INFO) << "[Cia402StatusMonitor] [statusword] recovered"
|
||||||
<< ", node=" << static_cast<int>(node_id)
|
<< ", node=" << static_cast<int>(node_id)
|
||||||
|
<< ", current_statusword=0x" << std::hex << std::uppercase
|
||||||
|
<< std::setw(4) << std::setfill('0') << current.statusword
|
||||||
|
<< std::dec << std::nouppercase << std::setfill(' ')
|
||||||
|
<< ' ' << deviceStateName_(current.statusword)
|
||||||
<< ", previous_statusword=0x" << std::hex << std::uppercase
|
<< ", previous_statusword=0x" << std::hex << std::uppercase
|
||||||
<< std::setw(4) << std::setfill('0') << previous.statusword
|
<< std::setw(4) << std::setfill('0') << previous.statusword
|
||||||
<< std::dec << std::nouppercase << std::setfill(' ');
|
<< std::dec << std::nouppercase << std::setfill(' ');
|
||||||
|
} else if (device_state_changed) {
|
||||||
|
CMVR_LOG(INFO) << "[Cia402StatusMonitor] [statusword] 0x"
|
||||||
|
<< std::hex << std::uppercase << std::setw(4)
|
||||||
|
<< std::setfill('0') << current.statusword
|
||||||
|
<< std::dec << std::nouppercase << std::setfill(' ')
|
||||||
|
<< ' ' << deviceStateName_(current.statusword)
|
||||||
|
<< ", node=" << static_cast<int>(node_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,12 +6,31 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <limits>
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
|
|
||||||
namespace cmvr::device {
|
namespace cmvr::device {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct MotorCurrentInfo {
|
||||||
|
double adc_amperes_per_count;
|
||||||
|
double rated_current_amperes;
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::map<std::string, MotorCurrentInfo> kMotorCurrentMap = {
|
||||||
|
{"EuPH11", {0.005371094, 3.8}},
|
||||||
|
{"EuPH14", {0.007672991, 3.9}},
|
||||||
|
{"EuPH17", {0.007672991, 3.9}},
|
||||||
|
{"EuPH20", {0.013427734, 6.9}},
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
EyouMotor::EyouMotor(const config::MotorConfigItem& config,
|
EyouMotor::EyouMotor(const config::MotorConfigItem& config,
|
||||||
std::shared_ptr<Cia402Protocol> cia402_protocol,
|
std::shared_ptr<Cia402Protocol> cia402_protocol,
|
||||||
std::unique_ptr<EyouMotorAdapter> vendor_adapter)
|
std::unique_ptr<EyouMotorAdapter> vendor_adapter)
|
||||||
@ -46,6 +65,7 @@ bool EyouMotor::init()
|
|||||||
CMVR_LOG(ERROR) << "[EyouMotor] failed to init vendor adapter: " << info_.joint_name;
|
CMVR_LOG(ERROR) << "[EyouMotor] failed to init vendor adapter: " << info_.joint_name;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
configureCurrentConversion_();
|
||||||
cia402_protocol_->setMotorConversion(node_id_, encoder_counts_per_rev_, gear_ratio_);
|
cia402_protocol_->setMotorConversion(node_id_, encoder_counts_per_rev_, gear_ratio_);
|
||||||
|
|
||||||
cia402_protocol_->setLimitQd(node_id_, info_.limit_qd);
|
cia402_protocol_->setLimitQd(node_id_, info_.limit_qd);
|
||||||
@ -212,6 +232,29 @@ bool EyouMotor::brakeRelease()
|
|||||||
return vendor_adapter_->brakeRelease(node_id_);
|
return vendor_adapter_->brakeRelease(node_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::int16_t EyouMotor::getCurrent()
|
||||||
|
{
|
||||||
|
std::scoped_lock lock(mtx_);
|
||||||
|
if (!hasDependencies_()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::int16_t raw_current = 0;
|
||||||
|
if (!vendor_adapter_->readActualCurrent(node_id_, raw_current)) {
|
||||||
|
CMVR_LOG(ERROR) << "[EyouMotor] failed to read actual current: "
|
||||||
|
<< info_.joint_name;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double current_ma = static_cast<double>(raw_current) *
|
||||||
|
current_scale_ma_per_count_;
|
||||||
|
const double clamped_current_ma = std::clamp(
|
||||||
|
current_ma,
|
||||||
|
static_cast<double>(std::numeric_limits<std::int16_t>::min()),
|
||||||
|
static_cast<double>(std::numeric_limits<std::int16_t>::max()));
|
||||||
|
return static_cast<std::int16_t>(clamped_current_ma);
|
||||||
|
}
|
||||||
|
|
||||||
bool EyouMotor::hasDependencies_() const
|
bool EyouMotor::hasDependencies_() const
|
||||||
{
|
{
|
||||||
if (!cia402_protocol_ || !vendor_adapter_) {
|
if (!cia402_protocol_ || !vendor_adapter_) {
|
||||||
@ -260,6 +303,37 @@ bool EyouMotor::writeVendorVelocityLimit_() const
|
|||||||
return vendor_adapter_->writeVelocityLimit(node_id_, radPerSecToCounts_(info_.limit_qd));
|
return vendor_adapter_->writeVelocityLimit(node_id_, radPerSecToCounts_(info_.limit_qd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EyouMotor::configureCurrentConversion_()
|
||||||
|
{
|
||||||
|
std::string motor_model;
|
||||||
|
std::string motor_version;
|
||||||
|
if (!vendor_adapter_->readMotorIdentity(node_id_, motor_model, motor_version)) {
|
||||||
|
CMVR_LOG(WARNING) << "[EyouMotor] failed to read motor identity; actual current "
|
||||||
|
<< "will use the raw PDO value: " << info_.joint_name;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string model_prefix = motor_model;
|
||||||
|
const auto dash_pos = motor_model.find('-');
|
||||||
|
if (dash_pos != std::string::npos) {
|
||||||
|
model_prefix = motor_model.substr(0, dash_pos);
|
||||||
|
} else if (motor_model.rfind("EuPH", 0) == 0 && motor_model.size() >= 6) {
|
||||||
|
model_prefix = motor_model.substr(0, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto current_info = kMotorCurrentMap.find(model_prefix);
|
||||||
|
if (current_info == kMotorCurrentMap.end()) {
|
||||||
|
CMVR_LOG(WARNING) << "[EyouMotor] unsupported motor model for current conversion: "
|
||||||
|
<< motor_model << ", actual current will use the raw PDO value";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool is_v145 = motor_version.find("V145") != std::string::npos;
|
||||||
|
current_scale_ma_per_count_ = is_v145
|
||||||
|
? current_info->second.rated_current_amperes
|
||||||
|
: current_info->second.adc_amperes_per_count * 1000.0;
|
||||||
|
}
|
||||||
|
|
||||||
std::int32_t EyouMotor::radToCounts_(const double angle_rad) const
|
std::int32_t EyouMotor::radToCounts_(const double angle_rad) const
|
||||||
{
|
{
|
||||||
const double rev = angle_rad / (2.0 * M_PI);
|
const double rev = angle_rad / (2.0 * M_PI);
|
||||||
|
|||||||
@ -373,4 +373,25 @@ bool EyouMotorAdapter::brakeRelease(const std::uint8_t node_id)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EyouMotorAdapter::readActualCurrent(const std::uint8_t node_id,
|
||||||
|
std::int16_t& current_value) const
|
||||||
|
{
|
||||||
|
return bus_runtime_ &&
|
||||||
|
bus_runtime_->readPdo<std::int16_t>(
|
||||||
|
node_id, msgs::CIA402_ACTUAL_CURRENT_6078, 0x00, current_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EyouMotorAdapter::readMotorIdentity(const std::uint8_t node_id,
|
||||||
|
std::string& motor_model,
|
||||||
|
std::string& motor_version) const
|
||||||
|
{
|
||||||
|
if (!bus_runtime_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return bus_runtime_->readSdoString(
|
||||||
|
node_id, eyou::EYOU_DEVICE_NAME_1008, 0x00, motor_model) &&
|
||||||
|
bus_runtime_->readSdoString(
|
||||||
|
node_id, eyou::EYOU_SOFTWARE_VERSION_100A, 0x00, motor_version);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace cmvr::device
|
} // namespace cmvr::device
|
||||||
|
|||||||
@ -145,6 +145,7 @@ void printMotorState(const char* label, AbstractMotor& motor)
|
|||||||
std::cout << label
|
std::cout << label
|
||||||
<< ": motor_q=" << motor.getQ() << " rad"
|
<< ": motor_q=" << motor.getQ() << " rad"
|
||||||
<< ", motor_qd=" << motor.getQd() << " rad/s"
|
<< ", motor_qd=" << motor.getQd() << " rad/s"
|
||||||
|
<< ", motor_current=" << motor.getCurrent() << " mA"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -304,7 +304,7 @@ void ffmpegSpeaker::decode_audio_() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AVCodec* decoder = nullptr;
|
const AVCodec* decoder = nullptr;
|
||||||
const int stream_index = av_find_best_stream(fmt_ctx.get(), AVMEDIA_TYPE_AUDIO, -1, -1, &decoder, 0);
|
const int stream_index = av_find_best_stream(fmt_ctx.get(), AVMEDIA_TYPE_AUDIO, -1, -1, &decoder, 0);
|
||||||
if (stream_index < 0) {
|
if (stream_index < 0) {
|
||||||
{
|
{
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
#include "runtime/include/cmvr_runtime.h"
|
#include "runtime/include/cmvr_runtime.h"
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
bool blockShutdownSignals(sigset_t& shutdown_signals)
|
bool blockShutdownSignals(sigset_t& shutdown_signals)
|
||||||
@ -16,8 +17,57 @@ bool blockShutdownSignals(sigset_t& shutdown_signals)
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
namespace fs = std::filesystem;
|
||||||
|
static bool setupIntelMediaEnvironment()
|
||||||
|
{
|
||||||
|
char exe_path_buffer[PATH_MAX] = {};
|
||||||
|
|
||||||
|
const ssize_t length = readlink(
|
||||||
|
"/proc/self/exe",
|
||||||
|
exe_path_buffer,
|
||||||
|
sizeof(exe_path_buffer) - 1);
|
||||||
|
|
||||||
|
if (length <= 0) {
|
||||||
|
std::cerr << "Failed to resolve /proc/self/exe\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
exe_path_buffer[length] = '\0';
|
||||||
|
|
||||||
|
const fs::path executable_path(exe_path_buffer);
|
||||||
|
const fs::path bin_directory = executable_path.parent_path();
|
||||||
|
const fs::path install_directory = bin_directory.parent_path();
|
||||||
|
const fs::path library_directory = install_directory / "lib";
|
||||||
|
const fs::path va_driver_directory = library_directory / "dri";
|
||||||
|
const fs::path ihd_driver = va_driver_directory / "iHD_drv_video.so";
|
||||||
|
|
||||||
|
if (!fs::exists(ihd_driver)) {
|
||||||
|
std::cerr << "Intel media driver not found: "
|
||||||
|
<< ihd_driver << '\n';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// overwrite=1:强制 cmvr-es 使用随项目发布的媒体运行时。
|
||||||
|
setenv("LIBVA_DRIVER_NAME", "iHD", 1);
|
||||||
|
setenv(
|
||||||
|
"LIBVA_DRIVERS_PATH",
|
||||||
|
va_driver_directory.c_str(),
|
||||||
|
1);
|
||||||
|
setenv(
|
||||||
|
"ONEVPL_SEARCH_PATH",
|
||||||
|
library_directory.c_str(),
|
||||||
|
1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
if (!setupIntelMediaEnvironment()) {
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
sigset_t shutdown_signals;
|
sigset_t shutdown_signals;
|
||||||
if (!blockShutdownSignals(shutdown_signals)) {
|
if (!blockShutdownSignals(shutdown_signals)) {
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@ -123,6 +123,10 @@ private:
|
|||||||
std::shared_ptr<Impl> impl_;
|
std::shared_ptr<Impl> impl_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Compatibility alias for older protocol tests and integrations. New code should
|
||||||
|
// use MediaSourceHub directly.
|
||||||
|
using MediaSourceManager = MediaSourceHub;
|
||||||
|
|
||||||
} // namespace cmvr::media
|
} // namespace cmvr::media
|
||||||
|
|
||||||
#endif // CMVR_ES_MANAGER_MEDIA_SOURCE_HUB_H
|
#endif // CMVR_ES_MANAGER_MEDIA_SOURCE_HUB_H
|
||||||
|
|||||||
@ -32,10 +32,12 @@ std::string normalizedCodec(std::string codec) {
|
|||||||
|
|
||||||
Codec videoCodec(const std::string& value) {
|
Codec videoCodec(const std::string& value) {
|
||||||
const std::string codec = normalizedCodec(value);
|
const std::string codec = normalizedCodec(value);
|
||||||
if (codec == "h264" || codec == "avc" || codec == "avc1" || codec == "libx264") {
|
if (codec == "h264" || codec == "avc" || codec == "avc1" ||
|
||||||
|
codec == "libx264" || codec == "h264qsv") {
|
||||||
return Codec::H264;
|
return Codec::H264;
|
||||||
}
|
}
|
||||||
if (codec == "h265" || codec == "hevc" || codec == "hvc1" || codec == "libx265") {
|
if (codec == "h265" || codec == "hevc" || codec == "hvc1" ||
|
||||||
|
codec == "libx265" || codec == "h265qsv" || codec == "hevcqsv") {
|
||||||
return Codec::H265;
|
return Codec::H265;
|
||||||
}
|
}
|
||||||
return Codec::UNKNOWN;
|
return Codec::UNKNOWN;
|
||||||
|
|||||||
@ -38,6 +38,9 @@ public:
|
|||||||
grpc::Status getJointState(grpc::ServerContext* context,
|
grpc::Status getJointState(grpc::ServerContext* context,
|
||||||
const api::JointRequest* request,
|
const api::JointRequest* request,
|
||||||
api::JointResponse* response) override;
|
api::JointResponse* response) override;
|
||||||
|
grpc::Status getRobotState(grpc::ServerContext* context,
|
||||||
|
const api::GetRobotState_Request* request,
|
||||||
|
api::GetRobotState_Response* response) override;
|
||||||
grpc::Status getPose(grpc::ServerContext* context,
|
grpc::Status getPose(grpc::ServerContext* context,
|
||||||
const api::GetPose_Request* request,
|
const api::GetPose_Request* request,
|
||||||
api::GetPose_Response* response) override;
|
api::GetPose_Response* response) override;
|
||||||
|
|||||||
@ -82,3 +82,28 @@ TEST(GrpcArmClientTest, GetJointState)
|
|||||||
CMVR_LOG(ERROR) << "RPC failed: " << status.error_message();
|
CMVR_LOG(ERROR) << "RPC failed: " << status.error_message();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(GrpcArmClientTest, GetRobotState)
|
||||||
|
{
|
||||||
|
auto stub = makeStub();
|
||||||
|
cmvr::api::GetRobotState_Request request;
|
||||||
|
fillHeader(request.mutable_header());
|
||||||
|
|
||||||
|
cmvr::api::GetRobotState_Response response;
|
||||||
|
grpc::ClientContext context;
|
||||||
|
const grpc::Status status = stub->getRobotState(&context, request, &response);
|
||||||
|
|
||||||
|
if (status.ok()) {
|
||||||
|
const auto& state = response.state();
|
||||||
|
CMVR_LOG(INFO) << "Robot state: connected=" << state.connected()
|
||||||
|
<< ", powered_on=" << state.powered_on()
|
||||||
|
<< ", moving=" << state.moving()
|
||||||
|
<< ", fault=" << state.fault()
|
||||||
|
<< ", robot_mode=" << state.robot_mode()
|
||||||
|
<< ", safety_mode=" << state.safety_mode()
|
||||||
|
<< ", control_mode=" << state.control_mode()
|
||||||
|
<< ", joints=" << state.actual_joint_state().name_size();
|
||||||
|
} else {
|
||||||
|
CMVR_LOG(ERROR) << "RPC failed: " << status.error_message();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -92,6 +92,131 @@ api::CartesianPose toApiCartesianPose(const device::CartesianPose& src)
|
|||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
api::CartesianVelocity toApiCartesianVelocity(const device::CartesianVelocity& src)
|
||||||
|
{
|
||||||
|
api::CartesianVelocity dst;
|
||||||
|
dst.set_vx(src.vx);
|
||||||
|
dst.set_vy(src.vy);
|
||||||
|
dst.set_vz(src.vz);
|
||||||
|
dst.set_wx(src.wx);
|
||||||
|
dst.set_wy(src.wy);
|
||||||
|
dst.set_wz(src.wz);
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
api::CartesianWrench toApiCartesianWrench(const device::CartesianWrench& src)
|
||||||
|
{
|
||||||
|
api::CartesianWrench dst;
|
||||||
|
dst.set_fx(src.fx);
|
||||||
|
dst.set_fy(src.fy);
|
||||||
|
dst.set_fz(src.fz);
|
||||||
|
dst.set_tx(src.tx);
|
||||||
|
dst.set_ty(src.ty);
|
||||||
|
dst.set_tz(src.tz);
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
api::ArmRobotMode toApiRobotMode(const device::RobotMode mode)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case device::RobotMode::Disconnected:
|
||||||
|
return api::ARM_ROBOT_MODE_DISCONNECTED;
|
||||||
|
case device::RobotMode::PowerOff:
|
||||||
|
return api::ARM_ROBOT_MODE_POWER_OFF;
|
||||||
|
case device::RobotMode::Idle:
|
||||||
|
return api::ARM_ROBOT_MODE_IDLE;
|
||||||
|
case device::RobotMode::Running:
|
||||||
|
return api::ARM_ROBOT_MODE_RUNNING;
|
||||||
|
case device::RobotMode::Paused:
|
||||||
|
return api::ARM_ROBOT_MODE_PAUSED;
|
||||||
|
case device::RobotMode::Stopped:
|
||||||
|
return api::ARM_ROBOT_MODE_STOPPED;
|
||||||
|
case device::RobotMode::Fault:
|
||||||
|
return api::ARM_ROBOT_MODE_FAULT;
|
||||||
|
case device::RobotMode::Unknown:
|
||||||
|
default:
|
||||||
|
return api::ARM_ROBOT_MODE_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api::ArmSafetyMode toApiSafetyMode(const device::SafetyMode mode)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case device::SafetyMode::Normal:
|
||||||
|
return api::ARM_SAFETY_MODE_NORMAL;
|
||||||
|
case device::SafetyMode::Reduced:
|
||||||
|
return api::ARM_SAFETY_MODE_REDUCED;
|
||||||
|
case device::SafetyMode::ProtectiveStop:
|
||||||
|
return api::ARM_SAFETY_MODE_PROTECTIVE_STOP;
|
||||||
|
case device::SafetyMode::EmergencyStop:
|
||||||
|
return api::ARM_SAFETY_MODE_EMERGENCY_STOP;
|
||||||
|
case device::SafetyMode::SafeguardStop:
|
||||||
|
return api::ARM_SAFETY_MODE_SAFEGUARD_STOP;
|
||||||
|
case device::SafetyMode::SystemEmergencyStop:
|
||||||
|
return api::ARM_SAFETY_MODE_SYSTEM_EMERGENCY_STOP;
|
||||||
|
case device::SafetyMode::Fault:
|
||||||
|
return api::ARM_SAFETY_MODE_FAULT;
|
||||||
|
case device::SafetyMode::Unknown:
|
||||||
|
default:
|
||||||
|
return api::ARM_SAFETY_MODE_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api::ArmControlMode toApiControlMode(const device::ControlMode mode)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case device::ControlMode::Manual:
|
||||||
|
return api::ARM_CONTROL_MODE_MANUAL;
|
||||||
|
case device::ControlMode::Position:
|
||||||
|
return api::ARM_CONTROL_MODE_POSITION;
|
||||||
|
case device::ControlMode::Velocity:
|
||||||
|
return api::ARM_CONTROL_MODE_VELOCITY;
|
||||||
|
case device::ControlMode::Torque:
|
||||||
|
return api::ARM_CONTROL_MODE_TORQUE;
|
||||||
|
case device::ControlMode::Servo:
|
||||||
|
return api::ARM_CONTROL_MODE_SERVO;
|
||||||
|
case device::ControlMode::Freedrive:
|
||||||
|
return api::ARM_CONTROL_MODE_FREEDRIVE;
|
||||||
|
case device::ControlMode::None:
|
||||||
|
default:
|
||||||
|
return api::ARM_CONTROL_MODE_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillJointState(const device::RobotModel& model,
|
||||||
|
const device::JointGroupState& state,
|
||||||
|
api::JointState* msg)
|
||||||
|
{
|
||||||
|
for (const auto& name : model.joint_names) msg->add_name(name);
|
||||||
|
for (const double value : state.position) msg->add_position(value);
|
||||||
|
for (const double value : state.velocity) msg->add_velocity(value);
|
||||||
|
for (const double value : state.effort) msg->add_effort(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillRobotState(const device::RobotModel& model,
|
||||||
|
const device::ArmState& state,
|
||||||
|
api::RobotState* msg)
|
||||||
|
{
|
||||||
|
msg->set_timestamp(state.timestamp);
|
||||||
|
msg->set_robot_mode(toApiRobotMode(state.robot_mode));
|
||||||
|
msg->set_safety_mode(toApiSafetyMode(state.safety_mode));
|
||||||
|
msg->set_control_mode(toApiControlMode(state.control_mode));
|
||||||
|
msg->set_connected(state.connected);
|
||||||
|
msg->set_powered_on(state.powered_on);
|
||||||
|
msg->set_brake_released(state.brake_released);
|
||||||
|
msg->set_moving(state.moving);
|
||||||
|
msg->set_program_running(state.program_running);
|
||||||
|
msg->set_protective_stopped(state.protective_stopped);
|
||||||
|
msg->set_emergency_stopped(state.emergency_stopped);
|
||||||
|
msg->set_fault(state.fault);
|
||||||
|
msg->set_speed_scaling(state.speed_scaling);
|
||||||
|
fillJointState(model, state.actual_joint_state, msg->mutable_actual_joint_state());
|
||||||
|
fillJointState(model, state.target_joint_state, msg->mutable_target_joint_state());
|
||||||
|
*msg->mutable_actual_tcp_pose() = toApiCartesianPose(state.actual_tcp_pose);
|
||||||
|
*msg->mutable_actual_tcp_velocity() = toApiCartesianVelocity(state.actual_tcp_velocity);
|
||||||
|
*msg->mutable_actual_tcp_wrench() = toApiCartesianWrench(state.actual_tcp_wrench);
|
||||||
|
}
|
||||||
|
|
||||||
device::CartesianVelocity toCartesianVelocity(const api::CartesianVelocity& src)
|
device::CartesianVelocity toCartesianVelocity(const api::CartesianVelocity& src)
|
||||||
{
|
{
|
||||||
return {src.vx(), src.vy(), src.vz(), src.wx(), src.wy(), src.wz()};
|
return {src.vx(), src.vy(), src.vz(), src.wx(), src.wy(), src.wz()};
|
||||||
@ -327,12 +452,7 @@ grpc::Status gRPCArmServiceImpl::getJointState(grpc::ServerContext*,
|
|||||||
const auto model = arm->getRobotModel();
|
const auto model = arm->getRobotModel();
|
||||||
const auto state = arm->getJointState();
|
const auto state = arm->getJointState();
|
||||||
auto* msg = response->mutable_state();
|
auto* msg = response->mutable_state();
|
||||||
for (const auto& name : model.joint_names) {
|
fillJointState(model, state, msg);
|
||||||
msg->add_name(name);
|
|
||||||
}
|
|
||||||
for (double v : state.position) msg->add_position(v);
|
|
||||||
for (double v : state.velocity) msg->add_velocity(v);
|
|
||||||
for (double v : state.effort) msg->add_effort(v);
|
|
||||||
fillFeedback(response->mutable_header(), true);
|
fillFeedback(response->mutable_header(), true);
|
||||||
// CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (getJointState): success, id=" << device_id
|
// CMVR_LOG(DEBUG) << "[gRPCArmServiceImpl] (getJointState): success, id=" << device_id
|
||||||
// << ", joints=" << msg->name_size()
|
// << ", joints=" << msg->name_size()
|
||||||
@ -344,6 +464,30 @@ grpc::Status gRPCArmServiceImpl::getJointState(grpc::ServerContext*,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grpc::Status gRPCArmServiceImpl::getRobotState(
|
||||||
|
grpc::ServerContext*,
|
||||||
|
const api::GetRobotState_Request* request,
|
||||||
|
api::GetRobotState_Response* response)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
const std::string device_id = request->header().device_id();
|
||||||
|
auto arm = dmgr_.getDevice<device::RobotArm>(device_id);
|
||||||
|
if (!arm) {
|
||||||
|
return setDeviceNotFound(response, device_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto model = arm->getRobotModel();
|
||||||
|
const auto state = arm->getRobotState();
|
||||||
|
fillRobotState(model, state, response->mutable_state());
|
||||||
|
fillFeedback(response->mutable_header(), true);
|
||||||
|
logRpcSuccess("getRobotState", device_id);
|
||||||
|
return grpc::Status::OK;
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
fillFeedback(response->mutable_header(), false, e.what());
|
||||||
|
return grpc::Status(grpc::StatusCode::INTERNAL, e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
grpc::Status gRPCArmServiceImpl::getPose(grpc::ServerContext*,
|
grpc::Status gRPCArmServiceImpl::getPose(grpc::ServerContext*,
|
||||||
const api::GetPose_Request* request,
|
const api::GetPose_Request* request,
|
||||||
api::GetPose_Response* response)
|
api::GetPose_Response* response)
|
||||||
|
|||||||
@ -7,9 +7,11 @@
|
|||||||
#include "../include/grpc_camera_service.h"
|
#include "../include/grpc_camera_service.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cmvr::service;
|
using namespace cmvr::service;
|
||||||
@ -203,7 +205,9 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImage(grpc::ServerContext* context,
|
|||||||
}
|
}
|
||||||
Rs2Intrinsics intrinsics = {0};
|
Rs2Intrinsics intrinsics = {0};
|
||||||
dev->getRGBImage(image,intrinsics);
|
dev->getRGBImage(image,intrinsics);
|
||||||
response->mutable_header()->set_success(true);
|
if (image.empty()) {
|
||||||
|
return failResponse(response, "Camera returned an empty RGB image: " + dev_id);
|
||||||
|
}
|
||||||
|
|
||||||
response->mutable_intrinsics()->set_fx(intrinsics.fx);
|
response->mutable_intrinsics()->set_fx(intrinsics.fx);
|
||||||
response->mutable_intrinsics()->set_fy(intrinsics.fy);
|
response->mutable_intrinsics()->set_fy(intrinsics.fy);
|
||||||
@ -256,6 +260,9 @@ grpc::Status gRPCCameraServiceImpl::GetDepthImage(grpc::ServerContext* context,
|
|||||||
}
|
}
|
||||||
Rs2Intrinsics intrinsics = {0};
|
Rs2Intrinsics intrinsics = {0};
|
||||||
dev->getDepthImage(image,intrinsics);
|
dev->getDepthImage(image,intrinsics);
|
||||||
|
if (image.empty()) {
|
||||||
|
return failResponse(response, "Camera returned an empty depth image: " + dev_id);
|
||||||
|
}
|
||||||
response->mutable_header()->set_success(true);
|
response->mutable_header()->set_success(true);
|
||||||
|
|
||||||
response->mutable_intrinsics()->set_fx(intrinsics.fx);
|
response->mutable_intrinsics()->set_fx(intrinsics.fx);
|
||||||
@ -312,6 +319,12 @@ grpc::Status gRPCCameraServiceImpl::GetRGBDImages(grpc::ServerContext* context,
|
|||||||
}
|
}
|
||||||
Rs2Intrinsics intrinsics = {0};
|
Rs2Intrinsics intrinsics = {0};
|
||||||
dev->getRGBDImages(color_image,depth_image, intrinsics);
|
dev->getRGBDImages(color_image,depth_image, intrinsics);
|
||||||
|
if (color_image.empty()) {
|
||||||
|
return failResponse(response, "Camera returned an empty RGB image: " + dev_id);
|
||||||
|
}
|
||||||
|
if (depth_image.empty()) {
|
||||||
|
return failResponse(response, "Camera returned an empty depth image: " + dev_id);
|
||||||
|
}
|
||||||
response->mutable_header()->set_success(true);
|
response->mutable_header()->set_success(true);
|
||||||
|
|
||||||
response->mutable_intrinsics()->set_fx(intrinsics.fx);
|
response->mutable_intrinsics()->set_fx(intrinsics.fx);
|
||||||
@ -353,6 +366,9 @@ grpc::Status gRPCCameraServiceImpl::GetRGBDImages(grpc::ServerContext* context,
|
|||||||
else if (depth_image.type() == CV_32FC1) {
|
else if (depth_image.type() == CV_32FC1) {
|
||||||
response->mutable_depth_frame()->set_type(api::FrameData::F32C1);
|
response->mutable_depth_frame()->set_type(api::FrameData::F32C1);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
return failResponse(response, "unsupported depth image type");
|
||||||
|
}
|
||||||
response->mutable_depth_frame()->set_data(
|
response->mutable_depth_frame()->set_data(
|
||||||
reinterpret_cast<const char*>(depth_image.data), depth_image.total() * depth_image.elemSize());
|
reinterpret_cast<const char*>(depth_image.data), depth_image.total() * depth_image.elemSize());
|
||||||
response->mutable_depth_frame()->set_height(depth_image.rows);
|
response->mutable_depth_frame()->set_height(depth_image.rows);
|
||||||
@ -667,7 +683,40 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImageStream(grpc::ServerContext* conte
|
|||||||
return grpc::Status::OK;
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::atomic<bool> client_eof_requested{false};
|
||||||
|
std::atomic<bool> request_stream_closed{false};
|
||||||
|
std::atomic<uint64_t> control_requests_read{1};
|
||||||
|
std::thread request_reader([&] {
|
||||||
|
api::GetRGBImageStreamCommand_Request control_request;
|
||||||
|
while (stream->Read(&control_request)) {
|
||||||
|
++control_requests_read;
|
||||||
|
if (control_request.eof()) {
|
||||||
|
client_eof_requested.store(true, std::memory_order_release);
|
||||||
|
CMVR_LOG(INFO) << "[gRPCCameraServiceImpl] client requested RGB stream EOF"
|
||||||
|
<< ", id=" << dev_id
|
||||||
|
<< ", peer=" << context->peer()
|
||||||
|
<< ", control_requests=" << control_requests_read.load();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
request_stream_closed.store(true, std::memory_order_release);
|
||||||
|
});
|
||||||
|
struct RequestReaderJoiner {
|
||||||
|
std::thread& thread;
|
||||||
|
~RequestReaderJoiner() {
|
||||||
|
if (thread.joinable()) {
|
||||||
|
thread.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} request_reader_joiner{request_reader};
|
||||||
|
const auto join_request_reader = [&] {
|
||||||
|
if (request_reader.joinable()) {
|
||||||
|
request_reader.join();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
bool waiting_for_key_frame = true;
|
bool waiting_for_key_frame = true;
|
||||||
|
const char* exit_reason = "unknown";
|
||||||
auto last_key_frame_request = std::chrono::steady_clock::now();
|
auto last_key_frame_request = std::chrono::steady_clock::now();
|
||||||
auto last_latency_log = std::chrono::steady_clock::time_point{};
|
auto last_latency_log = std::chrono::steady_clock::time_point{};
|
||||||
uint64_t discarded_since_log = 0;
|
uint64_t discarded_since_log = 0;
|
||||||
@ -713,15 +762,25 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImageStream(grpc::ServerContext* conte
|
|||||||
};
|
};
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
if (client_eof_requested.load(std::memory_order_acquire)) {
|
||||||
|
exit_reason = "client_eof";
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (context->IsCancelled())
|
if (context->IsCancelled())
|
||||||
{
|
{
|
||||||
CMVR_LOG(INFO) << "[gRPCCameraServiceImpl](GetRGBImageStream) context is cancelled,id=" << dev_id;
|
exit_reason = "context_cancelled";
|
||||||
|
CMVR_LOG(INFO) << "[gRPCCameraServiceImpl](GetRGBImageStream) context is cancelled"
|
||||||
|
<< ", id=" << dev_id
|
||||||
|
<< ", peer=" << context->peer()
|
||||||
|
<< ", client_eof=" << client_eof_requested.load()
|
||||||
|
<< ", request_stream_closed=" << request_stream_closed.load();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto read = subscription.waitRead(std::chrono::milliseconds(100));
|
const auto read = subscription.waitRead(std::chrono::milliseconds(100));
|
||||||
if (!read || !read->value || read->value->empty()) {
|
if (!read || !read->value || read->value->empty()) {
|
||||||
if (!subscription.valid()) {
|
if (!subscription.valid()) {
|
||||||
|
exit_reason = "subscription_invalid";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (waiting_for_key_frame) {
|
if (waiting_for_key_frame) {
|
||||||
@ -765,6 +824,7 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImageStream(grpc::ServerContext* conte
|
|||||||
"Unsupported camera stream codec or payload format: " + dev_id);
|
"Unsupported camera stream codec or payload format: " + dev_id);
|
||||||
setCurrentTimestamp(response.mutable_header()->mutable_timestamp());
|
setCurrentTimestamp(response.mutable_header()->mutable_timestamp());
|
||||||
stream->Write(response);
|
stream->Write(response);
|
||||||
|
exit_reason = "unsupported_stream";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (read->dropped_since_last_read > 0 || read->generation_changed || frame.discontinuity) {
|
if (read->dropped_since_last_read > 0 || read->generation_changed || frame.discontinuity) {
|
||||||
@ -808,7 +868,17 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImageStream(grpc::ServerContext* conte
|
|||||||
|
|
||||||
const auto write_started = std::chrono::steady_clock::now();
|
const auto write_started = std::chrono::steady_clock::now();
|
||||||
if (!stream->Write(response)) {
|
if (!stream->Write(response)) {
|
||||||
CMVR_LOG(INFO) << "[gRPCCameraServiceImpl] (stream->Write) failed,id=" << dev_id;
|
exit_reason = "write_failed";
|
||||||
|
CMVR_LOG(INFO) << "[gRPCCameraServiceImpl] (stream->Write) failed"
|
||||||
|
<< ", id=" << dev_id
|
||||||
|
<< ", peer=" << context->peer()
|
||||||
|
<< ", context_cancelled=" << context->IsCancelled()
|
||||||
|
<< ", client_eof=" << client_eof_requested.load()
|
||||||
|
<< ", request_stream_closed=" << request_stream_closed.load()
|
||||||
|
<< ", control_requests=" << control_requests_read.load()
|
||||||
|
<< ", write_ms="
|
||||||
|
<< std::chrono::duration_cast<std::chrono::microseconds>(
|
||||||
|
std::chrono::steady_clock::now() - write_started).count() / 1000.0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
last_write_duration = std::chrono::duration_cast<std::chrono::microseconds>(
|
last_write_duration = std::chrono::duration_cast<std::chrono::microseconds>(
|
||||||
@ -829,7 +899,15 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImageStream(grpc::ServerContext* conte
|
|||||||
last_write_duration);
|
last_write_duration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CMVR_LOG(INFO) << "[gRPCCameraServiceImpl] (GetRGBImageStream): end,id=" << dev_id;
|
join_request_reader();
|
||||||
|
CMVR_LOG(INFO) << "[gRPCCameraServiceImpl] (GetRGBImageStream): end"
|
||||||
|
<< ", id=" << dev_id
|
||||||
|
<< ", reason=" << exit_reason
|
||||||
|
<< ", peer=" << context->peer()
|
||||||
|
<< ", context_cancelled=" << context->IsCancelled()
|
||||||
|
<< ", client_eof=" << client_eof_requested.load()
|
||||||
|
<< ", request_stream_closed=" << request_stream_closed.load()
|
||||||
|
<< ", control_requests=" << control_requests_read.load();
|
||||||
return grpc::Status::OK;
|
return grpc::Status::OK;
|
||||||
}
|
}
|
||||||
catch (const exception &e) {
|
catch (const exception &e) {
|
||||||
|
|||||||
@ -23,6 +23,27 @@ target_link_libraries(quic_edge_service
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_library(cmvr_es::quic_edge_service ALIAS quic_edge_service)
|
add_library(cmvr_es::quic_edge_service ALIAS quic_edge_service)
|
||||||
|
|
||||||
|
if(BUILD_TESTING)
|
||||||
|
add_executable(quic_edge_protocol_test tests/quic_edge_protocol_test.cpp)
|
||||||
|
target_compile_features(quic_edge_protocol_test PRIVATE cxx_std_17)
|
||||||
|
target_link_libraries(quic_edge_protocol_test PRIVATE
|
||||||
|
cmvr_es::quic_edge_service
|
||||||
|
cmvr_es::media_source_hub
|
||||||
|
Threads::Threads
|
||||||
|
)
|
||||||
|
add_test(NAME quic_edge_protocol_test COMMAND quic_edge_protocol_test)
|
||||||
|
set(_quic_edge_test_environment
|
||||||
|
"LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}")
|
||||||
|
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
||||||
|
list(APPEND _quic_edge_test_environment
|
||||||
|
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
||||||
|
endif()
|
||||||
|
set_tests_properties(quic_edge_protocol_test PROPERTIES
|
||||||
|
TIMEOUT 15
|
||||||
|
ENVIRONMENT "${_quic_edge_test_environment}")
|
||||||
|
endif()
|
||||||
|
|
||||||
install(TARGETS quic_edge_service
|
install(TARGETS quic_edge_service
|
||||||
ARCHIVE DESTINATION lib
|
ARCHIVE DESTINATION lib
|
||||||
LIBRARY DESTINATION lib)
|
LIBRARY DESTINATION lib)
|
||||||
|
|||||||
@ -88,6 +88,10 @@ public:
|
|||||||
|
|
||||||
bool initialize(std::string* error);
|
bool initialize(std::string* error);
|
||||||
bool start(std::string* error);
|
bool start(std::string* error);
|
||||||
|
// Releases the current media subscriptions without stopping the QUIC
|
||||||
|
// transport, node registration, heartbeat loop, or service worker. The
|
||||||
|
// media worker automatically subscribes again when admission permits it.
|
||||||
|
bool interruptMediaActivities();
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
QuicEdgeServiceState state() const;
|
QuicEdgeServiceState state() const;
|
||||||
@ -124,8 +128,10 @@ private:
|
|||||||
bool dispatchControlFrame(const std::vector<std::uint8_t>& frame,
|
bool dispatchControlFrame(const std::vector<std::uint8_t>& frame,
|
||||||
std::string* error);
|
std::string* error);
|
||||||
bool openMediaSession(std::vector<ActiveTrack>* tracks,
|
bool openMediaSession(std::vector<ActiveTrack>* tracks,
|
||||||
|
std::uint64_t activity_generation,
|
||||||
std::string* error);
|
std::string* error);
|
||||||
void refreshMediaTracks(std::vector<ActiveTrack>* tracks);
|
void refreshMediaTracks(std::vector<ActiveTrack>* tracks,
|
||||||
|
std::uint64_t activity_generation);
|
||||||
bool hasEnabledMediaTracks() const;
|
bool hasEnabledMediaTracks() const;
|
||||||
bool ensureSourceRegistered(const config::QuicEdgeTrackConfig& track,
|
bool ensureSourceRegistered(const config::QuicEdgeTrackConfig& track,
|
||||||
const std::string& source_track_id,
|
const std::string& source_track_id,
|
||||||
@ -161,6 +167,7 @@ private:
|
|||||||
mutable std::mutex mutex_;
|
mutable std::mutex mutex_;
|
||||||
std::condition_variable stop_cv_;
|
std::condition_variable stop_cv_;
|
||||||
std::condition_variable media_stop_cv_;
|
std::condition_variable media_stop_cv_;
|
||||||
|
std::condition_variable media_activity_cv_;
|
||||||
QuicEdgeServiceState state_{QuicEdgeServiceState::UNINITIALIZED};
|
QuicEdgeServiceState state_{QuicEdgeServiceState::UNINITIALIZED};
|
||||||
std::string last_error_;
|
std::string last_error_;
|
||||||
std::string last_media_error_;
|
std::string last_media_error_;
|
||||||
@ -174,6 +181,9 @@ private:
|
|||||||
std::size_t active_media_tracks_{0};
|
std::size_t active_media_tracks_{0};
|
||||||
bool stop_requested_{false};
|
bool stop_requested_{false};
|
||||||
bool media_stop_requested_{false};
|
bool media_stop_requested_{false};
|
||||||
|
bool media_worker_running_{false};
|
||||||
|
std::uint64_t media_activity_generation_{1U};
|
||||||
|
std::uint64_t media_activity_quiesced_generation_{1U};
|
||||||
bool media_connection_failed_{false};
|
bool media_connection_failed_{false};
|
||||||
std::string media_connection_error_;
|
std::string media_connection_error_;
|
||||||
std::thread worker_;
|
std::thread worker_;
|
||||||
|
|||||||
@ -24,6 +24,8 @@
|
|||||||
|
|
||||||
#include "cmvr/quic_edge/v1/quic_edge.pb.h"
|
#include "cmvr/quic_edge/v1/quic_edge.pb.h"
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
|
#include "manager/device_manager/include/device_manager.h"
|
||||||
|
#include "manager/media_source_hub/include/device_media_source_adapter.h"
|
||||||
|
|
||||||
namespace cmvr::quic_edge {
|
namespace cmvr::quic_edge {
|
||||||
namespace {
|
namespace {
|
||||||
@ -217,6 +219,7 @@ void populateDescriptor(const config::QuicEdgeConfig& config,
|
|||||||
{
|
{
|
||||||
if (!descriptor) return;
|
if (!descriptor) return;
|
||||||
descriptor->set_node_id(node_id);
|
descriptor->set_node_id(node_id);
|
||||||
|
descriptor->set_robot_id(config.robot_id());
|
||||||
descriptor->set_boot_id(boot_id);
|
descriptor->set_boot_id(boot_id);
|
||||||
descriptor->set_software_version(software_version);
|
descriptor->set_software_version(software_version);
|
||||||
const auto interfaces =
|
const auto interfaces =
|
||||||
@ -442,6 +445,10 @@ bool QuicEdgeService::validateConfig(const config::QuicEdgeConfig& config,
|
|||||||
setError(error, "QUIC edge task id is empty");
|
setError(error, "QUIC edge task id is empty");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (config.robot_id().empty()) {
|
||||||
|
setError(error, "QUIC edge robot_id is empty");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (config.server_host().empty()) {
|
if (config.server_host().empty()) {
|
||||||
setError(error, "QUIC edge server_host is empty");
|
setError(error, "QUIC edge server_host is empty");
|
||||||
return false;
|
return false;
|
||||||
@ -630,6 +637,31 @@ bool QuicEdgeService::start(std::string* error)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QuicEdgeService::interruptMediaActivities()
|
||||||
|
{
|
||||||
|
std::unique_lock lock(mutex_);
|
||||||
|
if (state_ == QuicEdgeServiceState::FAILED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (media_activity_generation_ ==
|
||||||
|
std::numeric_limits<std::uint64_t>::max()) {
|
||||||
|
media_activity_generation_ = 1U;
|
||||||
|
media_activity_quiesced_generation_ = 0U;
|
||||||
|
} else {
|
||||||
|
++media_activity_generation_;
|
||||||
|
}
|
||||||
|
const std::uint64_t requested_generation = media_activity_generation_;
|
||||||
|
media_stop_cv_.notify_all();
|
||||||
|
|
||||||
|
media_activity_cv_.wait(lock, [this, requested_generation] {
|
||||||
|
return !media_worker_running_ || stop_requested_ ||
|
||||||
|
media_activity_quiesced_generation_ >= requested_generation;
|
||||||
|
});
|
||||||
|
return state_ != QuicEdgeServiceState::FAILED &&
|
||||||
|
(!media_worker_running_ ||
|
||||||
|
media_activity_quiesced_generation_ >= requested_generation);
|
||||||
|
}
|
||||||
|
|
||||||
void QuicEdgeService::stop()
|
void QuicEdgeService::stop()
|
||||||
{
|
{
|
||||||
std::lock_guard lifecycle_lock(lifecycle_mutex_);
|
std::lock_guard lifecycle_lock(lifecycle_mutex_);
|
||||||
@ -926,10 +958,18 @@ bool QuicEdgeService::startMediaWorker(std::string* error)
|
|||||||
media_connection_failed_ = false;
|
media_connection_failed_ = false;
|
||||||
media_connection_error_.clear();
|
media_connection_error_.clear();
|
||||||
active_media_tracks_ = 0U;
|
active_media_tracks_ = 0U;
|
||||||
|
media_worker_running_ = true;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
media_worker_ = std::thread(&QuicEdgeService::runMedia, this);
|
media_worker_ = std::thread(&QuicEdgeService::runMedia, this);
|
||||||
} catch (const std::exception& exception) {
|
} catch (const std::exception& exception) {
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex_);
|
||||||
|
media_worker_running_ = false;
|
||||||
|
media_activity_quiesced_generation_ =
|
||||||
|
media_activity_generation_;
|
||||||
|
}
|
||||||
|
media_activity_cv_.notify_all();
|
||||||
const std::string message =
|
const std::string message =
|
||||||
std::string("failed to start QUIC media worker: ") + exception.what();
|
std::string("failed to start QUIC media worker: ") + exception.what();
|
||||||
recordMediaConnectionFailure(message);
|
recordMediaConnectionFailure(message);
|
||||||
@ -947,8 +987,13 @@ void QuicEdgeService::stopMediaWorker()
|
|||||||
}
|
}
|
||||||
media_stop_cv_.notify_all();
|
media_stop_cv_.notify_all();
|
||||||
if (media_worker_.joinable()) media_worker_.join();
|
if (media_worker_.joinable()) media_worker_.join();
|
||||||
|
{
|
||||||
std::lock_guard lock(mutex_);
|
std::lock_guard lock(mutex_);
|
||||||
active_media_tracks_ = 0U;
|
active_media_tracks_ = 0U;
|
||||||
|
media_worker_running_ = false;
|
||||||
|
media_activity_quiesced_generation_ = media_activity_generation_;
|
||||||
|
}
|
||||||
|
media_activity_cv_.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuicEdgeService::recordMediaConnectionFailure(const std::string& error)
|
void QuicEdgeService::recordMediaConnectionFailure(const std::string& error)
|
||||||
@ -969,12 +1014,36 @@ void QuicEdgeService::recordMediaConnectionFailure(const std::string& error)
|
|||||||
void QuicEdgeService::runMedia()
|
void QuicEdgeService::runMedia()
|
||||||
{
|
{
|
||||||
std::vector<ActiveTrack> tracks;
|
std::vector<ActiveTrack> tracks;
|
||||||
|
std::uint64_t activity_generation = 0U;
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex_);
|
||||||
|
activity_generation = media_activity_generation_;
|
||||||
|
media_activity_quiesced_generation_ = activity_generation;
|
||||||
|
}
|
||||||
|
media_activity_cv_.notify_all();
|
||||||
try {
|
try {
|
||||||
next_media_source_retry_ = std::chrono::steady_clock::now();
|
next_media_source_retry_ = std::chrono::steady_clock::now();
|
||||||
while (true) {
|
while (true) {
|
||||||
|
std::uint64_t requested_generation = 0U;
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex_);
|
std::lock_guard lock(mutex_);
|
||||||
if (stop_requested_ || media_stop_requested_) break;
|
if (stop_requested_ || media_stop_requested_) break;
|
||||||
|
requested_generation = media_activity_generation_;
|
||||||
|
}
|
||||||
|
if (requested_generation != activity_generation) {
|
||||||
|
// Clearing the tracks is the publication barrier for this
|
||||||
|
// generation: subscriptions are released before StopAll is
|
||||||
|
// told that old QUIC media activity has quiesced.
|
||||||
|
tracks.clear();
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex_);
|
||||||
|
active_media_tracks_ = 0U;
|
||||||
|
activity_generation = requested_generation;
|
||||||
|
media_activity_quiesced_generation_ =
|
||||||
|
requested_generation;
|
||||||
|
}
|
||||||
|
media_activity_cv_.notify_all();
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (!transport_->isConnected()) break;
|
if (!transport_->isConnected()) break;
|
||||||
|
|
||||||
@ -987,7 +1056,8 @@ void QuicEdgeService::runMedia()
|
|||||||
return !track.subscription.valid();
|
return !track.subscription.valid();
|
||||||
}),
|
}),
|
||||||
tracks.end());
|
tracks.end());
|
||||||
if (!openMediaSession(&tracks, &error)) {
|
if (!openMediaSession(
|
||||||
|
&tracks, activity_generation, &error)) {
|
||||||
recordMediaConnectionFailure(error);
|
recordMediaConnectionFailure(error);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1034,8 +1104,13 @@ void QuicEdgeService::runMedia()
|
|||||||
recordMediaConnectionFailure("unknown QUIC media worker exception");
|
recordMediaConnectionFailure("unknown QUIC media worker exception");
|
||||||
}
|
}
|
||||||
tracks.clear();
|
tracks.clear();
|
||||||
|
{
|
||||||
std::lock_guard lock(mutex_);
|
std::lock_guard lock(mutex_);
|
||||||
active_media_tracks_ = 0U;
|
active_media_tracks_ = 0U;
|
||||||
|
media_worker_running_ = false;
|
||||||
|
media_activity_quiesced_generation_ = media_activity_generation_;
|
||||||
|
}
|
||||||
|
media_activity_cv_.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QuicEdgeService::performRegistration(ControlFrameDecoder* decoder,
|
bool QuicEdgeService::performRegistration(ControlFrameDecoder* decoder,
|
||||||
@ -1097,6 +1172,7 @@ bool QuicEdgeService::sendNodeRegistration(std::string* error)
|
|||||||
<< ", message_sequence=" << envelope.message_sequence()
|
<< ", message_sequence=" << envelope.message_sequence()
|
||||||
<< ", payload_bytes=" << serialized.size()
|
<< ", payload_bytes=" << serialized.size()
|
||||||
<< ", node_id=" << node.node_id()
|
<< ", node_id=" << node.node_id()
|
||||||
|
<< ", robot_id=" << node.robot_id()
|
||||||
<< ", boot_id=" << node.boot_id()
|
<< ", boot_id=" << node.boot_id()
|
||||||
<< ", grpc_endpoint=" << node.grpc_endpoint().host()
|
<< ", grpc_endpoint=" << node.grpc_endpoint().host()
|
||||||
<< ':' << node.grpc_endpoint().port()
|
<< ':' << node.grpc_endpoint().port()
|
||||||
@ -1145,6 +1221,7 @@ bool QuicEdgeService::sendHeartbeat(const std::uint64_t sequence,
|
|||||||
envelope.set_message_sequence(control_message_sequence_++);
|
envelope.set_message_sequence(control_message_sequence_++);
|
||||||
auto* heartbeat = envelope.mutable_node_heartbeat();
|
auto* heartbeat = envelope.mutable_node_heartbeat();
|
||||||
heartbeat->set_node_id(node_id_);
|
heartbeat->set_node_id(node_id_);
|
||||||
|
heartbeat->set_robot_id(config_.robot_id());
|
||||||
heartbeat->set_boot_id(boot_id_);
|
heartbeat->set_boot_id(boot_id_);
|
||||||
heartbeat->set_session_id(session_id);
|
heartbeat->set_session_id(session_id);
|
||||||
heartbeat->set_sequence(sequence);
|
heartbeat->set_sequence(sequence);
|
||||||
@ -1163,16 +1240,17 @@ bool QuicEdgeService::sendHeartbeat(const std::uint64_t sequence,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!sendControlEnvelope(serialized, error)) return false;
|
if (!sendControlEnvelope(serialized, error)) return false;
|
||||||
// CMVR_LOG(INFO) << "[QuicEdgeService] sent NodeHeartbeat"
|
CMVR_LOG(INFO) << "[QuicEdgeService] sent NodeHeartbeat"
|
||||||
// << ", message_sequence=" << envelope.message_sequence()
|
<< ", message_sequence=" << envelope.message_sequence()
|
||||||
// << ", payload_bytes=" << serialized.size()
|
<< ", payload_bytes=" << serialized.size()
|
||||||
// << ", session=" << session_id
|
<< ", robot_id=" << heartbeat->robot_id()
|
||||||
// << ", heartbeat_sequence=" << sequence
|
<< ", session=" << session_id
|
||||||
// << ", grpc_endpoint=" << heartbeat->grpc_endpoint().host()
|
<< ", heartbeat_sequence=" << sequence
|
||||||
// << ':' << heartbeat->grpc_endpoint().port()
|
<< ", grpc_endpoint=" << heartbeat->grpc_endpoint().host()
|
||||||
// << ", interfaces=" << heartbeat->local_interfaces_size()
|
<< ':' << heartbeat->grpc_endpoint().port()
|
||||||
// << ", devices=" << heartbeat->device_manager().devices_size()
|
<< ", interfaces=" << heartbeat->local_interfaces_size()
|
||||||
// << ", sent_at_unix_ms=" << sent_at_unix_ms;
|
<< ", devices=" << heartbeat->device_manager().devices_size()
|
||||||
|
<< ", sent_at_unix_ms=" << sent_at_unix_ms;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1318,7 +1396,9 @@ bool QuicEdgeService::dispatchControlFrame(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QuicEdgeService::openMediaSession(std::vector<ActiveTrack>* tracks,
|
bool QuicEdgeService::openMediaSession(
|
||||||
|
std::vector<ActiveTrack>* tracks,
|
||||||
|
const std::uint64_t activity_generation,
|
||||||
std::string* error)
|
std::string* error)
|
||||||
{
|
{
|
||||||
if (!tracks) {
|
if (!tracks) {
|
||||||
@ -1343,11 +1423,13 @@ bool QuicEdgeService::openMediaSession(std::vector<ActiveTrack>* tracks,
|
|||||||
++stats_.media_sessions_opened;
|
++stats_.media_sessions_opened;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
refreshMediaTracks(tracks);
|
refreshMediaTracks(tracks, activity_generation);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuicEdgeService::refreshMediaTracks(std::vector<ActiveTrack>* tracks)
|
void QuicEdgeService::refreshMediaTracks(
|
||||||
|
std::vector<ActiveTrack>* tracks,
|
||||||
|
const std::uint64_t activity_generation)
|
||||||
{
|
{
|
||||||
if (!tracks) return;
|
if (!tracks) return;
|
||||||
for (const auto& track_config : config_.tracks()) {
|
for (const auto& track_config : config_.tracks()) {
|
||||||
@ -1371,9 +1453,10 @@ void QuicEdgeService::refreshMediaTracks(std::vector<ActiveTrack>* tracks)
|
|||||||
track.subscription = media_hub_->subscribe(
|
track.subscription = media_hub_->subscribe(
|
||||||
track.source_track_id,
|
track.source_track_id,
|
||||||
media::MediaSourceHub::StartPosition::LATEST_AVAILABLE,
|
media::MediaSourceHub::StartPosition::LATEST_AVAILABLE,
|
||||||
[this] {
|
[this, activity_generation] {
|
||||||
std::lock_guard lock(mutex_);
|
std::lock_guard lock(mutex_);
|
||||||
return stop_requested_ || media_stop_requested_;
|
return stop_requested_ || media_stop_requested_ ||
|
||||||
|
media_activity_generation_ != activity_generation;
|
||||||
});
|
});
|
||||||
if (!track.subscription.valid()) {
|
if (!track.subscription.valid()) {
|
||||||
recordMediaError(
|
recordMediaError(
|
||||||
|
|||||||
@ -105,6 +105,7 @@ public:
|
|||||||
if (envelope.has_node_register_request()) {
|
if (envelope.has_node_register_request()) {
|
||||||
const auto& request = envelope.node_register_request();
|
const auto& request = envelope.node_register_request();
|
||||||
last_registered_node_id_ = request.node().node_id();
|
last_registered_node_id_ = request.node().node_id();
|
||||||
|
last_registered_robot_id_ = request.node().robot_id();
|
||||||
last_grpc_endpoint_port_ = request.node().grpc_endpoint().port();
|
last_grpc_endpoint_port_ = request.node().grpc_endpoint().port();
|
||||||
last_interface_count_ = request.node().local_interfaces_size();
|
last_interface_count_ = request.node().local_interfaces_size();
|
||||||
cmvr::quic_edge::v1::EdgeControlEnvelope response;
|
cmvr::quic_edge::v1::EdgeControlEnvelope response;
|
||||||
@ -253,6 +254,12 @@ public:
|
|||||||
return last_registered_node_id_;
|
return last_registered_node_id_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string lastRegisteredRobotId() const
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex_);
|
||||||
|
return last_registered_robot_id_;
|
||||||
|
}
|
||||||
|
|
||||||
std::uint32_t lastGrpcEndpointPort() const
|
std::uint32_t lastGrpcEndpointPort() const
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex_);
|
std::lock_guard lock(mutex_);
|
||||||
@ -335,6 +342,7 @@ private:
|
|||||||
std::uint32_t heartbeat_ack_delay_ms_{0U};
|
std::uint32_t heartbeat_ack_delay_ms_{0U};
|
||||||
std::uint64_t server_message_sequence_{0};
|
std::uint64_t server_message_sequence_{0};
|
||||||
std::string last_registered_node_id_;
|
std::string last_registered_node_id_;
|
||||||
|
std::string last_registered_robot_id_;
|
||||||
std::uint32_t last_grpc_endpoint_port_{0};
|
std::uint32_t last_grpc_endpoint_port_{0};
|
||||||
int last_interface_count_{0};
|
int last_interface_count_{0};
|
||||||
std::vector<std::vector<std::uint8_t>> controls_;
|
std::vector<std::vector<std::uint8_t>> controls_;
|
||||||
@ -359,6 +367,7 @@ config::QuicEdgeConfig validConfig(const std::string& source_track_id)
|
|||||||
config.set_server_port(4433);
|
config.set_server_port(4433);
|
||||||
config.set_alpn("cmvr-quic-edge/1");
|
config.set_alpn("cmvr-quic-edge/1");
|
||||||
config.set_node_id("test-node");
|
config.set_node_id("test-node");
|
||||||
|
config.set_robot_id("CN-CMVR-MBLRV1-CHAGAN-20260731-001");
|
||||||
config.set_software_version("test-version");
|
config.set_software_version("test-version");
|
||||||
config.set_grpc_endpoint_host("auto");
|
config.set_grpc_endpoint_host("auto");
|
||||||
config.set_grpc_endpoint_port(50052U);
|
config.set_grpc_endpoint_port(50052U);
|
||||||
@ -473,14 +482,14 @@ bool testPacketizer()
|
|||||||
bool testServiceWithSharedHub()
|
bool testServiceWithSharedHub()
|
||||||
{
|
{
|
||||||
const std::string track_id = "camera-test/video/color";
|
const std::string track_id = "camera-test/video/color";
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
media::MediaSourceHub::FrameSink sink;
|
media::MediaSourceManager::FrameSink sink;
|
||||||
std::mutex sink_mutex;
|
std::mutex sink_mutex;
|
||||||
std::atomic<bool> source_started{false};
|
std::atomic<bool> source_started{false};
|
||||||
std::atomic<std::uint64_t> keyframe_requests{0};
|
std::atomic<std::uint64_t> keyframe_requests{0};
|
||||||
media::MediaSourceHub::SourceCallbacks callbacks;
|
media::MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [&](const media::MediaSourceHub::FrameSink& value,
|
callbacks.start = [&](const media::MediaSourceManager::FrameSink& value,
|
||||||
const media::MediaSourceHub::CancelPredicate&) {
|
const media::MediaSourceManager::CancelPredicate&) {
|
||||||
std::lock_guard lock(sink_mutex);
|
std::lock_guard lock(sink_mutex);
|
||||||
sink = value;
|
sink = value;
|
||||||
source_started.store(true);
|
source_started.store(true);
|
||||||
@ -507,6 +516,8 @@ bool testServiceWithSharedHub()
|
|||||||
service.stats().heartbeats_acknowledged >= 1U;
|
service.stats().heartbeats_acknowledged >= 1U;
|
||||||
}));
|
}));
|
||||||
CHECK_TRUE(transport_view->lastRegisteredNodeId() == "test-node");
|
CHECK_TRUE(transport_view->lastRegisteredNodeId() == "test-node");
|
||||||
|
CHECK_TRUE(transport_view->lastRegisteredRobotId() ==
|
||||||
|
"CN-CMVR-MBLRV1-CHAGAN-20260731-001");
|
||||||
CHECK_TRUE(transport_view->lastGrpcEndpointPort() == 50052U);
|
CHECK_TRUE(transport_view->lastGrpcEndpointPort() == 50052U);
|
||||||
CHECK_TRUE(transport_view->connectCount() == 1U);
|
CHECK_TRUE(transport_view->connectCount() == 1U);
|
||||||
|
|
||||||
@ -516,7 +527,7 @@ bool testServiceWithSharedHub()
|
|||||||
frame_config.sequence = 1;
|
frame_config.sequence = 1;
|
||||||
frame_config.capture_time_ns = 1000000;
|
frame_config.capture_time_ns = 1000000;
|
||||||
frame_config.key_frame = true;
|
frame_config.key_frame = true;
|
||||||
media::MediaSourceHub::FrameSink publisher;
|
media::MediaSourceManager::FrameSink publisher;
|
||||||
{
|
{
|
||||||
std::lock_guard lock(sink_mutex);
|
std::lock_guard lock(sink_mutex);
|
||||||
publisher = sink;
|
publisher = sink;
|
||||||
@ -565,9 +576,150 @@ bool testServiceWithSharedHub()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool testMediaActivityInterruptPreservesPresenceAndResumes()
|
||||||
|
{
|
||||||
|
const std::string track_id = "camera-stop-all/video/color";
|
||||||
|
media::MediaSourceHub hub;
|
||||||
|
media::MediaSourceManager::FrameSink sink;
|
||||||
|
std::mutex sink_mutex;
|
||||||
|
std::atomic<bool> source_started{false};
|
||||||
|
std::atomic<std::uint64_t> source_starts{0U};
|
||||||
|
std::atomic<std::uint64_t> source_stops{0U};
|
||||||
|
media::MediaSourceManager::SourceCallbacks callbacks;
|
||||||
|
callbacks.start = [&](const media::MediaSourceManager::FrameSink& value,
|
||||||
|
const media::MediaSourceManager::CancelPredicate&) {
|
||||||
|
{
|
||||||
|
std::lock_guard lock(sink_mutex);
|
||||||
|
sink = value;
|
||||||
|
}
|
||||||
|
source_started.store(true);
|
||||||
|
++source_starts;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
callbacks.stop = [&]() {
|
||||||
|
source_started.store(false);
|
||||||
|
++source_stops;
|
||||||
|
};
|
||||||
|
callbacks.request_key_frame = [] { return true; };
|
||||||
|
const auto descriptor = videoDescriptor(track_id);
|
||||||
|
CHECK_TRUE(hub.registerSource(descriptor, std::move(callbacks), 8U));
|
||||||
|
|
||||||
|
auto transport = std::make_unique<FakeTransport>();
|
||||||
|
FakeTransport* transport_view = transport.get();
|
||||||
|
quic_edge::QuicEdgeService edge_service(
|
||||||
|
validConfig(track_id), std::move(transport), hub);
|
||||||
|
std::string error;
|
||||||
|
CHECK_TRUE(edge_service.initialize(&error));
|
||||||
|
CHECK_TRUE(edge_service.start(&error));
|
||||||
|
CHECK_TRUE(waitUntil([&] {
|
||||||
|
return edge_service.state() == quic_edge::QuicEdgeServiceState::ONLINE &&
|
||||||
|
edge_service.status().registered && source_started.load() &&
|
||||||
|
hub.subscriberCount(track_id) == 1U;
|
||||||
|
}));
|
||||||
|
|
||||||
|
auto publish = [&](const std::uint64_t sequence) {
|
||||||
|
media::MediaSourceManager::FrameSink publisher;
|
||||||
|
{
|
||||||
|
std::lock_guard lock(sink_mutex);
|
||||||
|
publisher = sink;
|
||||||
|
}
|
||||||
|
if (!publisher) return false;
|
||||||
|
media::MediaFrame::Config frame;
|
||||||
|
frame.descriptor = descriptor;
|
||||||
|
frame.payload.resize(256U, 0x5aU);
|
||||||
|
frame.sequence = sequence;
|
||||||
|
frame.capture_time_ns = sequence * 1000000U;
|
||||||
|
frame.key_frame = true;
|
||||||
|
publisher(media::makeMediaFrame(std::move(frame)));
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
CHECK_TRUE(publish(1U));
|
||||||
|
CHECK_TRUE(waitUntil([&] {
|
||||||
|
return transport_view->datagramBatchCount() == 1U;
|
||||||
|
}));
|
||||||
|
const auto heartbeat_before_stop = transport_view->heartbeatCount();
|
||||||
|
|
||||||
|
CHECK_TRUE(edge_service.interruptMediaActivities());
|
||||||
|
CHECK_TRUE(hub.subscriberCount(track_id) == 0U);
|
||||||
|
CHECK_TRUE(!source_started.load());
|
||||||
|
CHECK_TRUE(source_stops.load() == 1U);
|
||||||
|
CHECK_TRUE(edge_service.state() == quic_edge::QuicEdgeServiceState::ONLINE);
|
||||||
|
CHECK_TRUE(edge_service.status().registered);
|
||||||
|
CHECK_TRUE(transport_view->connectCount() == 1U);
|
||||||
|
|
||||||
|
// A publisher retained by the stopped generation must no longer enqueue
|
||||||
|
// frames while StopAll admission is closed.
|
||||||
|
CHECK_TRUE(publish(2U));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(30));
|
||||||
|
CHECK_TRUE(transport_view->datagramBatchCount() == 1U);
|
||||||
|
CHECK_TRUE(waitUntil([&] {
|
||||||
|
return source_starts.load() == 2U && source_started.load() &&
|
||||||
|
hub.subscriberCount(track_id) == 1U;
|
||||||
|
}));
|
||||||
|
CHECK_TRUE(publish(3U));
|
||||||
|
CHECK_TRUE(waitUntil([&] {
|
||||||
|
return transport_view->datagramBatchCount() == 2U;
|
||||||
|
}));
|
||||||
|
CHECK_TRUE(waitUntil([&] {
|
||||||
|
return transport_view->heartbeatCount() > heartbeat_before_stop;
|
||||||
|
}));
|
||||||
|
CHECK_TRUE(edge_service.stats().registrations_accepted == 1U);
|
||||||
|
CHECK_TRUE(transport_view->connectCount() == 1U);
|
||||||
|
CHECK_TRUE(edge_service.state() == quic_edge::QuicEdgeServiceState::ONLINE);
|
||||||
|
edge_service.stop();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool testMediaActivityInterruptCancelsStartingSubscription()
|
||||||
|
{
|
||||||
|
const std::string track_id = "slow-stop-all/video/color";
|
||||||
|
media::MediaSourceHub hub;
|
||||||
|
std::atomic<bool> start_entered{false};
|
||||||
|
std::atomic<bool> start_cancelled{false};
|
||||||
|
media::MediaSourceManager::SourceCallbacks callbacks;
|
||||||
|
callbacks.start = [&](const media::MediaSourceManager::FrameSink&,
|
||||||
|
const media::MediaSourceManager::CancelPredicate& cancelled) {
|
||||||
|
start_entered.store(true);
|
||||||
|
while (!cancelled()) {
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(2));
|
||||||
|
}
|
||||||
|
start_cancelled.store(true);
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
callbacks.stop = [] {};
|
||||||
|
CHECK_TRUE(hub.registerSource(
|
||||||
|
videoDescriptor(track_id), std::move(callbacks), 8U));
|
||||||
|
|
||||||
|
auto transport = std::make_unique<FakeTransport>();
|
||||||
|
FakeTransport* transport_view = transport.get();
|
||||||
|
quic_edge::QuicEdgeService edge_service(
|
||||||
|
validConfig(track_id), std::move(transport), hub);
|
||||||
|
std::string error;
|
||||||
|
CHECK_TRUE(edge_service.initialize(&error));
|
||||||
|
CHECK_TRUE(edge_service.start(&error));
|
||||||
|
CHECK_TRUE(waitUntil([&] {
|
||||||
|
return start_entered.load() && edge_service.status().registered;
|
||||||
|
}));
|
||||||
|
|
||||||
|
auto interrupt = std::async(std::launch::async, [&edge_service] {
|
||||||
|
return edge_service.interruptMediaActivities();
|
||||||
|
});
|
||||||
|
CHECK_TRUE(interrupt.wait_for(std::chrono::milliseconds(500)) ==
|
||||||
|
std::future_status::ready);
|
||||||
|
CHECK_TRUE(interrupt.get());
|
||||||
|
CHECK_TRUE(start_cancelled.load());
|
||||||
|
CHECK_TRUE(hub.subscriberCount(track_id) == 0U);
|
||||||
|
CHECK_TRUE(edge_service.state() == quic_edge::QuicEdgeServiceState::ONLINE);
|
||||||
|
CHECK_TRUE(edge_service.status().registered);
|
||||||
|
CHECK_TRUE(transport_view->connectCount() == 1U);
|
||||||
|
edge_service.stop();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool testMissingInjectedSourceRetriesSafely()
|
bool testMissingInjectedSourceRetriesSafely()
|
||||||
{
|
{
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>();
|
auto transport = std::make_unique<FakeTransport>();
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
quic_edge::QuicEdgeService service(
|
quic_edge::QuicEdgeService service(
|
||||||
@ -586,7 +738,7 @@ bool testMissingInjectedSourceRetriesSafely()
|
|||||||
|
|
||||||
bool testPresenceOnlyWithoutMedia()
|
bool testPresenceOnlyWithoutMedia()
|
||||||
{
|
{
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>();
|
auto transport = std::make_unique<FakeTransport>();
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
quic_edge::QuicEdgeService service(
|
quic_edge::QuicEdgeService service(
|
||||||
@ -630,7 +782,7 @@ bool testDeviceManagerSnapshotInHeartbeat()
|
|||||||
device::ManagedDeviceSnapshot running;
|
device::ManagedDeviceSnapshot running;
|
||||||
running.id = "src1100";
|
running.id = "src1100";
|
||||||
running.kind = device::DeviceKind::AGV;
|
running.kind = device::DeviceKind::AGV;
|
||||||
running.type_name = "Src1100Agv";
|
running.type_name = "SeerRobokitAgv";
|
||||||
running.enabled = true;
|
running.enabled = true;
|
||||||
running.state = device::ManagedDeviceState::Running;
|
running.state = device::ManagedDeviceState::Running;
|
||||||
running.health.state = device::DeviceHealthState::Healthy;
|
running.health.state = device::DeviceHealthState::Healthy;
|
||||||
@ -649,7 +801,7 @@ bool testDeviceManagerSnapshotInHeartbeat()
|
|||||||
failed.status_updated_at_unix_ms = 303U;
|
failed.status_updated_at_unix_ms = 303U;
|
||||||
snapshot.devices.push_back(failed);
|
snapshot.devices.push_back(failed);
|
||||||
|
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>();
|
auto transport = std::make_unique<FakeTransport>();
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
quic_edge::QuicEdgeService service(
|
quic_edge::QuicEdgeService service(
|
||||||
@ -664,6 +816,8 @@ bool testDeviceManagerSnapshotInHeartbeat()
|
|||||||
const auto heartbeat = transport_view->lastHeartbeat();
|
const auto heartbeat = transport_view->lastHeartbeat();
|
||||||
service.stop();
|
service.stop();
|
||||||
|
|
||||||
|
CHECK_TRUE(heartbeat.robot_id() ==
|
||||||
|
"CN-CMVR-MBLRV1-CHAGAN-20260731-001");
|
||||||
CHECK_TRUE(heartbeat.has_device_manager());
|
CHECK_TRUE(heartbeat.has_device_manager());
|
||||||
CHECK_TRUE(heartbeat.device_manager().manager_name() ==
|
CHECK_TRUE(heartbeat.device_manager().manager_name() ==
|
||||||
"edge-device-manager");
|
"edge-device-manager");
|
||||||
@ -781,7 +935,7 @@ bool testAllDeviceKindAndStateMappings()
|
|||||||
snapshot.devices.push_back(std::move(row));
|
snapshot.devices.push_back(std::move(row));
|
||||||
}
|
}
|
||||||
|
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>();
|
auto transport = std::make_unique<FakeTransport>();
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
quic_edge::QuicEdgeService service(
|
quic_edge::QuicEdgeService service(
|
||||||
@ -812,7 +966,7 @@ bool testAllDeviceKindAndStateMappings()
|
|||||||
|
|
||||||
bool testConfiguredHeartbeatIntervalWithoutGatewayOverride()
|
bool testConfiguredHeartbeatIntervalWithoutGatewayOverride()
|
||||||
{
|
{
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>(
|
auto transport = std::make_unique<FakeTransport>(
|
||||||
true, true, true, 0U, 0U);
|
true, true, true, 0U, 0U);
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
@ -839,7 +993,7 @@ bool testConfiguredHeartbeatIntervalWithoutGatewayOverride()
|
|||||||
|
|
||||||
bool testSnapshotLatencyDoesNotConsumeAckDeadline()
|
bool testSnapshotLatencyDoesNotConsumeAckDeadline()
|
||||||
{
|
{
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>(
|
auto transport = std::make_unique<FakeTransport>(
|
||||||
true, true, true, 0U, 250U, 70U);
|
true, true, true, 0U, 250U, 70U);
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
@ -864,7 +1018,7 @@ bool testSnapshotLatencyDoesNotConsumeAckDeadline()
|
|||||||
|
|
||||||
bool testHeartbeatTimeoutReconnectsWithoutTaskFailure()
|
bool testHeartbeatTimeoutReconnectsWithoutTaskFailure()
|
||||||
{
|
{
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>(true, false);
|
auto transport = std::make_unique<FakeTransport>(true, false);
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
auto config = validPresenceOnlyConfig();
|
auto config = validPresenceOnlyConfig();
|
||||||
@ -884,7 +1038,7 @@ bool testHeartbeatTimeoutReconnectsWithoutTaskFailure()
|
|||||||
|
|
||||||
bool testRegistrationRejectionBacksOff()
|
bool testRegistrationRejectionBacksOff()
|
||||||
{
|
{
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>(false, true);
|
auto transport = std::make_unique<FakeTransport>(false, true);
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
auto config = validPresenceOnlyConfig();
|
auto config = validPresenceOnlyConfig();
|
||||||
@ -912,7 +1066,7 @@ bool testRegistrationRejectionBacksOff()
|
|||||||
|
|
||||||
bool testHeartbeatAckRequiresSessionId()
|
bool testHeartbeatAckRequiresSessionId()
|
||||||
{
|
{
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
auto transport = std::make_unique<FakeTransport>(true, true, false);
|
auto transport = std::make_unique<FakeTransport>(true, true, false);
|
||||||
FakeTransport* transport_view = transport.get();
|
FakeTransport* transport_view = transport.get();
|
||||||
quic_edge::QuicEdgeService service(
|
quic_edge::QuicEdgeService service(
|
||||||
@ -933,13 +1087,13 @@ bool testHeartbeatAckRequiresSessionId()
|
|||||||
bool testSlowMediaStartDoesNotBlockHeartbeat()
|
bool testSlowMediaStartDoesNotBlockHeartbeat()
|
||||||
{
|
{
|
||||||
const std::string track_id = "slow-camera/video/color";
|
const std::string track_id = "slow-camera/video/color";
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
std::atomic<bool> start_entered{false};
|
std::atomic<bool> start_entered{false};
|
||||||
std::atomic<bool> start_exited{false};
|
std::atomic<bool> start_exited{false};
|
||||||
std::atomic<bool> release_start{false};
|
std::atomic<bool> release_start{false};
|
||||||
media::MediaSourceHub::SourceCallbacks callbacks;
|
media::MediaSourceManager::SourceCallbacks callbacks;
|
||||||
callbacks.start = [&](const media::MediaSourceHub::FrameSink&,
|
callbacks.start = [&](const media::MediaSourceManager::FrameSink&,
|
||||||
const media::MediaSourceHub::CancelPredicate& cancelled) {
|
const media::MediaSourceManager::CancelPredicate& cancelled) {
|
||||||
start_entered.store(true);
|
start_entered.store(true);
|
||||||
while (!release_start.load() && !cancelled()) {
|
while (!release_start.load() && !cancelled()) {
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(2));
|
std::this_thread::sleep_for(std::chrono::milliseconds(2));
|
||||||
@ -986,7 +1140,7 @@ bool testSlowMediaStartDoesNotBlockHeartbeat()
|
|||||||
|
|
||||||
bool testLifecycleStateGuards()
|
bool testLifecycleStateGuards()
|
||||||
{
|
{
|
||||||
media::MediaSourceHub hub;
|
media::MediaSourceManager hub;
|
||||||
{
|
{
|
||||||
auto transport = std::make_unique<FakeTransport>();
|
auto transport = std::make_unique<FakeTransport>();
|
||||||
quic_edge::QuicEdgeService service(
|
quic_edge::QuicEdgeService service(
|
||||||
@ -1016,12 +1170,29 @@ bool testLifecycleStateGuards()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool testRobotIdIsRequired()
|
||||||
|
{
|
||||||
|
media::MediaSourceManager hub;
|
||||||
|
auto config = validPresenceOnlyConfig();
|
||||||
|
config.clear_robot_id();
|
||||||
|
auto transport = std::make_unique<FakeTransport>();
|
||||||
|
quic_edge::QuicEdgeService service(
|
||||||
|
std::move(config), std::move(transport), hub);
|
||||||
|
std::string error;
|
||||||
|
CHECK_TRUE(!service.initialize(&error));
|
||||||
|
CHECK_TRUE(error.find("robot_id") != std::string::npos);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
if (!testControlFraming() || !testPacketizer() ||
|
if (!testControlFraming() || !testPacketizer() ||
|
||||||
!testServiceWithSharedHub() || !testMissingInjectedSourceRetriesSafely() ||
|
!testServiceWithSharedHub() ||
|
||||||
|
!testMediaActivityInterruptPreservesPresenceAndResumes() ||
|
||||||
|
!testMediaActivityInterruptCancelsStartingSubscription() ||
|
||||||
|
!testMissingInjectedSourceRetriesSafely() ||
|
||||||
!testPresenceOnlyWithoutMedia() ||
|
!testPresenceOnlyWithoutMedia() ||
|
||||||
!testDeviceManagerSnapshotInHeartbeat() ||
|
!testDeviceManagerSnapshotInHeartbeat() ||
|
||||||
!testAllDeviceKindAndStateMappings() ||
|
!testAllDeviceKindAndStateMappings() ||
|
||||||
@ -1031,7 +1202,7 @@ int main()
|
|||||||
!testRegistrationRejectionBacksOff() ||
|
!testRegistrationRejectionBacksOff() ||
|
||||||
!testHeartbeatAckRequiresSessionId() ||
|
!testHeartbeatAckRequiresSessionId() ||
|
||||||
!testSlowMediaStartDoesNotBlockHeartbeat() ||
|
!testSlowMediaStartDoesNotBlockHeartbeat() ||
|
||||||
!testLifecycleStateGuards()) {
|
!testLifecycleStateGuards() || !testRobotIdIsRequired()) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
std::cout << "quic_edge_protocol_test: PASS\n";
|
std::cout << "quic_edge_protocol_test: PASS\n";
|
||||||
|
|||||||
@ -15,13 +15,22 @@ add_library(cmvr_es::quic_edge_task ALIAS quic_edge_task)
|
|||||||
if(BUILD_TESTING)
|
if(BUILD_TESTING)
|
||||||
add_executable(quic_edge_task_test tests/quic_edge_task_test.cpp)
|
add_executable(quic_edge_task_test tests/quic_edge_task_test.cpp)
|
||||||
target_compile_features(quic_edge_task_test PRIVATE cxx_std_17)
|
target_compile_features(quic_edge_task_test PRIVATE cxx_std_17)
|
||||||
target_link_libraries(quic_edge_task_test PRIVATE cmvr_es::quic_edge_task)
|
target_link_libraries(quic_edge_task_test PRIVATE
|
||||||
|
cmvr_es::quic_edge_task
|
||||||
|
)
|
||||||
add_test(NAME quic_edge_task_test COMMAND quic_edge_task_test)
|
add_test(NAME quic_edge_task_test COMMAND quic_edge_task_test)
|
||||||
if(UNIX AND NOT APPLE)
|
if(UNIX AND NOT APPLE)
|
||||||
get_property(_quic_task_test_library_dirs DIRECTORY PROPERTY LINK_DIRECTORIES)
|
get_property(_quic_task_test_library_dirs DIRECTORY PROPERTY LINK_DIRECTORIES)
|
||||||
list(PREPEND _quic_task_test_library_dirs "${CMAKE_BINARY_DIR}/cmvr_compiler_runtime")
|
list(PREPEND _quic_task_test_library_dirs "${CMAKE_BINARY_DIR}/cmvr_compiler_runtime")
|
||||||
list(JOIN _quic_task_test_library_dirs ":" _quic_task_test_library_path)
|
list(JOIN _quic_task_test_library_dirs ":" _quic_task_test_library_path)
|
||||||
|
set(_quic_task_test_environment
|
||||||
|
"LD_LIBRARY_PATH=${_quic_task_test_library_path}")
|
||||||
|
if(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
||||||
|
list(APPEND _quic_task_test_environment
|
||||||
|
"LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
||||||
|
endif()
|
||||||
set_tests_properties(quic_edge_task_test PROPERTIES
|
set_tests_properties(quic_edge_task_test PROPERTIES
|
||||||
ENVIRONMENT "LD_LIBRARY_PATH=${_quic_task_test_library_path}")
|
TIMEOUT 10
|
||||||
|
ENVIRONMENT "${_quic_task_test_environment}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
#ifndef CMVR_ES_QUIC_EDGE_TASK_H
|
#ifndef CMVR_ES_QUIC_EDGE_TASK_H
|
||||||
#define CMVR_ES_QUIC_EDGE_TASK_H
|
#define CMVR_ES_QUIC_EDGE_TASK_H
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "cmvr/config/quic_edge_config/quic_edge_config.pb.h"
|
#include "cmvr/config/quic_edge_config/quic_edge_config.pb.h"
|
||||||
#include "service/quic_edge/include/quic_edge_service.h"
|
#include "service/quic_edge/include/quic_edge_service.h"
|
||||||
@ -13,7 +15,12 @@ namespace cmvr::task {
|
|||||||
|
|
||||||
class QuicEdgeTask final : public Task {
|
class QuicEdgeTask final : public Task {
|
||||||
public:
|
public:
|
||||||
|
using ServiceFactory = std::function<std::unique_ptr<quic_edge::QuicEdgeService>(
|
||||||
|
config::QuicEdgeConfig)>;
|
||||||
|
|
||||||
explicit QuicEdgeTask(const config::QuicEdgeConfig& config);
|
explicit QuicEdgeTask(const config::QuicEdgeConfig& config);
|
||||||
|
QuicEdgeTask(const config::QuicEdgeConfig& config,
|
||||||
|
ServiceFactory service_factory);
|
||||||
~QuicEdgeTask() override;
|
~QuicEdgeTask() override;
|
||||||
|
|
||||||
const std::string& id() const override { return id_; }
|
const std::string& id() const override { return id_; }
|
||||||
@ -22,6 +29,7 @@ public:
|
|||||||
bool start() override;
|
bool start() override;
|
||||||
bool step(double dt) override;
|
bool step(double dt) override;
|
||||||
void stop() override;
|
void stop() override;
|
||||||
|
bool stopActivity();
|
||||||
|
|
||||||
TaskState state() const override;
|
TaskState state() const override;
|
||||||
bool isBusy() const override;
|
bool isBusy() const override;
|
||||||
@ -31,11 +39,19 @@ public:
|
|||||||
std::string detailStatusString() const override;
|
std::string detailStatusString() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct PlatformService {
|
||||||
|
std::string id;
|
||||||
|
bool media_enabled{false};
|
||||||
|
config::QuicEdgeConfig config;
|
||||||
|
std::unique_ptr<quic_edge::QuicEdgeService> service;
|
||||||
|
};
|
||||||
|
|
||||||
TaskState mappedState() const;
|
TaskState mappedState() const;
|
||||||
|
|
||||||
config::QuicEdgeConfig config_;
|
config::QuicEdgeConfig config_;
|
||||||
std::string id_;
|
std::string id_;
|
||||||
std::unique_ptr<quic_edge::QuicEdgeService> service_;
|
ServiceFactory service_factory_;
|
||||||
|
std::vector<PlatformService> services_;
|
||||||
|
|
||||||
mutable std::mutex mutex_;
|
mutable std::mutex mutex_;
|
||||||
TaskState state_{TaskState::UNINITIALIZED};
|
TaskState state_{TaskState::UNINITIALIZED};
|
||||||
|
|||||||
@ -1,7 +1,10 @@
|
|||||||
#include "task/quic_edge_task/include/quic_edge_task.h"
|
#include "task/quic_edge_task/include/quic_edge_task.h"
|
||||||
|
|
||||||
|
#include <set>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <unordered_set>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "cmvr/config/task_manager_config/task_manager_config.pb.h"
|
#include "cmvr/config/task_manager_config/task_manager_config.pb.h"
|
||||||
#include "common/base/logging/logger.h"
|
#include "common/base/logging/logger.h"
|
||||||
@ -12,6 +15,107 @@
|
|||||||
namespace cmvr::task {
|
namespace cmvr::task {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
struct PlatformConfig {
|
||||||
|
std::string id;
|
||||||
|
bool media_enabled{false};
|
||||||
|
config::QuicEdgeConfig config;
|
||||||
|
};
|
||||||
|
|
||||||
|
void resolveTlsFiles(config::QuicEdgeTlsConfig* tls)
|
||||||
|
{
|
||||||
|
if (!tls) return;
|
||||||
|
if (!tls->ca_file().empty()) {
|
||||||
|
tls->set_ca_file(ConfigHelper::resolveConfigFile(tls->ca_file()));
|
||||||
|
}
|
||||||
|
if (!tls->certificate_file().empty()) {
|
||||||
|
tls->set_certificate_file(
|
||||||
|
ConfigHelper::resolveConfigFile(tls->certificate_file()));
|
||||||
|
}
|
||||||
|
if (!tls->private_key_file().empty()) {
|
||||||
|
tls->set_private_key_file(
|
||||||
|
ConfigHelper::resolveConfigFile(tls->private_key_file()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool appendPlatformConfig(
|
||||||
|
const config::QuicEdgeConfig& root_config,
|
||||||
|
const std::string& platform_id,
|
||||||
|
const std::string& server_host,
|
||||||
|
const std::uint32_t server_port,
|
||||||
|
const config::QuicEdgeTlsConfig& tls,
|
||||||
|
const bool media_enabled,
|
||||||
|
std::unordered_set<std::string>* platform_ids,
|
||||||
|
std::set<std::pair<std::string, std::uint32_t>>* endpoints,
|
||||||
|
std::vector<PlatformConfig>* platforms,
|
||||||
|
std::string* error)
|
||||||
|
{
|
||||||
|
if (platform_id.empty()) {
|
||||||
|
if (error) *error = "QUIC edge platform id is empty";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!platform_ids->insert(platform_id).second) {
|
||||||
|
if (error) *error = "duplicate QUIC edge platform id: " + platform_id;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!endpoints->emplace(server_host, server_port).second) {
|
||||||
|
if (error) {
|
||||||
|
*error = "duplicate QUIC edge platform endpoint: " + server_host +
|
||||||
|
':' + std::to_string(server_port);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlatformConfig platform;
|
||||||
|
platform.id = platform_id;
|
||||||
|
platform.media_enabled = media_enabled;
|
||||||
|
platform.config = root_config;
|
||||||
|
platform.config.set_server_host(server_host);
|
||||||
|
platform.config.set_server_port(server_port);
|
||||||
|
*platform.config.mutable_tls() = tls;
|
||||||
|
platform.config.clear_platforms();
|
||||||
|
if (!media_enabled) platform.config.clear_tracks();
|
||||||
|
platforms->push_back(std::move(platform));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool expandPlatformConfigs(const config::QuicEdgeConfig& config,
|
||||||
|
std::vector<PlatformConfig>* platforms,
|
||||||
|
std::string* error)
|
||||||
|
{
|
||||||
|
if (!platforms) {
|
||||||
|
if (error) *error = "QUIC edge platform output is null";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
platforms->clear();
|
||||||
|
std::unordered_set<std::string> platform_ids;
|
||||||
|
std::set<std::pair<std::string, std::uint32_t>> endpoints;
|
||||||
|
|
||||||
|
const bool has_primary_endpoint = !config.server_host().empty() ||
|
||||||
|
config.server_port() != 0U || config.has_tls();
|
||||||
|
if (has_primary_endpoint &&
|
||||||
|
!appendPlatformConfig(
|
||||||
|
config, config.id(), config.server_host(), config.server_port(),
|
||||||
|
config.tls(), true, &platform_ids, &endpoints, platforms, error)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& configured_platform : config.platforms()) {
|
||||||
|
if (!appendPlatformConfig(
|
||||||
|
config, configured_platform.id(),
|
||||||
|
configured_platform.server_host(),
|
||||||
|
configured_platform.server_port(), configured_platform.tls(),
|
||||||
|
configured_platform.enable_media(), &platform_ids, &endpoints,
|
||||||
|
platforms, error)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (platforms->empty()) {
|
||||||
|
if (error) *error = "QUIC edge has no platform endpoint";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<Task> createQuicEdgeTask(const config::TaskConfigEntry& entry)
|
std::shared_ptr<Task> createQuicEdgeTask(const config::TaskConfigEntry& entry)
|
||||||
{
|
{
|
||||||
if (entry.id().empty() || entry.config_file().empty()) {
|
if (entry.id().empty() || entry.config_file().empty()) {
|
||||||
@ -30,17 +134,9 @@ std::shared_ptr<Task> createQuicEdgeTask(const config::TaskConfigEntry& entry)
|
|||||||
<< ", config=" << config.id();
|
<< ", config=" << config.id();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (!config.tls().ca_file().empty()) {
|
if (config.has_tls()) resolveTlsFiles(config.mutable_tls());
|
||||||
config.mutable_tls()->set_ca_file(
|
for (auto& platform : *config.mutable_platforms()) {
|
||||||
ConfigHelper::resolveConfigFile(config.tls().ca_file()));
|
if (platform.has_tls()) resolveTlsFiles(platform.mutable_tls());
|
||||||
}
|
|
||||||
if (!config.tls().certificate_file().empty()) {
|
|
||||||
config.mutable_tls()->set_certificate_file(
|
|
||||||
ConfigHelper::resolveConfigFile(config.tls().certificate_file()));
|
|
||||||
}
|
|
||||||
if (!config.tls().private_key_file().empty()) {
|
|
||||||
config.mutable_tls()->set_private_key_file(
|
|
||||||
ConfigHelper::resolveConfigFile(config.tls().private_key_file()));
|
|
||||||
}
|
}
|
||||||
if (config.software_version().empty()) {
|
if (config.software_version().empty()) {
|
||||||
config.set_software_version(device::DeviceManager::getInstance().version());
|
config.set_software_version(device::DeviceManager::getInstance().version());
|
||||||
@ -51,7 +147,19 @@ std::shared_ptr<Task> createQuicEdgeTask(const config::TaskConfigEntry& entry)
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
QuicEdgeTask::QuicEdgeTask(const config::QuicEdgeConfig& config)
|
QuicEdgeTask::QuicEdgeTask(const config::QuicEdgeConfig& config)
|
||||||
: config_(config), id_(config.id())
|
: QuicEdgeTask(
|
||||||
|
config,
|
||||||
|
[](config::QuicEdgeConfig platform_config) {
|
||||||
|
return std::make_unique<quic_edge::QuicEdgeService>(
|
||||||
|
std::move(platform_config));
|
||||||
|
})
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QuicEdgeTask::QuicEdgeTask(const config::QuicEdgeConfig& config,
|
||||||
|
ServiceFactory service_factory)
|
||||||
|
: config_(config), id_(config.id()),
|
||||||
|
service_factory_(std::move(service_factory))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,13 +176,40 @@ bool QuicEdgeTask::init()
|
|||||||
state_ = TaskState::FAILED;
|
state_ = TaskState::FAILED;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
service_ = std::make_unique<quic_edge::QuicEdgeService>(config_);
|
|
||||||
|
std::vector<PlatformConfig> platform_configs;
|
||||||
std::string error;
|
std::string error;
|
||||||
if (!service_->initialize(&error)) {
|
if (!service_factory_) {
|
||||||
|
last_error_ = "QUIC edge service factory is empty";
|
||||||
|
state_ = TaskState::FAILED;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!expandPlatformConfigs(config_, &platform_configs, &error)) {
|
||||||
last_error_ = std::move(error);
|
last_error_ = std::move(error);
|
||||||
state_ = TaskState::FAILED;
|
state_ = TaskState::FAILED;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<PlatformService> initialized_services;
|
||||||
|
initialized_services.reserve(platform_configs.size());
|
||||||
|
for (auto& platform_config : platform_configs) {
|
||||||
|
auto service = service_factory_(platform_config.config);
|
||||||
|
if (!service) {
|
||||||
|
last_error_ = "failed to create QUIC edge service for platform " +
|
||||||
|
platform_config.id;
|
||||||
|
state_ = TaskState::FAILED;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!service->initialize(&error)) {
|
||||||
|
last_error_ = "platform " + platform_config.id + ": " + error;
|
||||||
|
state_ = TaskState::FAILED;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
initialized_services.push_back(PlatformService{
|
||||||
|
std::move(platform_config.id), platform_config.media_enabled,
|
||||||
|
std::move(platform_config.config), std::move(service)});
|
||||||
|
}
|
||||||
|
services_ = std::move(initialized_services);
|
||||||
last_error_.clear();
|
last_error_.clear();
|
||||||
state_ = TaskState::IDLE;
|
state_ = TaskState::IDLE;
|
||||||
return true;
|
return true;
|
||||||
@ -83,21 +218,34 @@ bool QuicEdgeTask::init()
|
|||||||
bool QuicEdgeTask::start()
|
bool QuicEdgeTask::start()
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex_);
|
std::lock_guard lock(mutex_);
|
||||||
if (state_ == TaskState::RUNNING) return true;
|
if (state_ == TaskState::RUNNING) {
|
||||||
if ((state_ != TaskState::IDLE && state_ != TaskState::STOPPED) || !service_) {
|
return true;
|
||||||
|
}
|
||||||
|
if ((state_ != TaskState::IDLE && state_ != TaskState::STOPPED) ||
|
||||||
|
services_.empty()) {
|
||||||
last_error_ = "QUIC edge task is not initialized";
|
last_error_ = "QUIC edge task is not initialized";
|
||||||
state_ = TaskState::FAILED;
|
state_ = TaskState::FAILED;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t started_services = 0U;
|
||||||
|
for (auto& platform : services_) {
|
||||||
std::string error;
|
std::string error;
|
||||||
if (!service_->start(&error)) {
|
if (!platform.service->start(&error)) {
|
||||||
last_error_ = std::move(error);
|
for (std::size_t index = 0U;
|
||||||
|
index < started_services; ++index) {
|
||||||
|
services_[index].service->stop();
|
||||||
|
}
|
||||||
|
last_error_ = "platform " + platform.id + ": " + error;
|
||||||
state_ = TaskState::FAILED;
|
state_ = TaskState::FAILED;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
++started_services;
|
||||||
|
}
|
||||||
last_error_.clear();
|
last_error_.clear();
|
||||||
state_ = TaskState::RUNNING;
|
state_ = TaskState::RUNNING;
|
||||||
CMVR_LOG(INFO) << "[QuicEdgeTask] Started, id=" << id_;
|
CMVR_LOG(INFO) << "[QuicEdgeTask] Started, id=" << id_
|
||||||
|
<< ", platforms=" << services_.size();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,17 +258,39 @@ bool QuicEdgeTask::step(const double dt)
|
|||||||
void QuicEdgeTask::stop()
|
void QuicEdgeTask::stop()
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex_);
|
std::lock_guard lock(mutex_);
|
||||||
// Keep ownership stable for the complete stop. init() may replace the
|
// stop() is the task lifecycle terminator used by TaskManager shutdown.
|
||||||
// unique service instance and therefore must not race a raw pointer here.
|
// Unlike StopAll's stopActivity(), it intentionally tears down transport.
|
||||||
if (service_) service_->stop();
|
for (auto& platform : services_) platform.service->stop();
|
||||||
if (state_ != TaskState::FAILED) state_ = TaskState::STOPPED;
|
if (state_ != TaskState::FAILED) state_ = TaskState::STOPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QuicEdgeTask::stopActivity()
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex_);
|
||||||
|
if (services_.empty() || state_ == TaskState::FAILED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// System StopAll must preserve the QUIC presence channel. Only old media
|
||||||
|
// subscriptions are fenced; registration and heartbeat stay online.
|
||||||
|
bool all_stopped = true;
|
||||||
|
for (auto& platform : services_) {
|
||||||
|
if (!platform.service->interruptMediaActivities()) {
|
||||||
|
all_stopped = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return all_stopped;
|
||||||
|
}
|
||||||
|
|
||||||
TaskState QuicEdgeTask::mappedState() const
|
TaskState QuicEdgeTask::mappedState() const
|
||||||
{
|
{
|
||||||
if (!service_ || state_ != TaskState::RUNNING) return state_;
|
if (services_.empty() || state_ != TaskState::RUNNING) return state_;
|
||||||
return service_->state() == quic_edge::QuicEdgeServiceState::FAILED
|
for (const auto& platform : services_) {
|
||||||
? TaskState::FAILED : state_;
|
if (platform.service->state() ==
|
||||||
|
quic_edge::QuicEdgeServiceState::FAILED) {
|
||||||
|
return TaskState::FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state_;
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskState QuicEdgeTask::state() const
|
TaskState QuicEdgeTask::state() const
|
||||||
@ -154,31 +324,38 @@ std::string QuicEdgeTask::detailStatusString() const
|
|||||||
std::lock_guard lock(mutex_);
|
std::lock_guard lock(mutex_);
|
||||||
std::ostringstream output;
|
std::ostringstream output;
|
||||||
output << taskStateToString(mappedState());
|
output << taskStateToString(mappedState());
|
||||||
if (service_) {
|
if (!services_.empty()) {
|
||||||
const auto stats = service_->stats();
|
output << " platforms=" << services_.size();
|
||||||
const auto service_status = service_->status();
|
for (const auto& platform : services_) {
|
||||||
output << " service=" << quic_edge::toString(service_->state())
|
const auto stats = platform.service->stats();
|
||||||
<< " target=" << config_.server_host() << ':' << config_.server_port()
|
const auto service_status = platform.service->status();
|
||||||
<< " node_id=" << service_status.node_id
|
output << " platform[" << platform.id << "]={"
|
||||||
<< " registered=" << service_status.registered
|
<< "service=" << quic_edge::toString(platform.service->state())
|
||||||
<< " connections=" << stats.successful_connections
|
<< ",target=" << platform.config.server_host() << ':'
|
||||||
<< " registrations=" << stats.registrations_accepted
|
<< platform.config.server_port()
|
||||||
<< " heartbeat_sequence=" << service_status.heartbeat_sequence
|
<< ",media_enabled=" << platform.media_enabled
|
||||||
<< " heartbeat_acks=" << stats.heartbeats_acknowledged
|
<< ",node_id=" << service_status.node_id
|
||||||
<< " media_tracks=" << service_status.active_media_tracks
|
<< ",registered=" << service_status.registered
|
||||||
<< " frames=" << stats.frames_queued
|
<< ",connections=" << stats.successful_connections
|
||||||
<< " datagrams=" << stats.datagrams_queued;
|
<< ",registrations=" << stats.registrations_accepted
|
||||||
|
<< ",heartbeat_sequence=" << service_status.heartbeat_sequence
|
||||||
|
<< ",heartbeat_acks=" << stats.heartbeats_acknowledged
|
||||||
|
<< ",media_tracks=" << service_status.active_media_tracks
|
||||||
|
<< ",frames=" << stats.frames_queued
|
||||||
|
<< ",datagrams=" << stats.datagrams_queued;
|
||||||
if (!service_status.session_id.empty()) {
|
if (!service_status.session_id.empty()) {
|
||||||
output << " session=" << service_status.session_id;
|
output << ",session=" << service_status.session_id;
|
||||||
}
|
}
|
||||||
if (!service_status.observed_source_ip.empty()) {
|
if (!service_status.observed_source_ip.empty()) {
|
||||||
output << " observed_ip=" << service_status.observed_source_ip;
|
output << ",observed_ip=" << service_status.observed_source_ip;
|
||||||
}
|
}
|
||||||
if (!service_status.last_media_error.empty()) {
|
if (!service_status.last_media_error.empty()) {
|
||||||
output << " media_error=" << service_status.last_media_error;
|
output << ",media_error=" << service_status.last_media_error;
|
||||||
|
}
|
||||||
|
const std::string service_error = platform.service->lastError();
|
||||||
|
if (!service_error.empty()) output << ",error=" << service_error;
|
||||||
|
output << '}';
|
||||||
}
|
}
|
||||||
const std::string service_error = service_->lastError();
|
|
||||||
if (!service_error.empty()) output << " error=" << service_error;
|
|
||||||
} else if (!last_error_.empty()) {
|
} else if (!last_error_.empty()) {
|
||||||
output << " error=" << last_error_;
|
output << " error=" << last_error_;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,237 @@
|
|||||||
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <deque>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "cmvr/quic_edge/v1/quic_edge.pb.h"
|
||||||
|
#include "manager/media_source_hub/include/media_source_hub.h"
|
||||||
|
#include "service/quic_edge/include/control_framing.h"
|
||||||
#include "task/quic_edge_task/include/quic_edge_task.h"
|
#include "task/quic_edge_task/include/quic_edge_task.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using Clock = std::chrono::steady_clock;
|
||||||
|
using QuicEdgeService = cmvr::quic_edge::QuicEdgeService;
|
||||||
|
|
||||||
|
class HeartbeatTransport final : public cmvr::quic_edge::QuicTransport {
|
||||||
|
public:
|
||||||
|
explicit HeartbeatTransport(std::string platform_id)
|
||||||
|
: platform_id_(std::move(platform_id))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool connect(const cmvr::config::QuicEdgeConfig&,
|
||||||
|
std::chrono::milliseconds,
|
||||||
|
std::string*) override
|
||||||
|
{
|
||||||
|
connected_.store(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disconnect() override
|
||||||
|
{
|
||||||
|
connected_.store(false);
|
||||||
|
condition_.notify_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isConnected() const override { return connected_.load(); }
|
||||||
|
std::size_t maximumDatagramBytes() const override { return 1200U; }
|
||||||
|
std::size_t maximumDatagramBatchPackets() const override { return 32U; }
|
||||||
|
|
||||||
|
cmvr::quic_edge::TransportSendResult sendControl(
|
||||||
|
std::vector<std::uint8_t> framed_message,
|
||||||
|
std::string*) override
|
||||||
|
{
|
||||||
|
if (!connected_.load()) {
|
||||||
|
return cmvr::quic_edge::TransportSendResult::DISCONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::vector<std::uint8_t>> frames;
|
||||||
|
std::string error;
|
||||||
|
cmvr::quic_edge::ControlFrameDecoder decoder(1024U * 1024U);
|
||||||
|
if (!decoder.push(framed_message, &frames, &error) ||
|
||||||
|
frames.size() != 1U) {
|
||||||
|
return cmvr::quic_edge::TransportSendResult::ERROR;
|
||||||
|
}
|
||||||
|
cmvr::quic_edge::v1::EdgeControlEnvelope request;
|
||||||
|
if (!request.ParseFromArray(
|
||||||
|
frames.front().data(),
|
||||||
|
static_cast<int>(frames.front().size()))) {
|
||||||
|
return cmvr::quic_edge::TransportSendResult::ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmvr::quic_edge::v1::EdgeControlEnvelope response;
|
||||||
|
response.set_protocol_version(cmvr::quic_edge::kProtocolVersion);
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex_);
|
||||||
|
response.set_message_sequence(server_message_sequence_++);
|
||||||
|
if (request.has_node_register_request()) {
|
||||||
|
++registrations_;
|
||||||
|
auto* registration = response.mutable_node_register_response();
|
||||||
|
registration->set_accepted(true);
|
||||||
|
registration->set_session_id("session-" + platform_id_);
|
||||||
|
registration->set_heartbeat_interval_ms(250U);
|
||||||
|
} else if (request.has_node_heartbeat()) {
|
||||||
|
const auto& heartbeat = request.node_heartbeat();
|
||||||
|
++heartbeats_;
|
||||||
|
last_heartbeat_sequence_.store(heartbeat.sequence());
|
||||||
|
auto* ack = response.mutable_node_heartbeat_ack();
|
||||||
|
ack->set_accepted(true);
|
||||||
|
ack->set_session_id(heartbeat.session_id());
|
||||||
|
ack->set_acknowledged_sequence(heartbeat.sequence());
|
||||||
|
} else {
|
||||||
|
return cmvr::quic_edge::TransportSendResult::ERROR;
|
||||||
|
}
|
||||||
|
if (!enqueueResponse(response)) {
|
||||||
|
return cmvr::quic_edge::TransportSendResult::ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
condition_.notify_all();
|
||||||
|
return cmvr::quic_edge::TransportSendResult::QUEUED;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmvr::quic_edge::TransportReceiveResult receiveControl(
|
||||||
|
std::vector<std::uint8_t>* chunk,
|
||||||
|
const std::chrono::milliseconds timeout,
|
||||||
|
std::string*) override
|
||||||
|
{
|
||||||
|
if (!chunk) return cmvr::quic_edge::TransportReceiveResult::ERROR;
|
||||||
|
std::unique_lock lock(mutex_);
|
||||||
|
condition_.wait_for(lock, timeout, [this] {
|
||||||
|
return !responses_.empty() || !connected_.load();
|
||||||
|
});
|
||||||
|
if (!responses_.empty()) {
|
||||||
|
*chunk = std::move(responses_.front());
|
||||||
|
responses_.pop_front();
|
||||||
|
return cmvr::quic_edge::TransportReceiveResult::DATA;
|
||||||
|
}
|
||||||
|
return connected_.load()
|
||||||
|
? cmvr::quic_edge::TransportReceiveResult::TIMEOUT
|
||||||
|
: cmvr::quic_edge::TransportReceiveResult::DISCONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmvr::quic_edge::TransportSendResult sendDatagramBatch(
|
||||||
|
std::vector<cmvr::quic_edge::DatagramPacket>,
|
||||||
|
std::string*) override
|
||||||
|
{
|
||||||
|
return connected_.load()
|
||||||
|
? cmvr::quic_edge::TransportSendResult::QUEUED
|
||||||
|
: cmvr::quic_edge::TransportSendResult::DISCONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::uint64_t registrations() const { return registrations_.load(); }
|
||||||
|
std::uint64_t heartbeats() const { return heartbeats_.load(); }
|
||||||
|
std::uint64_t lastHeartbeatSequence() const
|
||||||
|
{
|
||||||
|
return last_heartbeat_sequence_.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool enqueueResponse(
|
||||||
|
const cmvr::quic_edge::v1::EdgeControlEnvelope& response)
|
||||||
|
{
|
||||||
|
std::string serialized;
|
||||||
|
if (!response.SerializeToString(&serialized)) return false;
|
||||||
|
std::vector<std::uint8_t> framed;
|
||||||
|
std::string error;
|
||||||
|
if (!cmvr::quic_edge::ControlFrameEncoder::encode(
|
||||||
|
reinterpret_cast<const std::uint8_t*>(serialized.data()),
|
||||||
|
serialized.size(), 1024U * 1024U, &framed, &error)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
responses_.push_back(std::move(framed));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string platform_id_;
|
||||||
|
std::atomic<bool> connected_{false};
|
||||||
|
std::atomic<std::uint64_t> registrations_{0U};
|
||||||
|
std::atomic<std::uint64_t> heartbeats_{0U};
|
||||||
|
std::atomic<std::uint64_t> last_heartbeat_sequence_{0U};
|
||||||
|
mutable std::mutex mutex_;
|
||||||
|
std::condition_variable condition_;
|
||||||
|
std::deque<std::vector<std::uint8_t>> responses_;
|
||||||
|
std::uint64_t server_message_sequence_{0U};
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Predicate>
|
||||||
|
bool waitUntil(const std::chrono::milliseconds timeout, Predicate predicate)
|
||||||
|
{
|
||||||
|
const auto deadline = Clock::now() + timeout;
|
||||||
|
while (Clock::now() < deadline) {
|
||||||
|
if (predicate()) return true;
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
}
|
||||||
|
return predicate();
|
||||||
|
}
|
||||||
|
|
||||||
|
cmvr::config::QuicEdgeConfig validConfig()
|
||||||
|
{
|
||||||
|
cmvr::config::QuicEdgeConfig config;
|
||||||
|
config.set_id("quic-admission-test");
|
||||||
|
config.set_server_host("127.0.0.1");
|
||||||
|
config.set_server_port(4433U);
|
||||||
|
config.set_alpn("cmvr-quic-edge/1");
|
||||||
|
config.set_node_id("test-node");
|
||||||
|
config.set_robot_id("test-robot");
|
||||||
|
config.set_software_version("test-version");
|
||||||
|
config.set_grpc_endpoint_host("127.0.0.1");
|
||||||
|
config.set_grpc_endpoint_port(50052U);
|
||||||
|
config.set_heartbeat_interval_ms(250U);
|
||||||
|
config.set_control_response_timeout_ms(100U);
|
||||||
|
config.mutable_tls()->set_allow_insecure(true);
|
||||||
|
config.mutable_reconnect()->set_initial_delay_ms(5U);
|
||||||
|
config.mutable_reconnect()->set_maximum_delay_ms(20U);
|
||||||
|
config.mutable_reconnect()->set_multiplier(2.0);
|
||||||
|
config.mutable_reconnect()->set_connect_timeout_ms(20U);
|
||||||
|
config.set_maximum_datagram_bytes(1200U);
|
||||||
|
config.set_maximum_control_frame_bytes(4096U);
|
||||||
|
config.set_maximum_frame_bytes(32U * 1024U);
|
||||||
|
config.set_datagram_send_queue_depth(32U);
|
||||||
|
config.set_media_poll_interval_ms(1U);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmvr::config::QuicEdgeConfig multiPlatformConfig()
|
||||||
|
{
|
||||||
|
auto config = validConfig();
|
||||||
|
config.set_id("quic-multi-platform-test");
|
||||||
|
config.clear_server_host();
|
||||||
|
config.clear_server_port();
|
||||||
|
config.clear_tls();
|
||||||
|
|
||||||
|
auto* platform_a = config.add_platforms();
|
||||||
|
platform_a->set_id("platform-a");
|
||||||
|
platform_a->set_server_host("192.0.2.10");
|
||||||
|
platform_a->set_server_port(4433U);
|
||||||
|
platform_a->mutable_tls()->set_allow_insecure(true);
|
||||||
|
|
||||||
|
auto* platform_b = config.add_platforms();
|
||||||
|
platform_b->set_id("platform-b");
|
||||||
|
platform_b->set_server_host("198.51.100.20");
|
||||||
|
platform_b->set_server_port(4434U);
|
||||||
|
platform_b->mutable_tls()->set_allow_insecure(true);
|
||||||
|
platform_b->set_enable_media(true);
|
||||||
|
|
||||||
|
auto* disabled_track = config.add_tracks();
|
||||||
|
disabled_track->set_track_id(1U);
|
||||||
|
disabled_track->set_source_kind(
|
||||||
|
cmvr::config::QuicEdgeTrackConfig::SOURCE_KIND_CAMERA);
|
||||||
|
disabled_track->set_device_id("disabled-test-camera");
|
||||||
|
disabled_track->set_enable(false);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
cmvr::config::QuicEdgeConfig config;
|
cmvr::config::QuicEdgeConfig config;
|
||||||
@ -17,6 +247,95 @@ int main()
|
|||||||
std::cerr << "failed QUIC task did not preserve its failure state\n";
|
std::cerr << "failed QUIC task did not preserve its failure state\n";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (task.stopActivity()) {
|
||||||
|
std::cerr << "failed QUIC task reported a confirmed activity stop\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmvr::media::MediaSourceHub media_hub;
|
||||||
|
std::vector<HeartbeatTransport*> transports;
|
||||||
|
std::vector<QuicEdgeService*> services;
|
||||||
|
std::vector<cmvr::config::QuicEdgeConfig> expanded_configs;
|
||||||
|
cmvr::task::QuicEdgeTask multi_platform_task(
|
||||||
|
multiPlatformConfig(),
|
||||||
|
[&](cmvr::config::QuicEdgeConfig platform_config) {
|
||||||
|
expanded_configs.push_back(platform_config);
|
||||||
|
auto transport = std::make_unique<HeartbeatTransport>(
|
||||||
|
platform_config.server_host());
|
||||||
|
transports.push_back(transport.get());
|
||||||
|
auto service = std::make_unique<QuicEdgeService>(
|
||||||
|
std::move(platform_config), std::move(transport), media_hub,
|
||||||
|
[] { return cmvr::device::DeviceManagerSnapshot{}; });
|
||||||
|
services.push_back(service.get());
|
||||||
|
return service;
|
||||||
|
});
|
||||||
|
if (!multi_platform_task.init() || expanded_configs.size() != 2U ||
|
||||||
|
transports.size() != 2U || services.size() != 2U) {
|
||||||
|
std::cerr << "multi-platform QUIC task did not create two services: "
|
||||||
|
<< multi_platform_task.detailStatusString() << '\n';
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (expanded_configs[0].platforms_size() != 0 ||
|
||||||
|
expanded_configs[1].platforms_size() != 0 ||
|
||||||
|
expanded_configs[0].server_host() != "192.0.2.10" ||
|
||||||
|
expanded_configs[1].server_host() != "198.51.100.20" ||
|
||||||
|
expanded_configs[0].tracks_size() != 0 ||
|
||||||
|
expanded_configs[1].tracks_size() != 1) {
|
||||||
|
std::cerr << "multi-platform QUIC task expanded invalid service configs\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!multi_platform_task.start()) {
|
||||||
|
std::cerr << "multi-platform QUIC task did not start: "
|
||||||
|
<< multi_platform_task.detailStatusString() << '\n';
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
const bool both_platforms_online = waitUntil(
|
||||||
|
std::chrono::seconds(2), [&] {
|
||||||
|
return transports[0]->registrations() >= 1U &&
|
||||||
|
transports[1]->registrations() >= 1U &&
|
||||||
|
transports[0]->heartbeats() >= 1U &&
|
||||||
|
transports[1]->heartbeats() >= 1U &&
|
||||||
|
services[0]->stats().heartbeats_acknowledged >= 1U &&
|
||||||
|
services[1]->stats().heartbeats_acknowledged >= 1U;
|
||||||
|
});
|
||||||
|
if (!both_platforms_online ||
|
||||||
|
transports[0]->lastHeartbeatSequence() != 1U ||
|
||||||
|
transports[1]->lastHeartbeatSequence() != 1U) {
|
||||||
|
std::cerr << "both platforms did not independently ACK a heartbeat: "
|
||||||
|
<< multi_platform_task.detailStatusString() << '\n';
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
const std::string multi_status = multi_platform_task.detailStatusString();
|
||||||
|
if (multi_status.find("platforms=2") == std::string::npos ||
|
||||||
|
multi_status.find("platform[platform-a]") == std::string::npos ||
|
||||||
|
multi_status.find("platform[platform-b]") == std::string::npos) {
|
||||||
|
std::cerr << "multi-platform QUIC status is incomplete: "
|
||||||
|
<< multi_status << '\n';
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
multi_platform_task.stop();
|
||||||
|
if (multi_platform_task.state() != cmvr::task::TaskState::STOPPED) {
|
||||||
|
std::cerr << "multi-platform QUIC task did not stop cleanly\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto duplicate_endpoint_config = validConfig();
|
||||||
|
auto* duplicate_platform = duplicate_endpoint_config.add_platforms();
|
||||||
|
duplicate_platform->set_id("duplicate-primary");
|
||||||
|
duplicate_platform->set_server_host(
|
||||||
|
duplicate_endpoint_config.server_host());
|
||||||
|
duplicate_platform->set_server_port(
|
||||||
|
duplicate_endpoint_config.server_port());
|
||||||
|
duplicate_platform->mutable_tls()->set_allow_insecure(true);
|
||||||
|
cmvr::task::QuicEdgeTask duplicate_endpoint_task(
|
||||||
|
duplicate_endpoint_config);
|
||||||
|
if (duplicate_endpoint_task.init() ||
|
||||||
|
duplicate_endpoint_task.detailStatusString().find(
|
||||||
|
"duplicate QUIC edge platform endpoint") == std::string::npos) {
|
||||||
|
std::cerr << "duplicate QUIC platform endpoint was not rejected\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
std::cout << "quic_edge_task_test: PASS\n";
|
std::cout << "quic_edge_task_test: PASS\n";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
libstdc++.so.6.0.25
|
|
||||||
Binary file not shown.
Binary file not shown.
@ -1,3 +1,3 @@
|
|||||||
MASTER0_DEVICE="a0:ad:9f:c4:c2:2c"
|
MASTER0_DEVICE="00:e0:4c:93:b3:11"
|
||||||
DEVICE_MODULES="generic"
|
DEVICE_MODULES="igc"
|
||||||
UPDOWN_INTERFACES="eno1"
|
UPDOWN_INTERFACES="enp1s0"
|
||||||
|
|||||||
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
ETHERCATCTL="/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/sbin/ethercatctl -c /home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/etc/sysconfig/ethercat"
|
ETHERCATCTL="/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/sbin/ethercatctl -c /mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/etc/sysconfig/ethercat"
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@ -24,12 +24,12 @@
|
|||||||
|
|
||||||
find_library(EtherCAT_LIBRARY
|
find_library(EtherCAT_LIBRARY
|
||||||
NAMES ethercat
|
NAMES ethercat
|
||||||
PATHS /home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/lib
|
PATHS /mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/lib
|
||||||
)
|
)
|
||||||
|
|
||||||
find_path(EtherCAT_INCLUDE_DIR
|
find_path(EtherCAT_INCLUDE_DIR
|
||||||
NAMES ecrt.h
|
NAMES ecrt.h
|
||||||
PATHS /home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/include
|
PATHS /mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/include
|
||||||
)
|
)
|
||||||
|
|
||||||
mark_as_advanced(EtherCAT_LIBRARY EtherCAT_INCLUDE_DIR)
|
mark_as_advanced(EtherCAT_LIBRARY EtherCAT_INCLUDE_DIR)
|
||||||
|
|||||||
Binary file not shown.
@ -38,4 +38,4 @@ dlopen=''
|
|||||||
dlpreopen=''
|
dlpreopen=''
|
||||||
|
|
||||||
# Directory that this library needs to be installed in:
|
# Directory that this library needs to be installed in:
|
||||||
libdir='/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/lib'
|
libdir='/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/lib'
|
||||||
|
|||||||
Binary file not shown.
@ -21,10 +21,10 @@
|
|||||||
# vim: tw=78 noexpandtab
|
# vim: tw=78 noexpandtab
|
||||||
#
|
#
|
||||||
|
|
||||||
prefix=/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0
|
prefix=/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0
|
||||||
exec_prefix=${prefix}
|
exec_prefix=${prefix}
|
||||||
libdir=/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/lib
|
libdir=/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/lib
|
||||||
includedir=/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/include
|
includedir=/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/include
|
||||||
|
|
||||||
Name: libethercat
|
Name: libethercat
|
||||||
Description: Client support library for the EtherCAT Master
|
Description: Client support library for the EtherCAT Master
|
||||||
|
|||||||
@ -31,8 +31,8 @@ Description=EtherCAT Master Kernel Modules
|
|||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/sbin/ethercatctl start
|
ExecStart=/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/sbin/ethercatctl start
|
||||||
ExecStop=/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/sbin/ethercatctl stop
|
ExecStop=/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/sbin/ethercatctl stop
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|||||||
@ -31,7 +31,7 @@ RMMOD="/sbin/rmmod"
|
|||||||
MODINFO="/sbin/modinfo"
|
MODINFO="/sbin/modinfo"
|
||||||
IP="/sbin/ip"
|
IP="/sbin/ip"
|
||||||
|
|
||||||
ETHERCAT="/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/bin/ethercat"
|
ETHERCAT="/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/bin/ethercat"
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ if [ "$1" = "-c" ]; then
|
|||||||
ETHERCAT_CONFIG="$2"
|
ETHERCAT_CONFIG="$2"
|
||||||
COMMAND="$3"
|
COMMAND="$3"
|
||||||
else
|
else
|
||||||
ETHERCAT_CONFIG="/home/lgv/cmvr/0-workspace/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/etc/ethercat.conf"
|
ETHERCAT_CONFIG="/mnt/data/cmvr/cmvr-es/dependency/x86/third_party/ethercat/v1.7.0/etc/ethercat.conf"
|
||||||
COMMAND="$1"
|
COMMAND="$1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
BIN
dependency/x86/third_party/ffmpeg/v6.1/bin/ffmpeg
vendored
Executable file
BIN
dependency/x86/third_party/ffmpeg/v6.1/bin/ffmpeg
vendored
Executable file
Binary file not shown.
BIN
dependency/x86/third_party/ffmpeg/v6.1/bin/ffprobe
vendored
Executable file
BIN
dependency/x86/third_party/ffmpeg/v6.1/bin/ffprobe
vendored
Executable file
Binary file not shown.
36
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/ac3_parser.h
vendored
Normal file
36
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/ac3_parser.h
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* AC-3 parser prototypes
|
||||||
|
* Copyright (c) 2003 Fabrice Bellard
|
||||||
|
* Copyright (c) 2003 Michael Niedermayer
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_AC3_PARSER_H
|
||||||
|
#define AVCODEC_AC3_PARSER_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the bitstream ID and the frame size from AC-3 data.
|
||||||
|
*/
|
||||||
|
int av_ac3_parse_header(const uint8_t *buf, size_t size,
|
||||||
|
uint8_t *bitstream_id, uint16_t *frame_size);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* AVCODEC_AC3_PARSER_H */
|
||||||
37
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/adts_parser.h
vendored
Normal file
37
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/adts_parser.h
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_ADTS_PARSER_H
|
||||||
|
#define AVCODEC_ADTS_PARSER_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define AV_AAC_ADTS_HEADER_SIZE 7
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the number of samples and frames from AAC data.
|
||||||
|
* @param[in] buf pointer to AAC data buffer
|
||||||
|
* @param[out] samples Pointer to where number of samples is written
|
||||||
|
* @param[out] frames Pointer to where number of frames is written
|
||||||
|
* @return Returns 0 on success, error code on failure.
|
||||||
|
*/
|
||||||
|
int av_adts_header_parse(const uint8_t *buf, uint32_t *samples,
|
||||||
|
uint8_t *frames);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_ADTS_PARSER_H */
|
||||||
3158
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/avcodec.h
vendored
Normal file
3158
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/avcodec.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
88
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/avdct.h
vendored
Normal file
88
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/avdct.h
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_AVDCT_H
|
||||||
|
#define AVCODEC_AVDCT_H
|
||||||
|
|
||||||
|
#include "libavutil/opt.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AVDCT context.
|
||||||
|
* @note function pointers can be NULL if the specific features have been
|
||||||
|
* disabled at build time.
|
||||||
|
*/
|
||||||
|
typedef struct AVDCT {
|
||||||
|
const AVClass *av_class;
|
||||||
|
|
||||||
|
void (*idct)(int16_t *block /* align 16 */);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IDCT input permutation.
|
||||||
|
* Several optimized IDCTs need a permutated input (relative to the
|
||||||
|
* normal order of the reference IDCT).
|
||||||
|
* This permutation must be performed before the idct_put/add.
|
||||||
|
* Note, normally this can be merged with the zigzag/alternate scan<br>
|
||||||
|
* An example to avoid confusion:
|
||||||
|
* - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...)
|
||||||
|
* - (x -> reference DCT -> reference IDCT -> x)
|
||||||
|
* - (x -> reference DCT -> simple_mmx_perm = idct_permutation
|
||||||
|
* -> simple_idct_mmx -> x)
|
||||||
|
* - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant
|
||||||
|
* -> simple_idct_mmx -> ...)
|
||||||
|
*/
|
||||||
|
uint8_t idct_permutation[64];
|
||||||
|
|
||||||
|
void (*fdct)(int16_t *block /* align 16 */);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DCT algorithm.
|
||||||
|
* must use AVOptions to set this field.
|
||||||
|
*/
|
||||||
|
int dct_algo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IDCT algorithm.
|
||||||
|
* must use AVOptions to set this field.
|
||||||
|
*/
|
||||||
|
int idct_algo;
|
||||||
|
|
||||||
|
void (*get_pixels)(int16_t *block /* align 16 */,
|
||||||
|
const uint8_t *pixels /* align 8 */,
|
||||||
|
ptrdiff_t line_size);
|
||||||
|
|
||||||
|
int bits_per_sample;
|
||||||
|
|
||||||
|
void (*get_pixels_unaligned)(int16_t *block /* align 16 */,
|
||||||
|
const uint8_t *pixels,
|
||||||
|
ptrdiff_t line_size);
|
||||||
|
} AVDCT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a AVDCT context.
|
||||||
|
* This needs to be initialized with avcodec_dct_init() after optionally
|
||||||
|
* configuring it with AVOptions.
|
||||||
|
*
|
||||||
|
* To free it use av_free()
|
||||||
|
*/
|
||||||
|
AVDCT *avcodec_dct_alloc(void);
|
||||||
|
int avcodec_dct_init(AVDCT *);
|
||||||
|
|
||||||
|
const AVClass *avcodec_dct_get_class(void);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_AVDCT_H */
|
||||||
149
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/avfft.h
vendored
Normal file
149
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/avfft.h
vendored
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_AVFFT_H
|
||||||
|
#define AVCODEC_AVFFT_H
|
||||||
|
|
||||||
|
#include "libavutil/attributes.h"
|
||||||
|
#include "version_major.h"
|
||||||
|
#if FF_API_AVFFT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavc_fft
|
||||||
|
* FFT functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_fft FFT functions
|
||||||
|
* @ingroup lavc_misc
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef float FFTSample;
|
||||||
|
|
||||||
|
typedef struct FFTComplex {
|
||||||
|
FFTSample re, im;
|
||||||
|
} FFTComplex;
|
||||||
|
|
||||||
|
typedef struct FFTContext FFTContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up a complex FFT.
|
||||||
|
* @param nbits log2 of the length of the input array
|
||||||
|
* @param inverse if 0 perform the forward transform, if 1 perform the inverse
|
||||||
|
* @deprecated use av_tx_init from libavutil/tx.h with a type of AV_TX_FLOAT_FFT
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
FFTContext *av_fft_init(int nbits, int inverse);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do the permutation needed BEFORE calling ff_fft_calc().
|
||||||
|
* @deprecated without replacement
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
void av_fft_permute(FFTContext *s, FFTComplex *z);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do a complex FFT with the parameters defined in av_fft_init(). The
|
||||||
|
* input data must be permuted before. No 1.0/sqrt(n) normalization is done.
|
||||||
|
* @deprecated use the av_tx_fn value returned by av_tx_init, which also does permutation
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
void av_fft_calc(FFTContext *s, FFTComplex *z);
|
||||||
|
|
||||||
|
attribute_deprecated
|
||||||
|
void av_fft_end(FFTContext *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated use av_tx_init from libavutil/tx.h with a type of AV_TX_FLOAT_MDCT,
|
||||||
|
* with a flag of AV_TX_FULL_IMDCT for a replacement to av_imdct_calc.
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
FFTContext *av_mdct_init(int nbits, int inverse, double scale);
|
||||||
|
attribute_deprecated
|
||||||
|
void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||||
|
attribute_deprecated
|
||||||
|
void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||||
|
attribute_deprecated
|
||||||
|
void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
|
||||||
|
attribute_deprecated
|
||||||
|
void av_mdct_end(FFTContext *s);
|
||||||
|
|
||||||
|
/* Real Discrete Fourier Transform */
|
||||||
|
|
||||||
|
enum RDFTransformType {
|
||||||
|
DFT_R2C,
|
||||||
|
IDFT_C2R,
|
||||||
|
IDFT_R2C,
|
||||||
|
DFT_C2R,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct RDFTContext RDFTContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up a real FFT.
|
||||||
|
* @param nbits log2 of the length of the input array
|
||||||
|
* @param trans the type of transform
|
||||||
|
*
|
||||||
|
* @deprecated use av_tx_init from libavutil/tx.h with a type of AV_TX_FLOAT_RDFT
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans);
|
||||||
|
attribute_deprecated
|
||||||
|
void av_rdft_calc(RDFTContext *s, FFTSample *data);
|
||||||
|
attribute_deprecated
|
||||||
|
void av_rdft_end(RDFTContext *s);
|
||||||
|
|
||||||
|
/* Discrete Cosine Transform */
|
||||||
|
|
||||||
|
typedef struct DCTContext DCTContext;
|
||||||
|
|
||||||
|
enum DCTTransformType {
|
||||||
|
DCT_II = 0,
|
||||||
|
DCT_III,
|
||||||
|
DCT_I,
|
||||||
|
DST_I,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up DCT.
|
||||||
|
*
|
||||||
|
* @param nbits size of the input array:
|
||||||
|
* (1 << nbits) for DCT-II, DCT-III and DST-I
|
||||||
|
* (1 << nbits) + 1 for DCT-I
|
||||||
|
* @param type the type of transform
|
||||||
|
*
|
||||||
|
* @note the first element of the input of DST-I is ignored
|
||||||
|
*
|
||||||
|
* @deprecated use av_tx_init from libavutil/tx.h with an appropriate type of AV_TX_FLOAT_DCT
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
DCTContext *av_dct_init(int nbits, enum DCTTransformType type);
|
||||||
|
attribute_deprecated
|
||||||
|
void av_dct_calc(DCTContext *s, FFTSample *data);
|
||||||
|
attribute_deprecated
|
||||||
|
void av_dct_end (DCTContext *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* FF_API_AVFFT */
|
||||||
|
#endif /* AVCODEC_AVFFT_H */
|
||||||
332
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/bsf.h
vendored
Normal file
332
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/bsf.h
vendored
Normal file
@ -0,0 +1,332 @@
|
|||||||
|
/*
|
||||||
|
* Bitstream filters public API
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_BSF_H
|
||||||
|
#define AVCODEC_BSF_H
|
||||||
|
|
||||||
|
#include "libavutil/dict.h"
|
||||||
|
#include "libavutil/log.h"
|
||||||
|
#include "libavutil/rational.h"
|
||||||
|
|
||||||
|
#include "codec_id.h"
|
||||||
|
#include "codec_par.h"
|
||||||
|
#include "packet.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_bsf Bitstream filters
|
||||||
|
* @ingroup libavc
|
||||||
|
*
|
||||||
|
* Bitstream filters transform encoded media data without decoding it. This
|
||||||
|
* allows e.g. manipulating various header values. Bitstream filters operate on
|
||||||
|
* @ref AVPacket "AVPackets".
|
||||||
|
*
|
||||||
|
* The bitstream filtering API is centered around two structures:
|
||||||
|
* AVBitStreamFilter and AVBSFContext. The former represents a bitstream filter
|
||||||
|
* in abstract, the latter a specific filtering process. Obtain an
|
||||||
|
* AVBitStreamFilter using av_bsf_get_by_name() or av_bsf_iterate(), then pass
|
||||||
|
* it to av_bsf_alloc() to create an AVBSFContext. Fill in the user-settable
|
||||||
|
* AVBSFContext fields, as described in its documentation, then call
|
||||||
|
* av_bsf_init() to prepare the filter context for use.
|
||||||
|
*
|
||||||
|
* Submit packets for filtering using av_bsf_send_packet(), obtain filtered
|
||||||
|
* results with av_bsf_receive_packet(). When no more input packets will be
|
||||||
|
* sent, submit a NULL AVPacket to signal the end of the stream to the filter.
|
||||||
|
* av_bsf_receive_packet() will then return trailing packets, if any are
|
||||||
|
* produced by the filter.
|
||||||
|
*
|
||||||
|
* Finally, free the filter context with av_bsf_free().
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The bitstream filter state.
|
||||||
|
*
|
||||||
|
* This struct must be allocated with av_bsf_alloc() and freed with
|
||||||
|
* av_bsf_free().
|
||||||
|
*
|
||||||
|
* The fields in the struct will only be changed (by the caller or by the
|
||||||
|
* filter) as described in their documentation, and are to be considered
|
||||||
|
* immutable otherwise.
|
||||||
|
*/
|
||||||
|
typedef struct AVBSFContext {
|
||||||
|
/**
|
||||||
|
* A class for logging and AVOptions
|
||||||
|
*/
|
||||||
|
const AVClass *av_class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The bitstream filter this context is an instance of.
|
||||||
|
*/
|
||||||
|
const struct AVBitStreamFilter *filter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque filter-specific private data. If filter->priv_class is non-NULL,
|
||||||
|
* this is an AVOptions-enabled struct.
|
||||||
|
*/
|
||||||
|
void *priv_data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parameters of the input stream. This field is allocated in
|
||||||
|
* av_bsf_alloc(), it needs to be filled by the caller before
|
||||||
|
* av_bsf_init().
|
||||||
|
*/
|
||||||
|
AVCodecParameters *par_in;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parameters of the output stream. This field is allocated in
|
||||||
|
* av_bsf_alloc(), it is set by the filter in av_bsf_init().
|
||||||
|
*/
|
||||||
|
AVCodecParameters *par_out;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timebase used for the timestamps of the input packets. Set by the
|
||||||
|
* caller before av_bsf_init().
|
||||||
|
*/
|
||||||
|
AVRational time_base_in;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timebase used for the timestamps of the output packets. Set by the
|
||||||
|
* filter in av_bsf_init().
|
||||||
|
*/
|
||||||
|
AVRational time_base_out;
|
||||||
|
} AVBSFContext;
|
||||||
|
|
||||||
|
typedef struct AVBitStreamFilter {
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of codec ids supported by the filter, terminated by
|
||||||
|
* AV_CODEC_ID_NONE.
|
||||||
|
* May be NULL, in that case the bitstream filter works with any codec id.
|
||||||
|
*/
|
||||||
|
const enum AVCodecID *codec_ids;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class for the private data, used to declare bitstream filter private
|
||||||
|
* AVOptions. This field is NULL for bitstream filters that do not declare
|
||||||
|
* any options.
|
||||||
|
*
|
||||||
|
* If this field is non-NULL, the first member of the filter private data
|
||||||
|
* must be a pointer to AVClass, which will be set by libavcodec generic
|
||||||
|
* code to this class.
|
||||||
|
*/
|
||||||
|
const AVClass *priv_class;
|
||||||
|
} AVBitStreamFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a bitstream filter with the specified name or NULL if no such
|
||||||
|
* bitstream filter exists.
|
||||||
|
*/
|
||||||
|
const AVBitStreamFilter *av_bsf_get_by_name(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate over all registered bitstream filters.
|
||||||
|
*
|
||||||
|
* @param opaque a pointer where libavcodec will store the iteration state. Must
|
||||||
|
* point to NULL to start the iteration.
|
||||||
|
*
|
||||||
|
* @return the next registered bitstream filter or NULL when the iteration is
|
||||||
|
* finished
|
||||||
|
*/
|
||||||
|
const AVBitStreamFilter *av_bsf_iterate(void **opaque);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a context for a given bitstream filter. The caller must fill in the
|
||||||
|
* context parameters as described in the documentation and then call
|
||||||
|
* av_bsf_init() before sending any data to the filter.
|
||||||
|
*
|
||||||
|
* @param filter the filter for which to allocate an instance.
|
||||||
|
* @param[out] ctx a pointer into which the pointer to the newly-allocated context
|
||||||
|
* will be written. It must be freed with av_bsf_free() after the
|
||||||
|
* filtering is done.
|
||||||
|
*
|
||||||
|
* @return 0 on success, a negative AVERROR code on failure
|
||||||
|
*/
|
||||||
|
int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare the filter for use, after all the parameters and options have been
|
||||||
|
* set.
|
||||||
|
*
|
||||||
|
* @param ctx a AVBSFContext previously allocated with av_bsf_alloc()
|
||||||
|
*/
|
||||||
|
int av_bsf_init(AVBSFContext *ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submit a packet for filtering.
|
||||||
|
*
|
||||||
|
* After sending each packet, the filter must be completely drained by calling
|
||||||
|
* av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or
|
||||||
|
* AVERROR_EOF.
|
||||||
|
*
|
||||||
|
* @param ctx an initialized AVBSFContext
|
||||||
|
* @param pkt the packet to filter. The bitstream filter will take ownership of
|
||||||
|
* the packet and reset the contents of pkt. pkt is not touched if an error occurs.
|
||||||
|
* If pkt is empty (i.e. NULL, or pkt->data is NULL and pkt->side_data_elems zero),
|
||||||
|
* it signals the end of the stream (i.e. no more non-empty packets will be sent;
|
||||||
|
* sending more empty packets does nothing) and will cause the filter to output
|
||||||
|
* any packets it may have buffered internally.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - 0 on success.
|
||||||
|
* - AVERROR(EAGAIN) if packets need to be retrieved from the filter (using
|
||||||
|
* av_bsf_receive_packet()) before new input can be consumed.
|
||||||
|
* - Another negative AVERROR value if an error occurs.
|
||||||
|
*/
|
||||||
|
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a filtered packet.
|
||||||
|
*
|
||||||
|
* @param ctx an initialized AVBSFContext
|
||||||
|
* @param[out] pkt this struct will be filled with the contents of the filtered
|
||||||
|
* packet. It is owned by the caller and must be freed using
|
||||||
|
* av_packet_unref() when it is no longer needed.
|
||||||
|
* This parameter should be "clean" (i.e. freshly allocated
|
||||||
|
* with av_packet_alloc() or unreffed with av_packet_unref())
|
||||||
|
* when this function is called. If this function returns
|
||||||
|
* successfully, the contents of pkt will be completely
|
||||||
|
* overwritten by the returned data. On failure, pkt is not
|
||||||
|
* touched.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - 0 on success.
|
||||||
|
* - AVERROR(EAGAIN) if more packets need to be sent to the filter (using
|
||||||
|
* av_bsf_send_packet()) to get more output.
|
||||||
|
* - AVERROR_EOF if there will be no further output from the filter.
|
||||||
|
* - Another negative AVERROR value if an error occurs.
|
||||||
|
*
|
||||||
|
* @note one input packet may result in several output packets, so after sending
|
||||||
|
* a packet with av_bsf_send_packet(), this function needs to be called
|
||||||
|
* repeatedly until it stops returning 0. It is also possible for a filter to
|
||||||
|
* output fewer packets than were sent to it, so this function may return
|
||||||
|
* AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call.
|
||||||
|
*/
|
||||||
|
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the internal bitstream filter state. Should be called e.g. when seeking.
|
||||||
|
*/
|
||||||
|
void av_bsf_flush(AVBSFContext *ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free a bitstream filter context and everything associated with it; write NULL
|
||||||
|
* into the supplied pointer.
|
||||||
|
*/
|
||||||
|
void av_bsf_free(AVBSFContext **ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the AVClass for AVBSFContext. It can be used in combination with
|
||||||
|
* AV_OPT_SEARCH_FAKE_OBJ for examining options.
|
||||||
|
*
|
||||||
|
* @see av_opt_find().
|
||||||
|
*/
|
||||||
|
const AVClass *av_bsf_get_class(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure for chain/list of bitstream filters.
|
||||||
|
* Empty list can be allocated by av_bsf_list_alloc().
|
||||||
|
*/
|
||||||
|
typedef struct AVBSFList AVBSFList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate empty list of bitstream filters.
|
||||||
|
* The list must be later freed by av_bsf_list_free()
|
||||||
|
* or finalized by av_bsf_list_finalize().
|
||||||
|
*
|
||||||
|
* @return Pointer to @ref AVBSFList on success, NULL in case of failure
|
||||||
|
*/
|
||||||
|
AVBSFList *av_bsf_list_alloc(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free list of bitstream filters.
|
||||||
|
*
|
||||||
|
* @param lst Pointer to pointer returned by av_bsf_list_alloc()
|
||||||
|
*/
|
||||||
|
void av_bsf_list_free(AVBSFList **lst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append bitstream filter to the list of bitstream filters.
|
||||||
|
*
|
||||||
|
* @param lst List to append to
|
||||||
|
* @param bsf Filter context to be appended
|
||||||
|
*
|
||||||
|
* @return >=0 on success, negative AVERROR in case of failure
|
||||||
|
*/
|
||||||
|
int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct new bitstream filter context given it's name and options
|
||||||
|
* and append it to the list of bitstream filters.
|
||||||
|
*
|
||||||
|
* @param lst List to append to
|
||||||
|
* @param bsf_name Name of the bitstream filter
|
||||||
|
* @param options Options for the bitstream filter, can be set to NULL
|
||||||
|
*
|
||||||
|
* @return >=0 on success, negative AVERROR in case of failure
|
||||||
|
*/
|
||||||
|
int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options);
|
||||||
|
/**
|
||||||
|
* Finalize list of bitstream filters.
|
||||||
|
*
|
||||||
|
* This function will transform @ref AVBSFList to single @ref AVBSFContext,
|
||||||
|
* so the whole chain of bitstream filters can be treated as single filter
|
||||||
|
* freshly allocated by av_bsf_alloc().
|
||||||
|
* If the call is successful, @ref AVBSFList structure is freed and lst
|
||||||
|
* will be set to NULL. In case of failure, caller is responsible for
|
||||||
|
* freeing the structure by av_bsf_list_free()
|
||||||
|
*
|
||||||
|
* @param lst Filter list structure to be transformed
|
||||||
|
* @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure
|
||||||
|
* representing the chain of bitstream filters
|
||||||
|
*
|
||||||
|
* @return >=0 on success, negative AVERROR in case of failure
|
||||||
|
*/
|
||||||
|
int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse string describing list of bitstream filters and create single
|
||||||
|
* @ref AVBSFContext describing the whole chain of bitstream filters.
|
||||||
|
* Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly
|
||||||
|
* allocated by av_bsf_alloc().
|
||||||
|
*
|
||||||
|
* @param str String describing chain of bitstream filters in format
|
||||||
|
* `bsf1[=opt1=val1:opt2=val2][,bsf2]`
|
||||||
|
* @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure
|
||||||
|
* representing the chain of bitstream filters
|
||||||
|
*
|
||||||
|
* @return >=0 on success, negative AVERROR in case of failure
|
||||||
|
*/
|
||||||
|
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get null/pass-through bitstream filter.
|
||||||
|
*
|
||||||
|
* @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int av_bsf_get_null_filter(AVBSFContext **bsf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // AVCODEC_BSF_H
|
||||||
378
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/codec.h
vendored
Normal file
378
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/codec.h
vendored
Normal file
@ -0,0 +1,378 @@
|
|||||||
|
/*
|
||||||
|
* AVCodec public API
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_CODEC_H
|
||||||
|
#define AVCODEC_CODEC_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "libavutil/avutil.h"
|
||||||
|
#include "libavutil/hwcontext.h"
|
||||||
|
#include "libavutil/log.h"
|
||||||
|
#include "libavutil/pixfmt.h"
|
||||||
|
#include "libavutil/rational.h"
|
||||||
|
#include "libavutil/samplefmt.h"
|
||||||
|
|
||||||
|
#include "libavcodec/codec_id.h"
|
||||||
|
#include "libavcodec/version_major.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup lavc_core
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decoder can use draw_horiz_band callback.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0)
|
||||||
|
/**
|
||||||
|
* Codec uses get_buffer() or get_encode_buffer() for allocating buffers and
|
||||||
|
* supports custom allocators.
|
||||||
|
* If not set, it might not use get_buffer() or get_encode_buffer() at all, or
|
||||||
|
* use operations that assume the buffer was allocated by
|
||||||
|
* avcodec_default_get_buffer2 or avcodec_default_get_encode_buffer.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_DR1 (1 << 1)
|
||||||
|
/**
|
||||||
|
* Encoder or decoder requires flushing with NULL input at the end in order to
|
||||||
|
* give the complete and correct output.
|
||||||
|
*
|
||||||
|
* NOTE: If this flag is not set, the codec is guaranteed to never be fed with
|
||||||
|
* with NULL data. The user can still send NULL data to the public encode
|
||||||
|
* or decode function, but libavcodec will not pass it along to the codec
|
||||||
|
* unless this flag is set.
|
||||||
|
*
|
||||||
|
* Decoders:
|
||||||
|
* The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
|
||||||
|
* avpkt->size=0 at the end to get the delayed data until the decoder no longer
|
||||||
|
* returns frames.
|
||||||
|
*
|
||||||
|
* Encoders:
|
||||||
|
* The encoder needs to be fed with NULL data at the end of encoding until the
|
||||||
|
* encoder no longer returns data.
|
||||||
|
*
|
||||||
|
* NOTE: For encoders implementing the AVCodec.encode2() function, setting this
|
||||||
|
* flag also means that the encoder must set the pts and duration for
|
||||||
|
* each output packet. If this flag is not set, the pts and duration will
|
||||||
|
* be determined by libavcodec from the input frame.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_DELAY (1 << 5)
|
||||||
|
/**
|
||||||
|
* Codec can be fed a final frame with a smaller size.
|
||||||
|
* This can be used to prevent truncation of the last audio samples.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6)
|
||||||
|
|
||||||
|
#if FF_API_SUBFRAMES
|
||||||
|
/**
|
||||||
|
* Codec can output multiple frames per AVPacket
|
||||||
|
* Normally demuxers return one frame at a time, demuxers which do not do
|
||||||
|
* are connected to a parser to split what they return into proper frames.
|
||||||
|
* This flag is reserved to the very rare category of codecs which have a
|
||||||
|
* bitstream that cannot be split into frames without timeconsuming
|
||||||
|
* operations like full decoding. Demuxers carrying such bitstreams thus
|
||||||
|
* may return multiple frames in a packet. This has many disadvantages like
|
||||||
|
* prohibiting stream copy in many cases thus it should only be considered
|
||||||
|
* as a last resort.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_SUBFRAMES (1 << 8)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Codec is experimental and is thus avoided in favor of non experimental
|
||||||
|
* encoders
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9)
|
||||||
|
/**
|
||||||
|
* Codec should fill in channel configuration and samplerate instead of container
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10)
|
||||||
|
/**
|
||||||
|
* Codec supports frame-level multithreading.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_FRAME_THREADS (1 << 12)
|
||||||
|
/**
|
||||||
|
* Codec supports slice-based (or partition-based) multithreading.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_SLICE_THREADS (1 << 13)
|
||||||
|
/**
|
||||||
|
* Codec supports changed parameters at any point.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14)
|
||||||
|
/**
|
||||||
|
* Codec supports multithreading through a method other than slice- or
|
||||||
|
* frame-level multithreading. Typically this marks wrappers around
|
||||||
|
* multithreading-capable external libraries.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_OTHER_THREADS (1 << 15)
|
||||||
|
/**
|
||||||
|
* Audio encoder supports receiving a different number of samples in each call.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16)
|
||||||
|
/**
|
||||||
|
* Decoder is not a preferred choice for probing.
|
||||||
|
* This indicates that the decoder is not a good choice for probing.
|
||||||
|
* It could for example be an expensive to spin up hardware decoder,
|
||||||
|
* or it could simply not provide a lot of useful information about
|
||||||
|
* the stream.
|
||||||
|
* A decoder marked with this flag should only be used as last resort
|
||||||
|
* choice for probing.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_AVOID_PROBING (1 << 17)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Codec is backed by a hardware implementation. Typically used to
|
||||||
|
* identify a non-hwaccel hardware decoder. For information about hwaccels, use
|
||||||
|
* avcodec_get_hw_config() instead.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_HARDWARE (1 << 18)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Codec is potentially backed by a hardware implementation, but not
|
||||||
|
* necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the
|
||||||
|
* implementation provides some sort of internal fallback.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_HYBRID (1 << 19)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This encoder can reorder user opaque values from input AVFrames and return
|
||||||
|
* them with corresponding output packets.
|
||||||
|
* @see AV_CODEC_FLAG_COPY_OPAQUE
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This encoder can be flushed using avcodec_flush_buffers(). If this flag is
|
||||||
|
* not set, the encoder must be closed and reopened to ensure that no frames
|
||||||
|
* remain pending.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_ENCODER_FLUSH (1 << 21)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The encoder is able to output reconstructed frame data, i.e. raw frames that
|
||||||
|
* would be produced by decoding the encoded bitstream.
|
||||||
|
*
|
||||||
|
* Reconstructed frame output is enabled by the AV_CODEC_FLAG_RECON_FRAME flag.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_CAP_ENCODER_RECON_FRAME (1 << 22)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AVProfile.
|
||||||
|
*/
|
||||||
|
typedef struct AVProfile {
|
||||||
|
int profile;
|
||||||
|
const char *name; ///< short name for the profile
|
||||||
|
} AVProfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AVCodec.
|
||||||
|
*/
|
||||||
|
typedef struct AVCodec {
|
||||||
|
/**
|
||||||
|
* Name of the codec implementation.
|
||||||
|
* The name is globally unique among encoders and among decoders (but an
|
||||||
|
* encoder and a decoder can share the same name).
|
||||||
|
* This is the primary way to find a codec from the user perspective.
|
||||||
|
*/
|
||||||
|
const char *name;
|
||||||
|
/**
|
||||||
|
* Descriptive name for the codec, meant to be more human readable than name.
|
||||||
|
* You should use the NULL_IF_CONFIG_SMALL() macro to define it.
|
||||||
|
*/
|
||||||
|
const char *long_name;
|
||||||
|
enum AVMediaType type;
|
||||||
|
enum AVCodecID id;
|
||||||
|
/**
|
||||||
|
* Codec capabilities.
|
||||||
|
* see AV_CODEC_CAP_*
|
||||||
|
*/
|
||||||
|
int capabilities;
|
||||||
|
uint8_t max_lowres; ///< maximum value for lowres supported by the decoder
|
||||||
|
const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0}
|
||||||
|
const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1
|
||||||
|
const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
|
||||||
|
const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
|
||||||
|
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||||
|
/**
|
||||||
|
* @deprecated use ch_layouts instead
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
|
||||||
|
#endif
|
||||||
|
const AVClass *priv_class; ///< AVClass for the private context
|
||||||
|
const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {AV_PROFILE_UNKNOWN}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Group name of the codec implementation.
|
||||||
|
* This is a short symbolic name of the wrapper backing this codec. A
|
||||||
|
* wrapper uses some kind of external implementation for the codec, such
|
||||||
|
* as an external library, or a codec implementation provided by the OS or
|
||||||
|
* the hardware.
|
||||||
|
* If this field is NULL, this is a builtin, libavcodec native codec.
|
||||||
|
* If non-NULL, this will be the suffix in AVCodec.name in most cases
|
||||||
|
* (usually AVCodec.name will be of the form "<codec_name>_<wrapper_name>").
|
||||||
|
*/
|
||||||
|
const char *wrapper_name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of supported channel layouts, terminated with a zeroed layout.
|
||||||
|
*/
|
||||||
|
const AVChannelLayout *ch_layouts;
|
||||||
|
} AVCodec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate over all registered codecs.
|
||||||
|
*
|
||||||
|
* @param opaque a pointer where libavcodec will store the iteration state. Must
|
||||||
|
* point to NULL to start the iteration.
|
||||||
|
*
|
||||||
|
* @return the next registered codec or NULL when the iteration is
|
||||||
|
* finished
|
||||||
|
*/
|
||||||
|
const AVCodec *av_codec_iterate(void **opaque);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a registered decoder with a matching codec ID.
|
||||||
|
*
|
||||||
|
* @param id AVCodecID of the requested decoder
|
||||||
|
* @return A decoder if one was found, NULL otherwise.
|
||||||
|
*/
|
||||||
|
const AVCodec *avcodec_find_decoder(enum AVCodecID id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a registered decoder with the specified name.
|
||||||
|
*
|
||||||
|
* @param name name of the requested decoder
|
||||||
|
* @return A decoder if one was found, NULL otherwise.
|
||||||
|
*/
|
||||||
|
const AVCodec *avcodec_find_decoder_by_name(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a registered encoder with a matching codec ID.
|
||||||
|
*
|
||||||
|
* @param id AVCodecID of the requested encoder
|
||||||
|
* @return An encoder if one was found, NULL otherwise.
|
||||||
|
*/
|
||||||
|
const AVCodec *avcodec_find_encoder(enum AVCodecID id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a registered encoder with the specified name.
|
||||||
|
*
|
||||||
|
* @param name name of the requested encoder
|
||||||
|
* @return An encoder if one was found, NULL otherwise.
|
||||||
|
*/
|
||||||
|
const AVCodec *avcodec_find_encoder_by_name(const char *name);
|
||||||
|
/**
|
||||||
|
* @return a non-zero number if codec is an encoder, zero otherwise
|
||||||
|
*/
|
||||||
|
int av_codec_is_encoder(const AVCodec *codec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a non-zero number if codec is a decoder, zero otherwise
|
||||||
|
*/
|
||||||
|
int av_codec_is_decoder(const AVCodec *codec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a name for the specified profile, if available.
|
||||||
|
*
|
||||||
|
* @param codec the codec that is searched for the given profile
|
||||||
|
* @param profile the profile value for which a name is requested
|
||||||
|
* @return A name for the profile if found, NULL otherwise.
|
||||||
|
*/
|
||||||
|
const char *av_get_profile_name(const AVCodec *codec, int profile);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/**
|
||||||
|
* The codec supports this format via the hw_device_ctx interface.
|
||||||
|
*
|
||||||
|
* When selecting this format, AVCodecContext.hw_device_ctx should
|
||||||
|
* have been set to a device of the specified type before calling
|
||||||
|
* avcodec_open2().
|
||||||
|
*/
|
||||||
|
AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01,
|
||||||
|
/**
|
||||||
|
* The codec supports this format via the hw_frames_ctx interface.
|
||||||
|
*
|
||||||
|
* When selecting this format for a decoder,
|
||||||
|
* AVCodecContext.hw_frames_ctx should be set to a suitable frames
|
||||||
|
* context inside the get_format() callback. The frames context
|
||||||
|
* must have been created on a device of the specified type.
|
||||||
|
*
|
||||||
|
* When selecting this format for an encoder,
|
||||||
|
* AVCodecContext.hw_frames_ctx should be set to the context which
|
||||||
|
* will be used for the input frames before calling avcodec_open2().
|
||||||
|
*/
|
||||||
|
AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02,
|
||||||
|
/**
|
||||||
|
* The codec supports this format by some internal method.
|
||||||
|
*
|
||||||
|
* This format can be selected without any additional configuration -
|
||||||
|
* no device or frames context is required.
|
||||||
|
*/
|
||||||
|
AV_CODEC_HW_CONFIG_METHOD_INTERNAL = 0x04,
|
||||||
|
/**
|
||||||
|
* The codec supports this format by some ad-hoc method.
|
||||||
|
*
|
||||||
|
* Additional settings and/or function calls are required. See the
|
||||||
|
* codec-specific documentation for details. (Methods requiring
|
||||||
|
* this sort of configuration are deprecated and others should be
|
||||||
|
* used in preference.)
|
||||||
|
*/
|
||||||
|
AV_CODEC_HW_CONFIG_METHOD_AD_HOC = 0x08,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct AVCodecHWConfig {
|
||||||
|
/**
|
||||||
|
* For decoders, a hardware pixel format which that decoder may be
|
||||||
|
* able to decode to if suitable hardware is available.
|
||||||
|
*
|
||||||
|
* For encoders, a pixel format which the encoder may be able to
|
||||||
|
* accept. If set to AV_PIX_FMT_NONE, this applies to all pixel
|
||||||
|
* formats supported by the codec.
|
||||||
|
*/
|
||||||
|
enum AVPixelFormat pix_fmt;
|
||||||
|
/**
|
||||||
|
* Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible
|
||||||
|
* setup methods which can be used with this configuration.
|
||||||
|
*/
|
||||||
|
int methods;
|
||||||
|
/**
|
||||||
|
* The device type associated with the configuration.
|
||||||
|
*
|
||||||
|
* Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and
|
||||||
|
* AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused.
|
||||||
|
*/
|
||||||
|
enum AVHWDeviceType device_type;
|
||||||
|
} AVCodecHWConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve supported hardware configurations for a codec.
|
||||||
|
*
|
||||||
|
* Values of index from zero to some maximum return the indexed configuration
|
||||||
|
* descriptor; all other values return NULL. If the codec does not support
|
||||||
|
* any hardware configurations then it will always return NULL.
|
||||||
|
*/
|
||||||
|
const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVCODEC_CODEC_H */
|
||||||
134
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/codec_desc.h
vendored
Normal file
134
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/codec_desc.h
vendored
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* Codec descriptors public API
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_CODEC_DESC_H
|
||||||
|
#define AVCODEC_CODEC_DESC_H
|
||||||
|
|
||||||
|
#include "libavutil/avutil.h"
|
||||||
|
|
||||||
|
#include "codec_id.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup lavc_core
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This struct describes the properties of a single codec described by an
|
||||||
|
* AVCodecID.
|
||||||
|
* @see avcodec_descriptor_get()
|
||||||
|
*/
|
||||||
|
typedef struct AVCodecDescriptor {
|
||||||
|
enum AVCodecID id;
|
||||||
|
enum AVMediaType type;
|
||||||
|
/**
|
||||||
|
* Name of the codec described by this descriptor. It is non-empty and
|
||||||
|
* unique for each codec descriptor. It should contain alphanumeric
|
||||||
|
* characters and '_' only.
|
||||||
|
*/
|
||||||
|
const char *name;
|
||||||
|
/**
|
||||||
|
* A more descriptive name for this codec. May be NULL.
|
||||||
|
*/
|
||||||
|
const char *long_name;
|
||||||
|
/**
|
||||||
|
* Codec properties, a combination of AV_CODEC_PROP_* flags.
|
||||||
|
*/
|
||||||
|
int props;
|
||||||
|
/**
|
||||||
|
* MIME type(s) associated with the codec.
|
||||||
|
* May be NULL; if not, a NULL-terminated array of MIME types.
|
||||||
|
* The first item is always non-NULL and is the preferred MIME type.
|
||||||
|
*/
|
||||||
|
const char *const *mime_types;
|
||||||
|
/**
|
||||||
|
* If non-NULL, an array of profiles recognized for this codec.
|
||||||
|
* Terminated with AV_PROFILE_UNKNOWN.
|
||||||
|
*/
|
||||||
|
const struct AVProfile *profiles;
|
||||||
|
} AVCodecDescriptor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Codec uses only intra compression.
|
||||||
|
* Video and audio codecs only.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_PROP_INTRA_ONLY (1 << 0)
|
||||||
|
/**
|
||||||
|
* Codec supports lossy compression. Audio and video codecs only.
|
||||||
|
* @note a codec may support both lossy and lossless
|
||||||
|
* compression modes
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_PROP_LOSSY (1 << 1)
|
||||||
|
/**
|
||||||
|
* Codec supports lossless compression. Audio and video codecs only.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_PROP_LOSSLESS (1 << 2)
|
||||||
|
/**
|
||||||
|
* Codec supports frame reordering. That is, the coded order (the order in which
|
||||||
|
* the encoded packets are output by the encoders / stored / input to the
|
||||||
|
* decoders) may be different from the presentation order of the corresponding
|
||||||
|
* frames.
|
||||||
|
*
|
||||||
|
* For codecs that do not have this property set, PTS and DTS should always be
|
||||||
|
* equal.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_PROP_REORDER (1 << 3)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video codec supports separate coding of fields in interlaced frames.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_PROP_FIELDS (1 << 4)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subtitle codec is bitmap based
|
||||||
|
* Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_PROP_BITMAP_SUB (1 << 16)
|
||||||
|
/**
|
||||||
|
* Subtitle codec is text based.
|
||||||
|
* Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field.
|
||||||
|
*/
|
||||||
|
#define AV_CODEC_PROP_TEXT_SUB (1 << 17)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return descriptor for given codec ID or NULL if no descriptor exists.
|
||||||
|
*/
|
||||||
|
const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate over all codec descriptors known to libavcodec.
|
||||||
|
*
|
||||||
|
* @param prev previous descriptor. NULL to get the first descriptor.
|
||||||
|
*
|
||||||
|
* @return next descriptor or NULL after the last descriptor
|
||||||
|
*/
|
||||||
|
const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return codec descriptor with the given name or NULL if no such descriptor
|
||||||
|
* exists.
|
||||||
|
*/
|
||||||
|
const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // AVCODEC_CODEC_DESC_H
|
||||||
668
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/codec_id.h
vendored
Normal file
668
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/codec_id.h
vendored
Normal file
@ -0,0 +1,668 @@
|
|||||||
|
/*
|
||||||
|
* Codec IDs
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_CODEC_ID_H
|
||||||
|
#define AVCODEC_CODEC_ID_H
|
||||||
|
|
||||||
|
#include "libavutil/avutil.h"
|
||||||
|
#include "libavutil/samplefmt.h"
|
||||||
|
|
||||||
|
#include "version_major.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup lavc_core
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identify the syntax and semantics of the bitstream.
|
||||||
|
* The principle is roughly:
|
||||||
|
* Two decoders with the same ID can decode the same streams.
|
||||||
|
* Two encoders with the same ID can encode compatible streams.
|
||||||
|
* There may be slight deviations from the principle due to implementation
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* If you add a codec ID to this list, add it so that
|
||||||
|
* 1. no value of an existing codec ID changes (that would break ABI),
|
||||||
|
* 2. it is as close as possible to similar codecs
|
||||||
|
*
|
||||||
|
* After adding new codec IDs, do not forget to add an entry to the codec
|
||||||
|
* descriptor list and bump libavcodec minor version.
|
||||||
|
*/
|
||||||
|
enum AVCodecID {
|
||||||
|
AV_CODEC_ID_NONE,
|
||||||
|
|
||||||
|
/* video codecs */
|
||||||
|
AV_CODEC_ID_MPEG1VIDEO,
|
||||||
|
AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
|
||||||
|
AV_CODEC_ID_H261,
|
||||||
|
AV_CODEC_ID_H263,
|
||||||
|
AV_CODEC_ID_RV10,
|
||||||
|
AV_CODEC_ID_RV20,
|
||||||
|
AV_CODEC_ID_MJPEG,
|
||||||
|
AV_CODEC_ID_MJPEGB,
|
||||||
|
AV_CODEC_ID_LJPEG,
|
||||||
|
AV_CODEC_ID_SP5X,
|
||||||
|
AV_CODEC_ID_JPEGLS,
|
||||||
|
AV_CODEC_ID_MPEG4,
|
||||||
|
AV_CODEC_ID_RAWVIDEO,
|
||||||
|
AV_CODEC_ID_MSMPEG4V1,
|
||||||
|
AV_CODEC_ID_MSMPEG4V2,
|
||||||
|
AV_CODEC_ID_MSMPEG4V3,
|
||||||
|
AV_CODEC_ID_WMV1,
|
||||||
|
AV_CODEC_ID_WMV2,
|
||||||
|
AV_CODEC_ID_H263P,
|
||||||
|
AV_CODEC_ID_H263I,
|
||||||
|
AV_CODEC_ID_FLV1,
|
||||||
|
AV_CODEC_ID_SVQ1,
|
||||||
|
AV_CODEC_ID_SVQ3,
|
||||||
|
AV_CODEC_ID_DVVIDEO,
|
||||||
|
AV_CODEC_ID_HUFFYUV,
|
||||||
|
AV_CODEC_ID_CYUV,
|
||||||
|
AV_CODEC_ID_H264,
|
||||||
|
AV_CODEC_ID_INDEO3,
|
||||||
|
AV_CODEC_ID_VP3,
|
||||||
|
AV_CODEC_ID_THEORA,
|
||||||
|
AV_CODEC_ID_ASV1,
|
||||||
|
AV_CODEC_ID_ASV2,
|
||||||
|
AV_CODEC_ID_FFV1,
|
||||||
|
AV_CODEC_ID_4XM,
|
||||||
|
AV_CODEC_ID_VCR1,
|
||||||
|
AV_CODEC_ID_CLJR,
|
||||||
|
AV_CODEC_ID_MDEC,
|
||||||
|
AV_CODEC_ID_ROQ,
|
||||||
|
AV_CODEC_ID_INTERPLAY_VIDEO,
|
||||||
|
AV_CODEC_ID_XAN_WC3,
|
||||||
|
AV_CODEC_ID_XAN_WC4,
|
||||||
|
AV_CODEC_ID_RPZA,
|
||||||
|
AV_CODEC_ID_CINEPAK,
|
||||||
|
AV_CODEC_ID_WS_VQA,
|
||||||
|
AV_CODEC_ID_MSRLE,
|
||||||
|
AV_CODEC_ID_MSVIDEO1,
|
||||||
|
AV_CODEC_ID_IDCIN,
|
||||||
|
AV_CODEC_ID_8BPS,
|
||||||
|
AV_CODEC_ID_SMC,
|
||||||
|
AV_CODEC_ID_FLIC,
|
||||||
|
AV_CODEC_ID_TRUEMOTION1,
|
||||||
|
AV_CODEC_ID_VMDVIDEO,
|
||||||
|
AV_CODEC_ID_MSZH,
|
||||||
|
AV_CODEC_ID_ZLIB,
|
||||||
|
AV_CODEC_ID_QTRLE,
|
||||||
|
AV_CODEC_ID_TSCC,
|
||||||
|
AV_CODEC_ID_ULTI,
|
||||||
|
AV_CODEC_ID_QDRAW,
|
||||||
|
AV_CODEC_ID_VIXL,
|
||||||
|
AV_CODEC_ID_QPEG,
|
||||||
|
AV_CODEC_ID_PNG,
|
||||||
|
AV_CODEC_ID_PPM,
|
||||||
|
AV_CODEC_ID_PBM,
|
||||||
|
AV_CODEC_ID_PGM,
|
||||||
|
AV_CODEC_ID_PGMYUV,
|
||||||
|
AV_CODEC_ID_PAM,
|
||||||
|
AV_CODEC_ID_FFVHUFF,
|
||||||
|
AV_CODEC_ID_RV30,
|
||||||
|
AV_CODEC_ID_RV40,
|
||||||
|
AV_CODEC_ID_VC1,
|
||||||
|
AV_CODEC_ID_WMV3,
|
||||||
|
AV_CODEC_ID_LOCO,
|
||||||
|
AV_CODEC_ID_WNV1,
|
||||||
|
AV_CODEC_ID_AASC,
|
||||||
|
AV_CODEC_ID_INDEO2,
|
||||||
|
AV_CODEC_ID_FRAPS,
|
||||||
|
AV_CODEC_ID_TRUEMOTION2,
|
||||||
|
AV_CODEC_ID_BMP,
|
||||||
|
AV_CODEC_ID_CSCD,
|
||||||
|
AV_CODEC_ID_MMVIDEO,
|
||||||
|
AV_CODEC_ID_ZMBV,
|
||||||
|
AV_CODEC_ID_AVS,
|
||||||
|
AV_CODEC_ID_SMACKVIDEO,
|
||||||
|
AV_CODEC_ID_NUV,
|
||||||
|
AV_CODEC_ID_KMVC,
|
||||||
|
AV_CODEC_ID_FLASHSV,
|
||||||
|
AV_CODEC_ID_CAVS,
|
||||||
|
AV_CODEC_ID_JPEG2000,
|
||||||
|
AV_CODEC_ID_VMNC,
|
||||||
|
AV_CODEC_ID_VP5,
|
||||||
|
AV_CODEC_ID_VP6,
|
||||||
|
AV_CODEC_ID_VP6F,
|
||||||
|
AV_CODEC_ID_TARGA,
|
||||||
|
AV_CODEC_ID_DSICINVIDEO,
|
||||||
|
AV_CODEC_ID_TIERTEXSEQVIDEO,
|
||||||
|
AV_CODEC_ID_TIFF,
|
||||||
|
AV_CODEC_ID_GIF,
|
||||||
|
AV_CODEC_ID_DXA,
|
||||||
|
AV_CODEC_ID_DNXHD,
|
||||||
|
AV_CODEC_ID_THP,
|
||||||
|
AV_CODEC_ID_SGI,
|
||||||
|
AV_CODEC_ID_C93,
|
||||||
|
AV_CODEC_ID_BETHSOFTVID,
|
||||||
|
AV_CODEC_ID_PTX,
|
||||||
|
AV_CODEC_ID_TXD,
|
||||||
|
AV_CODEC_ID_VP6A,
|
||||||
|
AV_CODEC_ID_AMV,
|
||||||
|
AV_CODEC_ID_VB,
|
||||||
|
AV_CODEC_ID_PCX,
|
||||||
|
AV_CODEC_ID_SUNRAST,
|
||||||
|
AV_CODEC_ID_INDEO4,
|
||||||
|
AV_CODEC_ID_INDEO5,
|
||||||
|
AV_CODEC_ID_MIMIC,
|
||||||
|
AV_CODEC_ID_RL2,
|
||||||
|
AV_CODEC_ID_ESCAPE124,
|
||||||
|
AV_CODEC_ID_DIRAC,
|
||||||
|
AV_CODEC_ID_BFI,
|
||||||
|
AV_CODEC_ID_CMV,
|
||||||
|
AV_CODEC_ID_MOTIONPIXELS,
|
||||||
|
AV_CODEC_ID_TGV,
|
||||||
|
AV_CODEC_ID_TGQ,
|
||||||
|
AV_CODEC_ID_TQI,
|
||||||
|
AV_CODEC_ID_AURA,
|
||||||
|
AV_CODEC_ID_AURA2,
|
||||||
|
AV_CODEC_ID_V210X,
|
||||||
|
AV_CODEC_ID_TMV,
|
||||||
|
AV_CODEC_ID_V210,
|
||||||
|
AV_CODEC_ID_DPX,
|
||||||
|
AV_CODEC_ID_MAD,
|
||||||
|
AV_CODEC_ID_FRWU,
|
||||||
|
AV_CODEC_ID_FLASHSV2,
|
||||||
|
AV_CODEC_ID_CDGRAPHICS,
|
||||||
|
AV_CODEC_ID_R210,
|
||||||
|
AV_CODEC_ID_ANM,
|
||||||
|
AV_CODEC_ID_BINKVIDEO,
|
||||||
|
AV_CODEC_ID_IFF_ILBM,
|
||||||
|
#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM
|
||||||
|
AV_CODEC_ID_KGV1,
|
||||||
|
AV_CODEC_ID_YOP,
|
||||||
|
AV_CODEC_ID_VP8,
|
||||||
|
AV_CODEC_ID_PICTOR,
|
||||||
|
AV_CODEC_ID_ANSI,
|
||||||
|
AV_CODEC_ID_A64_MULTI,
|
||||||
|
AV_CODEC_ID_A64_MULTI5,
|
||||||
|
AV_CODEC_ID_R10K,
|
||||||
|
AV_CODEC_ID_MXPEG,
|
||||||
|
AV_CODEC_ID_LAGARITH,
|
||||||
|
AV_CODEC_ID_PRORES,
|
||||||
|
AV_CODEC_ID_JV,
|
||||||
|
AV_CODEC_ID_DFA,
|
||||||
|
AV_CODEC_ID_WMV3IMAGE,
|
||||||
|
AV_CODEC_ID_VC1IMAGE,
|
||||||
|
AV_CODEC_ID_UTVIDEO,
|
||||||
|
AV_CODEC_ID_BMV_VIDEO,
|
||||||
|
AV_CODEC_ID_VBLE,
|
||||||
|
AV_CODEC_ID_DXTORY,
|
||||||
|
AV_CODEC_ID_V410,
|
||||||
|
AV_CODEC_ID_XWD,
|
||||||
|
AV_CODEC_ID_CDXL,
|
||||||
|
AV_CODEC_ID_XBM,
|
||||||
|
AV_CODEC_ID_ZEROCODEC,
|
||||||
|
AV_CODEC_ID_MSS1,
|
||||||
|
AV_CODEC_ID_MSA1,
|
||||||
|
AV_CODEC_ID_TSCC2,
|
||||||
|
AV_CODEC_ID_MTS2,
|
||||||
|
AV_CODEC_ID_CLLC,
|
||||||
|
AV_CODEC_ID_MSS2,
|
||||||
|
AV_CODEC_ID_VP9,
|
||||||
|
AV_CODEC_ID_AIC,
|
||||||
|
AV_CODEC_ID_ESCAPE130,
|
||||||
|
AV_CODEC_ID_G2M,
|
||||||
|
AV_CODEC_ID_WEBP,
|
||||||
|
AV_CODEC_ID_HNM4_VIDEO,
|
||||||
|
AV_CODEC_ID_HEVC,
|
||||||
|
#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC
|
||||||
|
AV_CODEC_ID_FIC,
|
||||||
|
AV_CODEC_ID_ALIAS_PIX,
|
||||||
|
AV_CODEC_ID_BRENDER_PIX,
|
||||||
|
AV_CODEC_ID_PAF_VIDEO,
|
||||||
|
AV_CODEC_ID_EXR,
|
||||||
|
AV_CODEC_ID_VP7,
|
||||||
|
AV_CODEC_ID_SANM,
|
||||||
|
AV_CODEC_ID_SGIRLE,
|
||||||
|
AV_CODEC_ID_MVC1,
|
||||||
|
AV_CODEC_ID_MVC2,
|
||||||
|
AV_CODEC_ID_HQX,
|
||||||
|
AV_CODEC_ID_TDSC,
|
||||||
|
AV_CODEC_ID_HQ_HQA,
|
||||||
|
AV_CODEC_ID_HAP,
|
||||||
|
AV_CODEC_ID_DDS,
|
||||||
|
AV_CODEC_ID_DXV,
|
||||||
|
AV_CODEC_ID_SCREENPRESSO,
|
||||||
|
AV_CODEC_ID_RSCC,
|
||||||
|
AV_CODEC_ID_AVS2,
|
||||||
|
AV_CODEC_ID_PGX,
|
||||||
|
AV_CODEC_ID_AVS3,
|
||||||
|
AV_CODEC_ID_MSP2,
|
||||||
|
AV_CODEC_ID_VVC,
|
||||||
|
#define AV_CODEC_ID_H266 AV_CODEC_ID_VVC
|
||||||
|
AV_CODEC_ID_Y41P,
|
||||||
|
AV_CODEC_ID_AVRP,
|
||||||
|
AV_CODEC_ID_012V,
|
||||||
|
AV_CODEC_ID_AVUI,
|
||||||
|
#if FF_API_AYUV_CODECID
|
||||||
|
AV_CODEC_ID_AYUV,
|
||||||
|
#endif
|
||||||
|
AV_CODEC_ID_TARGA_Y216,
|
||||||
|
AV_CODEC_ID_V308,
|
||||||
|
AV_CODEC_ID_V408,
|
||||||
|
AV_CODEC_ID_YUV4,
|
||||||
|
AV_CODEC_ID_AVRN,
|
||||||
|
AV_CODEC_ID_CPIA,
|
||||||
|
AV_CODEC_ID_XFACE,
|
||||||
|
AV_CODEC_ID_SNOW,
|
||||||
|
AV_CODEC_ID_SMVJPEG,
|
||||||
|
AV_CODEC_ID_APNG,
|
||||||
|
AV_CODEC_ID_DAALA,
|
||||||
|
AV_CODEC_ID_CFHD,
|
||||||
|
AV_CODEC_ID_TRUEMOTION2RT,
|
||||||
|
AV_CODEC_ID_M101,
|
||||||
|
AV_CODEC_ID_MAGICYUV,
|
||||||
|
AV_CODEC_ID_SHEERVIDEO,
|
||||||
|
AV_CODEC_ID_YLC,
|
||||||
|
AV_CODEC_ID_PSD,
|
||||||
|
AV_CODEC_ID_PIXLET,
|
||||||
|
AV_CODEC_ID_SPEEDHQ,
|
||||||
|
AV_CODEC_ID_FMVC,
|
||||||
|
AV_CODEC_ID_SCPR,
|
||||||
|
AV_CODEC_ID_CLEARVIDEO,
|
||||||
|
AV_CODEC_ID_XPM,
|
||||||
|
AV_CODEC_ID_AV1,
|
||||||
|
AV_CODEC_ID_BITPACKED,
|
||||||
|
AV_CODEC_ID_MSCC,
|
||||||
|
AV_CODEC_ID_SRGC,
|
||||||
|
AV_CODEC_ID_SVG,
|
||||||
|
AV_CODEC_ID_GDV,
|
||||||
|
AV_CODEC_ID_FITS,
|
||||||
|
AV_CODEC_ID_IMM4,
|
||||||
|
AV_CODEC_ID_PROSUMER,
|
||||||
|
AV_CODEC_ID_MWSC,
|
||||||
|
AV_CODEC_ID_WCMV,
|
||||||
|
AV_CODEC_ID_RASC,
|
||||||
|
AV_CODEC_ID_HYMT,
|
||||||
|
AV_CODEC_ID_ARBC,
|
||||||
|
AV_CODEC_ID_AGM,
|
||||||
|
AV_CODEC_ID_LSCR,
|
||||||
|
AV_CODEC_ID_VP4,
|
||||||
|
AV_CODEC_ID_IMM5,
|
||||||
|
AV_CODEC_ID_MVDV,
|
||||||
|
AV_CODEC_ID_MVHA,
|
||||||
|
AV_CODEC_ID_CDTOONS,
|
||||||
|
AV_CODEC_ID_MV30,
|
||||||
|
AV_CODEC_ID_NOTCHLC,
|
||||||
|
AV_CODEC_ID_PFM,
|
||||||
|
AV_CODEC_ID_MOBICLIP,
|
||||||
|
AV_CODEC_ID_PHOTOCD,
|
||||||
|
AV_CODEC_ID_IPU,
|
||||||
|
AV_CODEC_ID_ARGO,
|
||||||
|
AV_CODEC_ID_CRI,
|
||||||
|
AV_CODEC_ID_SIMBIOSIS_IMX,
|
||||||
|
AV_CODEC_ID_SGA_VIDEO,
|
||||||
|
AV_CODEC_ID_GEM,
|
||||||
|
AV_CODEC_ID_VBN,
|
||||||
|
AV_CODEC_ID_JPEGXL,
|
||||||
|
AV_CODEC_ID_QOI,
|
||||||
|
AV_CODEC_ID_PHM,
|
||||||
|
AV_CODEC_ID_RADIANCE_HDR,
|
||||||
|
AV_CODEC_ID_WBMP,
|
||||||
|
AV_CODEC_ID_MEDIA100,
|
||||||
|
AV_CODEC_ID_VQC,
|
||||||
|
AV_CODEC_ID_PDV,
|
||||||
|
AV_CODEC_ID_EVC,
|
||||||
|
AV_CODEC_ID_RTV1,
|
||||||
|
AV_CODEC_ID_VMIX,
|
||||||
|
|
||||||
|
/* various PCM "codecs" */
|
||||||
|
AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
|
||||||
|
AV_CODEC_ID_PCM_S16LE = 0x10000,
|
||||||
|
AV_CODEC_ID_PCM_S16BE,
|
||||||
|
AV_CODEC_ID_PCM_U16LE,
|
||||||
|
AV_CODEC_ID_PCM_U16BE,
|
||||||
|
AV_CODEC_ID_PCM_S8,
|
||||||
|
AV_CODEC_ID_PCM_U8,
|
||||||
|
AV_CODEC_ID_PCM_MULAW,
|
||||||
|
AV_CODEC_ID_PCM_ALAW,
|
||||||
|
AV_CODEC_ID_PCM_S32LE,
|
||||||
|
AV_CODEC_ID_PCM_S32BE,
|
||||||
|
AV_CODEC_ID_PCM_U32LE,
|
||||||
|
AV_CODEC_ID_PCM_U32BE,
|
||||||
|
AV_CODEC_ID_PCM_S24LE,
|
||||||
|
AV_CODEC_ID_PCM_S24BE,
|
||||||
|
AV_CODEC_ID_PCM_U24LE,
|
||||||
|
AV_CODEC_ID_PCM_U24BE,
|
||||||
|
AV_CODEC_ID_PCM_S24DAUD,
|
||||||
|
AV_CODEC_ID_PCM_ZORK,
|
||||||
|
AV_CODEC_ID_PCM_S16LE_PLANAR,
|
||||||
|
AV_CODEC_ID_PCM_DVD,
|
||||||
|
AV_CODEC_ID_PCM_F32BE,
|
||||||
|
AV_CODEC_ID_PCM_F32LE,
|
||||||
|
AV_CODEC_ID_PCM_F64BE,
|
||||||
|
AV_CODEC_ID_PCM_F64LE,
|
||||||
|
AV_CODEC_ID_PCM_BLURAY,
|
||||||
|
AV_CODEC_ID_PCM_LXF,
|
||||||
|
AV_CODEC_ID_S302M,
|
||||||
|
AV_CODEC_ID_PCM_S8_PLANAR,
|
||||||
|
AV_CODEC_ID_PCM_S24LE_PLANAR,
|
||||||
|
AV_CODEC_ID_PCM_S32LE_PLANAR,
|
||||||
|
AV_CODEC_ID_PCM_S16BE_PLANAR,
|
||||||
|
AV_CODEC_ID_PCM_S64LE,
|
||||||
|
AV_CODEC_ID_PCM_S64BE,
|
||||||
|
AV_CODEC_ID_PCM_F16LE,
|
||||||
|
AV_CODEC_ID_PCM_F24LE,
|
||||||
|
AV_CODEC_ID_PCM_VIDC,
|
||||||
|
AV_CODEC_ID_PCM_SGA,
|
||||||
|
|
||||||
|
/* various ADPCM codecs */
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_WAV,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_DK3,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_DK4,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_WS,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_SMJPEG,
|
||||||
|
AV_CODEC_ID_ADPCM_MS,
|
||||||
|
AV_CODEC_ID_ADPCM_4XM,
|
||||||
|
AV_CODEC_ID_ADPCM_XA,
|
||||||
|
AV_CODEC_ID_ADPCM_ADX,
|
||||||
|
AV_CODEC_ID_ADPCM_EA,
|
||||||
|
AV_CODEC_ID_ADPCM_G726,
|
||||||
|
AV_CODEC_ID_ADPCM_CT,
|
||||||
|
AV_CODEC_ID_ADPCM_SWF,
|
||||||
|
AV_CODEC_ID_ADPCM_YAMAHA,
|
||||||
|
AV_CODEC_ID_ADPCM_SBPRO_4,
|
||||||
|
AV_CODEC_ID_ADPCM_SBPRO_3,
|
||||||
|
AV_CODEC_ID_ADPCM_SBPRO_2,
|
||||||
|
AV_CODEC_ID_ADPCM_THP,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_AMV,
|
||||||
|
AV_CODEC_ID_ADPCM_EA_R1,
|
||||||
|
AV_CODEC_ID_ADPCM_EA_R3,
|
||||||
|
AV_CODEC_ID_ADPCM_EA_R2,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_EA_SEAD,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_EA_EACS,
|
||||||
|
AV_CODEC_ID_ADPCM_EA_XAS,
|
||||||
|
AV_CODEC_ID_ADPCM_EA_MAXIS_XA,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_ISS,
|
||||||
|
AV_CODEC_ID_ADPCM_G722,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_APC,
|
||||||
|
AV_CODEC_ID_ADPCM_VIMA,
|
||||||
|
AV_CODEC_ID_ADPCM_AFC,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_OKI,
|
||||||
|
AV_CODEC_ID_ADPCM_DTK,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_RAD,
|
||||||
|
AV_CODEC_ID_ADPCM_G726LE,
|
||||||
|
AV_CODEC_ID_ADPCM_THP_LE,
|
||||||
|
AV_CODEC_ID_ADPCM_PSX,
|
||||||
|
AV_CODEC_ID_ADPCM_AICA,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_DAT4,
|
||||||
|
AV_CODEC_ID_ADPCM_MTAF,
|
||||||
|
AV_CODEC_ID_ADPCM_AGM,
|
||||||
|
AV_CODEC_ID_ADPCM_ARGO,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_SSI,
|
||||||
|
AV_CODEC_ID_ADPCM_ZORK,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_APM,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_ALP,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_MTF,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_CUNNING,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_MOFLEX,
|
||||||
|
AV_CODEC_ID_ADPCM_IMA_ACORN,
|
||||||
|
AV_CODEC_ID_ADPCM_XMD,
|
||||||
|
|
||||||
|
/* AMR */
|
||||||
|
AV_CODEC_ID_AMR_NB = 0x12000,
|
||||||
|
AV_CODEC_ID_AMR_WB,
|
||||||
|
|
||||||
|
/* RealAudio codecs*/
|
||||||
|
AV_CODEC_ID_RA_144 = 0x13000,
|
||||||
|
AV_CODEC_ID_RA_288,
|
||||||
|
|
||||||
|
/* various DPCM codecs */
|
||||||
|
AV_CODEC_ID_ROQ_DPCM = 0x14000,
|
||||||
|
AV_CODEC_ID_INTERPLAY_DPCM,
|
||||||
|
AV_CODEC_ID_XAN_DPCM,
|
||||||
|
AV_CODEC_ID_SOL_DPCM,
|
||||||
|
AV_CODEC_ID_SDX2_DPCM,
|
||||||
|
AV_CODEC_ID_GREMLIN_DPCM,
|
||||||
|
AV_CODEC_ID_DERF_DPCM,
|
||||||
|
AV_CODEC_ID_WADY_DPCM,
|
||||||
|
AV_CODEC_ID_CBD2_DPCM,
|
||||||
|
|
||||||
|
/* audio codecs */
|
||||||
|
AV_CODEC_ID_MP2 = 0x15000,
|
||||||
|
AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
|
||||||
|
AV_CODEC_ID_AAC,
|
||||||
|
AV_CODEC_ID_AC3,
|
||||||
|
AV_CODEC_ID_DTS,
|
||||||
|
AV_CODEC_ID_VORBIS,
|
||||||
|
AV_CODEC_ID_DVAUDIO,
|
||||||
|
AV_CODEC_ID_WMAV1,
|
||||||
|
AV_CODEC_ID_WMAV2,
|
||||||
|
AV_CODEC_ID_MACE3,
|
||||||
|
AV_CODEC_ID_MACE6,
|
||||||
|
AV_CODEC_ID_VMDAUDIO,
|
||||||
|
AV_CODEC_ID_FLAC,
|
||||||
|
AV_CODEC_ID_MP3ADU,
|
||||||
|
AV_CODEC_ID_MP3ON4,
|
||||||
|
AV_CODEC_ID_SHORTEN,
|
||||||
|
AV_CODEC_ID_ALAC,
|
||||||
|
AV_CODEC_ID_WESTWOOD_SND1,
|
||||||
|
AV_CODEC_ID_GSM, ///< as in Berlin toast format
|
||||||
|
AV_CODEC_ID_QDM2,
|
||||||
|
AV_CODEC_ID_COOK,
|
||||||
|
AV_CODEC_ID_TRUESPEECH,
|
||||||
|
AV_CODEC_ID_TTA,
|
||||||
|
AV_CODEC_ID_SMACKAUDIO,
|
||||||
|
AV_CODEC_ID_QCELP,
|
||||||
|
AV_CODEC_ID_WAVPACK,
|
||||||
|
AV_CODEC_ID_DSICINAUDIO,
|
||||||
|
AV_CODEC_ID_IMC,
|
||||||
|
AV_CODEC_ID_MUSEPACK7,
|
||||||
|
AV_CODEC_ID_MLP,
|
||||||
|
AV_CODEC_ID_GSM_MS, /* as found in WAV */
|
||||||
|
AV_CODEC_ID_ATRAC3,
|
||||||
|
AV_CODEC_ID_APE,
|
||||||
|
AV_CODEC_ID_NELLYMOSER,
|
||||||
|
AV_CODEC_ID_MUSEPACK8,
|
||||||
|
AV_CODEC_ID_SPEEX,
|
||||||
|
AV_CODEC_ID_WMAVOICE,
|
||||||
|
AV_CODEC_ID_WMAPRO,
|
||||||
|
AV_CODEC_ID_WMALOSSLESS,
|
||||||
|
AV_CODEC_ID_ATRAC3P,
|
||||||
|
AV_CODEC_ID_EAC3,
|
||||||
|
AV_CODEC_ID_SIPR,
|
||||||
|
AV_CODEC_ID_MP1,
|
||||||
|
AV_CODEC_ID_TWINVQ,
|
||||||
|
AV_CODEC_ID_TRUEHD,
|
||||||
|
AV_CODEC_ID_MP4ALS,
|
||||||
|
AV_CODEC_ID_ATRAC1,
|
||||||
|
AV_CODEC_ID_BINKAUDIO_RDFT,
|
||||||
|
AV_CODEC_ID_BINKAUDIO_DCT,
|
||||||
|
AV_CODEC_ID_AAC_LATM,
|
||||||
|
AV_CODEC_ID_QDMC,
|
||||||
|
AV_CODEC_ID_CELT,
|
||||||
|
AV_CODEC_ID_G723_1,
|
||||||
|
AV_CODEC_ID_G729,
|
||||||
|
AV_CODEC_ID_8SVX_EXP,
|
||||||
|
AV_CODEC_ID_8SVX_FIB,
|
||||||
|
AV_CODEC_ID_BMV_AUDIO,
|
||||||
|
AV_CODEC_ID_RALF,
|
||||||
|
AV_CODEC_ID_IAC,
|
||||||
|
AV_CODEC_ID_ILBC,
|
||||||
|
AV_CODEC_ID_OPUS,
|
||||||
|
AV_CODEC_ID_COMFORT_NOISE,
|
||||||
|
AV_CODEC_ID_TAK,
|
||||||
|
AV_CODEC_ID_METASOUND,
|
||||||
|
AV_CODEC_ID_PAF_AUDIO,
|
||||||
|
AV_CODEC_ID_ON2AVC,
|
||||||
|
AV_CODEC_ID_DSS_SP,
|
||||||
|
AV_CODEC_ID_CODEC2,
|
||||||
|
AV_CODEC_ID_FFWAVESYNTH,
|
||||||
|
AV_CODEC_ID_SONIC,
|
||||||
|
AV_CODEC_ID_SONIC_LS,
|
||||||
|
AV_CODEC_ID_EVRC,
|
||||||
|
AV_CODEC_ID_SMV,
|
||||||
|
AV_CODEC_ID_DSD_LSBF,
|
||||||
|
AV_CODEC_ID_DSD_MSBF,
|
||||||
|
AV_CODEC_ID_DSD_LSBF_PLANAR,
|
||||||
|
AV_CODEC_ID_DSD_MSBF_PLANAR,
|
||||||
|
AV_CODEC_ID_4GV,
|
||||||
|
AV_CODEC_ID_INTERPLAY_ACM,
|
||||||
|
AV_CODEC_ID_XMA1,
|
||||||
|
AV_CODEC_ID_XMA2,
|
||||||
|
AV_CODEC_ID_DST,
|
||||||
|
AV_CODEC_ID_ATRAC3AL,
|
||||||
|
AV_CODEC_ID_ATRAC3PAL,
|
||||||
|
AV_CODEC_ID_DOLBY_E,
|
||||||
|
AV_CODEC_ID_APTX,
|
||||||
|
AV_CODEC_ID_APTX_HD,
|
||||||
|
AV_CODEC_ID_SBC,
|
||||||
|
AV_CODEC_ID_ATRAC9,
|
||||||
|
AV_CODEC_ID_HCOM,
|
||||||
|
AV_CODEC_ID_ACELP_KELVIN,
|
||||||
|
AV_CODEC_ID_MPEGH_3D_AUDIO,
|
||||||
|
AV_CODEC_ID_SIREN,
|
||||||
|
AV_CODEC_ID_HCA,
|
||||||
|
AV_CODEC_ID_FASTAUDIO,
|
||||||
|
AV_CODEC_ID_MSNSIREN,
|
||||||
|
AV_CODEC_ID_DFPWM,
|
||||||
|
AV_CODEC_ID_BONK,
|
||||||
|
AV_CODEC_ID_MISC4,
|
||||||
|
AV_CODEC_ID_APAC,
|
||||||
|
AV_CODEC_ID_FTR,
|
||||||
|
AV_CODEC_ID_WAVARC,
|
||||||
|
AV_CODEC_ID_RKA,
|
||||||
|
AV_CODEC_ID_AC4,
|
||||||
|
AV_CODEC_ID_OSQ,
|
||||||
|
|
||||||
|
/* subtitle codecs */
|
||||||
|
AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
|
||||||
|
AV_CODEC_ID_DVD_SUBTITLE = 0x17000,
|
||||||
|
AV_CODEC_ID_DVB_SUBTITLE,
|
||||||
|
AV_CODEC_ID_TEXT, ///< raw UTF-8 text
|
||||||
|
AV_CODEC_ID_XSUB,
|
||||||
|
AV_CODEC_ID_SSA,
|
||||||
|
AV_CODEC_ID_MOV_TEXT,
|
||||||
|
AV_CODEC_ID_HDMV_PGS_SUBTITLE,
|
||||||
|
AV_CODEC_ID_DVB_TELETEXT,
|
||||||
|
AV_CODEC_ID_SRT,
|
||||||
|
AV_CODEC_ID_MICRODVD,
|
||||||
|
AV_CODEC_ID_EIA_608,
|
||||||
|
AV_CODEC_ID_JACOSUB,
|
||||||
|
AV_CODEC_ID_SAMI,
|
||||||
|
AV_CODEC_ID_REALTEXT,
|
||||||
|
AV_CODEC_ID_STL,
|
||||||
|
AV_CODEC_ID_SUBVIEWER1,
|
||||||
|
AV_CODEC_ID_SUBVIEWER,
|
||||||
|
AV_CODEC_ID_SUBRIP,
|
||||||
|
AV_CODEC_ID_WEBVTT,
|
||||||
|
AV_CODEC_ID_MPL2,
|
||||||
|
AV_CODEC_ID_VPLAYER,
|
||||||
|
AV_CODEC_ID_PJS,
|
||||||
|
AV_CODEC_ID_ASS,
|
||||||
|
AV_CODEC_ID_HDMV_TEXT_SUBTITLE,
|
||||||
|
AV_CODEC_ID_TTML,
|
||||||
|
AV_CODEC_ID_ARIB_CAPTION,
|
||||||
|
|
||||||
|
/* other specific kind of codecs (generally used for attachments) */
|
||||||
|
AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs.
|
||||||
|
AV_CODEC_ID_TTF = 0x18000,
|
||||||
|
|
||||||
|
AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream.
|
||||||
|
AV_CODEC_ID_EPG,
|
||||||
|
AV_CODEC_ID_BINTEXT,
|
||||||
|
AV_CODEC_ID_XBIN,
|
||||||
|
AV_CODEC_ID_IDF,
|
||||||
|
AV_CODEC_ID_OTF,
|
||||||
|
AV_CODEC_ID_SMPTE_KLV,
|
||||||
|
AV_CODEC_ID_DVD_NAV,
|
||||||
|
AV_CODEC_ID_TIMED_ID3,
|
||||||
|
AV_CODEC_ID_BIN_DATA,
|
||||||
|
AV_CODEC_ID_SMPTE_2038,
|
||||||
|
|
||||||
|
|
||||||
|
AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
|
||||||
|
|
||||||
|
AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
|
||||||
|
* stream (only used by libavformat) */
|
||||||
|
AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
|
||||||
|
* stream (only used by libavformat) */
|
||||||
|
AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information.
|
||||||
|
AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket
|
||||||
|
/**
|
||||||
|
* Dummy null video codec, useful mainly for development and debugging.
|
||||||
|
* Null encoder/decoder discard all input and never return any output.
|
||||||
|
*/
|
||||||
|
AV_CODEC_ID_VNULL,
|
||||||
|
/**
|
||||||
|
* Dummy null audio codec, useful mainly for development and debugging.
|
||||||
|
* Null encoder/decoder discard all input and never return any output.
|
||||||
|
*/
|
||||||
|
AV_CODEC_ID_ANULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the type of the given codec.
|
||||||
|
*/
|
||||||
|
enum AVMediaType avcodec_get_type(enum AVCodecID codec_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of a codec.
|
||||||
|
* @return a static string identifying the codec; never NULL
|
||||||
|
*/
|
||||||
|
const char *avcodec_get_name(enum AVCodecID id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return codec bits per sample.
|
||||||
|
*
|
||||||
|
* @param[in] codec_id the codec
|
||||||
|
* @return Number of bits per sample or zero if unknown for the given codec.
|
||||||
|
*/
|
||||||
|
int av_get_bits_per_sample(enum AVCodecID codec_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return codec bits per sample.
|
||||||
|
* Only return non-zero if the bits per sample is exactly correct, not an
|
||||||
|
* approximation.
|
||||||
|
*
|
||||||
|
* @param[in] codec_id the codec
|
||||||
|
* @return Number of bits per sample or zero if unknown for the given codec.
|
||||||
|
*/
|
||||||
|
int av_get_exact_bits_per_sample(enum AVCodecID codec_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a name for the specified profile, if available.
|
||||||
|
*
|
||||||
|
* @param codec_id the ID of the codec to which the requested profile belongs
|
||||||
|
* @param profile the profile value for which a name is requested
|
||||||
|
* @return A name for the profile if found, NULL otherwise.
|
||||||
|
*
|
||||||
|
* @note unlike av_get_profile_name(), which searches a list of profiles
|
||||||
|
* supported by a specific decoder or encoder implementation, this
|
||||||
|
* function searches the list of profiles from the AVCodecDescriptor
|
||||||
|
*/
|
||||||
|
const char *avcodec_profile_name(enum AVCodecID codec_id, int profile);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the PCM codec associated with a sample format.
|
||||||
|
* @param be endianness, 0 for little, 1 for big,
|
||||||
|
* -1 (or anything else) for native
|
||||||
|
* @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE
|
||||||
|
*/
|
||||||
|
enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // AVCODEC_CODEC_ID_H
|
||||||
262
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/codec_par.h
vendored
Normal file
262
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/codec_par.h
vendored
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
/*
|
||||||
|
* Codec parameters public API
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_CODEC_PAR_H
|
||||||
|
#define AVCODEC_CODEC_PAR_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "libavutil/avutil.h"
|
||||||
|
#include "libavutil/channel_layout.h"
|
||||||
|
#include "libavutil/rational.h"
|
||||||
|
#include "libavutil/pixfmt.h"
|
||||||
|
|
||||||
|
#include "codec_id.h"
|
||||||
|
#include "defs.h"
|
||||||
|
#include "packet.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup lavc_core
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This struct describes the properties of an encoded stream.
|
||||||
|
*
|
||||||
|
* sizeof(AVCodecParameters) is not a part of the public ABI, this struct must
|
||||||
|
* be allocated with avcodec_parameters_alloc() and freed with
|
||||||
|
* avcodec_parameters_free().
|
||||||
|
*/
|
||||||
|
typedef struct AVCodecParameters {
|
||||||
|
/**
|
||||||
|
* General type of the encoded data.
|
||||||
|
*/
|
||||||
|
enum AVMediaType codec_type;
|
||||||
|
/**
|
||||||
|
* Specific type of the encoded data (the codec used).
|
||||||
|
*/
|
||||||
|
enum AVCodecID codec_id;
|
||||||
|
/**
|
||||||
|
* Additional information about the codec (corresponds to the AVI FOURCC).
|
||||||
|
*/
|
||||||
|
uint32_t codec_tag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extra binary data needed for initializing the decoder, codec-dependent.
|
||||||
|
*
|
||||||
|
* Must be allocated with av_malloc() and will be freed by
|
||||||
|
* avcodec_parameters_free(). The allocated size of extradata must be at
|
||||||
|
* least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding
|
||||||
|
* bytes zeroed.
|
||||||
|
*/
|
||||||
|
uint8_t *extradata;
|
||||||
|
/**
|
||||||
|
* Size of the extradata content in bytes.
|
||||||
|
*/
|
||||||
|
int extradata_size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* - video: the pixel format, the value corresponds to enum AVPixelFormat.
|
||||||
|
* - audio: the sample format, the value corresponds to enum AVSampleFormat.
|
||||||
|
*/
|
||||||
|
int format;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The average bitrate of the encoded data (in bits per second).
|
||||||
|
*/
|
||||||
|
int64_t bit_rate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of bits per sample in the codedwords.
|
||||||
|
*
|
||||||
|
* This is basically the bitrate per sample. It is mandatory for a bunch of
|
||||||
|
* formats to actually decode them. It's the number of bits for one sample in
|
||||||
|
* the actual coded bitstream.
|
||||||
|
*
|
||||||
|
* This could be for example 4 for ADPCM
|
||||||
|
* For PCM formats this matches bits_per_raw_sample
|
||||||
|
* Can be 0
|
||||||
|
*/
|
||||||
|
int bits_per_coded_sample;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the number of valid bits in each output sample. If the
|
||||||
|
* sample format has more bits, the least significant bits are additional
|
||||||
|
* padding bits, which are always 0. Use right shifts to reduce the sample
|
||||||
|
* to its actual size. For example, audio formats with 24 bit samples will
|
||||||
|
* have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32.
|
||||||
|
* To get the original sample use "(int32_t)sample >> 8"."
|
||||||
|
*
|
||||||
|
* For ADPCM this might be 12 or 16 or similar
|
||||||
|
* Can be 0
|
||||||
|
*/
|
||||||
|
int bits_per_raw_sample;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Codec-specific bitstream restrictions that the stream conforms to.
|
||||||
|
*/
|
||||||
|
int profile;
|
||||||
|
int level;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only. The dimensions of the video frame in pixels.
|
||||||
|
*/
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only. The aspect ratio (width / height) which a single pixel
|
||||||
|
* should have when displayed.
|
||||||
|
*
|
||||||
|
* When the aspect ratio is unknown / undefined, the numerator should be
|
||||||
|
* set to 0 (the denominator may have any value).
|
||||||
|
*/
|
||||||
|
AVRational sample_aspect_ratio;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only. The order of the fields in interlaced video.
|
||||||
|
*/
|
||||||
|
enum AVFieldOrder field_order;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only. Additional colorspace characteristics.
|
||||||
|
*/
|
||||||
|
enum AVColorRange color_range;
|
||||||
|
enum AVColorPrimaries color_primaries;
|
||||||
|
enum AVColorTransferCharacteristic color_trc;
|
||||||
|
enum AVColorSpace color_space;
|
||||||
|
enum AVChromaLocation chroma_location;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only. Number of delayed frames.
|
||||||
|
*/
|
||||||
|
int video_delay;
|
||||||
|
|
||||||
|
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||||
|
/**
|
||||||
|
* Audio only. The channel layout bitmask. May be 0 if the channel layout is
|
||||||
|
* unknown or unspecified, otherwise the number of bits set must be equal to
|
||||||
|
* the channels field.
|
||||||
|
* @deprecated use ch_layout
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
uint64_t channel_layout;
|
||||||
|
/**
|
||||||
|
* Audio only. The number of audio channels.
|
||||||
|
* @deprecated use ch_layout.nb_channels
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
int channels;
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* Audio only. The number of audio samples per second.
|
||||||
|
*/
|
||||||
|
int sample_rate;
|
||||||
|
/**
|
||||||
|
* Audio only. The number of bytes per coded audio frame, required by some
|
||||||
|
* formats.
|
||||||
|
*
|
||||||
|
* Corresponds to nBlockAlign in WAVEFORMATEX.
|
||||||
|
*/
|
||||||
|
int block_align;
|
||||||
|
/**
|
||||||
|
* Audio only. Audio frame size, if known. Required by some formats to be static.
|
||||||
|
*/
|
||||||
|
int frame_size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Audio only. The amount of padding (in samples) inserted by the encoder at
|
||||||
|
* the beginning of the audio. I.e. this number of leading decoded samples
|
||||||
|
* must be discarded by the caller to get the original audio without leading
|
||||||
|
* padding.
|
||||||
|
*/
|
||||||
|
int initial_padding;
|
||||||
|
/**
|
||||||
|
* Audio only. The amount of padding (in samples) appended by the encoder to
|
||||||
|
* the end of the audio. I.e. this number of decoded samples must be
|
||||||
|
* discarded by the caller from the end of the stream to get the original
|
||||||
|
* audio without any trailing padding.
|
||||||
|
*/
|
||||||
|
int trailing_padding;
|
||||||
|
/**
|
||||||
|
* Audio only. Number of samples to skip after a discontinuity.
|
||||||
|
*/
|
||||||
|
int seek_preroll;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Audio only. The channel layout and number of channels.
|
||||||
|
*/
|
||||||
|
AVChannelLayout ch_layout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only. Number of frames per second, for streams with constant frame
|
||||||
|
* durations. Should be set to { 0, 1 } when some frames have differing
|
||||||
|
* durations or if the value is not known.
|
||||||
|
*
|
||||||
|
* @note This field correponds to values that are stored in codec-level
|
||||||
|
* headers and is typically overridden by container/transport-layer
|
||||||
|
* timestamps, when available. It should thus be used only as a last resort,
|
||||||
|
* when no higher-level timing information is available.
|
||||||
|
*/
|
||||||
|
AVRational framerate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Additional data associated with the entire stream.
|
||||||
|
*/
|
||||||
|
AVPacketSideData *coded_side_data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Amount of entries in @ref coded_side_data.
|
||||||
|
*/
|
||||||
|
int nb_coded_side_data;
|
||||||
|
} AVCodecParameters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a new AVCodecParameters and set its fields to default values
|
||||||
|
* (unknown/invalid/0). The returned struct must be freed with
|
||||||
|
* avcodec_parameters_free().
|
||||||
|
*/
|
||||||
|
AVCodecParameters *avcodec_parameters_alloc(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free an AVCodecParameters instance and everything associated with it and
|
||||||
|
* write NULL to the supplied pointer.
|
||||||
|
*/
|
||||||
|
void avcodec_parameters_free(AVCodecParameters **par);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy the contents of src to dst. Any allocated fields in dst are freed and
|
||||||
|
* replaced with newly allocated duplicates of the corresponding fields in src.
|
||||||
|
*
|
||||||
|
* @return >= 0 on success, a negative AVERROR code on failure.
|
||||||
|
*/
|
||||||
|
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is the same as av_get_audio_frame_duration(), except it works
|
||||||
|
* with AVCodecParameters instead of an AVCodecContext.
|
||||||
|
*/
|
||||||
|
int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // AVCODEC_CODEC_PAR_H
|
||||||
112
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/d3d11va.h
vendored
Normal file
112
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/d3d11va.h
vendored
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* Direct3D11 HW acceleration
|
||||||
|
*
|
||||||
|
* copyright (c) 2009 Laurent Aimar
|
||||||
|
* copyright (c) 2015 Steve Lhomme
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_D3D11VA_H
|
||||||
|
#define AVCODEC_D3D11VA_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavc_codec_hwaccel_d3d11va
|
||||||
|
* Public libavcodec D3D11VA header.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602
|
||||||
|
#undef _WIN32_WINNT
|
||||||
|
#define _WIN32_WINNT 0x0602
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <d3d11.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_codec_hwaccel_d3d11va Direct3D11
|
||||||
|
* @ingroup lavc_codec_hwaccel
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for Direct3D11 and old UVD/UVD+ ATI video cards
|
||||||
|
#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for Direct3D11 and old Intel GPUs with ClearVideo interface
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure is used to provides the necessary configurations and data
|
||||||
|
* to the Direct3D11 FFmpeg HWAccel implementation.
|
||||||
|
*
|
||||||
|
* The application must make it available as AVCodecContext.hwaccel_context.
|
||||||
|
*
|
||||||
|
* Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext.
|
||||||
|
*/
|
||||||
|
typedef struct AVD3D11VAContext {
|
||||||
|
/**
|
||||||
|
* D3D11 decoder object
|
||||||
|
*/
|
||||||
|
ID3D11VideoDecoder *decoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* D3D11 VideoContext
|
||||||
|
*/
|
||||||
|
ID3D11VideoContext *video_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* D3D11 configuration used to create the decoder
|
||||||
|
*/
|
||||||
|
D3D11_VIDEO_DECODER_CONFIG *cfg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of surface in the surface array
|
||||||
|
*/
|
||||||
|
unsigned surface_count;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The array of Direct3D surfaces used to create the decoder
|
||||||
|
*/
|
||||||
|
ID3D11VideoDecoderOutputView **surface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A bit field configuring the workarounds needed for using the decoder
|
||||||
|
*/
|
||||||
|
uint64_t workaround;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private to the FFmpeg AVHWAccel implementation
|
||||||
|
*/
|
||||||
|
unsigned report_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mutex to access video_context
|
||||||
|
*/
|
||||||
|
HANDLE context_mutex;
|
||||||
|
} AVD3D11VAContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate an AVD3D11VAContext.
|
||||||
|
*
|
||||||
|
* @return Newly-allocated AVD3D11VAContext or NULL on failure.
|
||||||
|
*/
|
||||||
|
AVD3D11VAContext *av_d3d11va_alloc_context(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVCODEC_D3D11VA_H */
|
||||||
335
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/defs.h
vendored
Normal file
335
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/defs.h
vendored
Normal file
@ -0,0 +1,335 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_DEFS_H
|
||||||
|
#define AVCODEC_DEFS_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup libavc
|
||||||
|
* Misc types and constants that do not belong anywhere else.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup lavc_decoding
|
||||||
|
* Required number of additionally allocated bytes at the end of the input bitstream for decoding.
|
||||||
|
* This is mainly needed because some optimized bitstream readers read
|
||||||
|
* 32 or 64 bit at once and could read over the end.<br>
|
||||||
|
* Note: If the first 23 bits of the additional bytes are not 0, then damaged
|
||||||
|
* MPEG bitstreams could cause overread and segfault.
|
||||||
|
*/
|
||||||
|
#define AV_INPUT_BUFFER_PADDING_SIZE 64
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify checksums embedded in the bitstream (could be of either encoded or
|
||||||
|
* decoded data, depending on the format) and print an error message on mismatch.
|
||||||
|
* If AV_EF_EXPLODE is also set, a mismatching checksum will result in the
|
||||||
|
* decoder/demuxer returning an error.
|
||||||
|
*/
|
||||||
|
#define AV_EF_CRCCHECK (1<<0)
|
||||||
|
#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations
|
||||||
|
#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length
|
||||||
|
#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection
|
||||||
|
|
||||||
|
#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue
|
||||||
|
#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors
|
||||||
|
#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors
|
||||||
|
#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder/muxer should not do as an error
|
||||||
|
|
||||||
|
#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software.
|
||||||
|
#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences.
|
||||||
|
#define FF_COMPLIANCE_NORMAL 0
|
||||||
|
#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions
|
||||||
|
#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.
|
||||||
|
|
||||||
|
|
||||||
|
#define AV_PROFILE_UNKNOWN -99
|
||||||
|
#define AV_PROFILE_RESERVED -100
|
||||||
|
|
||||||
|
#define AV_PROFILE_AAC_MAIN 0
|
||||||
|
#define AV_PROFILE_AAC_LOW 1
|
||||||
|
#define AV_PROFILE_AAC_SSR 2
|
||||||
|
#define AV_PROFILE_AAC_LTP 3
|
||||||
|
#define AV_PROFILE_AAC_HE 4
|
||||||
|
#define AV_PROFILE_AAC_HE_V2 28
|
||||||
|
#define AV_PROFILE_AAC_LD 22
|
||||||
|
#define AV_PROFILE_AAC_ELD 38
|
||||||
|
#define AV_PROFILE_MPEG2_AAC_LOW 128
|
||||||
|
#define AV_PROFILE_MPEG2_AAC_HE 131
|
||||||
|
|
||||||
|
#define AV_PROFILE_DNXHD 0
|
||||||
|
#define AV_PROFILE_DNXHR_LB 1
|
||||||
|
#define AV_PROFILE_DNXHR_SQ 2
|
||||||
|
#define AV_PROFILE_DNXHR_HQ 3
|
||||||
|
#define AV_PROFILE_DNXHR_HQX 4
|
||||||
|
#define AV_PROFILE_DNXHR_444 5
|
||||||
|
|
||||||
|
#define AV_PROFILE_DTS 20
|
||||||
|
#define AV_PROFILE_DTS_ES 30
|
||||||
|
#define AV_PROFILE_DTS_96_24 40
|
||||||
|
#define AV_PROFILE_DTS_HD_HRA 50
|
||||||
|
#define AV_PROFILE_DTS_HD_MA 60
|
||||||
|
#define AV_PROFILE_DTS_EXPRESS 70
|
||||||
|
#define AV_PROFILE_DTS_HD_MA_X 61
|
||||||
|
#define AV_PROFILE_DTS_HD_MA_X_IMAX 62
|
||||||
|
|
||||||
|
#define AV_PROFILE_EAC3_DDP_ATMOS 30
|
||||||
|
|
||||||
|
#define AV_PROFILE_TRUEHD_ATMOS 30
|
||||||
|
|
||||||
|
#define AV_PROFILE_MPEG2_422 0
|
||||||
|
#define AV_PROFILE_MPEG2_HIGH 1
|
||||||
|
#define AV_PROFILE_MPEG2_SS 2
|
||||||
|
#define AV_PROFILE_MPEG2_SNR_SCALABLE 3
|
||||||
|
#define AV_PROFILE_MPEG2_MAIN 4
|
||||||
|
#define AV_PROFILE_MPEG2_SIMPLE 5
|
||||||
|
|
||||||
|
#define AV_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag
|
||||||
|
#define AV_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag
|
||||||
|
|
||||||
|
#define AV_PROFILE_H264_BASELINE 66
|
||||||
|
#define AV_PROFILE_H264_CONSTRAINED_BASELINE (66|AV_PROFILE_H264_CONSTRAINED)
|
||||||
|
#define AV_PROFILE_H264_MAIN 77
|
||||||
|
#define AV_PROFILE_H264_EXTENDED 88
|
||||||
|
#define AV_PROFILE_H264_HIGH 100
|
||||||
|
#define AV_PROFILE_H264_HIGH_10 110
|
||||||
|
#define AV_PROFILE_H264_HIGH_10_INTRA (110|AV_PROFILE_H264_INTRA)
|
||||||
|
#define AV_PROFILE_H264_MULTIVIEW_HIGH 118
|
||||||
|
#define AV_PROFILE_H264_HIGH_422 122
|
||||||
|
#define AV_PROFILE_H264_HIGH_422_INTRA (122|AV_PROFILE_H264_INTRA)
|
||||||
|
#define AV_PROFILE_H264_STEREO_HIGH 128
|
||||||
|
#define AV_PROFILE_H264_HIGH_444 144
|
||||||
|
#define AV_PROFILE_H264_HIGH_444_PREDICTIVE 244
|
||||||
|
#define AV_PROFILE_H264_HIGH_444_INTRA (244|AV_PROFILE_H264_INTRA)
|
||||||
|
#define AV_PROFILE_H264_CAVLC_444 44
|
||||||
|
|
||||||
|
#define AV_PROFILE_VC1_SIMPLE 0
|
||||||
|
#define AV_PROFILE_VC1_MAIN 1
|
||||||
|
#define AV_PROFILE_VC1_COMPLEX 2
|
||||||
|
#define AV_PROFILE_VC1_ADVANCED 3
|
||||||
|
|
||||||
|
#define AV_PROFILE_MPEG4_SIMPLE 0
|
||||||
|
#define AV_PROFILE_MPEG4_SIMPLE_SCALABLE 1
|
||||||
|
#define AV_PROFILE_MPEG4_CORE 2
|
||||||
|
#define AV_PROFILE_MPEG4_MAIN 3
|
||||||
|
#define AV_PROFILE_MPEG4_N_BIT 4
|
||||||
|
#define AV_PROFILE_MPEG4_SCALABLE_TEXTURE 5
|
||||||
|
#define AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6
|
||||||
|
#define AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7
|
||||||
|
#define AV_PROFILE_MPEG4_HYBRID 8
|
||||||
|
#define AV_PROFILE_MPEG4_ADVANCED_REAL_TIME 9
|
||||||
|
#define AV_PROFILE_MPEG4_CORE_SCALABLE 10
|
||||||
|
#define AV_PROFILE_MPEG4_ADVANCED_CODING 11
|
||||||
|
#define AV_PROFILE_MPEG4_ADVANCED_CORE 12
|
||||||
|
#define AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
|
||||||
|
#define AV_PROFILE_MPEG4_SIMPLE_STUDIO 14
|
||||||
|
#define AV_PROFILE_MPEG4_ADVANCED_SIMPLE 15
|
||||||
|
|
||||||
|
#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1
|
||||||
|
#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2
|
||||||
|
#define AV_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768
|
||||||
|
#define AV_PROFILE_JPEG2000_DCINEMA_2K 3
|
||||||
|
#define AV_PROFILE_JPEG2000_DCINEMA_4K 4
|
||||||
|
|
||||||
|
#define AV_PROFILE_VP9_0 0
|
||||||
|
#define AV_PROFILE_VP9_1 1
|
||||||
|
#define AV_PROFILE_VP9_2 2
|
||||||
|
#define AV_PROFILE_VP9_3 3
|
||||||
|
|
||||||
|
#define AV_PROFILE_HEVC_MAIN 1
|
||||||
|
#define AV_PROFILE_HEVC_MAIN_10 2
|
||||||
|
#define AV_PROFILE_HEVC_MAIN_STILL_PICTURE 3
|
||||||
|
#define AV_PROFILE_HEVC_REXT 4
|
||||||
|
#define AV_PROFILE_HEVC_SCC 9
|
||||||
|
|
||||||
|
#define AV_PROFILE_VVC_MAIN_10 1
|
||||||
|
#define AV_PROFILE_VVC_MAIN_10_444 33
|
||||||
|
|
||||||
|
#define AV_PROFILE_AV1_MAIN 0
|
||||||
|
#define AV_PROFILE_AV1_HIGH 1
|
||||||
|
#define AV_PROFILE_AV1_PROFESSIONAL 2
|
||||||
|
|
||||||
|
#define AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0
|
||||||
|
#define AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1
|
||||||
|
#define AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2
|
||||||
|
#define AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3
|
||||||
|
#define AV_PROFILE_MJPEG_JPEG_LS 0xf7
|
||||||
|
|
||||||
|
#define AV_PROFILE_SBC_MSBC 1
|
||||||
|
|
||||||
|
#define AV_PROFILE_PRORES_PROXY 0
|
||||||
|
#define AV_PROFILE_PRORES_LT 1
|
||||||
|
#define AV_PROFILE_PRORES_STANDARD 2
|
||||||
|
#define AV_PROFILE_PRORES_HQ 3
|
||||||
|
#define AV_PROFILE_PRORES_4444 4
|
||||||
|
#define AV_PROFILE_PRORES_XQ 5
|
||||||
|
|
||||||
|
#define AV_PROFILE_ARIB_PROFILE_A 0
|
||||||
|
#define AV_PROFILE_ARIB_PROFILE_C 1
|
||||||
|
|
||||||
|
#define AV_PROFILE_KLVA_SYNC 0
|
||||||
|
#define AV_PROFILE_KLVA_ASYNC 1
|
||||||
|
|
||||||
|
#define AV_PROFILE_EVC_BASELINE 0
|
||||||
|
#define AV_PROFILE_EVC_MAIN 1
|
||||||
|
|
||||||
|
|
||||||
|
#define AV_LEVEL_UNKNOWN -99
|
||||||
|
|
||||||
|
enum AVFieldOrder {
|
||||||
|
AV_FIELD_UNKNOWN,
|
||||||
|
AV_FIELD_PROGRESSIVE,
|
||||||
|
AV_FIELD_TT, ///< Top coded_first, top displayed first
|
||||||
|
AV_FIELD_BB, ///< Bottom coded first, bottom displayed first
|
||||||
|
AV_FIELD_TB, ///< Top coded first, bottom displayed first
|
||||||
|
AV_FIELD_BT, ///< Bottom coded first, top displayed first
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup lavc_decoding
|
||||||
|
*/
|
||||||
|
enum AVDiscard{
|
||||||
|
/* We leave some space between them for extensions (drop some
|
||||||
|
* keyframes for intra-only or drop just some bidir frames). */
|
||||||
|
AVDISCARD_NONE =-16, ///< discard nothing
|
||||||
|
AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi
|
||||||
|
AVDISCARD_NONREF = 8, ///< discard all non reference
|
||||||
|
AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames
|
||||||
|
AVDISCARD_NONINTRA= 24, ///< discard all non intra frames
|
||||||
|
AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes
|
||||||
|
AVDISCARD_ALL = 48, ///< discard all
|
||||||
|
};
|
||||||
|
|
||||||
|
enum AVAudioServiceType {
|
||||||
|
AV_AUDIO_SERVICE_TYPE_MAIN = 0,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_EFFECTS = 1,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_KARAOKE = 8,
|
||||||
|
AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pan Scan area.
|
||||||
|
* This specifies the area which should be displayed.
|
||||||
|
* Note there may be multiple such areas for one frame.
|
||||||
|
*/
|
||||||
|
typedef struct AVPanScan {
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
* - encoding: Set by user.
|
||||||
|
* - decoding: Set by libavcodec.
|
||||||
|
*/
|
||||||
|
int id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* width and height in 1/16 pel
|
||||||
|
* - encoding: Set by user.
|
||||||
|
* - decoding: Set by libavcodec.
|
||||||
|
*/
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* position of the top left corner in 1/16 pel for up to 3 fields/frames
|
||||||
|
* - encoding: Set by user.
|
||||||
|
* - decoding: Set by libavcodec.
|
||||||
|
*/
|
||||||
|
int16_t position[3][2];
|
||||||
|
} AVPanScan;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure describes the bitrate properties of an encoded bitstream. It
|
||||||
|
* roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD
|
||||||
|
* parameters for H.264/HEVC.
|
||||||
|
*/
|
||||||
|
typedef struct AVCPBProperties {
|
||||||
|
/**
|
||||||
|
* Maximum bitrate of the stream, in bits per second.
|
||||||
|
* Zero if unknown or unspecified.
|
||||||
|
*/
|
||||||
|
int64_t max_bitrate;
|
||||||
|
/**
|
||||||
|
* Minimum bitrate of the stream, in bits per second.
|
||||||
|
* Zero if unknown or unspecified.
|
||||||
|
*/
|
||||||
|
int64_t min_bitrate;
|
||||||
|
/**
|
||||||
|
* Average bitrate of the stream, in bits per second.
|
||||||
|
* Zero if unknown or unspecified.
|
||||||
|
*/
|
||||||
|
int64_t avg_bitrate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The size of the buffer to which the ratecontrol is applied, in bits.
|
||||||
|
* Zero if unknown or unspecified.
|
||||||
|
*/
|
||||||
|
int64_t buffer_size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The delay between the time the packet this structure is associated with
|
||||||
|
* is received and the time when it should be decoded, in periods of a 27MHz
|
||||||
|
* clock.
|
||||||
|
*
|
||||||
|
* UINT64_MAX when unknown or unspecified.
|
||||||
|
*/
|
||||||
|
uint64_t vbv_delay;
|
||||||
|
} AVCPBProperties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a CPB properties structure and initialize its fields to default
|
||||||
|
* values.
|
||||||
|
*
|
||||||
|
* @param size if non-NULL, the size of the allocated struct will be written
|
||||||
|
* here. This is useful for embedding it in side data.
|
||||||
|
*
|
||||||
|
* @return the newly allocated struct or NULL on failure
|
||||||
|
*/
|
||||||
|
AVCPBProperties *av_cpb_properties_alloc(size_t *size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure supplies correlation between a packet timestamp and a wall clock
|
||||||
|
* production time. The definition follows the Producer Reference Time ('prft')
|
||||||
|
* as defined in ISO/IEC 14496-12
|
||||||
|
*/
|
||||||
|
typedef struct AVProducerReferenceTime {
|
||||||
|
/**
|
||||||
|
* A UTC timestamp, in microseconds, since Unix epoch (e.g, av_gettime()).
|
||||||
|
*/
|
||||||
|
int64_t wallclock;
|
||||||
|
int flags;
|
||||||
|
} AVProducerReferenceTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode extradata length to a buffer. Used by xiph codecs.
|
||||||
|
*
|
||||||
|
* @param s buffer to write to; must be at least (v/255+1) bytes long
|
||||||
|
* @param v size of extradata in bytes
|
||||||
|
* @return number of bytes written to the buffer.
|
||||||
|
*/
|
||||||
|
unsigned int av_xiphlacing(unsigned char *s, unsigned int v);
|
||||||
|
|
||||||
|
#endif // AVCODEC_DEFS_H
|
||||||
135
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/dirac.h
vendored
Normal file
135
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/dirac.h
vendored
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007 Marco Gerards <marco@gnu.org>
|
||||||
|
* Copyright (C) 2009 David Conrad
|
||||||
|
* Copyright (C) 2011 Jordi Ortiz
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_DIRAC_H
|
||||||
|
#define AVCODEC_DIRAC_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Interface to Dirac Decoder/Encoder
|
||||||
|
* @author Marco Gerards <marco@gnu.org>
|
||||||
|
* @author David Conrad
|
||||||
|
* @author Jordi Ortiz
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "libavutil/pixfmt.h"
|
||||||
|
#include "libavutil/rational.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The spec limits the number of wavelet decompositions to 4 for both
|
||||||
|
* level 1 (VC-2) and 128 (long-gop default).
|
||||||
|
* 5 decompositions is the maximum before >16-bit buffers are needed.
|
||||||
|
* Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting
|
||||||
|
* the others to 4 decompositions (or 3 for the fidelity filter).
|
||||||
|
*
|
||||||
|
* We use this instead of MAX_DECOMPOSITIONS to save some memory.
|
||||||
|
*/
|
||||||
|
#define MAX_DWT_LEVELS 5
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse code values:
|
||||||
|
*
|
||||||
|
* Dirac Specification ->
|
||||||
|
* 9.6.1 Table 9.1
|
||||||
|
*
|
||||||
|
* VC-2 Specification ->
|
||||||
|
* 10.4.1 Table 10.1
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum DiracParseCodes {
|
||||||
|
DIRAC_PCODE_SEQ_HEADER = 0x00,
|
||||||
|
DIRAC_PCODE_END_SEQ = 0x10,
|
||||||
|
DIRAC_PCODE_AUX = 0x20,
|
||||||
|
DIRAC_PCODE_PAD = 0x30,
|
||||||
|
DIRAC_PCODE_PICTURE_CODED = 0x08,
|
||||||
|
DIRAC_PCODE_PICTURE_RAW = 0x48,
|
||||||
|
DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8,
|
||||||
|
DIRAC_PCODE_PICTURE_HQ = 0xE8,
|
||||||
|
DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A,
|
||||||
|
DIRAC_PCODE_INTER_NOREF_CO2 = 0x09,
|
||||||
|
DIRAC_PCODE_INTER_REF_CO1 = 0x0D,
|
||||||
|
DIRAC_PCODE_INTER_REF_CO2 = 0x0E,
|
||||||
|
DIRAC_PCODE_INTRA_REF_CO = 0x0C,
|
||||||
|
DIRAC_PCODE_INTRA_REF_RAW = 0x4C,
|
||||||
|
DIRAC_PCODE_INTRA_REF_PICT = 0xCC,
|
||||||
|
DIRAC_PCODE_MAGIC = 0x42424344,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct DiracVersionInfo {
|
||||||
|
int major;
|
||||||
|
int minor;
|
||||||
|
} DiracVersionInfo;
|
||||||
|
|
||||||
|
typedef struct AVDiracSeqHeader {
|
||||||
|
unsigned width;
|
||||||
|
unsigned height;
|
||||||
|
uint8_t chroma_format; ///< 0: 444 1: 422 2: 420
|
||||||
|
|
||||||
|
uint8_t interlaced;
|
||||||
|
uint8_t top_field_first;
|
||||||
|
|
||||||
|
uint8_t frame_rate_index; ///< index into dirac_frame_rate[]
|
||||||
|
uint8_t aspect_ratio_index; ///< index into dirac_aspect_ratio[]
|
||||||
|
|
||||||
|
uint16_t clean_width;
|
||||||
|
uint16_t clean_height;
|
||||||
|
uint16_t clean_left_offset;
|
||||||
|
uint16_t clean_right_offset;
|
||||||
|
|
||||||
|
uint8_t pixel_range_index; ///< index into dirac_pixel_range_presets[]
|
||||||
|
uint8_t color_spec_index; ///< index into dirac_color_spec_presets[]
|
||||||
|
|
||||||
|
int profile;
|
||||||
|
int level;
|
||||||
|
|
||||||
|
AVRational framerate;
|
||||||
|
AVRational sample_aspect_ratio;
|
||||||
|
|
||||||
|
enum AVPixelFormat pix_fmt;
|
||||||
|
enum AVColorRange color_range;
|
||||||
|
enum AVColorPrimaries color_primaries;
|
||||||
|
enum AVColorTransferCharacteristic color_trc;
|
||||||
|
enum AVColorSpace colorspace;
|
||||||
|
|
||||||
|
DiracVersionInfo version;
|
||||||
|
int bit_depth;
|
||||||
|
} AVDiracSeqHeader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a Dirac sequence header.
|
||||||
|
*
|
||||||
|
* @param dsh this function will allocate and fill an AVDiracSeqHeader struct
|
||||||
|
* and write it into this pointer. The caller must free it with
|
||||||
|
* av_free().
|
||||||
|
* @param buf the data buffer
|
||||||
|
* @param buf_size the size of the data buffer in bytes
|
||||||
|
* @param log_ctx if non-NULL, this function will log errors here
|
||||||
|
* @return 0 on success, a negative AVERROR code on failure
|
||||||
|
*/
|
||||||
|
int av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh,
|
||||||
|
const uint8_t *buf, size_t buf_size,
|
||||||
|
void *log_ctx);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_DIRAC_H */
|
||||||
82
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/dv_profile.h
vendored
Normal file
82
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/dv_profile.h
vendored
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_DV_PROFILE_H
|
||||||
|
#define AVCODEC_DV_PROFILE_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "libavutil/pixfmt.h"
|
||||||
|
#include "libavutil/rational.h"
|
||||||
|
|
||||||
|
/* minimum number of bytes to read from a DV stream in order to
|
||||||
|
* determine the profile */
|
||||||
|
#define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AVDVProfile is used to express the differences between various
|
||||||
|
* DV flavors. For now it's primarily used for differentiating
|
||||||
|
* 525/60 and 625/50, but the plans are to use it for various
|
||||||
|
* DV specs as well (e.g. SMPTE314M vs. IEC 61834).
|
||||||
|
*/
|
||||||
|
typedef struct AVDVProfile {
|
||||||
|
int dsf; /* value of the dsf in the DV header */
|
||||||
|
int video_stype; /* stype for VAUX source pack */
|
||||||
|
int frame_size; /* total size of one frame in bytes */
|
||||||
|
int difseg_size; /* number of DIF segments per DIF channel */
|
||||||
|
int n_difchan; /* number of DIF channels per frame */
|
||||||
|
AVRational time_base; /* 1/framerate */
|
||||||
|
int ltc_divisor; /* FPS from the LTS standpoint */
|
||||||
|
int height; /* picture height in pixels */
|
||||||
|
int width; /* picture width in pixels */
|
||||||
|
AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */
|
||||||
|
enum AVPixelFormat pix_fmt; /* picture pixel format */
|
||||||
|
int bpm; /* blocks per macroblock */
|
||||||
|
const uint8_t *block_sizes; /* AC block sizes, in bits */
|
||||||
|
int audio_stride; /* size of audio_shuffle table */
|
||||||
|
int audio_min_samples[3]; /* min amount of audio samples */
|
||||||
|
/* for 48kHz, 44.1kHz and 32kHz */
|
||||||
|
int audio_samples_dist[5]; /* how many samples are supposed to be */
|
||||||
|
/* in each frame in a 5 frames window */
|
||||||
|
const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */
|
||||||
|
} AVDVProfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a DV profile for the provided compressed frame.
|
||||||
|
*
|
||||||
|
* @param sys the profile used for the previous frame, may be NULL
|
||||||
|
* @param frame the compressed data buffer
|
||||||
|
* @param buf_size size of the buffer in bytes
|
||||||
|
* @return the DV profile for the supplied data or NULL on failure
|
||||||
|
*/
|
||||||
|
const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys,
|
||||||
|
const uint8_t *frame, unsigned buf_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a DV profile for the provided stream parameters.
|
||||||
|
*/
|
||||||
|
const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a DV profile for the provided stream parameters.
|
||||||
|
* The frame rate is used as a best-effort parameter.
|
||||||
|
*/
|
||||||
|
const AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_DV_PROFILE_H */
|
||||||
93
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/dxva2.h
vendored
Normal file
93
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/dxva2.h
vendored
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* DXVA2 HW acceleration
|
||||||
|
*
|
||||||
|
* copyright (c) 2009 Laurent Aimar
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_DXVA2_H
|
||||||
|
#define AVCODEC_DXVA2_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavc_codec_hwaccel_dxva2
|
||||||
|
* Public libavcodec DXVA2 header.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602
|
||||||
|
#undef _WIN32_WINNT
|
||||||
|
#define _WIN32_WINNT 0x0602
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <d3d9.h>
|
||||||
|
#include <dxva2api.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_codec_hwaccel_dxva2 DXVA2
|
||||||
|
* @ingroup lavc_codec_hwaccel
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards
|
||||||
|
#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure is used to provides the necessary configurations and data
|
||||||
|
* to the DXVA2 FFmpeg HWAccel implementation.
|
||||||
|
*
|
||||||
|
* The application must make it available as AVCodecContext.hwaccel_context.
|
||||||
|
*/
|
||||||
|
struct dxva_context {
|
||||||
|
/**
|
||||||
|
* DXVA2 decoder object
|
||||||
|
*/
|
||||||
|
IDirectXVideoDecoder *decoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DXVA2 configuration used to create the decoder
|
||||||
|
*/
|
||||||
|
const DXVA2_ConfigPictureDecode *cfg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of surface in the surface array
|
||||||
|
*/
|
||||||
|
unsigned surface_count;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The array of Direct3D surfaces used to create the decoder
|
||||||
|
*/
|
||||||
|
LPDIRECT3DSURFACE9 *surface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A bit field configuring the workarounds needed for using the decoder
|
||||||
|
*/
|
||||||
|
uint64_t workaround;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private to the FFmpeg AVHWAccel implementation
|
||||||
|
*/
|
||||||
|
unsigned report_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVCODEC_DXVA2_H */
|
||||||
46
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/jni.h
vendored
Normal file
46
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/jni.h
vendored
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* JNI public API functions
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2016 Matthieu Bouron <matthieu.bouron stupeflix.com>
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_JNI_H
|
||||||
|
#define AVCODEC_JNI_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Manually set a Java virtual machine which will be used to retrieve the JNI
|
||||||
|
* environment. Once a Java VM is set it cannot be changed afterwards, meaning
|
||||||
|
* you can call multiple times av_jni_set_java_vm with the same Java VM pointer
|
||||||
|
* however it will error out if you try to set a different Java VM.
|
||||||
|
*
|
||||||
|
* @param vm Java virtual machine
|
||||||
|
* @param log_ctx context used for logging, can be NULL
|
||||||
|
* @return 0 on success, < 0 otherwise
|
||||||
|
*/
|
||||||
|
int av_jni_set_java_vm(void *vm, void *log_ctx);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the Java virtual machine which has been set with av_jni_set_java_vm.
|
||||||
|
*
|
||||||
|
* @param vm Java virtual machine
|
||||||
|
* @return a pointer to the Java virtual machine
|
||||||
|
*/
|
||||||
|
void *av_jni_get_java_vm(void *log_ctx);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_JNI_H */
|
||||||
103
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/mediacodec.h
vendored
Normal file
103
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/mediacodec.h
vendored
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* Android MediaCodec public API
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016 Matthieu Bouron <matthieu.bouron stupeflix.com>
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_MEDIACODEC_H
|
||||||
|
#define AVCODEC_MEDIACODEC_H
|
||||||
|
|
||||||
|
#include "libavcodec/avcodec.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure holds a reference to a android/view/Surface object that will
|
||||||
|
* be used as output by the decoder.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef struct AVMediaCodecContext {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* android/view/Surface object reference.
|
||||||
|
*/
|
||||||
|
void *surface;
|
||||||
|
|
||||||
|
} AVMediaCodecContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a MediaCodec context.
|
||||||
|
*
|
||||||
|
* When decoding with MediaCodec is finished, the caller must free the
|
||||||
|
* MediaCodec context with av_mediacodec_default_free.
|
||||||
|
*
|
||||||
|
* @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise
|
||||||
|
*/
|
||||||
|
AVMediaCodecContext *av_mediacodec_alloc_context(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function that sets up the MediaCodec context.
|
||||||
|
*
|
||||||
|
* @param avctx codec context
|
||||||
|
* @param ctx MediaCodec context to initialize
|
||||||
|
* @param surface reference to an android/view/Surface
|
||||||
|
* @return 0 on success, < 0 otherwise
|
||||||
|
*/
|
||||||
|
int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function must be called to free the MediaCodec context initialized with
|
||||||
|
* av_mediacodec_default_init().
|
||||||
|
*
|
||||||
|
* @param avctx codec context
|
||||||
|
*/
|
||||||
|
void av_mediacodec_default_free(AVCodecContext *avctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque structure representing a MediaCodec buffer to render.
|
||||||
|
*/
|
||||||
|
typedef struct MediaCodecBuffer AVMediaCodecBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release a MediaCodec buffer and render it to the surface that is associated
|
||||||
|
* with the decoder. This function should only be called once on a given
|
||||||
|
* buffer, once released the underlying buffer returns to the codec, thus
|
||||||
|
* subsequent calls to this function will have no effect.
|
||||||
|
*
|
||||||
|
* @param buffer the buffer to render
|
||||||
|
* @param render 1 to release and render the buffer to the surface or 0 to
|
||||||
|
* discard the buffer
|
||||||
|
* @return 0 on success, < 0 otherwise
|
||||||
|
*/
|
||||||
|
int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release a MediaCodec buffer and render it at the given time to the surface
|
||||||
|
* that is associated with the decoder. The timestamp must be within one second
|
||||||
|
* of the current `java/lang/System#nanoTime()` (which is implemented using
|
||||||
|
* `CLOCK_MONOTONIC` on Android). See the Android MediaCodec documentation
|
||||||
|
* of [`android/media/MediaCodec#releaseOutputBuffer(int,long)`][0] for more details.
|
||||||
|
*
|
||||||
|
* @param buffer the buffer to render
|
||||||
|
* @param time timestamp in nanoseconds of when to render the buffer
|
||||||
|
* @return 0 on success, < 0 otherwise
|
||||||
|
*
|
||||||
|
* [0]: https://developer.android.com/reference/android/media/MediaCodec#releaseOutputBuffer(int,%20long)
|
||||||
|
*/
|
||||||
|
int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_MEDIACODEC_H */
|
||||||
846
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/packet.h
vendored
Normal file
846
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/packet.h
vendored
Normal file
@ -0,0 +1,846 @@
|
|||||||
|
/*
|
||||||
|
* AVPacket public API
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_PACKET_H
|
||||||
|
#define AVCODEC_PACKET_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "libavutil/attributes.h"
|
||||||
|
#include "libavutil/buffer.h"
|
||||||
|
#include "libavutil/dict.h"
|
||||||
|
#include "libavutil/rational.h"
|
||||||
|
#include "libavutil/version.h"
|
||||||
|
|
||||||
|
#include "libavcodec/version_major.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_packet_side_data AVPacketSideData
|
||||||
|
*
|
||||||
|
* Types and functions for working with AVPacketSideData.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
enum AVPacketSideDataType {
|
||||||
|
/**
|
||||||
|
* An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE
|
||||||
|
* bytes worth of palette. This side data signals that a new palette is
|
||||||
|
* present.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_PALETTE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format
|
||||||
|
* that the extradata buffer was changed and the receiving side should
|
||||||
|
* act upon it appropriately. The new extradata is embedded in the side
|
||||||
|
* data buffer and should be immediately used for processing the current
|
||||||
|
* frame or packet.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_NEW_EXTRADATA,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
|
||||||
|
* @code
|
||||||
|
* u32le param_flags
|
||||||
|
* if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
|
||||||
|
* s32le channel_count
|
||||||
|
* if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
|
||||||
|
* u64le channel_layout
|
||||||
|
* if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
|
||||||
|
* s32le sample_rate
|
||||||
|
* if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
|
||||||
|
* s32le width
|
||||||
|
* s32le height
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_PARAM_CHANGE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of
|
||||||
|
* structures with info about macroblocks relevant to splitting the
|
||||||
|
* packet into smaller packets on macroblock edges (e.g. as for RFC 2190).
|
||||||
|
* That is, it does not necessarily contain info about all macroblocks,
|
||||||
|
* as long as the distance between macroblocks in the info is smaller
|
||||||
|
* than the target payload size.
|
||||||
|
* Each MB info structure is 12 bytes, and is laid out as follows:
|
||||||
|
* @code
|
||||||
|
* u32le bit offset from the start of the packet
|
||||||
|
* u8 current quantizer at the start of the macroblock
|
||||||
|
* u8 GOB number
|
||||||
|
* u16le macroblock address within the GOB
|
||||||
|
* u8 horizontal MV predictor
|
||||||
|
* u8 vertical MV predictor
|
||||||
|
* u8 horizontal MV predictor for block number 3
|
||||||
|
* u8 vertical MV predictor for block number 3
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_H263_MB_INFO,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data should be associated with an audio stream and contains
|
||||||
|
* ReplayGain information in form of the AVReplayGain struct.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_REPLAYGAIN,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data contains a 3x3 transformation matrix describing an affine
|
||||||
|
* transformation that needs to be applied to the decoded video frames for
|
||||||
|
* correct presentation.
|
||||||
|
*
|
||||||
|
* See libavutil/display.h for a detailed description of the data.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_DISPLAYMATRIX,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data should be associated with a video stream and contains
|
||||||
|
* Stereoscopic 3D information in form of the AVStereo3D struct.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_STEREO3D,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data should be associated with an audio stream and corresponds
|
||||||
|
* to enum AVAudioServiceType.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_AUDIO_SERVICE_TYPE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data contains quality related information from the encoder.
|
||||||
|
* @code
|
||||||
|
* u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad).
|
||||||
|
* u8 picture type
|
||||||
|
* u8 error count
|
||||||
|
* u16 reserved
|
||||||
|
* u64le[error count] sum of squared differences between encoder in and output
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_QUALITY_STATS,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data contains an integer value representing the stream index
|
||||||
|
* of a "fallback" track. A fallback track indicates an alternate
|
||||||
|
* track to use when the current track can not be decoded for some reason.
|
||||||
|
* e.g. no decoder available for codec.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_FALLBACK_TRACK,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data corresponds to the AVCPBProperties struct.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_CPB_PROPERTIES,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recommmends skipping the specified number of samples
|
||||||
|
* @code
|
||||||
|
* u32le number of samples to skip from start of this packet
|
||||||
|
* u32le number of samples to skip from end of this packet
|
||||||
|
* u8 reason for start skip
|
||||||
|
* u8 reason for end skip (0=padding silence, 1=convergence)
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_SKIP_SAMPLES,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An AV_PKT_DATA_JP_DUALMONO side data packet indicates that
|
||||||
|
* the packet may contain "dual mono" audio specific to Japanese DTV
|
||||||
|
* and if it is true, recommends only the selected channel to be used.
|
||||||
|
* @code
|
||||||
|
* u8 selected channels (0=main/left, 1=sub/right, 2=both)
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_JP_DUALMONO,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of zero terminated key/value strings. There is no end marker for
|
||||||
|
* the list, so it is required to rely on the side data size to stop.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_STRINGS_METADATA,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subtitle event position
|
||||||
|
* @code
|
||||||
|
* u32le x1
|
||||||
|
* u32le y1
|
||||||
|
* u32le x2
|
||||||
|
* u32le y2
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_SUBTITLE_POSITION,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data found in BlockAdditional element of matroska container. There is
|
||||||
|
* no end marker for the data, so it is required to rely on the side data
|
||||||
|
* size to recognize the end. 8 byte id (as found in BlockAddId) followed
|
||||||
|
* by data.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The optional first identifier line of a WebVTT cue.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_WEBVTT_IDENTIFIER,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The optional settings (rendering instructions) that immediately
|
||||||
|
* follow the timestamp specifier of a WebVTT cue.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_WEBVTT_SETTINGS,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of zero terminated key/value strings. There is no end marker for
|
||||||
|
* the list, so it is required to rely on the side data size to stop. This
|
||||||
|
* side data includes updated metadata which appeared in the stream.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_METADATA_UPDATE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPEGTS stream ID as uint8_t, this is required to pass the stream ID
|
||||||
|
* information from the demuxer to the corresponding muxer.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_MPEGTS_STREAM_ID,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mastering display metadata (based on SMPTE-2086:2014). This metadata
|
||||||
|
* should be associated with a video stream and contains data in the form
|
||||||
|
* of the AVMasteringDisplayMetadata struct.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data should be associated with a video stream and corresponds
|
||||||
|
* to the AVSphericalMapping structure.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_SPHERICAL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Content light level (based on CTA-861.3). This metadata should be
|
||||||
|
* associated with a video stream and contains data in the form of the
|
||||||
|
* AVContentLightMetadata struct.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ATSC A53 Part 4 Closed Captions. This metadata should be associated with
|
||||||
|
* a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data.
|
||||||
|
* The number of bytes of CC data is AVPacketSideData.size.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_A53_CC,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data is encryption initialization data.
|
||||||
|
* The format is not part of ABI, use av_encryption_init_info_* methods to
|
||||||
|
* access.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_ENCRYPTION_INIT_INFO,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This side data contains encryption info for how to decrypt the packet.
|
||||||
|
* The format is not part of ABI, use av_encryption_info_* methods to access.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_ENCRYPTION_INFO,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Active Format Description data consisting of a single byte as specified
|
||||||
|
* in ETSI TS 101 154 using AVActiveFormatDescription enum.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_AFD,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Producer Reference Time data corresponding to the AVProducerReferenceTime struct,
|
||||||
|
* usually exported by some encoders (on demand through the prft flag set in the
|
||||||
|
* AVCodecContext export_side_data field).
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_PRFT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ICC profile data consisting of an opaque octet buffer following the
|
||||||
|
* format described by ISO 15076-1.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_ICC_PROFILE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DOVI configuration
|
||||||
|
* ref:
|
||||||
|
* dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2, section 2.2
|
||||||
|
* dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2, section 3.3
|
||||||
|
* Tags are stored in struct AVDOVIDecoderConfigurationRecord.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_DOVI_CONF,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timecode which conforms to SMPTE ST 12-1:2014. The data is an array of 4 uint32_t
|
||||||
|
* where the first uint32_t describes how many (1-3) of the other timecodes are used.
|
||||||
|
* The timecode format is described in the documentation of av_timecode_get_smpte_from_framenum()
|
||||||
|
* function in libavutil/timecode.h.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_S12M_TIMECODE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HDR10+ dynamic metadata associated with a video frame. The metadata is in
|
||||||
|
* the form of the AVDynamicHDRPlus struct and contains
|
||||||
|
* information for color volume transform - application 4 of
|
||||||
|
* SMPTE 2094-40:2016 standard.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_DYNAMIC_HDR10_PLUS,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of side data types.
|
||||||
|
* This is not part of the public API/ABI in the sense that it may
|
||||||
|
* change when new side data types are added.
|
||||||
|
* This must stay the last enum value.
|
||||||
|
* If its value becomes huge, some code using it
|
||||||
|
* needs to be updated as it assumes it to be smaller than other limits.
|
||||||
|
*/
|
||||||
|
AV_PKT_DATA_NB
|
||||||
|
};
|
||||||
|
|
||||||
|
#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure stores auxiliary information for decoding, presenting, or
|
||||||
|
* otherwise processing the coded stream. It is typically exported by demuxers
|
||||||
|
* and encoders and can be fed to decoders and muxers either in a per packet
|
||||||
|
* basis, or as global side data (applying to the entire coded stream).
|
||||||
|
*
|
||||||
|
* Global side data is handled as follows:
|
||||||
|
* - During demuxing, it may be exported through
|
||||||
|
* @ref AVStream.codecpar.side_data "AVStream's codec parameters", which can
|
||||||
|
* then be passed as input to decoders through the
|
||||||
|
* @ref AVCodecContext.coded_side_data "decoder context's side data", for
|
||||||
|
* initialization.
|
||||||
|
* - For muxing, it can be fed through @ref AVStream.codecpar.side_data
|
||||||
|
* "AVStream's codec parameters", typically the output of encoders through
|
||||||
|
* the @ref AVCodecContext.coded_side_data "encoder context's side data", for
|
||||||
|
* initialization.
|
||||||
|
*
|
||||||
|
* Packet specific side data is handled as follows:
|
||||||
|
* - During demuxing, it may be exported through @ref AVPacket.side_data
|
||||||
|
* "AVPacket's side data", which can then be passed as input to decoders.
|
||||||
|
* - For muxing, it can be fed through @ref AVPacket.side_data "AVPacket's
|
||||||
|
* side data", typically the output of encoders.
|
||||||
|
*
|
||||||
|
* Different modules may accept or export different types of side data
|
||||||
|
* depending on media type and codec. Refer to @ref AVPacketSideDataType for a
|
||||||
|
* list of defined types and where they may be found or used.
|
||||||
|
*/
|
||||||
|
typedef struct AVPacketSideData {
|
||||||
|
uint8_t *data;
|
||||||
|
size_t size;
|
||||||
|
enum AVPacketSideDataType type;
|
||||||
|
} AVPacketSideData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a new packet side data.
|
||||||
|
*
|
||||||
|
* @param sd pointer to an array of side data to which the side data should
|
||||||
|
* be added. *sd may be NULL, in which case the array will be
|
||||||
|
* initialized.
|
||||||
|
* @param nb_sd pointer to an integer containing the number of entries in
|
||||||
|
* the array. The integer value will be increased by 1 on success.
|
||||||
|
* @param type side data type
|
||||||
|
* @param size desired side data size
|
||||||
|
* @param flags currently unused. Must be zero
|
||||||
|
*
|
||||||
|
* @return pointer to freshly allocated side data on success, or NULL otherwise.
|
||||||
|
*/
|
||||||
|
AVPacketSideData *av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd,
|
||||||
|
enum AVPacketSideDataType type,
|
||||||
|
size_t size, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap existing data as packet side data.
|
||||||
|
*
|
||||||
|
* @param sd pointer to an array of side data to which the side data should
|
||||||
|
* be added. *sd may be NULL, in which case the array will be
|
||||||
|
* initialized
|
||||||
|
* @param nb_sd pointer to an integer containing the number of entries in
|
||||||
|
* the array. The integer value will be increased by 1 on success.
|
||||||
|
* @param type side data type
|
||||||
|
* @param data a data array. It must be allocated with the av_malloc() family
|
||||||
|
* of functions. The ownership of the data is transferred to the
|
||||||
|
* side data array on success
|
||||||
|
* @param size size of the data array
|
||||||
|
* @param flags currently unused. Must be zero
|
||||||
|
*
|
||||||
|
* @return pointer to freshly allocated side data on success, or NULL otherwise
|
||||||
|
* On failure, the side data array is unchanged and the data remains
|
||||||
|
* owned by the caller.
|
||||||
|
*/
|
||||||
|
AVPacketSideData *av_packet_side_data_add(AVPacketSideData **sd, int *nb_sd,
|
||||||
|
enum AVPacketSideDataType type,
|
||||||
|
void *data, size_t size, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get side information from a side data array.
|
||||||
|
*
|
||||||
|
* @param sd the array from which the side data should be fetched
|
||||||
|
* @param nb_sd value containing the number of entries in the array.
|
||||||
|
* @param type desired side information type
|
||||||
|
*
|
||||||
|
* @return pointer to side data if present or NULL otherwise
|
||||||
|
*/
|
||||||
|
const AVPacketSideData *av_packet_side_data_get(const AVPacketSideData *sd,
|
||||||
|
int nb_sd,
|
||||||
|
enum AVPacketSideDataType type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove side data of the given type from a side data array.
|
||||||
|
*
|
||||||
|
* @param sd the array from which the side data should be removed
|
||||||
|
* @param nb_sd pointer to an integer containing the number of entries in
|
||||||
|
* the array. Will be reduced by the amount of entries removed
|
||||||
|
* upon return
|
||||||
|
* @param type side information type
|
||||||
|
*/
|
||||||
|
void av_packet_side_data_remove(AVPacketSideData *sd, int *nb_sd,
|
||||||
|
enum AVPacketSideDataType type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function to free all the side data stored in an array, and
|
||||||
|
* the array itself.
|
||||||
|
*
|
||||||
|
* @param sd pointer to array of side data to free. Will be set to NULL
|
||||||
|
* upon return.
|
||||||
|
* @param nb_sd pointer to an integer containing the number of entries in
|
||||||
|
* the array. Will be set to 0 upon return.
|
||||||
|
*/
|
||||||
|
void av_packet_side_data_free(AVPacketSideData **sd, int *nb_sd);
|
||||||
|
|
||||||
|
const char *av_packet_side_data_name(enum AVPacketSideDataType type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_packet AVPacket
|
||||||
|
*
|
||||||
|
* Types and functions for working with AVPacket.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure stores compressed data. It is typically exported by demuxers
|
||||||
|
* and then passed as input to decoders, or received as output from encoders and
|
||||||
|
* then passed to muxers.
|
||||||
|
*
|
||||||
|
* For video, it should typically contain one compressed frame. For audio it may
|
||||||
|
* contain several compressed frames. Encoders are allowed to output empty
|
||||||
|
* packets, with no compressed data, containing only side data
|
||||||
|
* (e.g. to update some stream parameters at the end of encoding).
|
||||||
|
*
|
||||||
|
* The semantics of data ownership depends on the buf field.
|
||||||
|
* If it is set, the packet data is dynamically allocated and is
|
||||||
|
* valid indefinitely until a call to av_packet_unref() reduces the
|
||||||
|
* reference count to 0.
|
||||||
|
*
|
||||||
|
* If the buf field is not set av_packet_ref() would make a copy instead
|
||||||
|
* of increasing the reference count.
|
||||||
|
*
|
||||||
|
* The side data is always allocated with av_malloc(), copied by
|
||||||
|
* av_packet_ref() and freed by av_packet_unref().
|
||||||
|
*
|
||||||
|
* sizeof(AVPacket) being a part of the public ABI is deprecated. once
|
||||||
|
* av_init_packet() is removed, new packets will only be able to be allocated
|
||||||
|
* with av_packet_alloc(), and new fields may be added to the end of the struct
|
||||||
|
* with a minor bump.
|
||||||
|
*
|
||||||
|
* @see av_packet_alloc
|
||||||
|
* @see av_packet_ref
|
||||||
|
* @see av_packet_unref
|
||||||
|
*/
|
||||||
|
typedef struct AVPacket {
|
||||||
|
/**
|
||||||
|
* A reference to the reference-counted buffer where the packet data is
|
||||||
|
* stored.
|
||||||
|
* May be NULL, then the packet data is not reference-counted.
|
||||||
|
*/
|
||||||
|
AVBufferRef *buf;
|
||||||
|
/**
|
||||||
|
* Presentation timestamp in AVStream->time_base units; the time at which
|
||||||
|
* the decompressed packet will be presented to the user.
|
||||||
|
* Can be AV_NOPTS_VALUE if it is not stored in the file.
|
||||||
|
* pts MUST be larger or equal to dts as presentation cannot happen before
|
||||||
|
* decompression, unless one wants to view hex dumps. Some formats misuse
|
||||||
|
* the terms dts and pts/cts to mean something different. Such timestamps
|
||||||
|
* must be converted to true pts/dts before they are stored in AVPacket.
|
||||||
|
*/
|
||||||
|
int64_t pts;
|
||||||
|
/**
|
||||||
|
* Decompression timestamp in AVStream->time_base units; the time at which
|
||||||
|
* the packet is decompressed.
|
||||||
|
* Can be AV_NOPTS_VALUE if it is not stored in the file.
|
||||||
|
*/
|
||||||
|
int64_t dts;
|
||||||
|
uint8_t *data;
|
||||||
|
int size;
|
||||||
|
int stream_index;
|
||||||
|
/**
|
||||||
|
* A combination of AV_PKT_FLAG values
|
||||||
|
*/
|
||||||
|
int flags;
|
||||||
|
/**
|
||||||
|
* Additional packet data that can be provided by the container.
|
||||||
|
* Packet can contain several types of side information.
|
||||||
|
*/
|
||||||
|
AVPacketSideData *side_data;
|
||||||
|
int side_data_elems;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Duration of this packet in AVStream->time_base units, 0 if unknown.
|
||||||
|
* Equals next_pts - this_pts in presentation order.
|
||||||
|
*/
|
||||||
|
int64_t duration;
|
||||||
|
|
||||||
|
int64_t pos; ///< byte position in stream, -1 if unknown
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for some private data of the user
|
||||||
|
*/
|
||||||
|
void *opaque;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AVBufferRef for free use by the API user. FFmpeg will never check the
|
||||||
|
* contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when
|
||||||
|
* the packet is unreferenced. av_packet_copy_props() calls create a new
|
||||||
|
* reference with av_buffer_ref() for the target packet's opaque_ref field.
|
||||||
|
*
|
||||||
|
* This is unrelated to the opaque field, although it serves a similar
|
||||||
|
* purpose.
|
||||||
|
*/
|
||||||
|
AVBufferRef *opaque_ref;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Time base of the packet's timestamps.
|
||||||
|
* In the future, this field may be set on packets output by encoders or
|
||||||
|
* demuxers, but its value will be by default ignored on input to decoders
|
||||||
|
* or muxers.
|
||||||
|
*/
|
||||||
|
AVRational time_base;
|
||||||
|
} AVPacket;
|
||||||
|
|
||||||
|
#if FF_API_INIT_PACKET
|
||||||
|
attribute_deprecated
|
||||||
|
typedef struct AVPacketList {
|
||||||
|
AVPacket pkt;
|
||||||
|
struct AVPacketList *next;
|
||||||
|
} AVPacketList;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe
|
||||||
|
#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
|
||||||
|
/**
|
||||||
|
* Flag is used to discard packets which are required to maintain valid
|
||||||
|
* decoder state but are not required for output and should be dropped
|
||||||
|
* after decoding.
|
||||||
|
**/
|
||||||
|
#define AV_PKT_FLAG_DISCARD 0x0004
|
||||||
|
/**
|
||||||
|
* The packet comes from a trusted source.
|
||||||
|
*
|
||||||
|
* Otherwise-unsafe constructs such as arbitrary pointers to data
|
||||||
|
* outside the packet may be followed.
|
||||||
|
*/
|
||||||
|
#define AV_PKT_FLAG_TRUSTED 0x0008
|
||||||
|
/**
|
||||||
|
* Flag is used to indicate packets that contain frames that can
|
||||||
|
* be discarded by the decoder. I.e. Non-reference frames.
|
||||||
|
*/
|
||||||
|
#define AV_PKT_FLAG_DISPOSABLE 0x0010
|
||||||
|
|
||||||
|
enum AVSideDataParamChangeFlags {
|
||||||
|
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||||
|
/**
|
||||||
|
* @deprecated those are not used by any decoder
|
||||||
|
*/
|
||||||
|
AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001,
|
||||||
|
AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
|
||||||
|
#endif
|
||||||
|
AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004,
|
||||||
|
AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate an AVPacket and set its fields to default values. The resulting
|
||||||
|
* struct must be freed using av_packet_free().
|
||||||
|
*
|
||||||
|
* @return An AVPacket filled with default values or NULL on failure.
|
||||||
|
*
|
||||||
|
* @note this only allocates the AVPacket itself, not the data buffers. Those
|
||||||
|
* must be allocated through other means such as av_new_packet.
|
||||||
|
*
|
||||||
|
* @see av_new_packet
|
||||||
|
*/
|
||||||
|
AVPacket *av_packet_alloc(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new packet that references the same data as src.
|
||||||
|
*
|
||||||
|
* This is a shortcut for av_packet_alloc()+av_packet_ref().
|
||||||
|
*
|
||||||
|
* @return newly created AVPacket on success, NULL on error.
|
||||||
|
*
|
||||||
|
* @see av_packet_alloc
|
||||||
|
* @see av_packet_ref
|
||||||
|
*/
|
||||||
|
AVPacket *av_packet_clone(const AVPacket *src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the packet, if the packet is reference counted, it will be
|
||||||
|
* unreferenced first.
|
||||||
|
*
|
||||||
|
* @param pkt packet to be freed. The pointer will be set to NULL.
|
||||||
|
* @note passing NULL is a no-op.
|
||||||
|
*/
|
||||||
|
void av_packet_free(AVPacket **pkt);
|
||||||
|
|
||||||
|
#if FF_API_INIT_PACKET
|
||||||
|
/**
|
||||||
|
* Initialize optional fields of a packet with default values.
|
||||||
|
*
|
||||||
|
* Note, this does not touch the data and size members, which have to be
|
||||||
|
* initialized separately.
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
*
|
||||||
|
* @see av_packet_alloc
|
||||||
|
* @see av_packet_unref
|
||||||
|
*
|
||||||
|
* @deprecated This function is deprecated. Once it's removed,
|
||||||
|
sizeof(AVPacket) will not be a part of the ABI anymore.
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
void av_init_packet(AVPacket *pkt);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate the payload of a packet and initialize its fields with
|
||||||
|
* default values.
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
* @param size wanted payload size
|
||||||
|
* @return 0 if OK, AVERROR_xxx otherwise
|
||||||
|
*/
|
||||||
|
int av_new_packet(AVPacket *pkt, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reduce packet size, correctly zeroing padding
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
* @param size new size
|
||||||
|
*/
|
||||||
|
void av_shrink_packet(AVPacket *pkt, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increase packet size, correctly zeroing padding
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
* @param grow_by number of bytes by which to increase the size of the packet
|
||||||
|
*/
|
||||||
|
int av_grow_packet(AVPacket *pkt, int grow_by);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a reference-counted packet from av_malloc()ed data.
|
||||||
|
*
|
||||||
|
* @param pkt packet to be initialized. This function will set the data, size,
|
||||||
|
* and buf fields, all others are left untouched.
|
||||||
|
* @param data Data allocated by av_malloc() to be used as packet data. If this
|
||||||
|
* function returns successfully, the data is owned by the underlying AVBuffer.
|
||||||
|
* The caller may not access the data through other means.
|
||||||
|
* @param size size of data in bytes, without the padding. I.e. the full buffer
|
||||||
|
* size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE.
|
||||||
|
*
|
||||||
|
* @return 0 on success, a negative AVERROR on error
|
||||||
|
*/
|
||||||
|
int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate new information of a packet.
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
* @param type side information type
|
||||||
|
* @param size side information size
|
||||||
|
* @return pointer to fresh allocated data or NULL otherwise
|
||||||
|
*/
|
||||||
|
uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
||||||
|
size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap an existing array as a packet side data.
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
* @param type side information type
|
||||||
|
* @param data the side data array. It must be allocated with the av_malloc()
|
||||||
|
* family of functions. The ownership of the data is transferred to
|
||||||
|
* pkt.
|
||||||
|
* @param size side information size
|
||||||
|
* @return a non-negative number on success, a negative AVERROR code on
|
||||||
|
* failure. On failure, the packet is unchanged and the data remains
|
||||||
|
* owned by the caller.
|
||||||
|
*/
|
||||||
|
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
||||||
|
uint8_t *data, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shrink the already allocated side data buffer
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
* @param type side information type
|
||||||
|
* @param size new side information size
|
||||||
|
* @return 0 on success, < 0 on failure
|
||||||
|
*/
|
||||||
|
int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
||||||
|
size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get side information from packet.
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
* @param type desired side information type
|
||||||
|
* @param size If supplied, *size will be set to the size of the side data
|
||||||
|
* or to zero if the desired side data is not present.
|
||||||
|
* @return pointer to data if present or NULL otherwise
|
||||||
|
*/
|
||||||
|
uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type,
|
||||||
|
size_t *size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pack a dictionary for use in side_data.
|
||||||
|
*
|
||||||
|
* @param dict The dictionary to pack.
|
||||||
|
* @param size pointer to store the size of the returned data
|
||||||
|
* @return pointer to data if successful, NULL otherwise
|
||||||
|
*/
|
||||||
|
uint8_t *av_packet_pack_dictionary(AVDictionary *dict, size_t *size);
|
||||||
|
/**
|
||||||
|
* Unpack a dictionary from side_data.
|
||||||
|
*
|
||||||
|
* @param data data from side_data
|
||||||
|
* @param size size of the data
|
||||||
|
* @param dict the metadata storage dictionary
|
||||||
|
* @return 0 on success, < 0 on failure
|
||||||
|
*/
|
||||||
|
int av_packet_unpack_dictionary(const uint8_t *data, size_t size,
|
||||||
|
AVDictionary **dict);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function to free all the side data stored.
|
||||||
|
* All the other fields stay untouched.
|
||||||
|
*
|
||||||
|
* @param pkt packet
|
||||||
|
*/
|
||||||
|
void av_packet_free_side_data(AVPacket *pkt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup a new reference to the data described by a given packet
|
||||||
|
*
|
||||||
|
* If src is reference-counted, setup dst as a new reference to the
|
||||||
|
* buffer in src. Otherwise allocate a new buffer in dst and copy the
|
||||||
|
* data from src into it.
|
||||||
|
*
|
||||||
|
* All the other fields are copied from src.
|
||||||
|
*
|
||||||
|
* @see av_packet_unref
|
||||||
|
*
|
||||||
|
* @param dst Destination packet. Will be completely overwritten.
|
||||||
|
* @param src Source packet
|
||||||
|
*
|
||||||
|
* @return 0 on success, a negative AVERROR on error. On error, dst
|
||||||
|
* will be blank (as if returned by av_packet_alloc()).
|
||||||
|
*/
|
||||||
|
int av_packet_ref(AVPacket *dst, const AVPacket *src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wipe the packet.
|
||||||
|
*
|
||||||
|
* Unreference the buffer referenced by the packet and reset the
|
||||||
|
* remaining packet fields to their default values.
|
||||||
|
*
|
||||||
|
* @param pkt The packet to be unreferenced.
|
||||||
|
*/
|
||||||
|
void av_packet_unref(AVPacket *pkt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move every field in src to dst and reset src.
|
||||||
|
*
|
||||||
|
* @see av_packet_unref
|
||||||
|
*
|
||||||
|
* @param src Source packet, will be reset
|
||||||
|
* @param dst Destination packet
|
||||||
|
*/
|
||||||
|
void av_packet_move_ref(AVPacket *dst, AVPacket *src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy only "properties" fields from src to dst.
|
||||||
|
*
|
||||||
|
* Properties for the purpose of this function are all the fields
|
||||||
|
* beside those related to the packet data (buf, data, size)
|
||||||
|
*
|
||||||
|
* @param dst Destination packet
|
||||||
|
* @param src Source packet
|
||||||
|
*
|
||||||
|
* @return 0 on success AVERROR on failure.
|
||||||
|
*/
|
||||||
|
int av_packet_copy_props(AVPacket *dst, const AVPacket *src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure the data described by a given packet is reference counted.
|
||||||
|
*
|
||||||
|
* @note This function does not ensure that the reference will be writable.
|
||||||
|
* Use av_packet_make_writable instead for that purpose.
|
||||||
|
*
|
||||||
|
* @see av_packet_ref
|
||||||
|
* @see av_packet_make_writable
|
||||||
|
*
|
||||||
|
* @param pkt packet whose data should be made reference counted.
|
||||||
|
*
|
||||||
|
* @return 0 on success, a negative AVERROR on error. On failure, the
|
||||||
|
* packet is unchanged.
|
||||||
|
*/
|
||||||
|
int av_packet_make_refcounted(AVPacket *pkt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a writable reference for the data described by a given packet,
|
||||||
|
* avoiding data copy if possible.
|
||||||
|
*
|
||||||
|
* @param pkt Packet whose data should be made writable.
|
||||||
|
*
|
||||||
|
* @return 0 on success, a negative AVERROR on failure. On failure, the
|
||||||
|
* packet is unchanged.
|
||||||
|
*/
|
||||||
|
int av_packet_make_writable(AVPacket *pkt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert valid timing fields (timestamps / durations) in a packet from one
|
||||||
|
* timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be
|
||||||
|
* ignored.
|
||||||
|
*
|
||||||
|
* @param pkt packet on which the conversion will be performed
|
||||||
|
* @param tb_src source timebase, in which the timing fields in pkt are
|
||||||
|
* expressed
|
||||||
|
* @param tb_dst destination timebase, to which the timing fields will be
|
||||||
|
* converted
|
||||||
|
*/
|
||||||
|
void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // AVCODEC_PACKET_H
|
||||||
109
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/qsv.h
vendored
Normal file
109
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/qsv.h
vendored
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Intel MediaSDK QSV public API
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_QSV_H
|
||||||
|
#define AVCODEC_QSV_H
|
||||||
|
|
||||||
|
#include <mfxvideo.h>
|
||||||
|
|
||||||
|
#include "libavutil/buffer.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This struct is used for communicating QSV parameters between libavcodec and
|
||||||
|
* the caller. It is managed by the caller and must be assigned to
|
||||||
|
* AVCodecContext.hwaccel_context.
|
||||||
|
* - decoding: hwaccel_context must be set on return from the get_format()
|
||||||
|
* callback
|
||||||
|
* - encoding: hwaccel_context must be set before avcodec_open2()
|
||||||
|
*/
|
||||||
|
typedef struct AVQSVContext {
|
||||||
|
/**
|
||||||
|
* If non-NULL, the session to use for encoding or decoding.
|
||||||
|
* Otherwise, libavcodec will try to create an internal session.
|
||||||
|
*/
|
||||||
|
mfxSession session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The IO pattern to use.
|
||||||
|
*/
|
||||||
|
int iopattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extra buffers to pass to encoder or decoder initialization.
|
||||||
|
*/
|
||||||
|
mfxExtBuffer **ext_buffers;
|
||||||
|
int nb_ext_buffers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoding only. If this field is set to non-zero by the caller, libavcodec
|
||||||
|
* will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to
|
||||||
|
* the encoder initialization. This only makes sense if iopattern is also
|
||||||
|
* set to MFX_IOPATTERN_IN_OPAQUE_MEMORY.
|
||||||
|
*
|
||||||
|
* The number of allocated opaque surfaces will be the sum of the number
|
||||||
|
* required by the encoder and the user-provided value nb_opaque_surfaces.
|
||||||
|
* The array of the opaque surfaces will be exported to the caller through
|
||||||
|
* the opaque_surfaces field.
|
||||||
|
*
|
||||||
|
* The caller must set this field to zero for oneVPL (MFX_VERSION >= 2.0)
|
||||||
|
*/
|
||||||
|
int opaque_alloc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoding only, and only if opaque_alloc is set to non-zero. Before
|
||||||
|
* calling avcodec_open2(), the caller should set this field to the number
|
||||||
|
* of extra opaque surfaces to allocate beyond what is required by the
|
||||||
|
* encoder.
|
||||||
|
*
|
||||||
|
* On return from avcodec_open2(), this field will be set by libavcodec to
|
||||||
|
* the total number of allocated opaque surfaces.
|
||||||
|
*/
|
||||||
|
int nb_opaque_surfaces;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoding only, and only if opaque_alloc is set to non-zero. On return
|
||||||
|
* from avcodec_open2(), this field will be used by libavcodec to export the
|
||||||
|
* array of the allocated opaque surfaces to the caller, so they can be
|
||||||
|
* passed to other parts of the pipeline.
|
||||||
|
*
|
||||||
|
* The buffer reference exported here is owned and managed by libavcodec,
|
||||||
|
* the callers should make their own reference with av_buffer_ref() and free
|
||||||
|
* it with av_buffer_unref() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1.
|
||||||
|
*/
|
||||||
|
AVBufferRef *opaque_surfaces;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoding only, and only if opaque_alloc is set to non-zero. On return
|
||||||
|
* from avcodec_open2(), this field will be set to the surface type used in
|
||||||
|
* the opaque allocation request.
|
||||||
|
*/
|
||||||
|
int opaque_alloc_type;
|
||||||
|
} AVQSVContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a new context.
|
||||||
|
*
|
||||||
|
* It must be freed by the caller with av_free().
|
||||||
|
*/
|
||||||
|
AVQSVContext *av_qsv_alloc_context(void);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_QSV_H */
|
||||||
157
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/vdpau.h
vendored
Normal file
157
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/vdpau.h
vendored
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* The Video Decode and Presentation API for UNIX (VDPAU) is used for
|
||||||
|
* hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 NVIDIA
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_VDPAU_H
|
||||||
|
#define AVCODEC_VDPAU_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavc_codec_hwaccel_vdpau
|
||||||
|
* Public libavcodec VDPAU header.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer
|
||||||
|
* @ingroup lavc_codec_hwaccel
|
||||||
|
*
|
||||||
|
* VDPAU hardware acceleration has two modules
|
||||||
|
* - VDPAU decoding
|
||||||
|
* - VDPAU presentation
|
||||||
|
*
|
||||||
|
* The VDPAU decoding module parses all headers using FFmpeg
|
||||||
|
* parsing mechanisms and uses VDPAU for the actual decoding.
|
||||||
|
*
|
||||||
|
* As per the current implementation, the actual decoding
|
||||||
|
* and rendering (API calls) are done as part of the VDPAU
|
||||||
|
* presentation (vo_vdpau.c) module.
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vdpau/vdpau.h>
|
||||||
|
|
||||||
|
#include "libavutil/avconfig.h"
|
||||||
|
#include "libavutil/attributes.h"
|
||||||
|
|
||||||
|
#include "avcodec.h"
|
||||||
|
|
||||||
|
struct AVCodecContext;
|
||||||
|
struct AVFrame;
|
||||||
|
|
||||||
|
typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *,
|
||||||
|
const VdpPictureInfo *, uint32_t,
|
||||||
|
const VdpBitstreamBuffer *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure is used to share data between the libavcodec library and
|
||||||
|
* the client video application.
|
||||||
|
* The user shall allocate the structure via the av_alloc_vdpau_hwaccel
|
||||||
|
* function and make it available as
|
||||||
|
* AVCodecContext.hwaccel_context. Members can be set by the user once
|
||||||
|
* during initialization or through each AVCodecContext.get_buffer()
|
||||||
|
* function call. In any case, they must be valid prior to calling
|
||||||
|
* decoding functions.
|
||||||
|
*
|
||||||
|
* The size of this structure is not a part of the public ABI and must not
|
||||||
|
* be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an
|
||||||
|
* AVVDPAUContext.
|
||||||
|
*/
|
||||||
|
typedef struct AVVDPAUContext {
|
||||||
|
/**
|
||||||
|
* VDPAU decoder handle
|
||||||
|
*
|
||||||
|
* Set by user.
|
||||||
|
*/
|
||||||
|
VdpDecoder decoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VDPAU decoder render callback
|
||||||
|
*
|
||||||
|
* Set by the user.
|
||||||
|
*/
|
||||||
|
VdpDecoderRender *render;
|
||||||
|
|
||||||
|
AVVDPAU_Render2 render2;
|
||||||
|
} AVVDPAUContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief allocation function for AVVDPAUContext
|
||||||
|
*
|
||||||
|
* Allows extending the struct without breaking API/ABI
|
||||||
|
*/
|
||||||
|
AVVDPAUContext *av_alloc_vdpaucontext(void);
|
||||||
|
|
||||||
|
AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *);
|
||||||
|
void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Associate a VDPAU device with a codec context for hardware acceleration.
|
||||||
|
* This function is meant to be called from the get_format() codec callback,
|
||||||
|
* or earlier. It can also be called after avcodec_flush_buffers() to change
|
||||||
|
* the underlying VDPAU device mid-stream (e.g. to recover from non-transparent
|
||||||
|
* display preemption).
|
||||||
|
*
|
||||||
|
* @note get_format() must return AV_PIX_FMT_VDPAU if this function completes
|
||||||
|
* successfully.
|
||||||
|
*
|
||||||
|
* @param avctx decoding context whose get_format() callback is invoked
|
||||||
|
* @param device VDPAU device handle to use for hardware acceleration
|
||||||
|
* @param get_proc_address VDPAU device driver
|
||||||
|
* @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags
|
||||||
|
*
|
||||||
|
* @return 0 on success, an AVERROR code on failure.
|
||||||
|
*/
|
||||||
|
int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
|
||||||
|
VdpGetProcAddress *get_proc_address, unsigned flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the parameters to create an adequate VDPAU video surface for the codec
|
||||||
|
* context using VDPAU hardware decoding acceleration.
|
||||||
|
*
|
||||||
|
* @note Behavior is undefined if the context was not successfully bound to a
|
||||||
|
* VDPAU device using av_vdpau_bind_context().
|
||||||
|
*
|
||||||
|
* @param avctx the codec context being used for decoding the stream
|
||||||
|
* @param type storage space for the VDPAU video surface chroma type
|
||||||
|
* (or NULL to ignore)
|
||||||
|
* @param width storage space for the VDPAU video surface pixel width
|
||||||
|
* (or NULL to ignore)
|
||||||
|
* @param height storage space for the VDPAU video surface pixel height
|
||||||
|
* (or NULL to ignore)
|
||||||
|
*
|
||||||
|
* @return 0 on success, a negative AVERROR code on failure.
|
||||||
|
*/
|
||||||
|
int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type,
|
||||||
|
uint32_t *width, uint32_t *height);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate an AVVDPAUContext.
|
||||||
|
*
|
||||||
|
* @return Newly-allocated AVVDPAUContext or NULL on failure.
|
||||||
|
*/
|
||||||
|
AVVDPAUContext *av_vdpau_alloc_context(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* AVCODEC_VDPAU_H */
|
||||||
45
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/version.h
vendored
Normal file
45
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/version.h
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_VERSION_H
|
||||||
|
#define AVCODEC_VERSION_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup libavc
|
||||||
|
* Libavcodec version macros.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/version.h"
|
||||||
|
|
||||||
|
#include "version_major.h"
|
||||||
|
|
||||||
|
#define LIBAVCODEC_VERSION_MINOR 31
|
||||||
|
#define LIBAVCODEC_VERSION_MICRO 102
|
||||||
|
|
||||||
|
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||||
|
LIBAVCODEC_VERSION_MINOR, \
|
||||||
|
LIBAVCODEC_VERSION_MICRO)
|
||||||
|
#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \
|
||||||
|
LIBAVCODEC_VERSION_MINOR, \
|
||||||
|
LIBAVCODEC_VERSION_MICRO)
|
||||||
|
#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
|
||||||
|
|
||||||
|
#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
|
||||||
|
|
||||||
|
#endif /* AVCODEC_VERSION_H */
|
||||||
59
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/version_major.h
vendored
Normal file
59
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/version_major.h
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_VERSION_MAJOR_H
|
||||||
|
#define AVCODEC_VERSION_MAJOR_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup libavc
|
||||||
|
* Libavcodec version macros.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LIBAVCODEC_VERSION_MAJOR 60
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FF_API_* defines may be placed below to indicate public API that will be
|
||||||
|
* dropped at a future version bump. The defines themselves are not part of
|
||||||
|
* the public API and may change, break or disappear at any time.
|
||||||
|
*
|
||||||
|
* @note, when bumping the major version it is recommended to manually
|
||||||
|
* disable each FF_API_* in its own commit instead of disabling them all
|
||||||
|
* at once through the bump. This improves the git bisect-ability of the change.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FF_API_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_IDCT_NONE (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_SVTAV1_OPTS (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_AYUV_CODECID (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_VT_OUTPUT_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_AVCODEC_CHROMA_POS (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_VT_HWACCEL_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_AVCTX_FRAME_NUMBER (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_SLICE_OFFSET (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_SUBFRAMES (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_TICKS_PER_FRAME (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_DROPCHANGED (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
|
||||||
|
#define FF_API_AVFFT (LIBAVCODEC_VERSION_MAJOR < 62)
|
||||||
|
#define FF_API_FF_PROFILE_LEVEL (LIBAVCODEC_VERSION_MAJOR < 62)
|
||||||
|
|
||||||
|
// reminder to remove CrystalHD decoders on next major bump
|
||||||
|
#define FF_CODEC_CRYSTAL_HD (LIBAVCODEC_VERSION_MAJOR < 61)
|
||||||
|
|
||||||
|
#endif /* AVCODEC_VERSION_MAJOR_H */
|
||||||
150
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/videotoolbox.h
vendored
Normal file
150
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/videotoolbox.h
vendored
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/*
|
||||||
|
* Videotoolbox hardware acceleration
|
||||||
|
*
|
||||||
|
* copyright (c) 2012 Sebastien Zwickert
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_VIDEOTOOLBOX_H
|
||||||
|
#define AVCODEC_VIDEOTOOLBOX_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavc_codec_hwaccel_videotoolbox
|
||||||
|
* Public libavcodec Videotoolbox header.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_codec_hwaccel_videotoolbox VideoToolbox Decoder
|
||||||
|
* @ingroup lavc_codec_hwaccel
|
||||||
|
*
|
||||||
|
* Hardware accelerated decoding using VideoToolbox on Apple Platforms
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define Picture QuickdrawPicture
|
||||||
|
#include <VideoToolbox/VideoToolbox.h>
|
||||||
|
#undef Picture
|
||||||
|
|
||||||
|
#include "libavcodec/avcodec.h"
|
||||||
|
|
||||||
|
#include "libavutil/attributes.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This struct holds all the information that needs to be passed
|
||||||
|
* between the caller and libavcodec for initializing Videotoolbox decoding.
|
||||||
|
* Its size is not a part of the public ABI, it must be allocated with
|
||||||
|
* av_videotoolbox_alloc_context() and freed with av_free().
|
||||||
|
*/
|
||||||
|
typedef struct AVVideotoolboxContext {
|
||||||
|
/**
|
||||||
|
* Videotoolbox decompression session object.
|
||||||
|
*/
|
||||||
|
VTDecompressionSessionRef session;
|
||||||
|
|
||||||
|
#if FF_API_VT_OUTPUT_CALLBACK
|
||||||
|
/**
|
||||||
|
* The output callback that must be passed to the session.
|
||||||
|
* Set by av_videottoolbox_default_init()
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
VTDecompressionOutputCallback output_callback;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CVPixelBuffer Format Type that Videotoolbox will use for decoded frames.
|
||||||
|
* set by the caller. If this is set to 0, then no specific format is
|
||||||
|
* requested from the decoder, and its native format is output.
|
||||||
|
*/
|
||||||
|
OSType cv_pix_fmt_type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CoreMedia Format Description that Videotoolbox will use to create the decompression session.
|
||||||
|
*/
|
||||||
|
CMVideoFormatDescriptionRef cm_fmt_desc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CoreMedia codec type that Videotoolbox will use to create the decompression session.
|
||||||
|
*/
|
||||||
|
int cm_codec_type;
|
||||||
|
} AVVideotoolboxContext;
|
||||||
|
|
||||||
|
#if FF_API_VT_HWACCEL_CONTEXT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a Videotoolbox context.
|
||||||
|
*
|
||||||
|
* This function should be called from the get_format() callback when the caller
|
||||||
|
* selects the AV_PIX_FMT_VIDETOOLBOX format. The caller must then create
|
||||||
|
* the decoder object (using the output callback provided by libavcodec) that
|
||||||
|
* will be used for Videotoolbox-accelerated decoding.
|
||||||
|
*
|
||||||
|
* When decoding with Videotoolbox is finished, the caller must destroy the decoder
|
||||||
|
* object and free the Videotoolbox context using av_free().
|
||||||
|
*
|
||||||
|
* @return the newly allocated context or NULL on failure
|
||||||
|
* @deprecated Use AVCodecContext.hw_frames_ctx or hw_device_ctx instead.
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
AVVideotoolboxContext *av_videotoolbox_alloc_context(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a convenience function that creates and sets up the Videotoolbox context using
|
||||||
|
* an internal implementation.
|
||||||
|
*
|
||||||
|
* @param avctx the corresponding codec context
|
||||||
|
*
|
||||||
|
* @return >= 0 on success, a negative AVERROR code on failure
|
||||||
|
* @deprecated Use AVCodecContext.hw_frames_ctx or hw_device_ctx instead.
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
int av_videotoolbox_default_init(AVCodecContext *avctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a convenience function that creates and sets up the Videotoolbox context using
|
||||||
|
* an internal implementation.
|
||||||
|
*
|
||||||
|
* @param avctx the corresponding codec context
|
||||||
|
* @param vtctx the Videotoolbox context to use
|
||||||
|
*
|
||||||
|
* @return >= 0 on success, a negative AVERROR code on failure
|
||||||
|
* @deprecated Use AVCodecContext.hw_frames_ctx or hw_device_ctx instead.
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function must be called to free the Videotoolbox context initialized with
|
||||||
|
* av_videotoolbox_default_init().
|
||||||
|
*
|
||||||
|
* @param avctx the corresponding codec context
|
||||||
|
* @deprecated Use AVCodecContext.hw_frames_ctx or hw_device_ctx instead.
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
void av_videotoolbox_default_free(AVCodecContext *avctx);
|
||||||
|
|
||||||
|
#endif /* FF_API_VT_HWACCEL_CONTEXT */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVCODEC_VIDEOTOOLBOX_H */
|
||||||
74
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/vorbis_parser.h
vendored
Normal file
74
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/vorbis_parser.h
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* A public API for Vorbis parsing
|
||||||
|
*
|
||||||
|
* Determines the duration for each packet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_VORBIS_PARSER_H
|
||||||
|
#define AVCODEC_VORBIS_PARSER_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct AVVorbisParseContext AVVorbisParseContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize the Vorbis parser using headers in the extradata.
|
||||||
|
*/
|
||||||
|
AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata,
|
||||||
|
int extradata_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the parser and everything associated with it.
|
||||||
|
*/
|
||||||
|
void av_vorbis_parse_free(AVVorbisParseContext **s);
|
||||||
|
|
||||||
|
#define VORBIS_FLAG_HEADER 0x00000001
|
||||||
|
#define VORBIS_FLAG_COMMENT 0x00000002
|
||||||
|
#define VORBIS_FLAG_SETUP 0x00000004
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the duration for a Vorbis packet.
|
||||||
|
*
|
||||||
|
* If @p flags is @c NULL,
|
||||||
|
* special frames are considered invalid.
|
||||||
|
*
|
||||||
|
* @param s Vorbis parser context
|
||||||
|
* @param buf buffer containing a Vorbis frame
|
||||||
|
* @param buf_size size of the buffer
|
||||||
|
* @param flags flags for special frames
|
||||||
|
*/
|
||||||
|
int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf,
|
||||||
|
int buf_size, int *flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the duration for a Vorbis packet.
|
||||||
|
*
|
||||||
|
* @param s Vorbis parser context
|
||||||
|
* @param buf buffer containing a Vorbis frame
|
||||||
|
* @param buf_size size of the buffer
|
||||||
|
*/
|
||||||
|
int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf,
|
||||||
|
int buf_size);
|
||||||
|
|
||||||
|
void av_vorbis_parse_reset(AVVorbisParseContext *s);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_VORBIS_PARSER_H */
|
||||||
171
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/xvmc.h
vendored
Normal file
171
dependency/x86/third_party/ffmpeg/v6.1/include/libavcodec/xvmc.h
vendored
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2003 Ivan Kalvachev
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_XVMC_H
|
||||||
|
#define AVCODEC_XVMC_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavc_codec_hwaccel_xvmc
|
||||||
|
* Public libavcodec XvMC header.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma message("XvMC is no longer supported; this header is deprecated and will be removed")
|
||||||
|
|
||||||
|
#include <X11/extensions/XvMC.h>
|
||||||
|
|
||||||
|
#include "libavutil/attributes.h"
|
||||||
|
#include "avcodec.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavc_codec_hwaccel_xvmc XvMC
|
||||||
|
* @ingroup lavc_codec_hwaccel
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct
|
||||||
|
the number is 1337 speak for the letters IDCT MCo (motion compensation) */
|
||||||
|
|
||||||
|
struct attribute_deprecated xvmc_pix_fmt {
|
||||||
|
/** The field contains the special constant value AV_XVMC_ID.
|
||||||
|
It is used as a test that the application correctly uses the API,
|
||||||
|
and that there is no corruption caused by pixel routines.
|
||||||
|
- application - set during initialization
|
||||||
|
- libavcodec - unchanged
|
||||||
|
*/
|
||||||
|
int xvmc_id;
|
||||||
|
|
||||||
|
/** Pointer to the block array allocated by XvMCCreateBlocks().
|
||||||
|
The array has to be freed by XvMCDestroyBlocks().
|
||||||
|
Each group of 64 values represents one data block of differential
|
||||||
|
pixel information (in MoCo mode) or coefficients for IDCT.
|
||||||
|
- application - set the pointer during initialization
|
||||||
|
- libavcodec - fills coefficients/pixel data into the array
|
||||||
|
*/
|
||||||
|
short* data_blocks;
|
||||||
|
|
||||||
|
/** Pointer to the macroblock description array allocated by
|
||||||
|
XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks().
|
||||||
|
- application - set the pointer during initialization
|
||||||
|
- libavcodec - fills description data into the array
|
||||||
|
*/
|
||||||
|
XvMCMacroBlock* mv_blocks;
|
||||||
|
|
||||||
|
/** Number of macroblock descriptions that can be stored in the mv_blocks
|
||||||
|
array.
|
||||||
|
- application - set during initialization
|
||||||
|
- libavcodec - unchanged
|
||||||
|
*/
|
||||||
|
int allocated_mv_blocks;
|
||||||
|
|
||||||
|
/** Number of blocks that can be stored at once in the data_blocks array.
|
||||||
|
- application - set during initialization
|
||||||
|
- libavcodec - unchanged
|
||||||
|
*/
|
||||||
|
int allocated_data_blocks;
|
||||||
|
|
||||||
|
/** Indicate that the hardware would interpret data_blocks as IDCT
|
||||||
|
coefficients and perform IDCT on them.
|
||||||
|
- application - set during initialization
|
||||||
|
- libavcodec - unchanged
|
||||||
|
*/
|
||||||
|
int idct;
|
||||||
|
|
||||||
|
/** In MoCo mode it indicates that intra macroblocks are assumed to be in
|
||||||
|
unsigned format; same as the XVMC_INTRA_UNSIGNED flag.
|
||||||
|
- application - set during initialization
|
||||||
|
- libavcodec - unchanged
|
||||||
|
*/
|
||||||
|
int unsigned_intra;
|
||||||
|
|
||||||
|
/** Pointer to the surface allocated by XvMCCreateSurface().
|
||||||
|
It has to be freed by XvMCDestroySurface() on application exit.
|
||||||
|
It identifies the frame and its state on the video hardware.
|
||||||
|
- application - set during initialization
|
||||||
|
- libavcodec - unchanged
|
||||||
|
*/
|
||||||
|
XvMCSurface* p_surface;
|
||||||
|
|
||||||
|
/** Set by the decoder before calling ff_draw_horiz_band(),
|
||||||
|
needed by the XvMCRenderSurface function. */
|
||||||
|
//@{
|
||||||
|
/** Pointer to the surface used as past reference
|
||||||
|
- application - unchanged
|
||||||
|
- libavcodec - set
|
||||||
|
*/
|
||||||
|
XvMCSurface* p_past_surface;
|
||||||
|
|
||||||
|
/** Pointer to the surface used as future reference
|
||||||
|
- application - unchanged
|
||||||
|
- libavcodec - set
|
||||||
|
*/
|
||||||
|
XvMCSurface* p_future_surface;
|
||||||
|
|
||||||
|
/** top/bottom field or frame
|
||||||
|
- application - unchanged
|
||||||
|
- libavcodec - set
|
||||||
|
*/
|
||||||
|
unsigned int picture_structure;
|
||||||
|
|
||||||
|
/** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence
|
||||||
|
- application - unchanged
|
||||||
|
- libavcodec - set
|
||||||
|
*/
|
||||||
|
unsigned int flags;
|
||||||
|
//}@
|
||||||
|
|
||||||
|
/** Number of macroblock descriptions in the mv_blocks array
|
||||||
|
that have already been passed to the hardware.
|
||||||
|
- application - zeroes it on get_buffer().
|
||||||
|
A successful ff_draw_horiz_band() may increment it
|
||||||
|
with filled_mb_block_num or zero both.
|
||||||
|
- libavcodec - unchanged
|
||||||
|
*/
|
||||||
|
int start_mv_blocks_num;
|
||||||
|
|
||||||
|
/** Number of new macroblock descriptions in the mv_blocks array (after
|
||||||
|
start_mv_blocks_num) that are filled by libavcodec and have to be
|
||||||
|
passed to the hardware.
|
||||||
|
- application - zeroes it on get_buffer() or after successful
|
||||||
|
ff_draw_horiz_band().
|
||||||
|
- libavcodec - increment with one of each stored MB
|
||||||
|
*/
|
||||||
|
int filled_mv_blocks_num;
|
||||||
|
|
||||||
|
/** Number of the next free data block; one data block consists of
|
||||||
|
64 short values in the data_blocks array.
|
||||||
|
All blocks before this one have already been claimed by placing their
|
||||||
|
position into the corresponding block description structure field,
|
||||||
|
that are part of the mv_blocks array.
|
||||||
|
- application - zeroes it on get_buffer().
|
||||||
|
A successful ff_draw_horiz_band() may zero it together
|
||||||
|
with start_mb_blocks_num.
|
||||||
|
- libavcodec - each decoded macroblock increases it by the number
|
||||||
|
of coded blocks it contains.
|
||||||
|
*/
|
||||||
|
int next_free_data_block_num;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVCODEC_XVMC_H */
|
||||||
397
dependency/x86/third_party/ffmpeg/v6.1/include/libavdevice/avdevice.h
vendored
Normal file
397
dependency/x86/third_party/ffmpeg/v6.1/include/libavdevice/avdevice.h
vendored
Normal file
@ -0,0 +1,397 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVDEVICE_AVDEVICE_H
|
||||||
|
#define AVDEVICE_AVDEVICE_H
|
||||||
|
|
||||||
|
#include "version_major.h"
|
||||||
|
#ifndef HAVE_AV_CONFIG_H
|
||||||
|
/* When included as part of the ffmpeg build, only include the major version
|
||||||
|
* to avoid unnecessary rebuilds. When included externally, keep including
|
||||||
|
* the full version information. */
|
||||||
|
#include "version.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavd
|
||||||
|
* Main libavdevice API header
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavd libavdevice
|
||||||
|
* Special devices muxing/demuxing library.
|
||||||
|
*
|
||||||
|
* Libavdevice is a complementary library to @ref libavf "libavformat". It
|
||||||
|
* provides various "special" platform-specific muxers and demuxers, e.g. for
|
||||||
|
* grabbing devices, audio capture and playback etc. As a consequence, the
|
||||||
|
* (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own
|
||||||
|
* I/O functions). The filename passed to avformat_open_input() often does not
|
||||||
|
* refer to an actually existing file, but has some special device-specific
|
||||||
|
* meaning - e.g. for xcbgrab it is the display name.
|
||||||
|
*
|
||||||
|
* To use libavdevice, simply call avdevice_register_all() to register all
|
||||||
|
* compiled muxers and demuxers. They all use standard libavformat API.
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/log.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
|
#include "libavutil/dict.h"
|
||||||
|
#include "libavformat/avformat.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the LIBAVDEVICE_VERSION_INT constant.
|
||||||
|
*/
|
||||||
|
unsigned avdevice_version(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the libavdevice build-time configuration.
|
||||||
|
*/
|
||||||
|
const char *avdevice_configuration(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the libavdevice license.
|
||||||
|
*/
|
||||||
|
const char *avdevice_license(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize libavdevice and register all the input and output devices.
|
||||||
|
*/
|
||||||
|
void avdevice_register_all(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Audio input devices iterator.
|
||||||
|
*
|
||||||
|
* If d is NULL, returns the first registered input audio/video device,
|
||||||
|
* if d is non-NULL, returns the next registered input audio/video device after d
|
||||||
|
* or NULL if d is the last one.
|
||||||
|
*/
|
||||||
|
const AVInputFormat *av_input_audio_device_next(const AVInputFormat *d);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video input devices iterator.
|
||||||
|
*
|
||||||
|
* If d is NULL, returns the first registered input audio/video device,
|
||||||
|
* if d is non-NULL, returns the next registered input audio/video device after d
|
||||||
|
* or NULL if d is the last one.
|
||||||
|
*/
|
||||||
|
const AVInputFormat *av_input_video_device_next(const AVInputFormat *d);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Audio output devices iterator.
|
||||||
|
*
|
||||||
|
* If d is NULL, returns the first registered output audio/video device,
|
||||||
|
* if d is non-NULL, returns the next registered output audio/video device after d
|
||||||
|
* or NULL if d is the last one.
|
||||||
|
*/
|
||||||
|
const AVOutputFormat *av_output_audio_device_next(const AVOutputFormat *d);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video output devices iterator.
|
||||||
|
*
|
||||||
|
* If d is NULL, returns the first registered output audio/video device,
|
||||||
|
* if d is non-NULL, returns the next registered output audio/video device after d
|
||||||
|
* or NULL if d is the last one.
|
||||||
|
*/
|
||||||
|
const AVOutputFormat *av_output_video_device_next(const AVOutputFormat *d);
|
||||||
|
|
||||||
|
typedef struct AVDeviceRect {
|
||||||
|
int x; /**< x coordinate of top left corner */
|
||||||
|
int y; /**< y coordinate of top left corner */
|
||||||
|
int width; /**< width */
|
||||||
|
int height; /**< height */
|
||||||
|
} AVDeviceRect;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message types used by avdevice_app_to_dev_control_message().
|
||||||
|
*/
|
||||||
|
enum AVAppToDevMessageType {
|
||||||
|
/**
|
||||||
|
* Dummy message.
|
||||||
|
*/
|
||||||
|
AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Window size change message.
|
||||||
|
*
|
||||||
|
* Message is sent to the device every time the application changes the size
|
||||||
|
* of the window device renders to.
|
||||||
|
* Message should also be sent right after window is created.
|
||||||
|
*
|
||||||
|
* data: AVDeviceRect: new window size.
|
||||||
|
*/
|
||||||
|
AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repaint request message.
|
||||||
|
*
|
||||||
|
* Message is sent to the device when window has to be repainted.
|
||||||
|
*
|
||||||
|
* data: AVDeviceRect: area required to be repainted.
|
||||||
|
* NULL: whole area is required to be repainted.
|
||||||
|
*/
|
||||||
|
AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request pause/play.
|
||||||
|
*
|
||||||
|
* Application requests pause/unpause playback.
|
||||||
|
* Mostly usable with devices that have internal buffer.
|
||||||
|
* By default devices are not paused.
|
||||||
|
*
|
||||||
|
* data: NULL
|
||||||
|
*/
|
||||||
|
AV_APP_TO_DEV_PAUSE = MKBETAG('P', 'A', 'U', ' '),
|
||||||
|
AV_APP_TO_DEV_PLAY = MKBETAG('P', 'L', 'A', 'Y'),
|
||||||
|
AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Volume control message.
|
||||||
|
*
|
||||||
|
* Set volume level. It may be device-dependent if volume
|
||||||
|
* is changed per stream or system wide. Per stream volume
|
||||||
|
* change is expected when possible.
|
||||||
|
*
|
||||||
|
* data: double: new volume with range of 0.0 - 1.0.
|
||||||
|
*/
|
||||||
|
AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mute control messages.
|
||||||
|
*
|
||||||
|
* Change mute state. It may be device-dependent if mute status
|
||||||
|
* is changed per stream or system wide. Per stream mute status
|
||||||
|
* change is expected when possible.
|
||||||
|
*
|
||||||
|
* data: NULL.
|
||||||
|
*/
|
||||||
|
AV_APP_TO_DEV_MUTE = MKBETAG(' ', 'M', 'U', 'T'),
|
||||||
|
AV_APP_TO_DEV_UNMUTE = MKBETAG('U', 'M', 'U', 'T'),
|
||||||
|
AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get volume/mute messages.
|
||||||
|
*
|
||||||
|
* Force the device to send AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED or
|
||||||
|
* AV_DEV_TO_APP_MUTE_STATE_CHANGED command respectively.
|
||||||
|
*
|
||||||
|
* data: NULL.
|
||||||
|
*/
|
||||||
|
AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'),
|
||||||
|
AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T'),
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message types used by avdevice_dev_to_app_control_message().
|
||||||
|
*/
|
||||||
|
enum AVDevToAppMessageType {
|
||||||
|
/**
|
||||||
|
* Dummy message.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create window buffer message.
|
||||||
|
*
|
||||||
|
* Device requests to create a window buffer. Exact meaning is device-
|
||||||
|
* and application-dependent. Message is sent before rendering first
|
||||||
|
* frame and all one-shot initializations should be done here.
|
||||||
|
* Application is allowed to ignore preferred window buffer size.
|
||||||
|
*
|
||||||
|
* @note: Application is obligated to inform about window buffer size
|
||||||
|
* with AV_APP_TO_DEV_WINDOW_SIZE message.
|
||||||
|
*
|
||||||
|
* data: AVDeviceRect: preferred size of the window buffer.
|
||||||
|
* NULL: no preferred size of the window buffer.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare window buffer message.
|
||||||
|
*
|
||||||
|
* Device requests to prepare a window buffer for rendering.
|
||||||
|
* Exact meaning is device- and application-dependent.
|
||||||
|
* Message is sent before rendering of each frame.
|
||||||
|
*
|
||||||
|
* data: NULL.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display window buffer message.
|
||||||
|
*
|
||||||
|
* Device requests to display a window buffer.
|
||||||
|
* Message is sent when new frame is ready to be displayed.
|
||||||
|
* Usually buffers need to be swapped in handler of this message.
|
||||||
|
*
|
||||||
|
* data: NULL.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy window buffer message.
|
||||||
|
*
|
||||||
|
* Device requests to destroy a window buffer.
|
||||||
|
* Message is sent when device is about to be destroyed and window
|
||||||
|
* buffer is not required anymore.
|
||||||
|
*
|
||||||
|
* data: NULL.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Buffer fullness status messages.
|
||||||
|
*
|
||||||
|
* Device signals buffer overflow/underflow.
|
||||||
|
*
|
||||||
|
* data: NULL.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'),
|
||||||
|
AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Buffer readable/writable.
|
||||||
|
*
|
||||||
|
* Device informs that buffer is readable/writable.
|
||||||
|
* When possible, device informs how many bytes can be read/write.
|
||||||
|
*
|
||||||
|
* @warning Device may not inform when number of bytes than can be read/write changes.
|
||||||
|
*
|
||||||
|
* data: int64_t: amount of bytes available to read/write.
|
||||||
|
* NULL: amount of bytes available to read/write is not known.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '),
|
||||||
|
AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mute state change message.
|
||||||
|
*
|
||||||
|
* Device informs that mute state has changed.
|
||||||
|
*
|
||||||
|
* data: int: 0 for not muted state, non-zero for muted state.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Volume level change message.
|
||||||
|
*
|
||||||
|
* Device informs that volume level has changed.
|
||||||
|
*
|
||||||
|
* data: double: new volume with range of 0.0 - 1.0.
|
||||||
|
*/
|
||||||
|
AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L'),
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send control message from application to device.
|
||||||
|
*
|
||||||
|
* @param s device context.
|
||||||
|
* @param type message type.
|
||||||
|
* @param data message data. Exact type depends on message type.
|
||||||
|
* @param data_size size of message data.
|
||||||
|
* @return >= 0 on success, negative on error.
|
||||||
|
* AVERROR(ENOSYS) when device doesn't implement handler of the message.
|
||||||
|
*/
|
||||||
|
int avdevice_app_to_dev_control_message(struct AVFormatContext *s,
|
||||||
|
enum AVAppToDevMessageType type,
|
||||||
|
void *data, size_t data_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send control message from device to application.
|
||||||
|
*
|
||||||
|
* @param s device context.
|
||||||
|
* @param type message type.
|
||||||
|
* @param data message data. Can be NULL.
|
||||||
|
* @param data_size size of message data.
|
||||||
|
* @return >= 0 on success, negative on error.
|
||||||
|
* AVERROR(ENOSYS) when application doesn't implement handler of the message.
|
||||||
|
*/
|
||||||
|
int avdevice_dev_to_app_control_message(struct AVFormatContext *s,
|
||||||
|
enum AVDevToAppMessageType type,
|
||||||
|
void *data, size_t data_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure describes basic parameters of the device.
|
||||||
|
*/
|
||||||
|
typedef struct AVDeviceInfo {
|
||||||
|
char *device_name; /**< device name, format depends on device */
|
||||||
|
char *device_description; /**< human friendly name */
|
||||||
|
enum AVMediaType *media_types; /**< array indicating what media types(s), if any, a device can provide. If null, cannot provide any */
|
||||||
|
int nb_media_types; /**< length of media_types array, 0 if device cannot provide any media types */
|
||||||
|
} AVDeviceInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of devices.
|
||||||
|
*/
|
||||||
|
typedef struct AVDeviceInfoList {
|
||||||
|
AVDeviceInfo **devices; /**< list of autodetected devices */
|
||||||
|
int nb_devices; /**< number of autodetected devices */
|
||||||
|
int default_device; /**< index of default device or -1 if no default */
|
||||||
|
} AVDeviceInfoList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List devices.
|
||||||
|
*
|
||||||
|
* Returns available device names and their parameters.
|
||||||
|
*
|
||||||
|
* @note: Some devices may accept system-dependent device names that cannot be
|
||||||
|
* autodetected. The list returned by this function cannot be assumed to
|
||||||
|
* be always completed.
|
||||||
|
*
|
||||||
|
* @param s device context.
|
||||||
|
* @param[out] device_list list of autodetected devices.
|
||||||
|
* @return count of autodetected devices, negative on error.
|
||||||
|
*/
|
||||||
|
int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenient function to free result of avdevice_list_devices().
|
||||||
|
*
|
||||||
|
* @param device_list device list to be freed.
|
||||||
|
*/
|
||||||
|
void avdevice_free_list_devices(AVDeviceInfoList **device_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List devices.
|
||||||
|
*
|
||||||
|
* Returns available device names and their parameters.
|
||||||
|
* These are convinient wrappers for avdevice_list_devices().
|
||||||
|
* Device context is allocated and deallocated internally.
|
||||||
|
*
|
||||||
|
* @param device device format. May be NULL if device name is set.
|
||||||
|
* @param device_name device name. May be NULL if device format is set.
|
||||||
|
* @param device_options An AVDictionary filled with device-private options. May be NULL.
|
||||||
|
* The same options must be passed later to avformat_write_header() for output
|
||||||
|
* devices or avformat_open_input() for input devices, or at any other place
|
||||||
|
* that affects device-private options.
|
||||||
|
* @param[out] device_list list of autodetected devices
|
||||||
|
* @return count of autodetected devices, negative on error.
|
||||||
|
* @note device argument takes precedence over device_name when both are set.
|
||||||
|
*/
|
||||||
|
int avdevice_list_input_sources(const AVInputFormat *device, const char *device_name,
|
||||||
|
AVDictionary *device_options, AVDeviceInfoList **device_list);
|
||||||
|
int avdevice_list_output_sinks(const AVOutputFormat *device, const char *device_name,
|
||||||
|
AVDictionary *device_options, AVDeviceInfoList **device_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVDEVICE_AVDEVICE_H */
|
||||||
45
dependency/x86/third_party/ffmpeg/v6.1/include/libavdevice/version.h
vendored
Normal file
45
dependency/x86/third_party/ffmpeg/v6.1/include/libavdevice/version.h
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVDEVICE_VERSION_H
|
||||||
|
#define AVDEVICE_VERSION_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavd
|
||||||
|
* Libavdevice version macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/version.h"
|
||||||
|
|
||||||
|
#include "version_major.h"
|
||||||
|
|
||||||
|
#define LIBAVDEVICE_VERSION_MINOR 3
|
||||||
|
#define LIBAVDEVICE_VERSION_MICRO 100
|
||||||
|
|
||||||
|
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
|
||||||
|
LIBAVDEVICE_VERSION_MINOR, \
|
||||||
|
LIBAVDEVICE_VERSION_MICRO)
|
||||||
|
#define LIBAVDEVICE_VERSION AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \
|
||||||
|
LIBAVDEVICE_VERSION_MINOR, \
|
||||||
|
LIBAVDEVICE_VERSION_MICRO)
|
||||||
|
#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT
|
||||||
|
|
||||||
|
#define LIBAVDEVICE_IDENT "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION)
|
||||||
|
|
||||||
|
#endif /* AVDEVICE_VERSION_H */
|
||||||
36
dependency/x86/third_party/ffmpeg/v6.1/include/libavdevice/version_major.h
vendored
Normal file
36
dependency/x86/third_party/ffmpeg/v6.1/include/libavdevice/version_major.h
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVDEVICE_VERSION_MAJOR_H
|
||||||
|
#define AVDEVICE_VERSION_MAJOR_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavd
|
||||||
|
* Libavdevice version macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LIBAVDEVICE_VERSION_MAJOR 60
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FF_API_* defines may be placed below to indicate public API that will be
|
||||||
|
* dropped at a future version bump. The defines themselves are not part of
|
||||||
|
* the public API and may change, break or disappear at any time.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVDEVICE_VERSION_MAJOR_H */
|
||||||
1500
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/avfilter.h
vendored
Normal file
1500
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/avfilter.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
173
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/buffersink.h
vendored
Normal file
173
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/buffersink.h
vendored
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVFILTER_BUFFERSINK_H
|
||||||
|
#define AVFILTER_BUFFERSINK_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavfi_buffersink
|
||||||
|
* memory buffer sink API for audio and video
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avfilter.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavfi_buffersink Buffer sink API
|
||||||
|
* @ingroup lavfi
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* The buffersink and abuffersink filters are there to connect filter graphs
|
||||||
|
* to applications. They have a single input, connected to the graph, and no
|
||||||
|
* output. Frames must be extracted using av_buffersink_get_frame() or
|
||||||
|
* av_buffersink_get_samples().
|
||||||
|
*
|
||||||
|
* The format negotiated by the graph during configuration can be obtained
|
||||||
|
* using the accessor functions:
|
||||||
|
* - av_buffersink_get_time_base(),
|
||||||
|
* - av_buffersink_get_format(),
|
||||||
|
* - av_buffersink_get_frame_rate(),
|
||||||
|
* - av_buffersink_get_w(),
|
||||||
|
* - av_buffersink_get_h(),
|
||||||
|
* - av_buffersink_get_sample_aspect_ratio(),
|
||||||
|
* - av_buffersink_get_channels(),
|
||||||
|
* - av_buffersink_get_ch_layout(),
|
||||||
|
* - av_buffersink_get_sample_rate().
|
||||||
|
*
|
||||||
|
* The layout returned by av_buffersink_get_ch_layout() must de uninitialized
|
||||||
|
* by the caller.
|
||||||
|
*
|
||||||
|
* The format can be constrained by setting options, using av_opt_set() and
|
||||||
|
* related functions with the AV_OPT_SEARCH_CHILDREN flag.
|
||||||
|
* - pix_fmts (int list),
|
||||||
|
* - sample_fmts (int list),
|
||||||
|
* - sample_rates (int list),
|
||||||
|
* - ch_layouts (string),
|
||||||
|
* - channel_counts (int list),
|
||||||
|
* - all_channel_counts (bool).
|
||||||
|
* Most of these options are of type binary, and should be set using
|
||||||
|
* av_opt_set_int_list() or av_opt_set_bin(). If they are not set, all
|
||||||
|
* corresponding formats are accepted.
|
||||||
|
*
|
||||||
|
* As a special case, if ch_layouts is not set, all valid channel layouts are
|
||||||
|
* accepted except for UNSPEC layouts, unless all_channel_counts is set.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a frame with filtered data from sink and put it in frame.
|
||||||
|
*
|
||||||
|
* @param ctx pointer to a buffersink or abuffersink filter context.
|
||||||
|
* @param frame pointer to an allocated frame that will be filled with data.
|
||||||
|
* The data must be freed using av_frame_unref() / av_frame_free()
|
||||||
|
* @param flags a combination of AV_BUFFERSINK_FLAG_* flags
|
||||||
|
*
|
||||||
|
* @return >= 0 in for success, a negative AVERROR code for failure.
|
||||||
|
*/
|
||||||
|
int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell av_buffersink_get_buffer_ref() to read video/samples buffer
|
||||||
|
* reference, but not remove it from the buffer. This is useful if you
|
||||||
|
* need only to read a video/samples buffer, without to fetch it.
|
||||||
|
*/
|
||||||
|
#define AV_BUFFERSINK_FLAG_PEEK 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell av_buffersink_get_buffer_ref() not to request a frame from its input.
|
||||||
|
* If a frame is already buffered, it is read (and removed from the buffer),
|
||||||
|
* but if no frame is present, return AVERROR(EAGAIN).
|
||||||
|
*/
|
||||||
|
#define AV_BUFFERSINK_FLAG_NO_REQUEST 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the frame size for an audio buffer sink.
|
||||||
|
*
|
||||||
|
* All calls to av_buffersink_get_buffer_ref will return a buffer with
|
||||||
|
* exactly the specified number of samples, or AVERROR(EAGAIN) if there is
|
||||||
|
* not enough. The last buffer at EOF will be padded with 0.
|
||||||
|
*/
|
||||||
|
void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavfi_buffersink_accessors Buffer sink accessors
|
||||||
|
* Get the properties of the stream
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx);
|
||||||
|
AVRational av_buffersink_get_time_base (const AVFilterContext *ctx);
|
||||||
|
int av_buffersink_get_format (const AVFilterContext *ctx);
|
||||||
|
|
||||||
|
AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx);
|
||||||
|
int av_buffersink_get_w (const AVFilterContext *ctx);
|
||||||
|
int av_buffersink_get_h (const AVFilterContext *ctx);
|
||||||
|
AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx);
|
||||||
|
|
||||||
|
int av_buffersink_get_channels (const AVFilterContext *ctx);
|
||||||
|
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||||
|
attribute_deprecated
|
||||||
|
uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx);
|
||||||
|
#endif
|
||||||
|
int av_buffersink_get_ch_layout (const AVFilterContext *ctx,
|
||||||
|
AVChannelLayout *ch_layout);
|
||||||
|
int av_buffersink_get_sample_rate (const AVFilterContext *ctx);
|
||||||
|
|
||||||
|
AVBufferRef * av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a frame with filtered data from sink and put it in frame.
|
||||||
|
*
|
||||||
|
* @param ctx pointer to a context of a buffersink or abuffersink AVFilter.
|
||||||
|
* @param frame pointer to an allocated frame that will be filled with data.
|
||||||
|
* The data must be freed using av_frame_unref() / av_frame_free()
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - >= 0 if a frame was successfully returned.
|
||||||
|
* - AVERROR(EAGAIN) if no frames are available at this point; more
|
||||||
|
* input frames must be added to the filtergraph to get more output.
|
||||||
|
* - AVERROR_EOF if there will be no more output frames on this sink.
|
||||||
|
* - A different negative AVERROR code in other failure cases.
|
||||||
|
*/
|
||||||
|
int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Same as av_buffersink_get_frame(), but with the ability to specify the number
|
||||||
|
* of samples read. This function is less efficient than
|
||||||
|
* av_buffersink_get_frame(), because it copies the data around.
|
||||||
|
*
|
||||||
|
* @param ctx pointer to a context of the abuffersink AVFilter.
|
||||||
|
* @param frame pointer to an allocated frame that will be filled with data.
|
||||||
|
* The data must be freed using av_frame_unref() / av_frame_free()
|
||||||
|
* frame will contain exactly nb_samples audio samples, except at
|
||||||
|
* the end of stream, when it can contain less than nb_samples.
|
||||||
|
*
|
||||||
|
* @return The return codes have the same meaning as for
|
||||||
|
* av_buffersink_get_frame().
|
||||||
|
*
|
||||||
|
* @warning do not mix this function with av_buffersink_get_frame(). Use only one or
|
||||||
|
* the other with a single sink, not both.
|
||||||
|
*/
|
||||||
|
int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVFILTER_BUFFERSINK_H */
|
||||||
218
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/buffersrc.h
vendored
Normal file
218
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/buffersrc.h
vendored
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVFILTER_BUFFERSRC_H
|
||||||
|
#define AVFILTER_BUFFERSRC_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavfi_buffersrc
|
||||||
|
* Memory buffer source API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "avfilter.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavfi_buffersrc Buffer source API
|
||||||
|
* @ingroup lavfi
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do not check for format changes.
|
||||||
|
*/
|
||||||
|
AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Immediately push the frame to the output.
|
||||||
|
*/
|
||||||
|
AV_BUFFERSRC_FLAG_PUSH = 4,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keep a reference to the frame.
|
||||||
|
* If the frame if reference-counted, create a new reference; otherwise
|
||||||
|
* copy the frame data.
|
||||||
|
*/
|
||||||
|
AV_BUFFERSRC_FLAG_KEEP_REF = 8,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of failed requests.
|
||||||
|
*
|
||||||
|
* A failed request is when the request_frame method is called while no
|
||||||
|
* frame is present in the buffer.
|
||||||
|
* The number is reset when a frame is added.
|
||||||
|
*/
|
||||||
|
unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This structure contains the parameters describing the frames that will be
|
||||||
|
* passed to this filter.
|
||||||
|
*
|
||||||
|
* It should be allocated with av_buffersrc_parameters_alloc() and freed with
|
||||||
|
* av_free(). All the allocated fields in it remain owned by the caller.
|
||||||
|
*/
|
||||||
|
typedef struct AVBufferSrcParameters {
|
||||||
|
/**
|
||||||
|
* video: the pixel format, value corresponds to enum AVPixelFormat
|
||||||
|
* audio: the sample format, value corresponds to enum AVSampleFormat
|
||||||
|
*/
|
||||||
|
int format;
|
||||||
|
/**
|
||||||
|
* The timebase to be used for the timestamps on the input frames.
|
||||||
|
*/
|
||||||
|
AVRational time_base;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only, the display dimensions of the input frames.
|
||||||
|
*/
|
||||||
|
int width, height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only, the sample (pixel) aspect ratio.
|
||||||
|
*/
|
||||||
|
AVRational sample_aspect_ratio;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video only, the frame rate of the input video. This field must only be
|
||||||
|
* set to a non-zero value if input stream has a known constant framerate
|
||||||
|
* and should be left at its initial value if the framerate is variable or
|
||||||
|
* unknown.
|
||||||
|
*/
|
||||||
|
AVRational frame_rate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video with a hwaccel pixel format only. This should be a reference to an
|
||||||
|
* AVHWFramesContext instance describing the input frames.
|
||||||
|
*/
|
||||||
|
AVBufferRef *hw_frames_ctx;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Audio only, the audio sampling rate in samples per second.
|
||||||
|
*/
|
||||||
|
int sample_rate;
|
||||||
|
|
||||||
|
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||||
|
/**
|
||||||
|
* Audio only, the audio channel layout
|
||||||
|
* @deprecated use ch_layout
|
||||||
|
*/
|
||||||
|
attribute_deprecated
|
||||||
|
uint64_t channel_layout;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Audio only, the audio channel layout
|
||||||
|
*/
|
||||||
|
AVChannelLayout ch_layout;
|
||||||
|
} AVBufferSrcParameters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a new AVBufferSrcParameters instance. It should be freed by the
|
||||||
|
* caller with av_free().
|
||||||
|
*/
|
||||||
|
AVBufferSrcParameters *av_buffersrc_parameters_alloc(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the buffersrc or abuffersrc filter with the provided parameters.
|
||||||
|
* This function may be called multiple times, the later calls override the
|
||||||
|
* previous ones. Some of the parameters may also be set through AVOptions, then
|
||||||
|
* whatever method is used last takes precedence.
|
||||||
|
*
|
||||||
|
* @param ctx an instance of the buffersrc or abuffersrc filter
|
||||||
|
* @param param the stream parameters. The frames later passed to this filter
|
||||||
|
* must conform to those parameters. All the allocated fields in
|
||||||
|
* param remain owned by the caller, libavfilter will make internal
|
||||||
|
* copies or references when necessary.
|
||||||
|
* @return 0 on success, a negative AVERROR code on failure.
|
||||||
|
*/
|
||||||
|
int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a frame to the buffer source.
|
||||||
|
*
|
||||||
|
* @param ctx an instance of the buffersrc filter
|
||||||
|
* @param frame frame to be added. If the frame is reference counted, this
|
||||||
|
* function will make a new reference to it. Otherwise the frame data will be
|
||||||
|
* copied.
|
||||||
|
*
|
||||||
|
* @return 0 on success, a negative AVERROR on error
|
||||||
|
*
|
||||||
|
* This function is equivalent to av_buffersrc_add_frame_flags() with the
|
||||||
|
* AV_BUFFERSRC_FLAG_KEEP_REF flag.
|
||||||
|
*/
|
||||||
|
av_warn_unused_result
|
||||||
|
int av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a frame to the buffer source.
|
||||||
|
*
|
||||||
|
* @param ctx an instance of the buffersrc filter
|
||||||
|
* @param frame frame to be added. If the frame is reference counted, this
|
||||||
|
* function will take ownership of the reference(s) and reset the frame.
|
||||||
|
* Otherwise the frame data will be copied. If this function returns an error,
|
||||||
|
* the input frame is not touched.
|
||||||
|
*
|
||||||
|
* @return 0 on success, a negative AVERROR on error.
|
||||||
|
*
|
||||||
|
* @note the difference between this function and av_buffersrc_write_frame() is
|
||||||
|
* that av_buffersrc_write_frame() creates a new reference to the input frame,
|
||||||
|
* while this function takes ownership of the reference passed to it.
|
||||||
|
*
|
||||||
|
* This function is equivalent to av_buffersrc_add_frame_flags() without the
|
||||||
|
* AV_BUFFERSRC_FLAG_KEEP_REF flag.
|
||||||
|
*/
|
||||||
|
av_warn_unused_result
|
||||||
|
int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a frame to the buffer source.
|
||||||
|
*
|
||||||
|
* By default, if the frame is reference-counted, this function will take
|
||||||
|
* ownership of the reference(s) and reset the frame. This can be controlled
|
||||||
|
* using the flags.
|
||||||
|
*
|
||||||
|
* If this function returns an error, the input frame is not touched.
|
||||||
|
*
|
||||||
|
* @param buffer_src pointer to a buffer source context
|
||||||
|
* @param frame a frame, or NULL to mark EOF
|
||||||
|
* @param flags a combination of AV_BUFFERSRC_FLAG_*
|
||||||
|
* @return >= 0 in case of success, a negative AVERROR code
|
||||||
|
* in case of failure
|
||||||
|
*/
|
||||||
|
av_warn_unused_result
|
||||||
|
int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src,
|
||||||
|
AVFrame *frame, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the buffer source after EOF.
|
||||||
|
*
|
||||||
|
* This is similar to passing NULL to av_buffersrc_add_frame_flags()
|
||||||
|
* except it takes the timestamp of the EOF, i.e. the timestamp of the end
|
||||||
|
* of the last frame.
|
||||||
|
*/
|
||||||
|
int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVFILTER_BUFFERSRC_H */
|
||||||
48
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/version.h
vendored
Normal file
48
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/version.h
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Version macros.
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVFILTER_VERSION_H
|
||||||
|
#define AVFILTER_VERSION_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavfi
|
||||||
|
* Libavfilter version macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/version.h"
|
||||||
|
|
||||||
|
#include "version_major.h"
|
||||||
|
|
||||||
|
#define LIBAVFILTER_VERSION_MINOR 12
|
||||||
|
#define LIBAVFILTER_VERSION_MICRO 100
|
||||||
|
|
||||||
|
|
||||||
|
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
||||||
|
LIBAVFILTER_VERSION_MINOR, \
|
||||||
|
LIBAVFILTER_VERSION_MICRO)
|
||||||
|
#define LIBAVFILTER_VERSION AV_VERSION(LIBAVFILTER_VERSION_MAJOR, \
|
||||||
|
LIBAVFILTER_VERSION_MINOR, \
|
||||||
|
LIBAVFILTER_VERSION_MICRO)
|
||||||
|
#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT
|
||||||
|
|
||||||
|
#define LIBAVFILTER_IDENT "Lavfi" AV_STRINGIFY(LIBAVFILTER_VERSION)
|
||||||
|
|
||||||
|
#endif /* AVFILTER_VERSION_H */
|
||||||
40
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/version_major.h
vendored
Normal file
40
dependency/x86/third_party/ffmpeg/v6.1/include/libavfilter/version_major.h
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Version macros.
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVFILTER_VERSION_MAJOR_H
|
||||||
|
#define AVFILTER_VERSION_MAJOR_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavfi
|
||||||
|
* Libavfilter version macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LIBAVFILTER_VERSION_MAJOR 9
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FF_API_* defines may be placed below to indicate public API that will be
|
||||||
|
* dropped at a future version bump. The defines themselves are not part of
|
||||||
|
* the public API and may change, break or disappear at any time.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FF_API_LIBPLACEBO_OPTS (LIBAVFILTER_VERSION_MAJOR < 10)
|
||||||
|
|
||||||
|
#endif /* AVFILTER_VERSION_MAJOR_H */
|
||||||
2858
dependency/x86/third_party/ffmpeg/v6.1/include/libavformat/avformat.h
vendored
Normal file
2858
dependency/x86/third_party/ffmpeg/v6.1/include/libavformat/avformat.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
850
dependency/x86/third_party/ffmpeg/v6.1/include/libavformat/avio.h
vendored
Normal file
850
dependency/x86/third_party/ffmpeg/v6.1/include/libavformat/avio.h
vendored
Normal file
@ -0,0 +1,850 @@
|
|||||||
|
/*
|
||||||
|
* copyright (c) 2001 Fabrice Bellard
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
#ifndef AVFORMAT_AVIO_H
|
||||||
|
#define AVFORMAT_AVIO_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavf_io
|
||||||
|
* Buffered I/O operations
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "libavutil/attributes.h"
|
||||||
|
#include "libavutil/dict.h"
|
||||||
|
#include "libavutil/log.h"
|
||||||
|
|
||||||
|
#include "libavformat/version_major.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seeking works like for a local file.
|
||||||
|
*/
|
||||||
|
#define AVIO_SEEKABLE_NORMAL (1 << 0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seeking by timestamp with avio_seek_time() is possible.
|
||||||
|
*/
|
||||||
|
#define AVIO_SEEKABLE_TIME (1 << 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback for checking whether to abort blocking functions.
|
||||||
|
* AVERROR_EXIT is returned in this case by the interrupted
|
||||||
|
* function. During blocking operations, callback is called with
|
||||||
|
* opaque as parameter. If the callback returns 1, the
|
||||||
|
* blocking operation will be aborted.
|
||||||
|
*
|
||||||
|
* No members can be added to this struct without a major bump, if
|
||||||
|
* new elements have been added after this struct in AVFormatContext
|
||||||
|
* or AVIOContext.
|
||||||
|
*/
|
||||||
|
typedef struct AVIOInterruptCB {
|
||||||
|
int (*callback)(void*);
|
||||||
|
void *opaque;
|
||||||
|
} AVIOInterruptCB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directory entry types.
|
||||||
|
*/
|
||||||
|
enum AVIODirEntryType {
|
||||||
|
AVIO_ENTRY_UNKNOWN,
|
||||||
|
AVIO_ENTRY_BLOCK_DEVICE,
|
||||||
|
AVIO_ENTRY_CHARACTER_DEVICE,
|
||||||
|
AVIO_ENTRY_DIRECTORY,
|
||||||
|
AVIO_ENTRY_NAMED_PIPE,
|
||||||
|
AVIO_ENTRY_SYMBOLIC_LINK,
|
||||||
|
AVIO_ENTRY_SOCKET,
|
||||||
|
AVIO_ENTRY_FILE,
|
||||||
|
AVIO_ENTRY_SERVER,
|
||||||
|
AVIO_ENTRY_SHARE,
|
||||||
|
AVIO_ENTRY_WORKGROUP,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes single entry of the directory.
|
||||||
|
*
|
||||||
|
* Only name and type fields are guaranteed be set.
|
||||||
|
* Rest of fields are protocol or/and platform dependent and might be unknown.
|
||||||
|
*/
|
||||||
|
typedef struct AVIODirEntry {
|
||||||
|
char *name; /**< Filename */
|
||||||
|
int type; /**< Type of the entry */
|
||||||
|
int utf8; /**< Set to 1 when name is encoded with UTF-8, 0 otherwise.
|
||||||
|
Name can be encoded with UTF-8 even though 0 is set. */
|
||||||
|
int64_t size; /**< File size in bytes, -1 if unknown. */
|
||||||
|
int64_t modification_timestamp; /**< Time of last modification in microseconds since unix
|
||||||
|
epoch, -1 if unknown. */
|
||||||
|
int64_t access_timestamp; /**< Time of last access in microseconds since unix epoch,
|
||||||
|
-1 if unknown. */
|
||||||
|
int64_t status_change_timestamp; /**< Time of last status change in microseconds since unix
|
||||||
|
epoch, -1 if unknown. */
|
||||||
|
int64_t user_id; /**< User ID of owner, -1 if unknown. */
|
||||||
|
int64_t group_id; /**< Group ID of owner, -1 if unknown. */
|
||||||
|
int64_t filemode; /**< Unix file mode, -1 if unknown. */
|
||||||
|
} AVIODirEntry;
|
||||||
|
|
||||||
|
#if FF_API_AVIODIRCONTEXT
|
||||||
|
typedef struct AVIODirContext {
|
||||||
|
struct URLContext *url_context;
|
||||||
|
} AVIODirContext;
|
||||||
|
#else
|
||||||
|
typedef struct AVIODirContext AVIODirContext;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Different data types that can be returned via the AVIO
|
||||||
|
* write_data_type callback.
|
||||||
|
*/
|
||||||
|
enum AVIODataMarkerType {
|
||||||
|
/**
|
||||||
|
* Header data; this needs to be present for the stream to be decodeable.
|
||||||
|
*/
|
||||||
|
AVIO_DATA_MARKER_HEADER,
|
||||||
|
/**
|
||||||
|
* A point in the output bytestream where a decoder can start decoding
|
||||||
|
* (i.e. a keyframe). A demuxer/decoder given the data flagged with
|
||||||
|
* AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT,
|
||||||
|
* should give decodeable results.
|
||||||
|
*/
|
||||||
|
AVIO_DATA_MARKER_SYNC_POINT,
|
||||||
|
/**
|
||||||
|
* A point in the output bytestream where a demuxer can start parsing
|
||||||
|
* (for non self synchronizing bytestream formats). That is, any
|
||||||
|
* non-keyframe packet start point.
|
||||||
|
*/
|
||||||
|
AVIO_DATA_MARKER_BOUNDARY_POINT,
|
||||||
|
/**
|
||||||
|
* This is any, unlabelled data. It can either be a muxer not marking
|
||||||
|
* any positions at all, it can be an actual boundary/sync point
|
||||||
|
* that the muxer chooses not to mark, or a later part of a packet/fragment
|
||||||
|
* that is cut into multiple write callbacks due to limited IO buffer size.
|
||||||
|
*/
|
||||||
|
AVIO_DATA_MARKER_UNKNOWN,
|
||||||
|
/**
|
||||||
|
* Trailer data, which doesn't contain actual content, but only for
|
||||||
|
* finalizing the output file.
|
||||||
|
*/
|
||||||
|
AVIO_DATA_MARKER_TRAILER,
|
||||||
|
/**
|
||||||
|
* A point in the output bytestream where the underlying AVIOContext might
|
||||||
|
* flush the buffer depending on latency or buffering requirements. Typically
|
||||||
|
* means the end of a packet.
|
||||||
|
*/
|
||||||
|
AVIO_DATA_MARKER_FLUSH_POINT,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bytestream IO Context.
|
||||||
|
* New public fields can be added with minor version bumps.
|
||||||
|
* Removal, reordering and changes to existing public fields require
|
||||||
|
* a major version bump.
|
||||||
|
* sizeof(AVIOContext) must not be used outside libav*.
|
||||||
|
*
|
||||||
|
* @note None of the function pointers in AVIOContext should be called
|
||||||
|
* directly, they should only be set by the client application
|
||||||
|
* when implementing custom I/O. Normally these are set to the
|
||||||
|
* function pointers specified in avio_alloc_context()
|
||||||
|
*/
|
||||||
|
typedef struct AVIOContext {
|
||||||
|
/**
|
||||||
|
* A class for private options.
|
||||||
|
*
|
||||||
|
* If this AVIOContext is created by avio_open2(), av_class is set and
|
||||||
|
* passes the options down to protocols.
|
||||||
|
*
|
||||||
|
* If this AVIOContext is manually allocated, then av_class may be set by
|
||||||
|
* the caller.
|
||||||
|
*
|
||||||
|
* warning -- this field can be NULL, be sure to not pass this AVIOContext
|
||||||
|
* to any av_opt_* functions in that case.
|
||||||
|
*/
|
||||||
|
const AVClass *av_class;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following shows the relationship between buffer, buf_ptr,
|
||||||
|
* buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing
|
||||||
|
* (since AVIOContext is used for both):
|
||||||
|
*
|
||||||
|
**********************************************************************************
|
||||||
|
* READING
|
||||||
|
**********************************************************************************
|
||||||
|
*
|
||||||
|
* | buffer_size |
|
||||||
|
* |---------------------------------------|
|
||||||
|
* | |
|
||||||
|
*
|
||||||
|
* buffer buf_ptr buf_end
|
||||||
|
* +---------------+-----------------------+
|
||||||
|
* |/ / / / / / / /|/ / / / / / /| |
|
||||||
|
* read buffer: |/ / consumed / | to be read /| |
|
||||||
|
* |/ / / / / / / /|/ / / / / / /| |
|
||||||
|
* +---------------+-----------------------+
|
||||||
|
*
|
||||||
|
* pos
|
||||||
|
* +-------------------------------------------+-----------------+
|
||||||
|
* input file: | | |
|
||||||
|
* +-------------------------------------------+-----------------+
|
||||||
|
*
|
||||||
|
*
|
||||||
|
**********************************************************************************
|
||||||
|
* WRITING
|
||||||
|
**********************************************************************************
|
||||||
|
*
|
||||||
|
* | buffer_size |
|
||||||
|
* |--------------------------------------|
|
||||||
|
* | |
|
||||||
|
*
|
||||||
|
* buf_ptr_max
|
||||||
|
* buffer (buf_ptr) buf_end
|
||||||
|
* +-----------------------+--------------+
|
||||||
|
* |/ / / / / / / / / / / /| |
|
||||||
|
* write buffer: | / / to be flushed / / | |
|
||||||
|
* |/ / / / / / / / / / / /| |
|
||||||
|
* +-----------------------+--------------+
|
||||||
|
* buf_ptr can be in this
|
||||||
|
* due to a backward seek
|
||||||
|
*
|
||||||
|
* pos
|
||||||
|
* +-------------+----------------------------------------------+
|
||||||
|
* output file: | | |
|
||||||
|
* +-------------+----------------------------------------------+
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
unsigned char *buffer; /**< Start of the buffer. */
|
||||||
|
int buffer_size; /**< Maximum buffer size */
|
||||||
|
unsigned char *buf_ptr; /**< Current position in the buffer */
|
||||||
|
unsigned char *buf_end; /**< End of the data, may be less than
|
||||||
|
buffer+buffer_size if the read function returned
|
||||||
|
less data than requested, e.g. for streams where
|
||||||
|
no more data has been received yet. */
|
||||||
|
void *opaque; /**< A private pointer, passed to the read/write/seek/...
|
||||||
|
functions. */
|
||||||
|
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
|
||||||
|
#if FF_API_AVIO_WRITE_NONCONST
|
||||||
|
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
|
||||||
|
#else
|
||||||
|
int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size);
|
||||||
|
#endif
|
||||||
|
int64_t (*seek)(void *opaque, int64_t offset, int whence);
|
||||||
|
int64_t pos; /**< position in the file of the current buffer */
|
||||||
|
int eof_reached; /**< true if was unable to read due to error or eof */
|
||||||
|
int error; /**< contains the error code or 0 if no error happened */
|
||||||
|
int write_flag; /**< true if open for writing */
|
||||||
|
int max_packet_size;
|
||||||
|
int min_packet_size; /**< Try to buffer at least this amount of data
|
||||||
|
before flushing it. */
|
||||||
|
unsigned long checksum;
|
||||||
|
unsigned char *checksum_ptr;
|
||||||
|
unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
|
||||||
|
/**
|
||||||
|
* Pause or resume playback for network streaming protocols - e.g. MMS.
|
||||||
|
*/
|
||||||
|
int (*read_pause)(void *opaque, int pause);
|
||||||
|
/**
|
||||||
|
* Seek to a given timestamp in stream with the specified stream_index.
|
||||||
|
* Needed for some network streaming protocols which don't support seeking
|
||||||
|
* to byte position.
|
||||||
|
*/
|
||||||
|
int64_t (*read_seek)(void *opaque, int stream_index,
|
||||||
|
int64_t timestamp, int flags);
|
||||||
|
/**
|
||||||
|
* A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
|
||||||
|
*/
|
||||||
|
int seekable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* avio_read and avio_write should if possible be satisfied directly
|
||||||
|
* instead of going through a buffer, and avio_seek will always
|
||||||
|
* call the underlying seek function directly.
|
||||||
|
*/
|
||||||
|
int direct;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ',' separated list of allowed protocols.
|
||||||
|
*/
|
||||||
|
const char *protocol_whitelist;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ',' separated list of disallowed protocols.
|
||||||
|
*/
|
||||||
|
const char *protocol_blacklist;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A callback that is used instead of write_packet.
|
||||||
|
*/
|
||||||
|
#if FF_API_AVIO_WRITE_NONCONST
|
||||||
|
int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size,
|
||||||
|
enum AVIODataMarkerType type, int64_t time);
|
||||||
|
#else
|
||||||
|
int (*write_data_type)(void *opaque, const uint8_t *buf, int buf_size,
|
||||||
|
enum AVIODataMarkerType type, int64_t time);
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT,
|
||||||
|
* but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly
|
||||||
|
* small chunks of data returned from the callback).
|
||||||
|
*/
|
||||||
|
int ignore_boundary_point;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum reached position before a backward seek in the write buffer,
|
||||||
|
* used keeping track of already written data for a later flush.
|
||||||
|
*/
|
||||||
|
unsigned char *buf_ptr_max;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read-only statistic of bytes read for this AVIOContext.
|
||||||
|
*/
|
||||||
|
int64_t bytes_read;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read-only statistic of bytes written for this AVIOContext.
|
||||||
|
*/
|
||||||
|
int64_t bytes_written;
|
||||||
|
} AVIOContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the name of the protocol that will handle the passed URL.
|
||||||
|
*
|
||||||
|
* NULL is returned if no protocol could be found for the given URL.
|
||||||
|
*
|
||||||
|
* @return Name of the protocol or NULL.
|
||||||
|
*/
|
||||||
|
const char *avio_find_protocol_name(const char *url);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return AVIO_FLAG_* access flags corresponding to the access permissions
|
||||||
|
* of the resource in url, or a negative value corresponding to an
|
||||||
|
* AVERROR code in case of failure. The returned access flags are
|
||||||
|
* masked by the value in flags.
|
||||||
|
*
|
||||||
|
* @note This function is intrinsically unsafe, in the sense that the
|
||||||
|
* checked resource may change its existence or permission status from
|
||||||
|
* one call to another. Thus you should not trust the returned value,
|
||||||
|
* unless you are sure that no other processes are accessing the
|
||||||
|
* checked resource.
|
||||||
|
*/
|
||||||
|
int avio_check(const char *url, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open directory for reading.
|
||||||
|
*
|
||||||
|
* @param s directory read context. Pointer to a NULL pointer must be passed.
|
||||||
|
* @param url directory to be listed.
|
||||||
|
* @param options A dictionary filled with protocol-private options. On return
|
||||||
|
* this parameter will be destroyed and replaced with a dictionary
|
||||||
|
* containing options that were not found. May be NULL.
|
||||||
|
* @return >=0 on success or negative on error.
|
||||||
|
*/
|
||||||
|
int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get next directory entry.
|
||||||
|
*
|
||||||
|
* Returned entry must be freed with avio_free_directory_entry(). In particular
|
||||||
|
* it may outlive AVIODirContext.
|
||||||
|
*
|
||||||
|
* @param s directory read context.
|
||||||
|
* @param[out] next next entry or NULL when no more entries.
|
||||||
|
* @return >=0 on success or negative on error. End of list is not considered an
|
||||||
|
* error.
|
||||||
|
*/
|
||||||
|
int avio_read_dir(AVIODirContext *s, AVIODirEntry **next);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close directory.
|
||||||
|
*
|
||||||
|
* @note Entries created using avio_read_dir() are not deleted and must be
|
||||||
|
* freeded with avio_free_directory_entry().
|
||||||
|
*
|
||||||
|
* @param s directory read context.
|
||||||
|
* @return >=0 on success or negative on error.
|
||||||
|
*/
|
||||||
|
int avio_close_dir(AVIODirContext **s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free entry allocated by avio_read_dir().
|
||||||
|
*
|
||||||
|
* @param entry entry to be freed.
|
||||||
|
*/
|
||||||
|
void avio_free_directory_entry(AVIODirEntry **entry);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize an AVIOContext for buffered I/O. It must be later
|
||||||
|
* freed with avio_context_free().
|
||||||
|
*
|
||||||
|
* @param buffer Memory block for input/output operations via AVIOContext.
|
||||||
|
* The buffer must be allocated with av_malloc() and friends.
|
||||||
|
* It may be freed and replaced with a new buffer by libavformat.
|
||||||
|
* AVIOContext.buffer holds the buffer currently in use,
|
||||||
|
* which must be later freed with av_free().
|
||||||
|
* @param buffer_size The buffer size is very important for performance.
|
||||||
|
* For protocols with fixed blocksize it should be set to this blocksize.
|
||||||
|
* For others a typical size is a cache page, e.g. 4kb.
|
||||||
|
* @param write_flag Set to 1 if the buffer should be writable, 0 otherwise.
|
||||||
|
* @param opaque An opaque pointer to user-specific data.
|
||||||
|
* @param read_packet A function for refilling the buffer, may be NULL.
|
||||||
|
* For stream protocols, must never return 0 but rather
|
||||||
|
* a proper AVERROR code.
|
||||||
|
* @param write_packet A function for writing the buffer contents, may be NULL.
|
||||||
|
* The function may not change the input buffers content.
|
||||||
|
* @param seek A function for seeking to specified byte position, may be NULL.
|
||||||
|
*
|
||||||
|
* @return Allocated AVIOContext or NULL on failure.
|
||||||
|
*/
|
||||||
|
AVIOContext *avio_alloc_context(
|
||||||
|
unsigned char *buffer,
|
||||||
|
int buffer_size,
|
||||||
|
int write_flag,
|
||||||
|
void *opaque,
|
||||||
|
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
|
||||||
|
#if FF_API_AVIO_WRITE_NONCONST
|
||||||
|
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
|
||||||
|
#else
|
||||||
|
int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size),
|
||||||
|
#endif
|
||||||
|
int64_t (*seek)(void *opaque, int64_t offset, int whence));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the supplied IO context and everything associated with it.
|
||||||
|
*
|
||||||
|
* @param s Double pointer to the IO context. This function will write NULL
|
||||||
|
* into s.
|
||||||
|
*/
|
||||||
|
void avio_context_free(AVIOContext **s);
|
||||||
|
|
||||||
|
void avio_w8(AVIOContext *s, int b);
|
||||||
|
void avio_write(AVIOContext *s, const unsigned char *buf, int size);
|
||||||
|
void avio_wl64(AVIOContext *s, uint64_t val);
|
||||||
|
void avio_wb64(AVIOContext *s, uint64_t val);
|
||||||
|
void avio_wl32(AVIOContext *s, unsigned int val);
|
||||||
|
void avio_wb32(AVIOContext *s, unsigned int val);
|
||||||
|
void avio_wl24(AVIOContext *s, unsigned int val);
|
||||||
|
void avio_wb24(AVIOContext *s, unsigned int val);
|
||||||
|
void avio_wl16(AVIOContext *s, unsigned int val);
|
||||||
|
void avio_wb16(AVIOContext *s, unsigned int val);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a NULL-terminated string.
|
||||||
|
* @return number of bytes written.
|
||||||
|
*/
|
||||||
|
int avio_put_str(AVIOContext *s, const char *str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an UTF-8 string to UTF-16LE and write it.
|
||||||
|
* @param s the AVIOContext
|
||||||
|
* @param str NULL-terminated UTF-8 string
|
||||||
|
*
|
||||||
|
* @return number of bytes written.
|
||||||
|
*/
|
||||||
|
int avio_put_str16le(AVIOContext *s, const char *str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an UTF-8 string to UTF-16BE and write it.
|
||||||
|
* @param s the AVIOContext
|
||||||
|
* @param str NULL-terminated UTF-8 string
|
||||||
|
*
|
||||||
|
* @return number of bytes written.
|
||||||
|
*/
|
||||||
|
int avio_put_str16be(AVIOContext *s, const char *str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark the written bytestream as a specific type.
|
||||||
|
*
|
||||||
|
* Zero-length ranges are omitted from the output.
|
||||||
|
*
|
||||||
|
* @param s the AVIOContext
|
||||||
|
* @param time the stream time the current bytestream pos corresponds to
|
||||||
|
* (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not
|
||||||
|
* applicable
|
||||||
|
* @param type the kind of data written starting at the current pos
|
||||||
|
*/
|
||||||
|
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ORing this as the "whence" parameter to a seek function causes it to
|
||||||
|
* return the filesize without seeking anywhere. Supporting this is optional.
|
||||||
|
* If it is not supported then the seek function will return <0.
|
||||||
|
*/
|
||||||
|
#define AVSEEK_SIZE 0x10000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Passing this flag as the "whence" parameter to a seek function causes it to
|
||||||
|
* seek by any means (like reopening and linear reading) or other normally unreasonable
|
||||||
|
* means that can be extremely slow.
|
||||||
|
* This may be ignored by the seek code.
|
||||||
|
*/
|
||||||
|
#define AVSEEK_FORCE 0x20000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fseek() equivalent for AVIOContext.
|
||||||
|
* @return new position or AVERROR.
|
||||||
|
*/
|
||||||
|
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skip given number of bytes forward
|
||||||
|
* @return new position or AVERROR.
|
||||||
|
*/
|
||||||
|
int64_t avio_skip(AVIOContext *s, int64_t offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ftell() equivalent for AVIOContext.
|
||||||
|
* @return position or AVERROR.
|
||||||
|
*/
|
||||||
|
static av_always_inline int64_t avio_tell(AVIOContext *s)
|
||||||
|
{
|
||||||
|
return avio_seek(s, 0, SEEK_CUR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the filesize.
|
||||||
|
* @return filesize or AVERROR
|
||||||
|
*/
|
||||||
|
int64_t avio_size(AVIOContext *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Similar to feof() but also returns nonzero on read errors.
|
||||||
|
* @return non zero if and only if at end of file or a read error happened when reading.
|
||||||
|
*/
|
||||||
|
int avio_feof(AVIOContext *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a formatted string to the context taking a va_list.
|
||||||
|
* @return number of bytes written, < 0 on error.
|
||||||
|
*/
|
||||||
|
int avio_vprintf(AVIOContext *s, const char *fmt, va_list ap);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a formatted string to the context.
|
||||||
|
* @return number of bytes written, < 0 on error.
|
||||||
|
*/
|
||||||
|
int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a NULL terminated array of strings to the context.
|
||||||
|
* Usually you don't need to use this function directly but its macro wrapper,
|
||||||
|
* avio_print.
|
||||||
|
*/
|
||||||
|
void avio_print_string_array(AVIOContext *s, const char *strings[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write strings (const char *) to the context.
|
||||||
|
* This is a convenience macro around avio_print_string_array and it
|
||||||
|
* automatically creates the string array from the variable argument list.
|
||||||
|
* For simple string concatenations this function is more performant than using
|
||||||
|
* avio_printf since it does not need a temporary buffer.
|
||||||
|
*/
|
||||||
|
#define avio_print(s, ...) \
|
||||||
|
avio_print_string_array(s, (const char*[]){__VA_ARGS__, NULL})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Force flushing of buffered data.
|
||||||
|
*
|
||||||
|
* For write streams, force the buffered data to be immediately written to the output,
|
||||||
|
* without to wait to fill the internal buffer.
|
||||||
|
*
|
||||||
|
* For read streams, discard all currently buffered data, and advance the
|
||||||
|
* reported file position to that of the underlying stream. This does not
|
||||||
|
* read new data, and does not perform any seeks.
|
||||||
|
*/
|
||||||
|
void avio_flush(AVIOContext *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read size bytes from AVIOContext into buf.
|
||||||
|
* @return number of bytes read or AVERROR
|
||||||
|
*/
|
||||||
|
int avio_read(AVIOContext *s, unsigned char *buf, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed
|
||||||
|
* to read fewer bytes than requested. The missing bytes can be read in the next
|
||||||
|
* call. This always tries to read at least 1 byte.
|
||||||
|
* Useful to reduce latency in certain cases.
|
||||||
|
* @return number of bytes read or AVERROR
|
||||||
|
*/
|
||||||
|
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Functions for reading from AVIOContext
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @note return 0 if EOF, so you cannot use it if EOF handling is
|
||||||
|
* necessary
|
||||||
|
*/
|
||||||
|
int avio_r8 (AVIOContext *s);
|
||||||
|
unsigned int avio_rl16(AVIOContext *s);
|
||||||
|
unsigned int avio_rl24(AVIOContext *s);
|
||||||
|
unsigned int avio_rl32(AVIOContext *s);
|
||||||
|
uint64_t avio_rl64(AVIOContext *s);
|
||||||
|
unsigned int avio_rb16(AVIOContext *s);
|
||||||
|
unsigned int avio_rb24(AVIOContext *s);
|
||||||
|
unsigned int avio_rb32(AVIOContext *s);
|
||||||
|
uint64_t avio_rb64(AVIOContext *s);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a string from pb into buf. The reading will terminate when either
|
||||||
|
* a NULL character was encountered, maxlen bytes have been read, or nothing
|
||||||
|
* more can be read from pb. The result is guaranteed to be NULL-terminated, it
|
||||||
|
* will be truncated if buf is too small.
|
||||||
|
* Note that the string is not interpreted or validated in any way, it
|
||||||
|
* might get truncated in the middle of a sequence for multi-byte encodings.
|
||||||
|
*
|
||||||
|
* @return number of bytes read (is always <= maxlen).
|
||||||
|
* If reading ends on EOF or error, the return value will be one more than
|
||||||
|
* bytes actually read.
|
||||||
|
*/
|
||||||
|
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a UTF-16 string from pb and convert it to UTF-8.
|
||||||
|
* The reading will terminate when either a null or invalid character was
|
||||||
|
* encountered or maxlen bytes have been read.
|
||||||
|
* @return number of bytes read (is always <= maxlen)
|
||||||
|
*/
|
||||||
|
int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen);
|
||||||
|
int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name URL open modes
|
||||||
|
* The flags argument to avio_open must be one of the following
|
||||||
|
* constants, optionally ORed with other flags.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define AVIO_FLAG_READ 1 /**< read-only */
|
||||||
|
#define AVIO_FLAG_WRITE 2 /**< write-only */
|
||||||
|
#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE) /**< read-write pseudo flag */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use non-blocking mode.
|
||||||
|
* If this flag is set, operations on the context will return
|
||||||
|
* AVERROR(EAGAIN) if they can not be performed immediately.
|
||||||
|
* If this flag is not set, operations on the context will never return
|
||||||
|
* AVERROR(EAGAIN).
|
||||||
|
* Note that this flag does not affect the opening/connecting of the
|
||||||
|
* context. Connecting a protocol will always block if necessary (e.g. on
|
||||||
|
* network protocols) but never hang (e.g. on busy devices).
|
||||||
|
* Warning: non-blocking protocols is work-in-progress; this flag may be
|
||||||
|
* silently ignored.
|
||||||
|
*/
|
||||||
|
#define AVIO_FLAG_NONBLOCK 8
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use direct mode.
|
||||||
|
* avio_read and avio_write should if possible be satisfied directly
|
||||||
|
* instead of going through a buffer, and avio_seek will always
|
||||||
|
* call the underlying seek function directly.
|
||||||
|
*/
|
||||||
|
#define AVIO_FLAG_DIRECT 0x8000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create and initialize a AVIOContext for accessing the
|
||||||
|
* resource indicated by url.
|
||||||
|
* @note When the resource indicated by url has been opened in
|
||||||
|
* read+write mode, the AVIOContext can be used only for writing.
|
||||||
|
*
|
||||||
|
* @param s Used to return the pointer to the created AVIOContext.
|
||||||
|
* In case of failure the pointed to value is set to NULL.
|
||||||
|
* @param url resource to access
|
||||||
|
* @param flags flags which control how the resource indicated by url
|
||||||
|
* is to be opened
|
||||||
|
* @return >= 0 in case of success, a negative value corresponding to an
|
||||||
|
* AVERROR code in case of failure
|
||||||
|
*/
|
||||||
|
int avio_open(AVIOContext **s, const char *url, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create and initialize a AVIOContext for accessing the
|
||||||
|
* resource indicated by url.
|
||||||
|
* @note When the resource indicated by url has been opened in
|
||||||
|
* read+write mode, the AVIOContext can be used only for writing.
|
||||||
|
*
|
||||||
|
* @param s Used to return the pointer to the created AVIOContext.
|
||||||
|
* In case of failure the pointed to value is set to NULL.
|
||||||
|
* @param url resource to access
|
||||||
|
* @param flags flags which control how the resource indicated by url
|
||||||
|
* is to be opened
|
||||||
|
* @param int_cb an interrupt callback to be used at the protocols level
|
||||||
|
* @param options A dictionary filled with protocol-private options. On return
|
||||||
|
* this parameter will be destroyed and replaced with a dict containing options
|
||||||
|
* that were not found. May be NULL.
|
||||||
|
* @return >= 0 in case of success, a negative value corresponding to an
|
||||||
|
* AVERROR code in case of failure
|
||||||
|
*/
|
||||||
|
int avio_open2(AVIOContext **s, const char *url, int flags,
|
||||||
|
const AVIOInterruptCB *int_cb, AVDictionary **options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the resource accessed by the AVIOContext s and free it.
|
||||||
|
* This function can only be used if s was opened by avio_open().
|
||||||
|
*
|
||||||
|
* The internal buffer is automatically flushed before closing the
|
||||||
|
* resource.
|
||||||
|
*
|
||||||
|
* @return 0 on success, an AVERROR < 0 on error.
|
||||||
|
* @see avio_closep
|
||||||
|
*/
|
||||||
|
int avio_close(AVIOContext *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the resource accessed by the AVIOContext *s, free it
|
||||||
|
* and set the pointer pointing to it to NULL.
|
||||||
|
* This function can only be used if s was opened by avio_open().
|
||||||
|
*
|
||||||
|
* The internal buffer is automatically flushed before closing the
|
||||||
|
* resource.
|
||||||
|
*
|
||||||
|
* @return 0 on success, an AVERROR < 0 on error.
|
||||||
|
* @see avio_close
|
||||||
|
*/
|
||||||
|
int avio_closep(AVIOContext **s);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a write only memory stream.
|
||||||
|
*
|
||||||
|
* @param s new IO context
|
||||||
|
* @return zero if no error.
|
||||||
|
*/
|
||||||
|
int avio_open_dyn_buf(AVIOContext **s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the written size and a pointer to the buffer.
|
||||||
|
* The AVIOContext stream is left intact.
|
||||||
|
* The buffer must NOT be freed.
|
||||||
|
* No padding is added to the buffer.
|
||||||
|
*
|
||||||
|
* @param s IO context
|
||||||
|
* @param pbuffer pointer to a byte buffer
|
||||||
|
* @return the length of the byte buffer
|
||||||
|
*/
|
||||||
|
int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the written size and a pointer to the buffer. The buffer
|
||||||
|
* must be freed with av_free().
|
||||||
|
* Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer.
|
||||||
|
*
|
||||||
|
* @param s IO context
|
||||||
|
* @param pbuffer pointer to a byte buffer
|
||||||
|
* @return the length of the byte buffer
|
||||||
|
*/
|
||||||
|
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate through names of available protocols.
|
||||||
|
*
|
||||||
|
* @param opaque A private pointer representing current protocol.
|
||||||
|
* It must be a pointer to NULL on first iteration and will
|
||||||
|
* be updated by successive calls to avio_enum_protocols.
|
||||||
|
* @param output If set to 1, iterate over output protocols,
|
||||||
|
* otherwise over input protocols.
|
||||||
|
*
|
||||||
|
* @return A static string containing the name of current protocol or NULL
|
||||||
|
*/
|
||||||
|
const char *avio_enum_protocols(void **opaque, int output);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get AVClass by names of available protocols.
|
||||||
|
*
|
||||||
|
* @return A AVClass of input protocol name or NULL
|
||||||
|
*/
|
||||||
|
const AVClass *avio_protocol_get_class(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pause and resume playing - only meaningful if using a network streaming
|
||||||
|
* protocol (e.g. MMS).
|
||||||
|
*
|
||||||
|
* @param h IO context from which to call the read_pause function pointer
|
||||||
|
* @param pause 1 for pause, 0 for resume
|
||||||
|
*/
|
||||||
|
int avio_pause(AVIOContext *h, int pause);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seek to a given timestamp relative to some component stream.
|
||||||
|
* Only meaningful if using a network streaming protocol (e.g. MMS.).
|
||||||
|
*
|
||||||
|
* @param h IO context from which to call the seek function pointers
|
||||||
|
* @param stream_index The stream index that the timestamp is relative to.
|
||||||
|
* If stream_index is (-1) the timestamp should be in AV_TIME_BASE
|
||||||
|
* units from the beginning of the presentation.
|
||||||
|
* If a stream_index >= 0 is used and the protocol does not support
|
||||||
|
* seeking based on component streams, the call will fail.
|
||||||
|
* @param timestamp timestamp in AVStream.time_base units
|
||||||
|
* or if there is no stream specified then in AV_TIME_BASE units.
|
||||||
|
* @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE
|
||||||
|
* and AVSEEK_FLAG_ANY. The protocol may silently ignore
|
||||||
|
* AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will
|
||||||
|
* fail if used and not supported.
|
||||||
|
* @return >= 0 on success
|
||||||
|
* @see AVInputFormat::read_seek
|
||||||
|
*/
|
||||||
|
int64_t avio_seek_time(AVIOContext *h, int stream_index,
|
||||||
|
int64_t timestamp, int flags);
|
||||||
|
|
||||||
|
/* Avoid a warning. The header can not be included because it breaks c++. */
|
||||||
|
struct AVBPrint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read contents of h into print buffer, up to max_size bytes, or up to EOF.
|
||||||
|
*
|
||||||
|
* @return 0 for success (max_size bytes read or EOF reached), negative error
|
||||||
|
* code otherwise
|
||||||
|
*/
|
||||||
|
int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accept and allocate a client context on a server context.
|
||||||
|
* @param s the server context
|
||||||
|
* @param c the client context, must be unallocated
|
||||||
|
* @return >= 0 on success or a negative value corresponding
|
||||||
|
* to an AVERROR on failure
|
||||||
|
*/
|
||||||
|
int avio_accept(AVIOContext *s, AVIOContext **c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform one step of the protocol handshake to accept a new client.
|
||||||
|
* This function must be called on a client returned by avio_accept() before
|
||||||
|
* using it as a read/write context.
|
||||||
|
* It is separate from avio_accept() because it may block.
|
||||||
|
* A step of the handshake is defined by places where the application may
|
||||||
|
* decide to change the proceedings.
|
||||||
|
* For example, on a protocol with a request header and a reply header, each
|
||||||
|
* one can constitute a step because the application may use the parameters
|
||||||
|
* from the request to change parameters in the reply; or each individual
|
||||||
|
* chunk of the request can constitute a step.
|
||||||
|
* If the handshake is already finished, avio_handshake() does nothing and
|
||||||
|
* returns 0 immediately.
|
||||||
|
*
|
||||||
|
* @param c the client context to perform the handshake on
|
||||||
|
* @return 0 on a complete and successful handshake
|
||||||
|
* > 0 if the handshake progressed, but is not complete
|
||||||
|
* < 0 for an AVERROR code
|
||||||
|
*/
|
||||||
|
int avio_handshake(AVIOContext *c);
|
||||||
|
#endif /* AVFORMAT_AVIO_H */
|
||||||
47
dependency/x86/third_party/ffmpeg/v6.1/include/libavformat/version.h
vendored
Normal file
47
dependency/x86/third_party/ffmpeg/v6.1/include/libavformat/version.h
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Version macros.
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVFORMAT_VERSION_H
|
||||||
|
#define AVFORMAT_VERSION_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup libavf
|
||||||
|
* Libavformat version macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/version.h"
|
||||||
|
|
||||||
|
#include "version_major.h"
|
||||||
|
|
||||||
|
#define LIBAVFORMAT_VERSION_MINOR 16
|
||||||
|
#define LIBAVFORMAT_VERSION_MICRO 101
|
||||||
|
|
||||||
|
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
|
LIBAVFORMAT_VERSION_MINOR, \
|
||||||
|
LIBAVFORMAT_VERSION_MICRO)
|
||||||
|
#define LIBAVFORMAT_VERSION AV_VERSION(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
|
LIBAVFORMAT_VERSION_MINOR, \
|
||||||
|
LIBAVFORMAT_VERSION_MICRO)
|
||||||
|
#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT
|
||||||
|
|
||||||
|
#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION)
|
||||||
|
|
||||||
|
#endif /* AVFORMAT_VERSION_H */
|
||||||
56
dependency/x86/third_party/ffmpeg/v6.1/include/libavformat/version_major.h
vendored
Normal file
56
dependency/x86/third_party/ffmpeg/v6.1/include/libavformat/version_major.h
vendored
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Version macros.
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVFORMAT_VERSION_MAJOR_H
|
||||||
|
#define AVFORMAT_VERSION_MAJOR_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup libavf
|
||||||
|
* Libavformat version macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
|
||||||
|
// Also please add any ticket numbers that you believe might be affected here
|
||||||
|
#define LIBAVFORMAT_VERSION_MAJOR 60
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FF_API_* defines may be placed below to indicate public API that will be
|
||||||
|
* dropped at a future version bump. The defines themselves are not part of
|
||||||
|
* the public API and may change, break or disappear at any time.
|
||||||
|
*
|
||||||
|
* @note, when bumping the major version it is recommended to manually
|
||||||
|
* disable each FF_API_* in its own commit instead of disabling them all
|
||||||
|
* at once through the bump. This improves the git bisect-ability of the change.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_GET_END_PTS (LIBAVFORMAT_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_AVIODIRCONTEXT (LIBAVFORMAT_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_AVFORMAT_IO_CLOSE (LIBAVFORMAT_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_AVIO_WRITE_NONCONST (LIBAVFORMAT_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_LAVF_SHORTEST (LIBAVFORMAT_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_ALLOW_FLUSH (LIBAVFORMAT_VERSION_MAJOR < 61)
|
||||||
|
#define FF_API_AVSTREAM_SIDE_DATA (LIBAVFORMAT_VERSION_MAJOR < 61)
|
||||||
|
|
||||||
|
|
||||||
|
#define FF_API_R_FRAME_RATE 1
|
||||||
|
|
||||||
|
#endif /* AVFORMAT_VERSION_MAJOR_H */
|
||||||
63
dependency/x86/third_party/ffmpeg/v6.1/include/libavutil/adler32.h
vendored
Normal file
63
dependency/x86/third_party/ffmpeg/v6.1/include/libavutil/adler32.h
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* copyright (c) 2006 Mans Rullgard
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @ingroup lavu_adler32
|
||||||
|
* Public header for Adler-32 hash function implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVUTIL_ADLER32_H
|
||||||
|
#define AVUTIL_ADLER32_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "attributes.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavu_adler32 Adler-32
|
||||||
|
* @ingroup lavu_hash
|
||||||
|
* Adler-32 hash function implementation.
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef uint32_t AVAdler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the Adler32 checksum of a buffer.
|
||||||
|
*
|
||||||
|
* Passing the return value to a subsequent av_adler32_update() call
|
||||||
|
* allows the checksum of multiple buffers to be calculated as though
|
||||||
|
* they were concatenated.
|
||||||
|
*
|
||||||
|
* @param adler initial checksum value
|
||||||
|
* @param buf pointer to input buffer
|
||||||
|
* @param len size of input buffer
|
||||||
|
* @return updated checksum
|
||||||
|
*/
|
||||||
|
AVAdler av_adler32_update(AVAdler adler, const uint8_t *buf,
|
||||||
|
size_t len) av_pure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVUTIL_ADLER32_H */
|
||||||
69
dependency/x86/third_party/ffmpeg/v6.1/include/libavutil/aes.h
vendored
Normal file
69
dependency/x86/third_party/ffmpeg/v6.1/include/libavutil/aes.h
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* copyright (c) 2007 Michael Niedermayer <michaelni@gmx.at>
|
||||||
|
*
|
||||||
|
* This file is part of FFmpeg.
|
||||||
|
*
|
||||||
|
* FFmpeg is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with FFmpeg; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVUTIL_AES_H
|
||||||
|
#define AVUTIL_AES_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "attributes.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup lavu_aes AES
|
||||||
|
* @ingroup lavu_crypto
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern const int av_aes_size;
|
||||||
|
|
||||||
|
struct AVAES;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate an AVAES context.
|
||||||
|
*/
|
||||||
|
struct AVAES *av_aes_alloc(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize an AVAES context.
|
||||||
|
*
|
||||||
|
* @param a The AVAES context
|
||||||
|
* @param key Pointer to the key
|
||||||
|
* @param key_bits 128, 192 or 256
|
||||||
|
* @param decrypt 0 for encryption, 1 for decryption
|
||||||
|
*/
|
||||||
|
int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encrypt or decrypt a buffer using a previously initialized context.
|
||||||
|
*
|
||||||
|
* @param a The AVAES context
|
||||||
|
* @param dst destination array, can be equal to src
|
||||||
|
* @param src source array, can be equal to dst
|
||||||
|
* @param count number of 16 byte blocks
|
||||||
|
* @param iv initialization vector for CBC mode, if NULL then ECB will be used
|
||||||
|
* @param decrypt 0 for encryption, 1 for decryption
|
||||||
|
*/
|
||||||
|
void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* AVUTIL_AES_H */
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user