diff --git a/src/toxic.c b/src/toxic.c index 654ca26..ada01a4 100644 --- a/src/toxic.c +++ b/src/toxic.c @@ -132,6 +132,11 @@ void exit_toxic_success(Tox *m) #ifdef AUDIO terminate_audio(); + +#ifdef VIDEO + terminate_video(); +#endif /* VIDEO */ + #endif /* AUDIO */ free(DATA_FILE); diff --git a/src/video_call.c b/src/video_call.c index 4e06ff7..2d6b6a3 100644 --- a/src/video_call.c +++ b/src/video_call.c @@ -81,8 +81,14 @@ ToxAV *init_video(ToxWindow *self, Tox *tox) void terminate_video() { int i; - for (i = 0; i < MAX_CALLS; ++i) - stop_video_transmission(&CallControl.calls[i], i); + for (i = 0; i < MAX_CALLS; ++i) { + Call* this_call = &CallControl.calls[i]; + + stop_video_transmission(this_call, i); + + if( this_call->vout_idx != -1 ) + close_video_device(vdt_output, this_call->vout_idx); + } terminate_video_devices(); } diff --git a/src/video_device.c b/src/video_device.c index 4be81a2..b0c2a41 100644 --- a/src/video_device.c +++ b/src/video_device.c @@ -185,11 +185,17 @@ VideoDeviceError init_video_devices() char* video_input_name; /* Query V4L for capture capabilities */ - if ( ioctl(fd, VIDIOC_QUERYCAP, &cap) != -1 ) { - //strcpy(video_input_name,cap.card); - video_input_name = cap.card; + if ( -1 != ioctl(fd, VIDIOC_QUERYCAP, &cap) ) { + video_input_name = (char*)malloc(strlen(cap.card) + strlen(device_address) + 4); + strcpy(video_input_name, (char*)cap.card); + strcat(video_input_name, " ("); + strcat(video_input_name, (char*)device_address); + strcat(video_input_name, ")"); } else { - video_input_name = device_address; + video_input_name = (char*)malloc(strlen(device_address) + 3); + strcpy(video_input_name, "("); + strcat(video_input_name, device_address); + strcat(video_input_name, ")"); } video_devices_names[vdt_input][size[vdt_input]] = video_input_name; @@ -226,6 +232,12 @@ VideoDeviceError terminate_video_devices() video_thread_running = false; usleep(20000); + int i; + for (i = 0; i < size[vdt_input]; ++i) { + const char* video_input_name = video_devices_names[vdt_input][i]; + free(video_input_name); + } + if ( pthread_mutex_destroy(&video_mutex) != 0 ) return (VideoDeviceError) vde_InternalError;