X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvattachmentpoint.C;fp=cinelerra-5.1%2Fcinelerra%2Fvattachmentpoint.C;h=062db5bb826567ff27ff2d9f1782c8253a1529f6;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/vattachmentpoint.C b/cinelerra-5.1/cinelerra/vattachmentpoint.C new file mode 100644 index 00000000..062db5bb --- /dev/null +++ b/cinelerra-5.1/cinelerra/vattachmentpoint.C @@ -0,0 +1,162 @@ + +/* + * 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 + * + */ + +#include "bcsignals.h" +#include "clip.h" +#include "datatype.h" +#include "edl.h" +#include "edlsession.h" +#include "plugin.h" +#include "pluginserver.h" +#include "renderengine.h" +#include "transportque.h" +#include "vattachmentpoint.h" +#include "vdevicex11.h" +#include "videodevice.h" +#include "vframe.h" + +VAttachmentPoint::VAttachmentPoint(RenderEngine *renderengine, Plugin *plugin) +: AttachmentPoint(renderengine, plugin, TRACK_VIDEO) +{ + buffer_vector = 0; +} + +VAttachmentPoint::~VAttachmentPoint() +{ + delete_buffer_vector(); +} + +void VAttachmentPoint::delete_buffer_vector() +{ + if(!this) printf("VAttachmentPoint::delete_buffer_vector NULL\n"); + if(buffer_vector) + { + for(int i = 0; i < virtual_plugins.total; i++) + delete buffer_vector[i]; + delete [] buffer_vector; + } + buffer_vector = 0; +} + +void VAttachmentPoint::new_buffer_vector(int width, int height, int colormodel) +{ + if(!this) printf("VAttachmentPoint::new_buffer_vector NULL\n"); + if(buffer_vector && + (width != buffer_vector[0]->get_w() || + height != buffer_vector[0]->get_h() || + colormodel != buffer_vector[0]->get_color_model())) + { + delete_buffer_vector(); + } + + if(!buffer_vector) + { + buffer_vector = new VFrame*[virtual_plugins.total]; + for(int i = 0; i < virtual_plugins.total; i++) + { + buffer_vector[i] = new VFrame(0, + -1, + width, + height, + colormodel, + -1); + } + } +} + +int VAttachmentPoint::get_buffer_size() +{ + return 1; +} + +void VAttachmentPoint::render(VFrame *output, + int buffer_number, + int64_t start_position, + double frame_rate, + int debug_render, + int use_opengl) +{ + if(!this) printf("VAttachmentPoint::render NULL\n"); + if(!plugin_server || !plugin->on) return; + + if(debug_render) + printf(" VAttachmentPoint::render \"%s\" multi=%d opengl=%d\n", + plugin_server->title, + plugin_server->multichannel, + use_opengl); + + if(plugin_server->multichannel) + { +// Test against previous parameters for reuse of previous data + if( !is_processed || this->start_position != start_position || + !EQUIV(this->frame_rate, frame_rate)) { + is_processed = 1; + this->start_position = start_position; + this->frame_rate = frame_rate; + +// Allocate buffer vector for subsequent render calls + new_buffer_vector(output->get_w(), output->get_h(), + output->get_color_model()); +// Process plugin +//printf("VAttachmentPoint::render 1 %d\n", buffer_number); + if(renderengine) + plugin_servers.values[0]->set_use_opengl(use_opengl, + renderengine->video); + plugin_servers.values[0]->process_buffer(buffer_vector, + start_position, frame_rate, + (int64_t)Units::round(plugin->length * frame_rate / + renderengine->get_edl()->session->frame_rate), + renderengine->command->get_direction()); + } +//printf("VAttachmentPoint::render 3\n"); +// Need to copy PBuffer if OpenGL, regardless of use_opengl + if( buffer_vector[buffer_number]->get_opengl_state() == VFrame::RAM ) { + output->copy_from(buffer_vector[buffer_number]); + output->set_opengl_state(VFrame::RAM); + } + else if(renderengine && renderengine->video) { +// Need to copy PBuffer to texture +// printf("VAttachmentPoint::render temp=%p output=%p\n", +// buffer_vector[buffer_number], +// output); + VDeviceX11 *x11_device = (VDeviceX11*)renderengine->video->get_output_base(); + x11_device->copy_frame(output, buffer_vector[buffer_number]); + } + } + else +// process single track + { + VFrame *output_temp[1]; + output_temp[0] = output; + if(renderengine) + plugin_servers.values[buffer_number]->set_use_opengl(use_opengl, + renderengine->video); + plugin_servers.values[buffer_number]->process_buffer(output_temp, + start_position, + frame_rate, + (int64_t)Units::round(plugin->length * + frame_rate / + renderengine->get_edl()->session->frame_rate), + renderengine->command->get_direction()); + } +} + +