UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
sage.cpp File Reference
#include "debug.h"
#include "host.h"
#include "lib_common.h"
#include "video.h"
#include "video_display.h"
#include <GL/gl.h>
#include <X11/Xlib.h>
#include <sys/time.h>
#include <assert.h>
#include <semaphore.h>
#include <signal.h>
#include <pthread.h>
#include <sail.h>
#include <misc.h>
#include <tv.h>
#include <video_codec.h>
Include dependency graph for sage.cpp:

Go to the source code of this file.

Classes

struct  state_sage
 

Macros

#define MAGIC_SAGE   0x3e960c47
 

Functions

static void display_sage_done (void *state)
 
static bool display_sage_get_property (void *state, int property, void *val, size_t *len)
 
static struct video_frame * display_sage_getf (void *state)
 
static int display_sage_handle_events (void)
 
static void * display_sage_init (struct module *parent, const char *fmt, unsigned int flags)
 
static void display_sage_probe (struct device_info **available_cards, int *count, void(**deleter)(void *))
 
static void display_sage_put_audio_frame (void *state, const struct audio_frame *frame)
 
static bool display_sage_putf (void *state, struct video_frame *frame, long long nonblock)
 
static bool display_sage_reconfigure (void *state, struct video_desc desc)
 
static bool display_sage_reconfigure_audio (void *state, int quant_samples, int channels, int sample_rate)
 
static void display_sage_run (void *arg)
 
static sail * initSage (const char *confName, const char *fsIP, int appID, int nodeID, int width, int height, codec_t codec)
 
 REGISTER_MODULE (sage, &display_sage_info, LIBRARY_CLASS_VIDEO_DISPLAY, VIDEO_DISPLAY_ABI_VERSION)
 

Variables

static const struct video_display_info display_sage_info
 

Macro Definition Documentation

◆ MAGIC_SAGE

#define MAGIC_SAGE   0x3e960c47

Function Documentation

◆ display_sage_done()

static void display_sage_done ( void * state)
static

Definition at line 302 of file sage.cpp.

303{
304 struct state_sage *s = (struct state_sage *)state;
305
306 assert(s->magic == MAGIC_SAGE);
307
308 pthread_join(s->thread_id, NULL);
309 sem_destroy(&s->semaphore);
310 pthread_cond_destroy(&s->buffer_writable_cond);
311 pthread_mutex_destroy(&s->buffer_writable_lock);
312 vf_free(s->frame);
313 if (s->sage_state)
314 s->sage_state->shutdown();
315 //delete s->sage_state;
316 free(s);
317}
void ** state
void vf_free(struct video_frame *buf)
Frees video_frame structure.
struct video_frame * frame
Definition sage.cpp:82
pthread_cond_t buffer_writable_cond
Definition sage.cpp:92
pthread_mutex_t buffer_writable_lock
Definition sage.cpp:93
sem_t semaphore
Definition sage.cpp:88
sail * sage_state
Definition sage.cpp:99
uint32_t magic
Definition sage.cpp:96
pthread_t thread_id
Definition sage.cpp:87
#define MAGIC_SAGE
Definition sage.cpp:79

References state_sage::buffer_writable_cond, state_sage::buffer_writable_lock, state_sage::frame, state_sage::magic, MAGIC_SAGE, state_sage::sage_state, state_sage::semaphore, state, state_sage::thread_id, and vf_free().

Here is the call graph for this function:

◆ display_sage_get_property()

static bool display_sage_get_property ( void * state,
int property,
void * val,
size_t * len )
static

Definition at line 491 of file sage.cpp.

492{
493 struct state_sage *s = (struct state_sage *)state;
494 UNUSED(state);
496#ifdef SAGE_NATIVE_DXT5YCOCG
497 , DXT5
498#endif // SAGE_NATIVE_DXT5YCOCG
499 };
500 int rgb_shift[] = {0, 8, 16};
501
502 switch (property) {
505 if(sizeof(codec_t) <= *len) {
506 memcpy(val, &s->requestedDisplayCodec, sizeof(codec_t));
507 *len = sizeof(codec_t);
508 } else {
509 return false;
510 }
511 } else {
512 if(sizeof(codecs) <= *len) {
513 memcpy(val, codecs, sizeof(codecs));
514 *len = sizeof(codecs);
515 } else {
516 return false;
517 }
518 }
519 break;
521 if(sizeof(rgb_shift) > *len) {
522 return false;
523 }
524 memcpy(val, rgb_shift, sizeof(rgb_shift));
525 *len = sizeof(rgb_shift);
526 break;
528 *(int *) val = PITCH_DEFAULT;
529 *len = sizeof(int);
530 break;
531 default:
532 return false;
533 }
534 return true;
535}
#define UNUSED(x)
int void * val
int void size_t * len
int property
#define PITCH_DEFAULT
default pitch, i. e. respective linesize
@ DISPLAY_PROPERTY_BUF_PITCH
requested framebuffer pitch - int (bytes), may be PITCH_DEFAULT
@ DISPLAY_PROPERTY_RGB_SHIFT
red,green,blue shift - int[3] (bits)
@ DISPLAY_PROPERTY_CODECS
list of natively supported codecs - codec_t[]
codec_t requestedDisplayCodec
Definition sage.cpp:84
codec_t
Definition types.h:65
@ DXT1
S3 Texture Compression DXT1.
Definition types.h:77
@ RGB
RGB 8-bit (packed into 24-bit word)
Definition types.h:80
@ UYVY
YCbCr 422 8-bit - Cb Y0 Cr Y1.
Definition types.h:71
@ VIDEO_CODEC_NONE
dummy color spec
Definition types.h:66
@ DXT5
S3 Texture Compression DXT5.
Definition types.h:79
@ RGBA
RGBA 8-bit, big-endian.
Definition types.h:70
static struct @76 codecs[]

References codecs, DISPLAY_PROPERTY_BUF_PITCH, DISPLAY_PROPERTY_CODECS, DISPLAY_PROPERTY_RGB_SHIFT, DXT1, DXT5, len, PITCH_DEFAULT, property, state_sage::requestedDisplayCodec, RGB, RGBA, state, UNUSED, UYVY, val, and VIDEO_CODEC_NONE.

◆ display_sage_getf()

static struct video_frame * display_sage_getf ( void * state)
static

Definition at line 319 of file sage.cpp.

320{
321 struct state_sage *s = (struct state_sage *)state;
322
323 assert(s->magic == MAGIC_SAGE);
324
325 pthread_mutex_lock(&s->buffer_writable_lock);
326 while (!s->buffer_writable) {
327 s->grab_waiting = TRUE;
328 pthread_cond_wait(&s->buffer_writable_cond,
330 s->grab_waiting = FALSE;
331 }
332 pthread_mutex_unlock(&s->buffer_writable_lock);
333
334 return s->frame;
335}
#define TRUE
#define FALSE
volatile unsigned int grab_waiting
Definition sage.cpp:91
volatile unsigned int buffer_writable
Definition sage.cpp:90

References state_sage::buffer_writable, state_sage::buffer_writable_cond, state_sage::buffer_writable_lock, FALSE, state_sage::frame, state_sage::grab_waiting, state_sage::magic, MAGIC_SAGE, state, and TRUE.

◆ display_sage_handle_events()

static int display_sage_handle_events ( void )
static

Prototyping

Definition at line 115 of file sage.cpp.

116{
117 return 0;
118}

Referenced by display_sage_run().

◆ display_sage_init()

static void * display_sage_init ( struct module * parent,
const char * fmt,
unsigned int flags )
static

Definition at line 171 of file sage.cpp.

172{
173 UNUSED(fmt);
174 UNUSED(flags);
175 UNUSED(parent);
176 struct state_sage *s;
177
178 s = (struct state_sage *) calloc(1, sizeof(struct state_sage));
179 assert(s != NULL);
180
181 s->confName = NULL;
182
183 if(fmt) {
184 if(strcmp(fmt, "help") == 0) {
185 printf("SAGE usage:\n");
186 printf("\tuv -t sage[:config=<config_file>|:fs=<fsIP>][:codec=<fcc>][:d]\n");
187 printf("\t <config_file> - SAGE app config file, default \"ultragrid.conf\"\n");
188 printf("\t <fsIP> - FS manager IP address\n");
189 printf("\t <fcc> - FourCC of codec that will be used to transmit to SAGE\n");
190 printf("\t Supported options are UYVY, RGBA, RGB or DXT1\n");
191 printf("\t d - deinterlace output\n");
192 return INIT_NOERR;
193 } else {
194 char *tmp, *parse_str;
195 tmp = parse_str = strdup(fmt);
196 char *save_ptr = NULL;
197 char *item;
198
199 while((item = strtok_r(parse_str, ":", &save_ptr))) {
200 parse_str = NULL;
201 if(strncmp(item, "config=", strlen("config=")) == 0) {
202 s->confName = item + strlen("config=");
203 } else if(strncmp(item, "codec=", strlen("codec=")) == 0) {
204 uint32_t fourcc;
205 if(strlen(item + strlen("codec=")) != sizeof(fourcc)) {
206 fprintf(stderr, "Malformed FourCC code (wrong length).\n");
207 free(s); return NULL;
208 }
209 memcpy((void *) &fourcc, item + strlen("codec="), sizeof(fourcc));
212 fprintf(stderr, "Codec not found according to FourCC.\n");
213 free(s); return NULL;
214 }
215 if(s->requestedDisplayCodec != UYVY &&
219#ifdef SAGE_NATIVE_DXT5YCOCG
221#endif // SAGE_NATIVE_DXT5YCOCG
222 ) {
223 fprintf(stderr, "Entered codec is not nativelly supported by SAGE.\n");
224 free(s); return NULL;
225 }
226 } else if(strcmp(item, "tx") == 0) {
227 s->is_tx = true;
228 } else if(strncmp(item, "fs=", strlen("fs=")) == 0) {
229 s->fsIP = item + strlen("fs=");
230 } else if(strcmp(item, "d") == 0) {
231 s->deinterlace = true;
232 } else {
233 fprintf(stderr, "[SAGE] unrecognized configuration: %s\n",
234 item);
235 free(s);
236 return NULL;
237 }
238 }
239 free(tmp);
240 }
241 }
242
243 if (!s->is_tx) {
244 // read config file only if we are in dispaly mode (not sender mode)
245 struct stat sb;
246 if(s->confName) {
247 if(stat(s->confName, &sb)) {
248 perror("Unable to use SAGE config file");
249 free(s);
250 return NULL;
251 }
252 } else if(stat("ultragrid.conf", &sb) == 0) {
253 s->confName = "ultragrid.conf";
254 }
255 if(s->confName) {
256 printf("[SAGE] Using config file %s.\n", s->confName);
257 }
258 }
259
260 if(s->confName == NULL && s->fsIP == NULL) {
261 fprintf(stderr, "[SAGE] Unable to locate FS manager address. "
262 "Set either in config file or from command line.\n");
263 free(s);
264 return NULL;
265 }
266
267 s->magic = MAGIC_SAGE;
268
269 gettimeofday(&s->t0, NULL);
270
271 s->frames = 0;
272 s->frame = vf_alloc(1);
273 s->tile = vf_get_tile(s->frame, 0);
274
275 /* sage init */
276 //FIXME sem se musi propasovat ty spravne parametry argc argv
277 s->appID = 0;
278 s->nodeID = 1;
279
280 s->sage_state = NULL;
281
282 /* thread init */
283 sem_init(&s->semaphore, 0, 0);
284
285 s->buffer_writable = 1;
286 s->grab_waiting = 1;
287 pthread_mutex_init(&s->buffer_writable_lock, 0);
288 pthread_cond_init(&s->buffer_writable_cond, NULL);
289
290 /*if (pthread_create
291 (&(s->thread_id), NULL, display_thread_sage, (void *)s) != 0) {
292 perror("Unable to create display thread\n");
293 return NULL;
294 }*/
295
296 debug_msg("Window initialized %p\n", s);
297
298 pthread_create(&s->thread_id, NULL, display_sage_run, s);
299 return (void *)s;
300}
const char * fmt
const char unsigned int flags
struct video_frame * vf_alloc(int count)
Allocates blank video frame.
#define debug_msg(...)
#define debug_msg(...) log_msg(LOG_LEVEL_DEBUG, "[pid/%d +%d %s] ", getpid(), LINE,...
Definition debug.h:92
#define INIT_NOERR
Definition host.h:73
const char * parent
Definition settings.cpp:198
Definition hd-rum.c:27
int appID
Definition sage.cpp:97
bool is_tx
Definition sage.cpp:108
int nodeID
Definition sage.cpp:97
struct timeval t t0
Definition sage.cpp:105
const char * confName
Definition sage.cpp:101
const char * fsIP
Definition sage.cpp:102
int frames
Definition sage.cpp:104
bool deinterlace
Definition sage.cpp:109
struct tile * tile
Definition sage.cpp:83
codec_t get_codec_from_fcc(uint32_t fourcc)
static void display_sage_run(void *arg)
Definition sage.cpp:120
struct tile * vf_get_tile(struct video_frame *buf, int pos)
Returns pointer to n-th tile from video frame Equivalent to &video_frame::tiles[pos].

References state_sage::appID, state_sage::buffer_writable, state_sage::buffer_writable_cond, state_sage::buffer_writable_lock, state_sage::confName, debug_msg, state_sage::deinterlace, display_sage_run(), DXT1, DXT5, flags, fmt, state_sage::frame, state_sage::frames, state_sage::fsIP, get_codec_from_fcc(), state_sage::grab_waiting, INIT_NOERR, state_sage::is_tx, state_sage::magic, MAGIC_SAGE, state_sage::nodeID, parent, state_sage::requestedDisplayCodec, RGB, RGBA, state_sage::sage_state, state_sage::semaphore, state_sage::t0, state_sage::thread_id, state_sage::tile, UNUSED, UYVY, vf_alloc(), vf_get_tile(), and VIDEO_CODEC_NONE.

Here is the call graph for this function:

◆ display_sage_probe()

static void display_sage_probe ( struct device_info ** available_cards,
int * count,
void(** deleter )(void *) )
static

Definition at line 554 of file sage.cpp.

554 {
556 *count = 1;
557 *available_cards = (struct device_info *) calloc(1, sizeof(struct device_info));
558 strcpy((*available_cards)[0].dev, "");
559 strcpy((*available_cards)[0].name, "SAGE display wall");
560 (*available_cards)[0].repeatable = true;
561}
int void(** deleter)(void *))
int count
Definition hd-rum.c:44
const char * name
Definition settings.cpp:193
char dev[1024]
Definition types.h:383

References count, deleter, device_info::dev, name, and UNUSED.

◆ display_sage_put_audio_frame()

static void display_sage_put_audio_frame ( void * state,
const struct audio_frame * frame )
static

Definition at line 537 of file sage.cpp.

538{
539 UNUSED(state);
540 UNUSED(frame);
541}
struct video_frame * frame

References frame, state, and UNUSED.

◆ display_sage_putf()

static bool display_sage_putf ( void * state,
struct video_frame * frame,
long long nonblock )
static

Definition at line 337 of file sage.cpp.

338{
339 int tmp;
340 struct state_sage *s = (struct state_sage *)state;
341
342 assert(s->magic == MAGIC_SAGE);
343 UNUSED(frame);
345
346 if(!frame) {
347 s->should_exit = true;
348 }
349
350 /* ...and signal the worker */
351 pthread_mutex_lock(&s->buffer_writable_lock);
352 s->buffer_writable = 0;
353 pthread_mutex_unlock(&s->buffer_writable_lock);
354
355 sem_post(&s->semaphore);
356#ifndef __APPLE__
357 sem_getvalue(&s->semaphore, &tmp);
358 if (tmp > 1)
359 printf("frame drop!\n");
360#endif
361 return true;
362}
struct video_frame long long nonblock
volatile bool should_exit
Definition sage.cpp:107

References state_sage::buffer_writable, state_sage::buffer_writable_lock, frame, state_sage::magic, MAGIC_SAGE, nonblock, state_sage::semaphore, state_sage::should_exit, state, and UNUSED.

◆ display_sage_reconfigure()

static bool display_sage_reconfigure ( void * state,
struct video_desc desc )
static

Definition at line 447 of file sage.cpp.

448{
449 struct state_sage *s = (struct state_sage *)state;
450
451 assert(s->magic == MAGIC_SAGE);
452 assert(desc.color_spec == RGBA || desc.color_spec == RGB || desc.color_spec == UYVY ||
454#ifdef SAGE_NATIVE_DXT5YCOCG
455 || desc.color_spec == DXT5
456#endif // SAGE_NATIVE_DXT5YCOCG
457 );
458
459 s->tile->width = desc.width;
460 s->tile->height = desc.height;
461 s->frame->fps = desc.fps;
464
465 // SAGE fix - SAGE threads apparently do not process signals correctly so we temporarily
466 // block all signals while creating SAGE
467 sigset_t mask, old_mask;
468 sigemptyset(&mask);
469 sigaddset(&mask, SIGINT);
470 sigaddset(&mask, SIGTERM);
471 sigaddset(&mask, SIGHUP);
472 pthread_sigmask(SIG_BLOCK, &mask, &old_mask);
473
474 if(s->sage_state) {
475 s->sage_state->shutdown();
476 //delete s->sage_state; // this used to cause crashes
477 }
478
479 s->sage_state = initSage(s->confName, s->fsIP, s->appID, s->nodeID,
480 s->tile->width, s->tile->height, desc.color_spec);
481
482 // calling thread should be able to process signals afterwards
483 pthread_sigmask(SIG_UNBLOCK, &old_mask, NULL);
484
485 s->tile->data = (char *) s->sage_state->getBuffer();
487
488 return true;
489}
struct video_desc desc
int vc_get_linesize(unsigned int width, codec_t codec)
unsigned int width
Definition types.h:280
char * data
Raw tile data. Pointer must be at least 4B aligned.
Definition types.h:287
unsigned int data_len
length of the data
Definition types.h:288
unsigned int height
Definition types.h:281
codec_t color_spec
Definition types.h:182
enum interlacing_t interlacing
Definition types.h:184
double fps
Definition types.h:183
unsigned int width
width of every tile (!)
Definition types.h:179
unsigned int height
height of every tile (!)
Definition types.h:180
enum interlacing_t interlacing
Definition types.h:307
double fps
Definition types.h:308
codec_t color_spec
Definition types.h:306
static sail * initSage(const char *confName, const char *fsIP, int appID, int nodeID, int width, int height, codec_t codec)
Definition sage.cpp:367

References state_sage::appID, video_desc::color_spec, video_frame::color_spec, state_sage::confName, tile::data, tile::data_len, desc, DXT1, DXT5, video_desc::fps, video_frame::fps, state_sage::frame, state_sage::fsIP, tile::height, video_desc::height, initSage(), video_desc::interlacing, video_frame::interlacing, state_sage::magic, MAGIC_SAGE, state_sage::nodeID, RGB, RGBA, state_sage::sage_state, state, state_sage::tile, UYVY, vc_get_linesize(), tile::width, and video_desc::width.

Here is the call graph for this function:

◆ display_sage_reconfigure_audio()

static bool display_sage_reconfigure_audio ( void * state,
int quant_samples,
int channels,
int sample_rate )
static

Definition at line 543 of file sage.cpp.

545{
546 UNUSED(state);
550
551 return false;
552}
int int int sample_rate
int int channels
int quant_samples

References channels, quant_samples, sample_rate, state, and UNUSED.

◆ display_sage_run()

static void display_sage_run ( void * arg)
static

Definition at line 120 of file sage.cpp.

121{
122 struct state_sage *s = (struct state_sage *)arg;
123 s->magic = MAGIC_SAGE;
124
125 while (!s->should_exit) {
127
128 sem_wait(&s->semaphore);
129 if (s->should_exit)
130 break;
131
132 if (s->deinterlace) {
133 vc_deinterlace((unsigned char *) s->tile->data, vc_get_linesize(s->tile->width,
134 s->frame->color_spec), s->tile->height);
135 }
136
137 s->sage_state->swapBuffer(SAGE_NON_BLOCKING);
138 sageMessage msg;
139 if (s->sage_state->checkMsg(msg, false) > 0) {
140 switch (msg.getCode()) {
141 case APP_QUIT:
142 sage::printLog("Ultragrid: QUIT message");
143 exit_uv(1);
144 break;
145 }
146 }
147
148 s->tile->data = (char *) s->sage_state->getBuffer();
149
150 pthread_mutex_lock(&s->buffer_writable_lock);
151 s->buffer_writable = 1;
152 if(s->grab_waiting) {
153 pthread_cond_broadcast(&s->buffer_writable_cond);
154 }
155 pthread_mutex_unlock(&s->buffer_writable_lock);
156
157 s->frames++;
158
159 gettimeofday(&s->t, NULL);
160 double seconds = tv_diff(s->t, s->t0);
161 if (seconds >= 5) {
162 float fps = s->frames / seconds;
163 log_msg(LOG_LEVEL_INFO, "[SAGE] %d frames in %g seconds = %g FPS\n",
164 s->frames, seconds, fps);
165 s->t0 = s->t;
166 s->frames = 0;
167 }
168 }
169}
void log_msg(int level, const char *format,...)
Definition debug.cpp:130
#define LOG_LEVEL_INFO
normal reporting
Definition debug.h:62
void exit_uv(int status)
Definition host.cpp:625
struct msghdr msg
double tv_diff(struct timeval curr_time, struct timeval prev_time)
Definition tv.c:97
void vc_deinterlace(unsigned char *src, long src_linesize, int lines)
Deinterlaces framebuffer.
static int display_sage_handle_events(void)
Definition sage.cpp:115

References state_sage::buffer_writable, state_sage::buffer_writable_cond, state_sage::buffer_writable_lock, video_frame::color_spec, tile::data, state_sage::deinterlace, display_sage_handle_events(), exit_uv(), state_sage::frame, state_sage::frames, state_sage::grab_waiting, tile::height, LOG_LEVEL_INFO, log_msg(), state_sage::magic, MAGIC_SAGE, msg, state_sage::sage_state, state_sage::semaphore, state_sage::should_exit, state_sage::t0, state_sage::tile, tv_diff(), vc_deinterlace(), vc_get_linesize(), and tile::width.

Referenced by display_sage_init().

Here is the call graph for this function:

◆ initSage()

static sail * initSage ( const char * confName,
const char * fsIP,
int appID,
int nodeID,
int width,
int height,
codec_t codec )
static

Definition at line 367 of file sage.cpp.

369{
370 sail *sageInf; // sage sail object
371
372 sageInf = new sail;
373 sailConfig sailCfg;
374
375 // default values
376 if(fsIP) {
377 strncpy(sailCfg.fsIP, fsIP, SAGE_IP_LEN - 1);
378 }
379 sailCfg.fsPort = 20002;
380 strncpy(sailCfg.masterIP, "127.0.0.1", SAGE_IP_LEN - 1);
381 sailCfg.nwID = 1;
382 sailCfg.msgPort = 23010;
383 sailCfg.syncPort = 13010;
384 sailCfg.blockSize = 64;
385 sailCfg.winX = sailCfg.winY = 0;
386 sailCfg.winWidth = width;
387 sailCfg.winHeight = height;
388 sailCfg.streamType = SAGE_BLOCK_NO_SYNC;
389 sailCfg.protocol = SAGE_UDP;
390 sailCfg.asyncUpdate = false;
391
392 if(confName) {
393 sailCfg.init((char *) confName);
394 }
395 char appName[] = "ultragrid";
396 sailCfg.setAppName(appName);
397 sailCfg.rank = nodeID;
398 sailCfg.appID = appID;
399 sailCfg.resX = width;
400 sailCfg.resY = height;
401
402 sageRect renderImageMap;
403 renderImageMap.left = 0.0;
404 renderImageMap.right = 1.0;
405 renderImageMap.bottom = 0.0;
406 renderImageMap.top = 1.0;
407
408 sailCfg.imageMap = renderImageMap;
409 switch (codec) {
410 case DXT1:
411 sailCfg.pixFmt = PIXFMT_DXT;
412 break;
413#ifdef SAGE_NATIVE_DXT5YCOCG
414 case DXT5:
415 sailCfg.pixFmt = PIXFMT_DXT5YCOCG
416 break;
417#endif // SAGE_NATIVE_DXT5YCOCG
418 case RGBA:
419 sailCfg.pixFmt = PIXFMT_8888;
420 break;
421 case UYVY:
422 sailCfg.pixFmt = PIXFMT_YUV;
423 break;
424 case RGB:
425 sailCfg.pixFmt = PIXFMT_888;
426 break;
427 default:
428 abort();
429 }
430
431 if(codec == DXT1) {
432 sailCfg.rowOrd = BOTTOM_TO_TOP;
433#ifdef SAGE_NATIVE_DXT5YCOCG
434 } else if(codec == DXT5) {
435 sailCfg.rowOrd = BOTTOM_TO_TOP;
436#endif // SAGE_NATIVE_DXT5YCOCG
437 } else {
438 sailCfg.rowOrd = TOP_TO_BOTTOM;
439 }
440 sailCfg.master = true;
441
442 sageInf->init(sailCfg);
443
444 return sageInf;
445}

References state_sage::appID, state_sage::confName, DXT1, DXT5, state_sage::fsIP, state_sage::nodeID, RGB, RGBA, and UYVY.

Referenced by display_sage_reconfigure().

◆ REGISTER_MODULE()

REGISTER_MODULE ( sage ,
& display_sage_info,
LIBRARY_CLASS_VIDEO_DISPLAY ,
VIDEO_DISPLAY_ABI_VERSION  )

Variable Documentation

◆ display_sage_info

const struct video_display_info display_sage_info
static
Initial value:
= {
NULL,
}
#define DISPLAY_NO_GENERIC_FPS_INDICATOR
static struct video_frame * display_sage_getf(void *state)
Definition sage.cpp:319
static void display_sage_probe(struct device_info **available_cards, int *count, void(**deleter)(void *))
Definition sage.cpp:554
static void display_sage_put_audio_frame(void *state, const struct audio_frame *frame)
Definition sage.cpp:537
static void * display_sage_init(struct module *parent, const char *fmt, unsigned int flags)
Definition sage.cpp:171
static void display_sage_done(void *state)
Definition sage.cpp:302
static bool display_sage_reconfigure(void *state, struct video_desc desc)
Definition sage.cpp:447
static bool display_sage_putf(void *state, struct video_frame *frame, long long nonblock)
Definition sage.cpp:337
static bool display_sage_reconfigure_audio(void *state, int quant_samples, int channels, int sample_rate)
Definition sage.cpp:543
static bool display_sage_get_property(void *state, int property, void *val, size_t *len)
Definition sage.cpp:491

Definition at line 563 of file sage.cpp.