mirror of
https://github.com/game-stop/veejay.git
synced 2026-01-06 15:05:28 +01:00
Some bugfixes, Added color stream (removed all solid color tags)
git-svn-id: svn://code.dyne.org/veejay/trunk@277 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
This commit is contained in:
@@ -21,7 +21,11 @@
|
||||
this is one of veejay's most important components.
|
||||
and it needs to be refactorized
|
||||
(vj-v4lvideo, vj-avcodec, vj-avformat, vj-yuv4mpeg, vj-rgb)
|
||||
|
||||
|
||||
TODO:(2005)
|
||||
refactor this pile of junk (merge with libsample),
|
||||
|
||||
|
||||
*/
|
||||
#include <config.h>
|
||||
#include <string.h>
|
||||
@@ -61,7 +65,6 @@ static int last_added_tag = 0;
|
||||
|
||||
//forward decl
|
||||
|
||||
|
||||
int _vj_tag_new_net(vj_tag *tag, int stream_nr, int w, int h,int f, char *host, int port, int p );
|
||||
int _vj_tag_new_avformat( vj_tag *tag, int stream_nr, editlist *el);
|
||||
int _vj_tag_new_yuv4mpeg(vj_tag * tag, int stream_nr, editlist * el);
|
||||
@@ -363,6 +366,25 @@ int _vj_tag_new_dv1394(vj_tag *tag, int stream_nr, int channel,int quality, edit
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int vj_tag_set_stream_color(int t1, int r, int g, int b)
|
||||
{
|
||||
vj_tag *tag = vj_tag_get(t1);
|
||||
if(!tag)
|
||||
return 0;
|
||||
if(tag->source_type != VJ_TAG_TYPE_COLOR)
|
||||
return 0;
|
||||
|
||||
veejay_msg(VEEJAY_MSG_DEBUG,"Set stream %d color %d,%d,%d",t1,
|
||||
r,g, b );
|
||||
|
||||
tag->color_r = r;
|
||||
tag->color_g = g;
|
||||
tag->color_b = b;
|
||||
|
||||
return (vj_tag_update(tag,t1));
|
||||
}
|
||||
|
||||
// for network, filename /channel is passed as host/port num
|
||||
int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
int pix_fmt, int channel )
|
||||
@@ -383,12 +405,15 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
}
|
||||
n = this_tag_id;
|
||||
/* see if we are already using the source */
|
||||
for (i = 1; i < n; i++)
|
||||
{
|
||||
if (vj_tag_exists(i))
|
||||
if( type == VJ_TAG_TYPE_NET || type == VJ_TAG_TYPE_MCAST )
|
||||
{
|
||||
for (i = 1; i < n; i++)
|
||||
{
|
||||
if (vj_tag_exists(i) )
|
||||
{
|
||||
vj_tag_get_source_name(i, sourcename);
|
||||
if (strcmp(sourcename, filename) == 0) {
|
||||
if (strcmp(sourcename, filename) == 0)
|
||||
{
|
||||
vj_tag *tt = vj_tag_get( i );
|
||||
if( tt->source_type == VJ_TAG_TYPE_NET || tt->source_type == VJ_TAG_TYPE_MCAST )
|
||||
{
|
||||
@@ -399,23 +424,18 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
veejay_msg(VEEJAY_MSG_WARNING,
|
||||
"Stream [%d] is already owner of file [%s]\n", n,
|
||||
filename);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tag = (vj_tag *) vj_malloc(sizeof(vj_tag));
|
||||
if(!tag)
|
||||
return -1;
|
||||
|
||||
tag->source_name = (char *) malloc(sizeof(char) * 255);
|
||||
if (!tag->source_name)
|
||||
return -1;
|
||||
|
||||
bzero(tag->source_name, 255 );
|
||||
|
||||
/* see if we can reclaim some id */
|
||||
for(i=0; i <= next_avail_tag; i++) {
|
||||
@@ -459,9 +479,6 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
tag->rec_total_bytes = 0;
|
||||
tag->encoder_total_frames = 0;
|
||||
tag->source = 0;
|
||||
tag->freeze_mode = 0;
|
||||
tag->freeze_nframes = 0;
|
||||
tag->freeze_pframes = 0;
|
||||
tag->fader_active = 0;
|
||||
tag->fader_val = 0.0;
|
||||
tag->fader_inc = 0.0;
|
||||
@@ -471,9 +488,13 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
tag->effect_toggle = 1; /* same as for clips */
|
||||
tag->socket_ready = 0;
|
||||
tag->socket_frame = NULL;
|
||||
|
||||
tag->color_r = 0;
|
||||
tag->color_g = 0;
|
||||
tag->color_b = 0;
|
||||
tag->opacity = 0;
|
||||
palette = (pix_fmt == FMT_420 ? VIDEO_PALETTE_YUV420P : VIDEO_PALETTE_YUV422P);
|
||||
|
||||
|
||||
switch (type) {
|
||||
#ifdef HAVE_V4L
|
||||
case VJ_TAG_TYPE_V4L:
|
||||
@@ -491,8 +512,8 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
return -1;
|
||||
tag->active = 0;
|
||||
break;
|
||||
#ifdef SUPPORT_READ_DV2
|
||||
case VJ_TAG_TYPE_DV1394:
|
||||
#ifdef SUPPORT_READ_DV2
|
||||
sprintf(tag->source_name, "/dev/dv1394");
|
||||
if( _vj_tag_new_dv1394( tag, stream_nr,channel,1,el ) == 0 )
|
||||
{
|
||||
@@ -501,6 +522,9 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
}
|
||||
tag->active = 1;
|
||||
break;
|
||||
#else
|
||||
veejay_msg(VEEJAY_MSG_DEBUG, "libdv not enabled at compile time");
|
||||
return -1;
|
||||
#endif
|
||||
case VJ_TAG_TYPE_AVFORMAT:
|
||||
sprintf(tag->source_name, "%s", filename);
|
||||
@@ -522,18 +546,28 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
sprintf(tag->source_name, "%s", "SHM");
|
||||
veejay_msg(VEEJAY_MSG_INFO, "Opened SHM as Stream");
|
||||
break;
|
||||
/*
|
||||
case VJ_TAG_TYPE_WHITE:
|
||||
case VJ_TAG_TYPE_BLACK:
|
||||
case VJ_TAG_TYPE_RED:
|
||||
case VJ_TAG_TYPE_GREEN:
|
||||
case VJ_TAG_TYPE_YELLOW:
|
||||
case VJ_TAG_TYPE_BLUE:
|
||||
vj_tag_get_description(type,tag->source_name);
|
||||
*/
|
||||
case VJ_TAG_TYPE_COLOR:
|
||||
sprintf(tag->source_name, "solid-[%d,%d,%d]",
|
||||
tag->color_r,tag->color_g,tag->color_b );
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
sprintf( tag->descr, "%s", tag->source_name );
|
||||
|
||||
|
||||
/* effect chain is empty */
|
||||
for (i = 0; i < CLIP_MAX_EFFECTS; i++)
|
||||
{
|
||||
@@ -558,7 +592,7 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el,
|
||||
last_added_tag = tag->id;
|
||||
|
||||
|
||||
return 1;
|
||||
return (int)(tag->id);
|
||||
}
|
||||
|
||||
|
||||
@@ -638,20 +672,20 @@ int vj_tag_del(int id)
|
||||
}
|
||||
|
||||
tag_node = hash_lookup(TagHash, (void *) tag->id);
|
||||
if(tag_node) {
|
||||
for (i = 0; i < CLIP_MAX_EFFECTS; i++) {
|
||||
if (tag->effect_chain[i])
|
||||
free(tag->effect_chain[i]);
|
||||
}
|
||||
if(tag->source_name) free(tag->source_name);
|
||||
if(tag->encoder_active)
|
||||
if(tag_node)
|
||||
{
|
||||
if(tag->encoder_active)
|
||||
vj_tag_stop_encoder( tag->id );
|
||||
}
|
||||
if(tag) free(tag);
|
||||
avail_tag[ next_avail_tag] = id;
|
||||
next_avail_tag++;
|
||||
hash_delete(TagHash, tag_node);
|
||||
if(tag->source_name) free(tag->source_name);
|
||||
|
||||
for (i = 0; i < CLIP_MAX_EFFECTS; i++)
|
||||
if (tag->effect_chain[i])
|
||||
free(tag->effect_chain[i]);
|
||||
|
||||
if(tag) free(tag);
|
||||
avail_tag[ next_avail_tag] = id;
|
||||
next_avail_tag++;
|
||||
hash_delete(TagHash, tag_node);
|
||||
return 1;
|
||||
}
|
||||
return -1;
|
||||
@@ -690,6 +724,26 @@ float vj_tag_get_fader_val(int t1) {
|
||||
return ( tag->fader_val );
|
||||
}
|
||||
|
||||
|
||||
int vj_tag_set_description(int t1, char *description)
|
||||
{
|
||||
vj_tag *tag = vj_tag_get(t1);
|
||||
if(!tag) return 0;
|
||||
if(!description || strlen(description) <= 0 )
|
||||
snprintf( tag->descr, TAG_MAX_DESCR_LEN, "%s","Untitled");
|
||||
else
|
||||
snprintf( tag->descr, TAG_MAX_DESCR_LEN, "%s", description );
|
||||
return ( vj_tag_update(tag, t1)) ;
|
||||
}
|
||||
|
||||
int vj_tag_get_description( int t1, char *description )
|
||||
{
|
||||
vj_tag *tag = vj_tag_get(t1);
|
||||
if(!tag) return 0;
|
||||
snprintf( description ,TAG_MAX_DESCR_LEN, "%s", tag->descr );
|
||||
return 1;
|
||||
}
|
||||
|
||||
int vj_tag_set_manual_fader(int t1, int value )
|
||||
{
|
||||
vj_tag *tag = vj_tag_get(t1);
|
||||
@@ -1040,6 +1094,30 @@ int vj_tag_set_brightness(int t1, int value)
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int vj_tag_set_white(int t1, int value)
|
||||
{
|
||||
vj_tag *tag = vj_tag_get(t1);
|
||||
|
||||
if(!tag) return -1;
|
||||
if(tag->source_type!=VJ_TAG_TYPE_V4L)
|
||||
{
|
||||
veejay_msg(VEEJAY_MSG_ERROR,"Brightness adjustment only for v4l devices");
|
||||
return -1;
|
||||
}
|
||||
if(value < 0 || value > 65535)
|
||||
{
|
||||
veejay_msg(VEEJAY_MSG_ERROR,"Brightness valid range is 0 - 65535");
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
v4l_video *v4l = vj_tag_input->v4l[tag->index];
|
||||
v4lsetpicture( v4l->device, -1,-1,-1,-1,value );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int vj_tag_set_hue(int t1, int value)
|
||||
{
|
||||
vj_tag *tag = vj_tag_get(t1);
|
||||
@@ -1107,6 +1185,34 @@ int vj_tag_set_color(int t1, int value)
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int vj_tag_get_v4l_properties(int t1,
|
||||
int *brightness, int *hue,int *contrast, int *color, int *white )
|
||||
{
|
||||
vj_tag *tag = vj_tag_get(t1);
|
||||
if(!tag) return -1;
|
||||
if(tag->source_type!=VJ_TAG_TYPE_V4L)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
v4l_video *v4l = vj_tag_input->v4l[tag->index];
|
||||
v4ldevice *vd = v4l->device;
|
||||
|
||||
int err = v4lgetpicture( vd );
|
||||
if(err == 0 )
|
||||
{
|
||||
*brightness = vd->picture.brightness;
|
||||
*hue = vd->picture.hue;
|
||||
*contrast = vd->picture.contrast;
|
||||
*white = vd->picture.whiteness;
|
||||
*color = vd->picture.colour;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int vj_tag_get_effect_any(int t1, int position) {
|
||||
@@ -1612,32 +1718,17 @@ void vj_tag_get_source_name(int t1, char *dst)
|
||||
sprintf(dst, "error in tag %d", t1);
|
||||
}
|
||||
}
|
||||
|
||||
void vj_tag_get_description(int id, char *description)
|
||||
#include <valgrind/memcheck.h>
|
||||
void vj_tag_get_descriptive(int id, char *description)
|
||||
{
|
||||
vj_tag *tag = vj_tag_get(id);
|
||||
int type ;
|
||||
if(!tag) {sprintf(description, "invalid");return;}
|
||||
|
||||
type = tag->source_type;
|
||||
int type = tag->source_type;
|
||||
switch (type) {
|
||||
case VJ_TAG_TYPE_WHITE:
|
||||
sprintf(description,"%s", "Solid_White");
|
||||
break;
|
||||
case VJ_TAG_TYPE_BLACK:
|
||||
sprintf(description,"%s", "Solid_Black");
|
||||
break;
|
||||
case VJ_TAG_TYPE_RED:
|
||||
sprintf(description,"%s", "Solid_Red");
|
||||
break;
|
||||
case VJ_TAG_TYPE_BLUE:
|
||||
sprintf(description, "%s", "Solid_Blue");
|
||||
break;
|
||||
case VJ_TAG_TYPE_YELLOW:
|
||||
sprintf(description, "%s", "Solid_Yellow");
|
||||
break;
|
||||
case VJ_TAG_TYPE_GREEN:
|
||||
sprintf(description, "%s", "Solid_Green");
|
||||
case VJ_TAG_TYPE_COLOR:
|
||||
sprintf(description, "Solid {R=%d,G=%d,B=%d}",
|
||||
tag->color_r,tag->color_g,tag->color_b);
|
||||
break;
|
||||
case VJ_TAG_TYPE_NONE:
|
||||
sprintf(description, "%s", "EditList");
|
||||
@@ -1807,8 +1898,9 @@ int vj_tag_get_audio_frame(int t1, uint8_t *dst_buffer)
|
||||
vj_dv_decoder_get_audio( vj_tag_input->dv1394[tag->index], dst_buffer );
|
||||
}
|
||||
#endif
|
||||
if(tag->source_type != VJ_TAG_TYPE_AVFORMAT) return 0;
|
||||
return (vj_avformat_get_audio( vj_tag_input->avformat[tag->index], dst_buffer, -1 ));
|
||||
if(tag->source_type == VJ_TAG_TYPE_AVFORMAT)
|
||||
return (vj_avformat_get_audio( vj_tag_input->avformat[tag->index], dst_buffer, -1 ));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1822,15 +1914,13 @@ int vj_tag_get_frame(int t1, uint8_t *buffer[3], uint8_t * abuffer)
|
||||
int height = vj_tag_input->height;
|
||||
int uv_len = (vj_tag_input->width * vj_tag_input->height);
|
||||
int len = (width * height);
|
||||
char buf[10];
|
||||
char buf[10];
|
||||
|
||||
if(!tag) return -1;
|
||||
|
||||
if( vj_tag_input->pix_fmt == FMT_420) uv_len = uv_len / 4;
|
||||
if( vj_tag_input->pix_fmt == FMT_422) uv_len = uv_len / 2;
|
||||
|
||||
if (!tag)
|
||||
{
|
||||
veejay_msg(VEEJAY_MSG_ERROR,"Stream %d doesnt exist!!!",t1);
|
||||
return -1;
|
||||
}
|
||||
switch (tag->source_type) {
|
||||
#ifdef HAVE_V4L
|
||||
case VJ_TAG_TYPE_V4L:
|
||||
@@ -1838,12 +1928,12 @@ int vj_tag_get_frame(int t1, uint8_t *buffer[3], uint8_t * abuffer)
|
||||
{
|
||||
if(!vj_v4l_video_grab_start( vj_tag_input->v4l[tag->index])!=0)
|
||||
{
|
||||
veejay_msg(VEEJAY_MSG_ERROR, "Error syncing frame from v4l");
|
||||
memset( buffer[0], 16, len );
|
||||
memset( buffer[1], 128, uv_len);
|
||||
memset( buffer[2], 128, uv_len);
|
||||
return 1;
|
||||
}
|
||||
veejay_msg(VEEJAY_MSG_ERROR, "Error syncing frame from v4l");
|
||||
memset( buffer[0], 16, len );
|
||||
memset( buffer[1], 128, uv_len);
|
||||
memset( buffer[2], 128, uv_len);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*todo: pointer to colorspace converter function */
|
||||
address = vj_v4l_video_get_address(vj_tag_input->v4l[tag->index]);
|
||||
@@ -1927,29 +2017,21 @@ int vj_tag_get_frame(int t1, uint8_t *buffer[3], uint8_t * abuffer)
|
||||
consume( _tag_info->client, buffer, width * height );
|
||||
return 1;
|
||||
break;
|
||||
break;
|
||||
case VJ_TAG_TYPE_RED: dummy_color = VJ_EFFECT_COLOR_RED; break;
|
||||
case VJ_TAG_TYPE_WHITE: dummy_color = VJ_EFFECT_COLOR_WHITE; break;
|
||||
case VJ_TAG_TYPE_BLACK: dummy_color = VJ_EFFECT_COLOR_BLACK; break;
|
||||
case VJ_TAG_TYPE_YELLOW: dummy_color =VJ_EFFECT_COLOR_YELLOW; break;
|
||||
case VJ_TAG_TYPE_BLUE: dummy_color = VJ_EFFECT_COLOR_BLUE; break;
|
||||
case VJ_TAG_TYPE_GREEN: dummy_color =VJ_EFFECT_COLOR_GREEN; break;
|
||||
|
||||
case VJ_TAG_TYPE_NONE:
|
||||
/* clip */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if(dummy_color >=0)
|
||||
{
|
||||
_tmp->len = len;
|
||||
_tmp->uv_len = uv_len;
|
||||
case VJ_TAG_TYPE_COLOR:
|
||||
_tmp->len = len;
|
||||
_tmp->uv_len = uv_len;
|
||||
_tmp->data[0] = buffer[0];
|
||||
_tmp->data[1] = buffer[1];
|
||||
_tmp->data[2] = buffer[2];
|
||||
dummy_apply( _tmp, width, height, dummy_color );
|
||||
}
|
||||
|
||||
dummy_rgb_apply( _tmp, width, height,
|
||||
tag->color_r,tag->color_g,tag->color_b );
|
||||
break;
|
||||
case VJ_TAG_TYPE_NONE:
|
||||
/* clip */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
@@ -2000,9 +2082,9 @@ int vj_tag_sprint_status( int tag_id, int pfps,int frame, int mode, char *str )
|
||||
mode,
|
||||
tag_id,
|
||||
tag->effect_toggle,
|
||||
0, // no start,
|
||||
0, // no end,
|
||||
0, // no speed,
|
||||
tag->color_r, // no start, but color
|
||||
tag->color_g, // no end,
|
||||
tag->color_b, // no speed,
|
||||
0, // no looping
|
||||
tag->encoder_active,
|
||||
tag->encoder_duration,
|
||||
|
||||
Reference in New Issue
Block a user