mirror of
https://github.com/jetkvm/kvm.git
synced 2026-05-21 05:20:35 +00:00
cb7746fb78
* feat(video): add H.265 codec support with auto-negotiation Add H.265 (HEVC) encoding support to the RV1106 hardware encoder alongside existing H.264. The codec is negotiated per-WebRTC session based on browser capabilities. - Add codec preference setting (Auto/H.265/H.264) to config, RPC, and UI - Auto mode inspects the browser's SDP offer and prefers H.265 when supported, with graceful fallback to H.264 for browsers without H.265 (e.g. Firefox) - Move WebRTC video track creation from newSession() to ExchangeOffer() so the codec can be resolved after seeing the browser's offer - Set encoder codec type in onFirstSessionConnected() before VideoStart() - Show active codec in the status bar when troubleshooting mode is enabled - Remove quality factor >1.0 ceiling from ctrl.c to allow bitrate testing - Fix Go wrapper to check return value from C quality factor setter - Add e2e tests: video quality bitrate measurement, codec negotiation, codec preference persistence, and a quality factor sweep benchmark - Add visual noise helpers (remote host terminal) to e2e test infrastructure * chore(e2e): remove video quality benchmark tests and helpers Remove video-quality-sweep and video-quality spec files — these are benchmarking tools, not regression tests. Also removes the visual noise helpers and hardcoded developer SSH address from helpers.ts. * feat(video): bump bitrate cap to 4000 kbps and tighten VBR ceiling - Increase base_bitrate_high from 2000 to 4000 kbps, giving users better image quality at every quality factor setting. - Tighten VBR max_bitrate from 2x to 1.5x target, reducing encoder overshoot while still allowing headroom for dynamic content. - Add frames dropped, decode time, freeze count to WebRTC test hooks for pipeline health monitoring. - Move bitrate sweep benchmark to ui/benchmarks/ with its own playwright config, separate from the e2e test suite. Sweep results (visual noise, H.264, 1080p): factor=0.1: 3082 kbps, 60fps, 0 dropped, 2.9ms decode factor=0.5: 6357 kbps, 60fps, 0 dropped, 3.6ms decode factor=1.0: 9445 kbps, 59fps, 0 dropped, 4.3ms decode
77 lines
2.8 KiB
C
77 lines
2.8 KiB
C
#ifndef VIDEO_DAEMON_CTRL_H
|
|
#define VIDEO_DAEMON_CTRL_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <sys/types.h>
|
|
|
|
typedef struct
|
|
{
|
|
bool ready;
|
|
uint8_t streaming;
|
|
const char *error;
|
|
u_int16_t width;
|
|
u_int16_t height;
|
|
double frame_per_second;
|
|
} jetkvm_video_state_t;
|
|
|
|
typedef void (jetkvm_video_state_handler_t)(jetkvm_video_state_t *state);
|
|
typedef void (jetkvm_log_handler_t)(int level, const char *filename, const char *funcname, int line, const char *message);
|
|
typedef void (jetkvm_rpc_handler_t)(const char *method, const char *params);
|
|
typedef void (jetkvm_video_handler_t)(const uint8_t *frame, ssize_t len);
|
|
typedef void (jetkvm_indev_handler_t)(int code);
|
|
|
|
void jetkvm_set_log_handler(jetkvm_log_handler_t *handler);
|
|
void jetkvm_set_video_handler(jetkvm_video_handler_t *handler);
|
|
void jetkvm_set_indev_handler(jetkvm_indev_handler_t *handler);
|
|
void jetkvm_set_rpc_handler(jetkvm_rpc_handler_t *handler);
|
|
void jetkvm_call_rpc_handler(const char *method, const char *params);
|
|
void jetkvm_set_video_state_handler(jetkvm_video_state_handler_t *handler);
|
|
void jetkvm_crash();
|
|
|
|
void jetkvm_ui_set_var(const char *name, const char *value);
|
|
const char *jetkvm_ui_get_var(const char *name);
|
|
|
|
void jetkvm_ui_init(u_int16_t rotation);
|
|
void jetkvm_ui_tick();
|
|
|
|
|
|
void jetkvm_ui_set_rotation(u_int16_t rotation);
|
|
const char *jetkvm_ui_get_current_screen();
|
|
void jetkvm_ui_load_screen(const char *obj_name);
|
|
int jetkvm_ui_set_text(const char *obj_name, const char *text);
|
|
void jetkvm_ui_set_image(const char *obj_name, const char *image_name);
|
|
void jetkvm_ui_add_state(const char *obj_name, const char *state_name);
|
|
void jetkvm_ui_clear_state(const char *obj_name, const char *state_name);
|
|
void jetkvm_ui_fade_in(const char *obj_name, u_int32_t duration);
|
|
void jetkvm_ui_fade_out(const char *obj_name, u_int32_t duration);
|
|
void jetkvm_ui_set_opacity(const char *obj_name, u_int8_t opacity);
|
|
int jetkvm_ui_add_flag(const char *obj_name, const char *flag_name);
|
|
int jetkvm_ui_clear_flag(const char *obj_name, const char *flag_name);
|
|
|
|
const char *jetkvm_ui_get_lvgl_version();
|
|
|
|
const char *jetkvm_ui_event_code_to_name(int code);
|
|
|
|
int jetkvm_video_init(float quality_factor);
|
|
void jetkvm_video_shutdown();
|
|
void jetkvm_video_start();
|
|
void jetkvm_video_stop();
|
|
uint8_t jetkvm_video_get_streaming_status();
|
|
int jetkvm_video_set_quality_factor(float quality_factor);
|
|
float jetkvm_video_get_quality_factor();
|
|
int jetkvm_video_set_codec_type(int codec_type);
|
|
int jetkvm_video_get_codec_type();
|
|
int jetkvm_video_set_edid(const char *edid_hex);
|
|
char *jetkvm_video_get_edid_hex();
|
|
char *jetkvm_video_log_status();
|
|
jetkvm_video_state_t *jetkvm_video_get_status();
|
|
|
|
void video_report_format(bool ready, const char *error, u_int16_t width, u_int16_t height, double frame_per_second);
|
|
void video_send_format_report();
|
|
int video_send_frame(const uint8_t *frame, ssize_t len);
|
|
|
|
|
|
|
|
#endif //VIDEO_DAEMON_CTRL_H
|