r602: Fix baver's code... don't insert timecode when show_tc is not set
[cinelerra_cv/mob.git] / cinelerra / vattachmentpoint.C
blobc06b78214877d8f90ef9008e7008116bf93b58b9
1 #include "bcsignals.h"
2 #include "clip.h"
3 #include "datatype.h"
4 #include "edl.h"
5 #include "edlsession.h"
6 #include "plugin.h"
7 #include "pluginserver.h"
8 #include "renderengine.h"
9 #include "transportque.h"
10 #include "vattachmentpoint.h"
11 #include "vframe.h"
13 VAttachmentPoint::VAttachmentPoint(RenderEngine *renderengine, Plugin *plugin)
14 : AttachmentPoint(renderengine, plugin, TRACK_VIDEO)
16         buffer_vector = 0;
19 VAttachmentPoint::~VAttachmentPoint()
21         delete_buffer_vector();
24 void VAttachmentPoint::delete_buffer_vector()
26         if(!this) printf("VAttachmentPoint::delete_buffer_vector NULL\n");
27         if(buffer_vector)
28         {
29                 for(int i = 0; i < virtual_plugins.total; i++)
30                         delete buffer_vector[i];
31                 delete [] buffer_vector;
32         }
33         buffer_vector = 0;
36 void VAttachmentPoint::new_buffer_vector(int width, int height, int colormodel)
38         if(!this) printf("VAttachmentPoint::new_buffer_vector NULL\n");
39         if(buffer_vector &&
40                 (width != buffer_vector[0]->get_w() ||
41                 height != buffer_vector[0]->get_h() ||
42                 colormodel != buffer_vector[0]->get_color_model()))
43         {
44                 delete_buffer_vector();
45         }
47         if(!buffer_vector)
48         {
49                 buffer_vector = new VFrame*[virtual_plugins.total];
50                 for(int i = 0; i < virtual_plugins.total; i++)
51                 {
52                         buffer_vector[i] = new VFrame(0,
53                                 width,
54                                 height,
55                                 colormodel,
56                                 -1);
57                 }
58         }
61 int VAttachmentPoint::get_buffer_size()
63         return 1;
66 void VAttachmentPoint::render(VFrame *output, 
67         int buffer_number,
68         int64_t start_position,
69         double frame_rate,
70         int debug_render)
72         if(!this) printf("VAttachmentPoint::render NULL\n");
73         if(!plugin_server || !plugin->on) return;
75         if(debug_render)
76                 printf("    VAttachmentPoint::render %s %d\n", 
77                         plugin_server->title,
78                         plugin_server->multichannel);
80         if(plugin_server->multichannel)
81         {
82 // Test against previous parameters for reuse of previous data
83                 if(is_processed &&
84                         this->start_position == start_position &&
85                         EQUIV(this->frame_rate, frame_rate))
86                 {
87                         output->copy_from(buffer_vector[buffer_number]);
88                         return;
89                 }
91                 is_processed = 1;
92                 this->start_position = start_position;
93                 this->frame_rate = frame_rate;
95 // Allocate buffer vector
96                 new_buffer_vector(output->get_w(), 
97                         output->get_h(), 
98                         output->get_color_model());
100 // Create temporary vector with output argument substituted in
101                 VFrame **output_temp = new VFrame*[virtual_plugins.total];
102                 for(int i = 0; i < virtual_plugins.total; i++)
103                 {
104                         if(i == buffer_number)
105                                 output_temp[i] = output;
106                         else
107                                 output_temp[i] = buffer_vector[i];
108                 }
110 // Process plugin
111 //printf("VAttachmentPoint::render 1 %d\n", buffer_number);
112                 plugin_servers.values[0]->process_buffer(output_temp,
113                         start_position,
114                         frame_rate,
115                         (int64_t)Units::round(plugin->length * 
116                                 frame_rate / 
117                                 renderengine->edl->session->frame_rate),
118                         renderengine->command->get_direction());
119 //printf("VAttachmentPoint::render 2\n");
121                 delete [] output_temp;
122 //printf("VAttachmentPoint::render 3\n");
123         }
124         else
125 // process single track
126         {
127                 VFrame *output_temp[1];
128                 output_temp[0] = output;
129                 plugin_servers.values[buffer_number]->process_buffer(output_temp,
130                         start_position,
131                         frame_rate,
132                         (int64_t)Units::round(plugin->length * 
133                                 frame_rate / 
134                                 renderengine->edl->session->frame_rate),
135                         renderengine->command->get_direction());
136         }