void ofxLibdc::initCamera(int cameraNumber) { // create camera struct dc1394camera_list_t* list; dc1394_camera_enumerate(libdcContext, &list); if(list->num == 0) { ofLog(OF_LOG_ERROR, "No cameras found."); return; } camera = dc1394_camera_new(libdcContext, list->ids[cameraNumber].guid); if (!camera) { stringstream error; error << "Failed to initialize camera " << cameraNumber << " with guid " << list->ids[cameraNumber].guid; ofLog(OF_LOG_ERROR, error.str()); return; } else { stringstream msg; msg << "Using camera with GUID " << camera->guid; ofLog(OF_LOG_VERBOSE, msg.str()); } dc1394_camera_free_list(list); #ifdef TARGET_OSX dc1394_iso_release_bandwidth(camera, INT_MAX); for (int channel = 0; channel < 64; channel++) dc1394_iso_release_channel(camera, channel); #endif #ifdef TARGET_LINUX dc1394_reset_bus(camera); #endif }
void ieee1394capture::release_iso_and_bw(int i) { uint32_t val; if ( dc1394_video_get_bandwidth_usage(cameras[i], &val) == DC1394_SUCCESS && dc1394_iso_release_bandwidth(cameras[i], val) == DC1394_SUCCESS ) qDebug() << "Succesfully released " << val << " bytes of Bandwidth."; if ( dc1394_video_get_iso_channel(cameras[i], &val) == DC1394_SUCCESS && dc1394_iso_release_channel(cameras[i], val) == DC1394_SUCCESS ) qDebug() << "Succesfully released ISO channel #" << val << "." ; }
void release_iso_and_bw() //In this function, first we get the bandwidth usage value and release the resource accordingly, and then do the same for the ISO channel. { if(camera==NULL) { dc1394_log_error("Camera is not initialised"); return; } uint32_t val; if ( dc1394_video_get_bandwidth_usage(camera, &val) == DC1394_SUCCESS && dc1394_iso_release_bandwidth(camera, val) == DC1394_SUCCESS ) printf("Succesfully released %d bytes of Bandwidth.\n",val); if ( dc1394_video_get_iso_channel(camera, &val) == DC1394_SUCCESS && dc1394_iso_release_channel(camera, val) == DC1394_SUCCESS ) printf("Succesfully released ISO channel #%d.\n", val); }
int main(int argc, char *argv[]) { dc1394_t * d; dc1394camera_list_t * list; dc1394camera_t *camera; dc1394error_t err; d = dc1394_new (); if (!d) return 1; int cam=0; int num=-1; int chan; unsigned int val; do { err=dc1394_camera_enumerate (d, &list); DC1394_ERR_RTN(err,"Failed to enumerate cameras"); if (list->num == 0) { dc1394_log_error("No cameras found"); return 1; } else { num=list->num; } printf("Camera %d\n",cam); camera = dc1394_camera_new (d, list->ids[cam].guid); if (!camera) { dc1394_log_error("Failed to initialize camera with guid %llx", list->ids[cam].guid); return 1; } dc1394_camera_free_list (list); printf("Using camera with GUID %"PRIx64"\n", camera->guid); printf ("Reseting bus...\n"); if (dc1394_reset_bus (camera) != DC1394_SUCCESS) printf ("Warning: reset reported error\n"); dc1394_capture_stop(camera); dc1394_iso_release_all(camera); if ( dc1394_video_get_bandwidth_usage(camera,&val) == DC1394_SUCCESS && dc1394_iso_release_bandwidth(camera,val) == DC1394_SUCCESS) { printf("Freed %d Bandwidth\n",val); } if ( dc1394_video_get_iso_channel(camera,&val) == DC1394_SUCCESS && dc1394_iso_release_channel(camera,val) == DC1394_SUCCESS) { printf("Freed ISO %d\n",val); } dc1394_video_set_transmission(camera, DC1394_OFF); //dc1394_iso_release_bandwidth(camera, 10000000); /*dc1394_iso_release_bandwidth(camera, INT_MAX); for(chan=0;chan<64;chan++) { dc1394_iso_release_channel(camera,chan); }*/ dc1394_camera_free (camera); cam++; } while(cam<num); dc1394_free (d); return 0; }
dc1394error_t dc1394_windows_capture_setup(platform_camera_t * craw, uint32_t num_dma_buffers, uint32_t flags) { dc1394camera_t * camera = craw->camera; dc1394error_t err; if (flags & DC1394_CAPTURE_FLAGS_DEFAULT) { flags = DC1394_CAPTURE_FLAGS_CHANNEL_ALLOC | DC1394_CAPTURE_FLAGS_BANDWIDTH_ALLOC; } // if capture is already set, abort if (craw->capture_is_set > 0) { return DC1394_CAPTURE_IS_RUNNING; } craw->capture.flags = flags; craw->allocated_channel = -1; // if auto iso is requested, stop ISO (if necessary) if (flags & DC1394_CAPTURE_FLAGS_AUTO_ISO) { dc1394switch_t is_iso_on; dc1394_video_get_transmission(camera, &is_iso_on); if (is_iso_on == DC1394_ON) { err=dc1394_video_set_transmission(camera, DC1394_OFF); DC1394_ERR_RTN(err,"Could not stop ISO!"); } } craw->capture.frames = malloc (num_dma_buffers * sizeof (dc1394video_frame_t)); if (!craw->capture.frames) { goto fail; } err = capture_basic_setup(camera, craw->capture.frames); if (err != DC1394_SUCCESS) { goto fail; } err = windows_capture_setup (craw, num_dma_buffers, flags); if (err != DC1394_SUCCESS) { goto fail; } // if auto iso is requested, start ISO if (flags & DC1394_CAPTURE_FLAGS_AUTO_ISO) { err=dc1394_video_set_transmission(camera, DC1394_ON); DC1394_ERR_RTN(err,"Could not start ISO!"); craw->iso_auto_started = 1; } craw->capture.num_dma_buffers = num_dma_buffers; return DC1394_SUCCESS; fail: // free resources if they were allocated if (craw->allocated_channel >= 0) { if (dc1394_iso_release_channel (camera, craw->allocated_channel) != DC1394_SUCCESS) dc1394_log_warning("Warning: Could not free ISO channel"); } if (craw->allocated_bandwidth) { if (dc1394_iso_release_bandwidth (camera, craw->allocated_bandwidth) != DC1394_SUCCESS) dc1394_log_warning("Warning: Could not free bandwidth"); } craw->allocated_channel = -1; craw->allocated_bandwidth = 0; free (craw->capture.frames); craw->capture.frames = NULL; dc1394_log_error ("Error: Failed to setup DMA capture"); return DC1394_FAILURE; }
dc1394error_t platform_capture_stop(platform_camera_t *craw) { dc1394camera_t * camera = craw->camera; int err; if (craw->capture_is_set>0) { // unlisten if (ioctl(craw->capture.dma_fd, VIDEO1394_IOC_UNLISTEN_CHANNEL, &(craw->iso_channel)) < 0) return DC1394_IOCTL_FAILURE; // release if (craw->capture.dma_ring_buffer) { munmap((void*)craw->capture.dma_ring_buffer,craw->capture.dma_buffer_size); } while (close(craw->capture.dma_fd) != 0) { dc1394_log_debug("waiting for dma_fd to close"); sleep (1); } craw->capture.dma_fd = -1; free (craw->capture.frames); craw->capture.frames = NULL; // this dma_device file is allocated by the strdup() function and can be freed here without problems. free(craw->capture.dma_device_file); craw->capture.dma_device_file=NULL; // capture is not set anymore craw->capture_is_set=0; // free ressources if they were allocated if (craw->allocated_channel >= 0) { if (dc1394_iso_release_channel (camera, craw->allocated_channel) != DC1394_SUCCESS) dc1394_log_warning("Warning: Could not free ISO channel"); } if (craw->allocated_bandwidth) { if (dc1394_iso_release_bandwidth (camera, craw->allocated_bandwidth) != DC1394_SUCCESS) dc1394_log_warning("Warning: Could not free bandwidth"); } craw->allocated_channel = -1; craw->allocated_bandwidth = 0; // stop ISO if it was started automatically if (craw->iso_auto_started>0) { err=dc1394_video_set_transmission(camera, DC1394_OFF); DC1394_ERR_RTN(err,"Could not stop ISO!"); craw->iso_auto_started=0; } // free the additional capture handle raw1394_destroy_handle(craw->capture.handle); } else { return DC1394_CAPTURE_IS_NOT_SET; } return DC1394_SUCCESS; }