+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
- * 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());
- }
-}
-
-