X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvdevicebuz.h;fp=cinelerra-5.1%2Fcinelerra%2Fvdevicebuz.h;h=6fe9321b22881d06f9138c2f0c4ebf0c7812ebbc;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/vdevicebuz.h b/cinelerra-5.1/cinelerra/vdevicebuz.h new file mode 100644 index 00000000..6fe9321b --- /dev/null +++ b/cinelerra-5.1/cinelerra/vdevicebuz.h @@ -0,0 +1,129 @@ + +/* + * CINELERRA + * Copyright (C) 2008 Adam Williams + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef VDEVICEBUZ_H +#define VDEVICEBUZ_H + +#include "buz.h" +#include "channel.inc" +#include "condition.inc" +#include "guicast.h" +#include "libmjpeg.h" +#include "mutex.inc" +#include "thread.h" +#include "vdevicebase.h" +#include "vdevicebuz.inc" +#include "vframe.inc" + + +#define INPUT_BUFFER_SIZE 0x40000 + +// Let's get real. The Buz driver doesn't work. If the buffers overflow +// for enough time it locks up and can't be recovered except by a +// SIGINT and restart. We need to cascade the buffer reading in another +// ring buffer thread, have it read continuously, and cancel it if it +// dies. How about if we do this in SCHED_RR and wait for it to die before +// implementing cancellation? + + +class VDeviceBUZInput : public Thread +{ +public: + VDeviceBUZInput(VDeviceBUZ *device); + ~VDeviceBUZInput(); + void start(); + void run(); + void get_buffer(char **ptr, int *size); + void put_buffer(); + void increment_counter(int *counter); + void decrement_counter(int *counter); + VDeviceBUZ *device; + + char **buffer; + int *buffer_size; + int total_buffers; + int current_inbuffer; + int current_outbuffer; + Condition *output_lock; + Mutex *buffer_lock; + int done; +}; + + +class VDeviceBUZ : public VDeviceBase +{ +public: + VDeviceBUZ(VideoDevice *device); + ~VDeviceBUZ(); + + friend class VDeviceBUZInput; + + int open_input(); + int open_output(); + int close_all(); + int read_buffer(VFrame *frame); + int write_buffer(VFrame *frames, EDL *edl); + void reset_parameters(); + ArrayList* get_render_strategies(); + int set_channel(Channel *channel); + int get_norm(int norm); + static void get_inputs(ArrayList *input_sources); + int set_picture(PictureConfig *picture); + int get_best_colormodel(int colormodel); + int create_channeldb(ArrayList *channeldb); + void new_output_buffer(VFrame *output, int colormodel); + + +private: + int open_input_core(Channel *channel); + void close_input_core(); + int open_output_core(Channel *channel); + int close_output_core(); + + int jvideo_fd; + char *input_buffer, *frame_buffer, *output_buffer; + long frame_size, frame_allocated; + int input_error; + long last_frame_no; + ArrayList render_strategies; +// Temporary frame for compressing output data + VFrame *temp_frame; +// Frame given to user to acquire data + VFrame *user_frame; + mjpeg_t *mjpeg; + Mutex *tuner_lock; + VDeviceBUZInput *input_thread; + + struct buz_params bparm; + struct buz_requestbuffers breq; +// Can't CSYNC the first loop + int total_loops; +// Number of output frame to load + int output_number; + + int brightness; + int hue; + int color; + int contrast; + int whiteness; +}; + +#endif