Device1394Output::~Device1394Output() { if(Thread::running()) { done = 1; start_lock->unlock(); Thread::cancel(); Thread::join(); } if(buffer) { for(int i = 0; i < total_buffers; i++) { if(buffer[i]) delete [] buffer[i]; } delete [] buffer; delete [] buffer_size; delete [] buffer_valid; } if(audio_lock) delete audio_lock; if(video_lock) delete video_lock; if(start_lock) delete start_lock; if(audio_buffer) delete [] audio_buffer; if(output_fd >= 0) { output_queue.buffer = (output_mmap.nb_buffers + output_queue.buffer - 1) % output_mmap.nb_buffers; if(get_dv1394()) { if(ioctl(output_fd, dv1394_wait_frames, status.init.n_frames - 1) < 0) { fprintf(stderr, "Device1394Output::close_all: DV1394_WAIT_FRAMES %i: %s", output_mmap.nb_buffers, strerror(errno)); } munmap(output_buffer, status.init.n_frames * (is_pal ? DV1394_PAL_FRAME_SIZE : DV1394_NTSC_FRAME_SIZE)); if(ioctl(output_fd, dv1394_shutdown, NULL) < 0) { perror("Device1394Output::close_all: DV1394_SHUTDOWN"); } } else { if(ioctl(output_fd, video1394_talk_wait_buffer, &output_queue) < 0) { fprintf(stderr, "Device1394::close_all: VIDEO1394_TALK_WAIT_BUFFER: %s", strerror(errno)); } munmap(output_buffer, output_mmap.nb_buffers * output_mmap.buf_size); if(ioctl(output_fd, video1394_untalk_channel, &output_mmap.channel) < 0) { perror("Device1394::close_all: VIDEO1394_UNTALK_CHANNEL"); } } close(output_fd); // if(avc_handle) // raw1394_destroy_handle(avc_handle); } if(temp_frame) delete temp_frame; if(temp_frame2) delete temp_frame2; if(video_encoder) dv_delete(video_encoder); if(position_presented) delete [] position_presented; if(audio_encoder) dv_delete(audio_encoder); if(buffer_lock) delete buffer_lock; if(position_lock) delete position_lock; }
int RecVideoDVThread::stop_rendering() { if( dv ) { dv_delete(((dv_t*)dv)); dv = 0; } return 0; }