2025-01-26 18:33:45 +01:00

134 lines
2.9 KiB
C

/*
Raydium - CQFD Corp.
http://raydium.org/
License: GPL - GNU General Public License, see "gpl.txt" file.
*/
// Live textures functions
// TODO:
// 4 bpp live textures support
#ifndef LIVE_H
#define LIVE_H
#ifndef WIN32
#include <linux/types.h>
#include <linux/videodev.h>
#include <sys/mman.h>
#endif
#define RAYDIUM_LIVE_DEVICE_DEFAULT "/dev/video0"
#define RAYDIUM_LIVE_SIZEX_DEFAULT 352
#define RAYDIUM_LIVE_SIZEY_DEFAULT 288
#define RAYDIUM_LIVE_DEVICE_AUTO NULL
#define RAYDIUM_LIVE_SIZE_AUTO -1
#define RAYDIUM_LIVE_FREE 0
#define RAYDIUM_LIVE_CAPTURE_NONE -1
#define RAYDIUM_LIVE_CAPTURE_READ 1
#define RAYDIUM_LIVE_CAPTURE_MMAP 2
typedef struct raydium_live_Device
{
#ifndef WIN32
int fd;
struct video_capability cap;
struct video_window win;
struct video_picture vpic;
// for mmap captures
struct video_mbuf gb_buffers;
struct video_mmap gb_buf;
#endif
unsigned char *buffer; // capture buffer
unsigned char *src; // intermediate buffer
unsigned char *buffer2; // final buffer
signed char capture_style;
int frame;
char name[RAYDIUM_MAX_NAME_LEN];
} raydium_live_Device;
typedef struct raydium_live_Texture
{
signed char state;
raydium_live_Device *device;
int texture;
void *OnRefresh;
int tx;
int ty;
int hardware_tx;
int hardware_ty;
int bpp;
unsigned char *data_source;
} raydium_live_Texture;
__global raydium_live_Device raydium_live_device[RAYDIUM_MAX_VIDEO_DEVICES];
__global raydium_live_Texture raydium_live_texture[RAYDIUM_MAX_LIVE_TEXTURES];
// mostly from tvset.c (thanks to vgrabber.c)
#define READ_VIDEO_PIXEL(buf, format, depth, r, g, b) \
{ \
switch (format) \
{ \
case VIDEO_PALETTE_GREY: \
switch (depth) \
{ \
case 4: \
case 6: \
case 8: \
(r) = (g) = (b) = (*buf++ << 8);\
break; \
\
case 16: \
(r) = (g) = (b) = \
*((unsigned short *) buf); \
buf += 2; \
break; \
} \
break; \
\
\
case VIDEO_PALETTE_RGB565: \
{ \
unsigned short tmp = *(unsigned short *)buf; \
(r) = tmp&0xF800; \
(g) = (tmp<<5)&0xFC00; \
(b) = (tmp<<11)&0xF800; \
buf += 2; \
} \
break; \
\
case VIDEO_PALETTE_RGB555: \
(r) = (buf[0]&0xF8)<<8; \
(g) = ((buf[0] << 5 | buf[1] >> 3)&0xF8)<<8; \
(b) = ((buf[1] << 2 ) & 0xF8)<<8; \
buf += 2; \
break; \
\
case VIDEO_PALETTE_RGB24: \
(r) = buf[0] << 8; (g) = buf[1] << 8; \
(b) = buf[2] << 8; \
buf += 3; \
break; \
case VIDEO_PALETTE_YUV420P: \
(r) = buf[0]+1.140*buf[2]; \
(g) = buf[0]-0.394*buf[1]-0.581*buf[2]; \
(b) = buf[0]+2.028*buf[1]; \
buf += 3; \
break; \
\
default: \
raydium_log("live: error: palette unknown"); \
} \
}
// endif LIVE_H
#endif