From: <do...@us...> - 2007-11-04 19:17:54
|
Revision: 1264 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1264&view=rev Author: dohpaz Date: 2007-11-04 11:17:58 -0800 (Sun, 04 Nov 2007) Log Message: ----------- Merge up to trunk r1263. Modified Paths: -------------- branches/team/elbunce/iaxclient/lib/iaxclient_lib.c branches/team/elbunce/iaxclient/lib/video.c Modified: branches/team/elbunce/iaxclient/lib/iaxclient_lib.c =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2007-11-02 21:05:49 UTC (rev 1263) +++ branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2007-11-04 19:17:58 UTC (rev 1264) @@ -679,7 +679,25 @@ video_destroy(); #endif } - + + /* destroy enocders and decoders for all existing calls */ + if ( calls ) + { + int i; + for ( i=0 ; i<max_calls ; i++ ) + { + if ( calls[i].encoder ) + calls[i].encoder->destroy(calls[i].encoder); + if ( calls[i].decoder ) + calls[i].decoder->destroy(calls[i].decoder); + if ( calls[i].vencoder ) + calls[i].vdecoder->destroy(calls[i].vencoder); + if ( calls[i].vdecoder ) + calls[i].vencoder->destroy(calls[i].vdecoder); + } + free(calls); + calls = NULL; + } put_iaxc_lock(); #ifdef WIN32 closesocket(iax_get_fd()); //fd: Modified: branches/team/elbunce/iaxclient/lib/video.c =================================================================== --- branches/team/elbunce/iaxclient/lib/video.c 2007-11-02 21:05:49 UTC (rev 1263) +++ branches/team/elbunce/iaxclient/lib/video.c 2007-11-04 19:17:58 UTC (rev 1264) @@ -557,6 +557,15 @@ cap_info->error_status); vinfo.capturing = 0; + /* NOTE: + * We want to release now, but we're in the capture callback thread. + * vidcap_src_release() fails during capture. + * + * We'll defer the release until the end-application's main thread + * requires the release - if either iaxc_set_video_prefs(), + * iaxc_video_device_set() or video_destroy() are called. + */ + evt.type = IAXC_EVENT_VIDCAP_ERROR; iaxci_post_event(evt); return -1; @@ -969,20 +978,19 @@ fprintf(stderr, "We SHOULD be STOPPING capture here! vinfo.capturing=%d\n", vinfo.capturing); MUTEXLOCK(&vinfo.camera_lock); - if ( vinfo.capturing ) + if ( vinfo.capturing && vinfo.src && + vidcap_src_capture_stop(vinfo.src) ) { - if ( vidcap_src_capture_stop(vinfo.src) ) - fprintf(stderr, "failed vidcap_src_capture_stop\n"); + fprintf(stderr, "failed vidcap_src_capture_stop\n"); + } - vinfo.capturing = 0; + if ( vinfo.src && vidcap_src_release(vinfo.src) ) + { + fprintf(stderr, "failed to release a video source\n"); + } - if ( vinfo.src && vidcap_src_release(vinfo.src) ) - { - fprintf(stderr, "failed to release a video source\n"); - } - - vinfo.src = 0; - } + vinfo.src = 0; + vinfo.capturing = 0; MUTEXUNLOCK(&vinfo.camera_lock); } else @@ -1379,7 +1387,10 @@ */ for ( i = 0; i < vinfo.device_count; i++ ) { - if ( !strcmp(new_iaxc_dev_list[n].name, vinfo.devices[i].name) ) + /* check both the device name and its unique identifier */ + if ( !strcmp(new_iaxc_dev_list[n].name, vinfo.devices[i].name) && + !strcmp(new_iaxc_dev_list[n].id_string, + vinfo.devices[i].id_string) ) { new_iaxc_dev_list[n].id = vinfo.devices[i].id; @@ -1433,9 +1444,16 @@ free(old_iaxc_dev_list); } + /* If we can't find the selected device, defer releasing it. + * It'll happen when we set a new device, or shutdown + */ + + if ( !found_selected_device ) + vinfo.selected_device_id = -1; + *devs = vinfo.devices; *num_devs = vinfo.device_count; - *id_selected = found_selected_device ? vinfo.selected_device_id : -1; + *id_selected = vinfo.selected_device_id; return list_changed; } @@ -1479,6 +1497,12 @@ vinfo.selected_device_id = capture_dev_id; + if ( vinfo.capturing && vinfo.src && + vidcap_src_capture_stop(vinfo.src) ) + { + fprintf(stderr, "failed to stop video capture\n"); + } + if ( vinfo.src && vidcap_src_release(vinfo.src) ) { fprintf(stderr, "failed to release video source\n"); @@ -1654,6 +1678,12 @@ } free(vinfo.devices); + if ( vinfo.capturing && vinfo.src ) + vidcap_src_capture_stop(vinfo.src); + + if ( vinfo.src ) + vidcap_src_release(vinfo.src); + vidcap_destroy(vinfo.vc); vinfo.vc = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |