|
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.
|