00001 #include "bcsignals.h"
00002 #include "bctimer.h"
00003 #include "datatype.h"
00004 #include "edl.h"
00005 #include "edlsession.h"
00006 #include "mwindow.h"
00007 #include "playabletracks.h"
00008 #include "preferences.h"
00009 #include "renderengine.h"
00010 #include "tracks.h"
00011 #include "transportque.h"
00012 #include "vdevicex11.h"
00013 #include "vframe.h"
00014 #include "videodevice.h"
00015 #include "virtualvconsole.h"
00016 #include "virtualvnode.h"
00017 #include "vmodule.h"
00018 #include "vrender.h"
00019 #include "vtrack.h"
00020
00021 VirtualVConsole::VirtualVConsole(RenderEngine *renderengine, VRender *vrender)
00022 : VirtualConsole(renderengine, vrender, TRACK_VIDEO)
00023 {
00024 this->vrender = vrender;
00025 output_temp = 0;
00026 }
00027
00028 VirtualVConsole::~VirtualVConsole()
00029 {
00030 if(output_temp)
00031 {
00032 delete output_temp;
00033 }
00034 }
00035
00036 VDeviceBase* VirtualVConsole::get_vdriver()
00037 {
00038 return renderengine->video->get_output_base();
00039 }
00040
00041 void VirtualVConsole::get_playable_tracks()
00042 {
00043 if(!playable_tracks)
00044 playable_tracks = new PlayableTracks(renderengine,
00045 commonrender->current_position,
00046 TRACK_VIDEO,
00047 1);
00048 }
00049
00050 VirtualNode* VirtualVConsole::new_entry_node(Track *track,
00051 Module *module,
00052 int track_number)
00053 {
00054 return new VirtualVNode(renderengine,
00055 this,
00056 module,
00057 0,
00058 track,
00059 0);
00060 }
00061
00062
00063 int VirtualVConsole::process_buffer(int64_t input_position)
00064 {
00065 int i, j, k;
00066 int result = 0;
00067
00068
00069
00070
00071 use_opengl = (renderengine->video &&
00072 renderengine->video->out_config->driver == PLAYBACK_X11_GL);
00073
00074
00075
00076
00077
00078 if(debug_tree)
00079 printf("VirtualVConsole::process_buffer begin exit_nodes=%d\n",
00080 exit_nodes.total);
00081
00082
00083 if(use_opengl)
00084 {
00085
00086
00087 ((VDeviceX11*)get_vdriver())->clear_output();
00088
00089
00090 vrender->video_out->set_opengl_state(VFrame::SCREEN);
00091
00092 }
00093 else
00094 {
00095
00096 vrender->video_out->clear_frame();
00097 }
00098
00099
00100
00101
00102
00103
00104
00105 reset_attachments();
00106
00107 Timer timer;
00108
00109 for(current_exit_node = exit_nodes.total - 1; current_exit_node >= 0; current_exit_node--)
00110 {
00111 VirtualVNode *node = (VirtualVNode*)exit_nodes.values[current_exit_node];
00112 Track *track = node->track;
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 if(output_temp &&
00123 (output_temp->get_w() != track->track_w ||
00124 output_temp->get_h() != track->track_h))
00125 {
00126 delete output_temp;
00127 output_temp = 0;
00128 }
00129
00130
00131 if(!output_temp)
00132 {
00133
00134 output_temp = new VFrame(0,
00135 track->track_w,
00136 track->track_h,
00137 renderengine->edl->session->color_model,
00138 -1);
00139 }
00140
00141
00142 if(use_opengl)
00143 output_temp->set_opengl_state(VFrame::RAM);
00144
00145
00146
00147
00148 output_temp->clear_stacks();
00149 result |= node->render(output_temp,
00150 input_position + track->nudge,
00151 renderengine->edl->session->frame_rate,
00152 use_opengl);
00153
00154 }
00155
00156
00157 if(debug_tree) printf("VirtualVConsole::process_buffer end\n");
00158 return result;
00159 }
00160