//*** Method for automatic adaption of the lumination parameter****// int CameraDcam::autoBrightness(camera_data_msg *dataPackage) { int i, count, minCount, maxCount, bytesPerPixel, gain, shutter; double unclearPixel; unsigned int ubrightness; unsigned int ushutter; unsigned int ugain; int start; minCount = 0; maxCount = 0; // third = dataPackage->data.width * dataPackage->data.height bytesPerPixel = dataPackage->data.depth / 8; count = dataPackage->data.width * dataPackage->data.height * bytesPerPixel; start = (int)(count * (((double ) 1) - ((double) 1) / autoBrightnessSize)); start += start % bytesPerPixel; start++; for(i = start; i < count; i += bytesPerPixel) { if((unsigned char)dataPackage->byteStream[i] <= minHue) { minCount++; } else if((unsigned char)dataPackage->byteStream[i] >= maxHue) { maxCount++; } } if (dc1394_get_shutter(porthandle[dc1394CameraPortNo], camera_node, &ushutter) != DC1394_SUCCESS) { GDOS_WARNING("getting of shutter failed! "); return DC1394_FAILURE; } if (dc1394_get_gain(porthandle[dc1394CameraPortNo], camera_node, &ugain) != DC1394_SUCCESS) { GDOS_WARNING("getting of gain failed! "); return DC1394_FAILURE; } if (dc1394_get_brightness(porthandle[dc1394CameraPortNo], camera_node, &ubrightness) != DC1394_SUCCESS) { GDOS_WARNING("getting of brightness failed! "); return DC1394_FAILURE; } GDOS_DBG_DETAIL("count %i minCount %i maxCount %i actual shutter %i gain:%i brightness:%i \n", count, minCount, maxCount, ushutter, ugain, ubrightness); //if pixel are too dark, light them up! unclearPixel = ((double)(minCount - maxCount)) / count; //percent of over or under illum. pixel ubrightness = 124; if (unclearPixel > 0) { //light up if (ushutter < 4095) { ushutter += (unsigned int) (unclearPixel * shutterMult); if(ushutter > 4095) ushutter = 4095; } else { //increase gain ugain += (unsigned int) (unclearPixel * gainMult); if (ugain > 1023) { ugain = 1023;} } } else { //unclearPixel is negative, darken image if (ugain > 192) { //to handle negative values gain = (int) (ugain + unclearPixel * gainMult); if (gain < 192) gain = 192; ugain = gain; } else { shutter = (int) (ushutter + unclearPixel * shutterMult); if (shutter < 1) shutter = 1; ushutter = shutter; } } if (dc1394_set_shutter(porthandle[dc1394CameraPortNo], camera_node, ushutter) != DC1394_SUCCESS) { GDOS_WARNING("setting of shutter failed! is value:%i", ushutter ); return DC1394_FAILURE; } if (dc1394_set_gain(porthandle[dc1394CameraPortNo], camera_node, ugain) != DC1394_SUCCESS) { GDOS_WARNING("setting of gain failed! is value:%i", ugain ); return DC1394_FAILURE; } if (dc1394_set_brightness(porthandle[dc1394CameraPortNo], camera_node, ubrightness) != DC1394_SUCCESS) { GDOS_WARNING("setting of brightness failed! is value:%i", ubrightness ); return DC1394_FAILURE; } GDOS_DBG_DETAIL("set shutter:%i gain:%i brightness:%i \n", ushutter, ugain, ubrightness); return DC1394_SUCCESS; }
/***************************************************************************** * Open: *****************************************************************************/ static int Open( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys; es_format_t fmt; int i; int i_width; int i_height; int result = 0; if( strncmp(p_demux->psz_access, "dc1394", 6) != 0 ) return VLC_EGENERIC; /* Set up p_demux */ p_demux->pf_demux = Demux; p_demux->pf_control = Control; p_demux->info.i_update = 0; p_demux->info.i_title = 0; p_demux->info.i_seekpoint = 0; p_demux->p_sys = p_sys = calloc( 1, sizeof( demux_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; memset( &fmt, 0, sizeof( es_format_t ) ); /* DEFAULTS */ p_sys->frame_size = MODE_640x480_YUV422; p_sys->width = 640; p_sys->height = 480; p_sys->frame_rate = FRAMERATE_30; p_sys->brightness = 200; p_sys->focus = 0; p_sys->dma_capture = DMA_ON; /* defaults to VIDEO1394 capture mode */ p_sys->fd_audio = -1; p_sys->fd_video = NULL; p_sys->camera_nodes = NULL; p_sys->selected_camera = 0; p_sys->dma_device = NULL; p_sys->selected_uid = 0; /* PROCESS INPUT OPTIONS */ if( process_options(p_demux) != VLC_SUCCESS ) { msg_Err( p_demux, "Bad MRL, please check the option line " "(MRL was: %s)", p_demux->psz_path ); free( p_sys ); p_demux->p_sys = NULL; return VLC_EGENERIC; } msg_Dbg( p_demux, "Selected camera %d", p_sys->selected_camera ); msg_Dbg( p_demux, "Selected uid 0x%llx", p_sys->selected_uid ); ScanCameras( p_sys, p_demux ); if( !p_sys->camera_nodes ) { msg_Err( p_demux, "No camera found !!" ); free( p_sys ); p_demux->p_sys = NULL; return VLC_EGENERIC; } if( p_sys->selected_uid ) { int found = 0; for( i=0; i < p_sys->num_cameras; i++ ) { if( p_sys->camera_nodes[i].uid == p_sys->selected_uid ) { p_sys->selected_camera = i; found++; break; } } if( !found ) { msg_Err( p_demux, "Can't find camera with uid : 0x%llx.", p_sys->selected_uid ); Close( p_this ); return VLC_EGENERIC; } } else if( p_sys->selected_camera >= p_sys->num_cameras ) { msg_Err( p_demux, "there are not this many cameras. (%d/%d)", p_sys->selected_camera, p_sys->num_cameras ); Close( p_this ); return VLC_EGENERIC; } p_sys->fd_video = dc1394_create_handle( p_sys->camera_nodes[p_sys->selected_camera].port ); if( (int)p_sys->fd_video < 0 ) { msg_Err( p_demux, "Can't init dc1394 handle" ); Close( p_this ); return VLC_EGENERIC; } /* get camera info */ result = dc1394_get_camera_info( p_sys->fd_video, p_sys->camera_nodes[p_sys->selected_camera].node, &p_sys->camera_info ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux ,"unable to get camera info" ); Close( p_this ); return VLC_EGENERIC; } dc1394_print_camera_info( &p_sys->camera_info ); result = dc1394_get_camera_misc_info( p_sys->fd_video, p_sys->camera_nodes[p_sys->selected_camera].node, &p_sys->misc_info ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "unable to get camera misc info" ); Close( p_this ); return VLC_EGENERIC; } /* init camera and set some video options */ result = dc1394_init_camera( p_sys->camera_info.handle, p_sys->camera_info.id ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "unable to get init dc1394 camera" ); Close( p_this ); return VLC_EGENERIC; } if( p_sys->focus ) { result = dc1394_set_focus( p_sys->camera_info.handle, p_sys->camera_nodes[p_sys->selected_camera].node, p_sys->focus ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "unable to set initial focus to %u", p_sys->focus ); } msg_Dbg( p_demux, "Initial focus set to %u", p_sys->focus ); } result = dc1394_set_brightness( p_sys->camera_info.handle, p_sys->camera_nodes[p_sys->selected_camera].node, p_sys->brightness ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "unable to set init brightness to %d", p_sys->brightness); Close( p_this ); return VLC_EGENERIC; } result = dc1394_set_video_framerate( p_sys->camera_info.handle, p_sys->camera_nodes[p_sys->selected_camera].node, p_sys->frame_rate ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "unable to set framerate to %d", p_sys->frame_rate ); Close( p_this ); return VLC_EGENERIC; } p_sys->misc_info.framerate = p_sys->frame_rate; result = dc1394_set_video_format( p_sys->camera_info.handle, p_sys->camera_nodes[p_sys->selected_camera].node, FORMAT_VGA_NONCOMPRESSED ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "unable to set video format to VGA_NONCOMPRESSED" ); Close( p_this ); return VLC_EGENERIC; } p_sys->misc_info.format = FORMAT_VGA_NONCOMPRESSED; result = dc1394_set_video_mode( p_sys->camera_info.handle, p_sys->camera_nodes[p_sys->selected_camera].node, p_sys->frame_size ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "unable to set video mode" ); Close( p_this ); return VLC_EGENERIC; } p_sys->misc_info.mode = p_sys->frame_size; /* reprobe everything */ result = dc1394_get_camera_info( p_sys->camera_info.handle, p_sys->camera_info.id, &p_sys->camera_info ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "Could not get camera basic information!" ); Close( p_this ); return VLC_EGENERIC; } result = dc1394_get_camera_misc_info( p_sys->camera_info.handle, p_sys->camera_info.id, &p_sys->misc_info ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "Could not get camera misc information!" ); Close( p_this ); return VLC_EGENERIC; } /* set iso_channel */ result = dc1394_set_iso_channel_and_speed( p_sys->camera_info.handle, p_sys->camera_info.id, p_sys->selected_camera, SPEED_400 ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "Could not set iso channel!" ); Close( p_this ); return VLC_EGENERIC; } msg_Dbg( p_demux, "Using ISO channel %d", p_sys->misc_info.iso_channel ); p_sys->misc_info.iso_channel = p_sys->selected_camera; /* and setup capture */ if( p_sys->dma_capture ) { result = dc1394_dma_setup_capture( p_sys->camera_info.handle, p_sys->camera_info.id, p_sys->misc_info.iso_channel, p_sys->misc_info.format, p_sys->misc_info.mode, SPEED_400, p_sys->misc_info.framerate, 10, 0, p_sys->dma_device, &p_sys->camera ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux ,"unable to setup camera" ); Close( p_this ); return VLC_EGENERIC; } } else { result = dc1394_setup_capture( p_sys->camera_info.handle, p_sys->camera_info.id, p_sys->misc_info.iso_channel, p_sys->misc_info.format, p_sys->misc_info.mode, SPEED_400, p_sys->misc_info.framerate, &p_sys->camera ); if( result != DC1394_SUCCESS) { msg_Err( p_demux ,"unable to setup camera" ); Close( p_this ); return VLC_EGENERIC; } } /* TODO - UYV444 chroma converter is missing, when it will be available * fourcc will become variable (and not just a fixed value for UYVY) */ i_width = p_sys->camera.frame_width; i_height = p_sys->camera.frame_height; if( picture_Setup( &p_sys->pic, VLC_CODEC_UYVY, i_width, i_height, i_width * VOUT_ASPECT_FACTOR / i_height ) ) { msg_Err( p_demux ,"unknown chroma" ); Close( p_this ); return VLC_EGENERIC; } es_format_Init( &fmt, VIDEO_ES, VLC_CODEC_UYVY ); fmt.video.i_width = i_width; fmt.video.i_height = i_height; msg_Dbg( p_demux, "added new video es %4.4s %dx%d", (char*)&fmt.i_codec, fmt.video.i_width, fmt.video.i_height ); p_sys->p_es_video = es_out_Add( p_demux->out, &fmt ); if( p_sys->audio_device ) { OpenAudioDev( p_demux ); if( p_sys->fd_audio >= 0 ) { es_format_t fmt; es_format_Init( &fmt, AUDIO_ES, VLC_CODEC_S16L ); /* FIXME: hmm, ?? */ fmt.audio.i_channels = p_sys->channels ? p_sys->channels : 1; fmt.audio.i_rate = p_sys->i_sample_rate; fmt.audio.i_bitspersample = 16; fmt.audio.i_blockalign = fmt.audio.i_channels * fmt.audio.i_bitspersample / 8; fmt.i_bitrate = fmt.audio.i_channels * fmt.audio.i_rate * fmt.audio.i_bitspersample; msg_Dbg( p_demux, "new audio es %d channels %dHz", fmt.audio.i_channels, fmt.audio.i_rate ); p_sys->p_es_audio = es_out_Add( p_demux->out, &fmt ); } } /* have the camera start sending us data */ result = dc1394_start_iso_transmission( p_sys->camera_info.handle, p_sys->camera_info.id ); if( result != DC1394_SUCCESS ) { msg_Err( p_demux, "unable to start camera iso transmission" ); if( p_sys->dma_capture ) { dc1394_dma_release_camera( p_sys->fd_video, &p_sys->camera ); } else { dc1394_release_camera( p_sys->fd_video, &p_sys->camera ); } Close( p_this ); return VLC_EGENERIC; } p_sys->misc_info.is_iso_on = DC1394_TRUE; return VLC_SUCCESS; }