00001 #include "bcsignals.h"
00002 #include "clip.h"
00003 #include "datatype.h"
00004 #include "edl.h"
00005 #include "edlsession.h"
00006 #include "plugin.h"
00007 #include "pluginserver.h"
00008 #include "renderengine.h"
00009 #include "transportque.h"
00010 #include "vattachmentpoint.h"
00011 #include "vdevicex11.h"
00012 #include "videodevice.h"
00013 #include "vframe.h"
00014
00015 VAttachmentPoint::VAttachmentPoint(RenderEngine *renderengine, Plugin *plugin)
00016 : AttachmentPoint(renderengine, plugin, TRACK_VIDEO)
00017 {
00018 buffer_vector = 0;
00019 }
00020
00021 VAttachmentPoint::~VAttachmentPoint()
00022 {
00023 delete_buffer_vector();
00024 }
00025
00026 void VAttachmentPoint::delete_buffer_vector()
00027 {
00028 if(!this) printf("VAttachmentPoint::delete_buffer_vector NULL\n");
00029 if(buffer_vector)
00030 {
00031 for(int i = 0; i < virtual_plugins.total; i++)
00032 delete buffer_vector[i];
00033 delete [] buffer_vector;
00034 }
00035 buffer_vector = 0;
00036 }
00037
00038 void VAttachmentPoint::new_buffer_vector(int width, int height, int colormodel)
00039 {
00040 if(!this) printf("VAttachmentPoint::new_buffer_vector NULL\n");
00041 if(buffer_vector &&
00042 (width != buffer_vector[0]->get_w() ||
00043 height != buffer_vector[0]->get_h() ||
00044 colormodel != buffer_vector[0]->get_color_model()))
00045 {
00046 delete_buffer_vector();
00047 }
00048
00049 if(!buffer_vector)
00050 {
00051 buffer_vector = new VFrame*[virtual_plugins.total];
00052 for(int i = 0; i < virtual_plugins.total; i++)
00053 {
00054 buffer_vector[i] = new VFrame(0,
00055 width,
00056 height,
00057 colormodel,
00058 -1);
00059 }
00060 }
00061 }
00062
00063 int VAttachmentPoint::get_buffer_size()
00064 {
00065 return 1;
00066 }
00067
00068 void VAttachmentPoint::render(VFrame *output,
00069 int buffer_number,
00070 int64_t start_position,
00071 double frame_rate,
00072 int debug_render,
00073 int use_opengl)
00074 {
00075 if(!this) printf("VAttachmentPoint::render NULL\n");
00076 if(!plugin_server || !plugin->on) return;
00077
00078 if(debug_render)
00079 printf(" VAttachmentPoint::render \"%s\" multi=%d opengl=%d\n",
00080 plugin_server->title,
00081 plugin_server->multichannel,
00082 use_opengl);
00083
00084 if(plugin_server->multichannel)
00085 {
00086
00087 if(is_processed &&
00088 this->start_position == start_position &&
00089 EQUIV(this->frame_rate, frame_rate))
00090 {
00091
00092 if(buffer_vector[buffer_number]->get_opengl_state() == VFrame::RAM)
00093 {
00094 output->copy_from(buffer_vector[buffer_number]);
00095 output->set_opengl_state(VFrame::RAM);
00096 }
00097 else
00098 if(renderengine && renderengine->video)
00099 {
00100
00101
00102
00103
00104 VDeviceX11 *x11_device = (VDeviceX11*)renderengine->video->get_output_base();
00105 x11_device->copy_frame(output, buffer_vector[buffer_number]);
00106 }
00107 return;
00108 }
00109
00110 is_processed = 1;
00111 this->start_position = start_position;
00112 this->frame_rate = frame_rate;
00113
00114
00115 new_buffer_vector(output->get_w(),
00116 output->get_h(),
00117 output->get_color_model());
00118
00119
00120 VFrame **output_temp = new VFrame*[virtual_plugins.total];
00121 for(int i = 0; i < virtual_plugins.total; i++)
00122 {
00123 if(i == buffer_number)
00124 output_temp[i] = output;
00125 else
00126 output_temp[i] = buffer_vector[i];
00127 }
00128
00129
00130
00131 if(renderengine)
00132 plugin_servers.values[0]->set_use_opengl(use_opengl,
00133 renderengine->video);
00134 plugin_servers.values[0]->process_buffer(output_temp,
00135 start_position,
00136 frame_rate,
00137 (int64_t)Units::round(plugin->length *
00138 frame_rate /
00139 renderengine->edl->session->frame_rate),
00140 renderengine->command->get_direction());
00141
00142
00143 delete [] output_temp;
00144
00145 }
00146 else
00147
00148 {
00149 VFrame *output_temp[1];
00150 output_temp[0] = output;
00151 if(renderengine)
00152 plugin_servers.values[buffer_number]->set_use_opengl(use_opengl,
00153 renderengine->video);
00154 plugin_servers.values[buffer_number]->process_buffer(output_temp,
00155 start_position,
00156 frame_rate,
00157 (int64_t)Units::round(plugin->length *
00158 frame_rate /
00159 renderengine->edl->session->frame_rate),
00160 renderengine->command->get_direction());
00161 }
00162 }
00163
00164