00001 #ifndef VIDEODEVICE_H
00002 #define VIDEODEVICE_H
00003
00004 #include "asset.inc"
00005 #include "assets.inc"
00006 #include "audiodevice.inc"
00007 #include "bccapture.inc"
00008 #include "bctimer.h"
00009 #include "canvas.inc"
00010 #include "channel.inc"
00011 #include "channeldb.inc"
00012 #include "device1394output.inc"
00013 #include "edl.inc"
00014 #include "guicast.h"
00015 #include "mwindow.inc"
00016 #include "mutex.inc"
00017 #include "preferences.inc"
00018 #include "recordmonitor.inc"
00019 #include "thread.h"
00020 #include "picture.inc"
00021 #include "vdevicebase.inc"
00022 #include "vdevicebuz.inc"
00023 #include "vdevicelml.inc"
00024 #include "vdevicev4l.inc"
00025 #include "vdevicex11.inc"
00026 #include "videoconfig.inc"
00027 #include "videowindow.inc"
00028 #ifdef HAVE_FIREWIRE
00029 #include "audio1394.inc"
00030 #include "device1394output.inc"
00031 #include "vdevice1394.inc"
00032 #endif
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #define KEEPALIVE_DELAY 0.5
00043
00044 class VideoDevice;
00045
00046 class KeepaliveThread : public Thread
00047 {
00048 public:
00049 KeepaliveThread(VideoDevice *device);
00050 ~KeepaliveThread();
00051
00052 void run();
00053 int reset_keepalive();
00054 int get_failed();
00055 int start_keepalive();
00056 int stop();
00057
00058 Timer timer;
00059 int still_alive;
00060 int failed;
00061 int interrupted;
00062 VideoDevice *device;
00063 Mutex *startup_lock;
00064 int capturing;
00065 };
00066
00067 class VideoDevice
00068 {
00069 public:
00070
00071 VideoDevice(MWindow *mwindow = 0);
00072 ~VideoDevice();
00073
00074 int close_all();
00075
00076
00077 int open_input(VideoInConfig *config,
00078 int input_x,
00079 int input_y,
00080 float input_z,
00081 double frame_rate);
00082
00083
00084
00085 VDeviceBase* new_device_base();
00086
00087
00088
00089 VDeviceBase* get_output_base();
00090
00091
00092
00093
00094
00095 static int is_compressed(int driver, int use_file, int use_fixed);
00096 int is_compressed(int use_file, int use_fixed);
00097
00098
00099 static void load_channeldb(ChannelDB *channeldb, VideoInConfig *vconfig_in);
00100 static void save_channeldb(ChannelDB *channeldb, VideoInConfig *vconfig_in);
00101
00102
00103
00104 void fix_asset(Asset *asset, int driver);
00105 static char* drivertostr(int driver);
00106
00107
00108 int get_best_colormodel(Asset *asset);
00109
00110
00111 int set_adevice(AudioDevice *adevice);
00112
00113 int get_failed();
00114
00115 int interrupt_crash();
00116
00117 int set_translation(int input_x, int input_y);
00118
00119 int set_channel(Channel *channel);
00120
00121 void set_quality(int quality);
00122
00123 int set_field_order(int odd_field_first);
00124
00125 int set_latency_counter(int value);
00126
00127 int set_picture(PictureConfig *picture);
00128 int capture_frame(int frame_number);
00129 int read_buffer(VFrame *frame);
00130 int has_signal();
00131 int frame_to_vframe(VFrame *frame, unsigned char *input);
00132 int initialize();
00133 ArrayList<Channel*>* get_inputs();
00134
00135
00136 Channel* new_input_source(char *device_name);
00137 BC_Bitmap* get_bitmap();
00138
00139
00140 int set_cloexec_flag(int desc, int value);
00141
00142
00143 int open_output(VideoOutConfig *config,
00144 float rate,
00145 int out_w,
00146 int out_h,
00147 Canvas *output,
00148 int single_frame);
00149 void set_cpus(int cpus);
00150
00151 int start_playback();
00152 int interrupt_playback();
00153
00154
00155 void new_output_buffer(VFrame **output, int colormodel);
00156 int wait_for_startup();
00157 int wait_for_completion();
00158 int output_visible();
00159 int stop_playback();
00160 void goose_input();
00161 long current_position();
00162
00163
00164 int write_buffer(VFrame *output, EDL *edl);
00165
00166
00167
00168
00169
00170
00171
00172
00173 int interrupt;
00174
00175 int output_format;
00176 int is_playing_back;
00177
00178 AudioDevice *adevice;
00179
00180 int sharing;
00181
00182 int done_sharing;
00183 Mutex *sharing_lock;
00184
00185
00186 float orate, irate;
00187
00188 Timer buffer_timer;
00189
00190 Timer rate_timer;
00191
00192 int out_w, out_h;
00193
00194 int r, w;
00195
00196 long frame_delay;
00197
00198 int cpus;
00199
00200
00201 int is_recording;
00202 double frame_rate;
00203
00204 int frame_in_capture_x1, frame_in_capture_x2, frame_in_capture_y1, frame_in_capture_y2;
00205 int capture_in_frame_x1, capture_in_frame_x2, capture_in_frame_y1, capture_in_frame_y2;
00206
00207 int capture_w, capture_h;
00208 int input_x, input_y;
00209 float input_z;
00210
00211 int new_input_x, new_input_y;
00212 float new_input_z;
00213 int frame_resized;
00214
00215 int latency_counter;
00216 int capturing;
00217 int swap_bytes;
00218
00219
00220
00221 ArrayList<Channel*> input_sources;
00222 int odd_field_first;
00223
00224 int quality;
00225
00226 int single_frame;
00227
00228
00229 Channel *channel;
00230
00231 int channel_changed;
00232 Mutex *channel_lock;
00233
00234
00235 int picture_changed;
00236 PictureConfig *picture;
00237 Mutex *picture_lock;
00238
00239
00240
00241 int update_translation();
00242
00243 VDeviceBase *input_base;
00244 VDeviceBase *output_base;
00245 VideoInConfig *in_config;
00246 VideoOutConfig *out_config;
00247 KeepaliveThread *keepalive;
00248 MWindow *mwindow;
00249 };
00250
00251
00252
00253 #endif