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;
}
示例#2
0
int RecVideoDVThread::stop_rendering()
{
	if( dv ) { dv_delete(((dv_t*)dv));  dv = 0; }
	return 0;
}