53#define MOD_NAME "[caca] "
75 long long timeout_ns);
76static void *
worker(
void *arg);
82 *available_cards = calloc(*
count,
sizeof **available_cards);
83 snprintf((*available_cards)[0].
name,
sizeof (*available_cards)[0].
name,
"caca");
96 caca_free_dither(s->
dither);
102 caca_free_canvas(s->
canvas);
108 pthread_mutex_destroy(&s->
lock);
118 const char *
const * drivers = caca_get_display_driver_list();
120 const char *driver = *drivers++;
121 const char *
desc = *drivers++;
130 const char *driver = NULL;
131 if (strlen(
fmt) > 0) {
132 if (strstr(
fmt,
"driver=") ==
fmt) {
133 driver = strchr(
fmt,
'=') + 1;
142 pthread_mutex_init(&s->
lock, NULL);
146 s->
canvas = caca_create_canvas(0, 0);
152 s->
display = caca_create_display_with_driver(s->
canvas, driver);
158 driver = caca_get_display_driver(s->
display);
161 if (strcmp(driver,
"x11") != 0 && strcmp(driver,
"null") != 0) {
167 "Setting log level to error - set to a different "
168 "level than info to keep logging.\n");
191 while ((ret = caca_get_event(s->
display, CACA_EVENT_ANY, &e, 0)) > 0) {
193 case CACA_EVENT_KEY_PRESS:
194 if (e.data.key.ch ==
'q' || e.data.key.ch == CACA_KEY_CTRL_C) {
198 case CACA_EVENT_RESIZE:
204 caca_refresh_display(s->
display);
207 case CACA_EVENT_QUIT:
223 caca_free_dither(s->
dither);
227 RMASK, GMASK, BMASK, AMASK);
249 pthread_mutex_lock(&s->
lock);
255 pthread_mutex_unlock(&s->
lock);
260 pthread_mutex_unlock(&s->
lock);
272 caca_refresh_display(s->
display);
290 pthread_mutex_lock(&s->
lock);
299 pthread_mutex_unlock(&s->
lock);
311 memcpy(
val, c,
sizeof c);
339 const char *
display = getenv(
"DISPLAY");
343 return &display_caca_info;
struct video_frame * frame
const char unsigned int flags
int void(** deleter)(void *))
void vf_free(struct video_frame *buf)
Frees video_frame structure.
struct video_desc video_desc_from_frame(const struct video_frame *frame)
Returns struct video_desc from video frame.
struct video_frame * vf_alloc_desc_data(struct video_desc desc)
static void display_caca_done(void *state)
static bool display_caca_putf(void *state, struct video_frame *frame, long long timeout_ns)
static bool display_caca_get_property(void *state, int property, void *val, size_t *len)
static struct video_frame * display_caca_getf(void *state)
static void display_caca_probe(struct device_info **available_cards, int *count, void(**deleter)(void *))
static void * worker(void *arg)
static const void * display_caca_info_get()
static void handle_events(struct state_caca *s, struct video_frame *last_frame)
static bool display_caca_reconfigure(void *state, struct video_desc desc)
static _Bool reconfigure(struct state_caca *s, struct video_desc desc)
static void * display_caca_init(struct module *parent, const char *fmt, unsigned int flags)
int color_printf(const char *format,...)
void log_msg(int level, const char *format,...)
#define LOG_LEVEL_INFO
normal reporting
#define LOG_LEVEL_ERROR
general errors
#define VIDEO_DISPLAY_ABI_VERSION
#define DISPLAY_NO_GENERIC_FPS_INDICATOR
struct video_frame * get_splashscreen()
@ DISPLAY_PROPERTY_CODECS
list of natively supported codecs - codec_t[]
void set_commandline_param(const char *key, const char *val)
@ LIBRARY_CLASS_VIDEO_DISPLAY
#define REGISTER_MODULE_WITH_FUNC(name, func, lclass, abi)
This struct represents initialized video display state.
pthread_cond_t frame_consumed_cv
pthread_cond_t frame_ready_cv
char * data
Raw tile data. Pointer must be at least 4B aligned.
unsigned int width
width of every tile (!)
unsigned int height
height of every tile (!)
const char * generic_fps_indicator_prefix
NO_GENERIC_FPS_INDICATOR or pointer to preferred module name.
Struct video_frame represents a video frame and contains video description.
struct tile tiles[FLEXIBLE_ARRAY_MEMBER]
void ts_add_nsec(struct timespec *ts, long long offset)
int timespec_get(struct timespec *ts, int base)
@ RGB
RGB 8-bit (packed into 24-bit word)
@ RGBA
RGBA 8-bit, big-endian.
This is an umbrella header for video functions.
double get_bpp(codec_t codec)
bool video_desc_eq(struct video_desc a, struct video_desc b)
Compares two video descriptions.