2001-12-27 23:52:48 +00:00
|
|
|
#include <stdlib.h> /* malloc */
|
2002-11-06 23:54:29 +00:00
|
|
|
#include <string.h> /* memset */
|
2001-12-27 23:52:48 +00:00
|
|
|
|
|
|
|
static int init(priv_t *priv);
|
2001-11-10 23:32:10 +00:00
|
|
|
static int uninit(priv_t *priv);
|
2001-11-09 23:46:06 +00:00
|
|
|
static int control(priv_t *priv, int cmd, void *arg);
|
2001-11-10 23:32:10 +00:00
|
|
|
static int start(priv_t *priv);
|
2002-04-12 10:40:38 +00:00
|
|
|
static double grab_video_frame(priv_t *priv, char *buffer, int len);
|
2001-11-09 23:46:06 +00:00
|
|
|
static int get_video_framesize(priv_t *priv);
|
2002-04-12 10:40:38 +00:00
|
|
|
static double grab_audio_frame(priv_t *priv, char *buffer, int len);
|
2001-11-09 23:46:06 +00:00
|
|
|
static int get_audio_framesize(priv_t *priv);
|
|
|
|
|
|
|
|
static tvi_functions_t functions =
|
|
|
|
{
|
|
|
|
init,
|
2001-11-10 23:32:10 +00:00
|
|
|
uninit,
|
2001-11-09 23:46:06 +00:00
|
|
|
control,
|
2001-11-10 23:32:10 +00:00
|
|
|
start,
|
2001-11-09 23:46:06 +00:00
|
|
|
grab_video_frame,
|
|
|
|
get_video_framesize,
|
|
|
|
grab_audio_frame,
|
|
|
|
get_audio_framesize
|
|
|
|
};
|
|
|
|
|
2006-02-09 14:08:03 +00:00
|
|
|
static tvi_handle_t *new_handle(void)
|
2001-11-09 23:46:06 +00:00
|
|
|
{
|
2001-11-11 03:53:42 +00:00
|
|
|
tvi_handle_t *h = (tvi_handle_t *)malloc(sizeof(tvi_handle_t));
|
2001-11-09 23:46:06 +00:00
|
|
|
|
|
|
|
if (!h)
|
|
|
|
return(NULL);
|
2001-11-10 23:32:10 +00:00
|
|
|
h->priv = (priv_t *)malloc(sizeof(priv_t));
|
2001-11-09 23:46:06 +00:00
|
|
|
if (!h->priv)
|
|
|
|
{
|
|
|
|
free(h);
|
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
memset(h->priv, 0, sizeof(priv_t));
|
|
|
|
h->functions = &functions;
|
2001-11-10 23:32:10 +00:00
|
|
|
h->seq = 0;
|
2001-11-17 00:23:48 +00:00
|
|
|
h->chanlist = -1;
|
|
|
|
h->chanlist_s = NULL;
|
|
|
|
h->norm = -1;
|
|
|
|
h->channel = -1;
|
2001-11-09 23:46:06 +00:00
|
|
|
return(h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void free_handle(tvi_handle_t *h)
|
|
|
|
{
|
2001-12-19 12:54:06 +00:00
|
|
|
if (h) {
|
|
|
|
if (h->priv)
|
|
|
|
free(h->priv);
|
2001-11-09 23:46:06 +00:00
|
|
|
free(h);
|
2001-12-19 12:54:06 +00:00
|
|
|
}
|
2001-11-09 23:46:06 +00:00
|
|
|
}
|
2007-05-31 17:49:51 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
Fills video frame in given buffer with blue color for yv12,i420,uyvy,yuy2.
|
|
|
|
Other formats will be filled with 0xC0
|
|
|
|
*/
|
|
|
|
static inline void fill_blank_frame(char* buffer,int len,int fmt){
|
|
|
|
int i;
|
|
|
|
|
|
|
|
switch(fmt){
|
|
|
|
case IMGFMT_YV12:
|
|
|
|
memset(buffer, 0xFF,5*len/6);
|
|
|
|
memset(buffer+5*len/6, 0xFF,len/6);
|
|
|
|
break;
|
|
|
|
case IMGFMT_I420:
|
|
|
|
memset(buffer, 0xFF,4*len/6);
|
|
|
|
memset(buffer+4*len/6, 0xFF,len/6);
|
|
|
|
memset(buffer+5*len/6, 0xFF,len/6);
|
|
|
|
break;
|
|
|
|
case IMGFMT_UYVY:
|
|
|
|
for(i=0;i<len;i+=4){
|
|
|
|
buffer[i]=0xFF;
|
|
|
|
buffer[i+1]=0;
|
|
|
|
buffer[i+2]=0;
|
|
|
|
buffer[i+3]=0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case IMGFMT_YUY2:
|
|
|
|
for(i=0;i<len;i+=4){
|
|
|
|
buffer[i]=0;
|
|
|
|
buffer[i+1]=0xFF;
|
|
|
|
buffer[i+2]=0;
|
|
|
|
buffer[i+3]=0;
|
|
|
|
}
|
|
|
|
break;
|
2007-06-01 17:29:35 +00:00
|
|
|
case IMGFMT_MJPEG:
|
|
|
|
/*
|
|
|
|
This is compressed format. I don't know yet how to fill such frame with blue color.
|
|
|
|
Keeping frame unchanged.
|
|
|
|
*/
|
|
|
|
break;
|
2007-05-31 17:49:51 +00:00
|
|
|
default:
|
|
|
|
memset(buffer,0xC0,len);
|
|
|
|
}
|
|
|
|
}
|