00001 #include "dissolve.h"
00002 #include "edl.inc"
00003 #include "language.h"
00004 #include "overlayframe.h"
00005 #include "picon_png.h"
00006 #include "vframe.h"
00007
00008 #include <string.h>
00009
00010 PluginClient* new_plugin(PluginServer *server)
00011 {
00012 return new DissolveMain(server);
00013 }
00014
00015
00016
00017
00018
00019 DissolveMain::DissolveMain(PluginServer *server)
00020 : PluginVClient(server)
00021 {
00022 overlayer = 0;
00023 }
00024
00025 DissolveMain::~DissolveMain()
00026 {
00027 delete overlayer;
00028 }
00029
00030 char* DissolveMain::plugin_title() { return N_("Dissolve"); }
00031 int DissolveMain::is_video() { return 1; }
00032 int DissolveMain::is_transition() { return 1; }
00033 int DissolveMain::uses_gui() { return 0; }
00034
00035 NEW_PICON_MACRO(DissolveMain)
00036
00037
00038 int DissolveMain::process_realtime(VFrame *incoming, VFrame *outgoing)
00039 {
00040 fade = (float)PluginClient::get_source_position() /
00041 PluginClient::get_total_len();
00042
00043
00044 if(get_use_opengl())
00045 {
00046 run_opengl();
00047 return 0;
00048 }
00049
00050
00051 if(!overlayer) overlayer = new OverlayFrame(get_project_smp() + 1);
00052
00053
00054
00055
00056 switch (outgoing->get_color_model())
00057 {
00058 case BC_RGBA8888:
00059 case BC_YUVA8888:
00060 {
00061 uint8_t** data_rows = (uint8_t **)outgoing->get_rows();
00062 int w = outgoing->get_w();
00063 int h = outgoing->get_h();
00064 for(int i = 0; i < h; i++)
00065 {
00066 uint8_t* alpha_chan = data_rows[i] + 3;
00067 for(int j = 0; j < w; j++)
00068 {
00069 *alpha_chan = (uint8_t) (*alpha_chan * (1-fade));
00070 alpha_chan+=4;
00071 }
00072 }
00073 break;
00074 }
00075 case BC_YUVA16161616:
00076 {
00077 uint16_t** data_rows = (uint16_t **)outgoing->get_rows();
00078 int w = outgoing->get_w();
00079 int h = outgoing->get_h();
00080 for(int i = 0; i < h; i++)
00081 {
00082 uint16_t* alpha_chan = data_rows[i] + 3;
00083 for(int j = 0; j < w; j++)
00084 {
00085 *alpha_chan = (uint16_t)(*alpha_chan * (1-fade));
00086 alpha_chan += 8;
00087 }
00088 }
00089 break;
00090 }
00091 case BC_RGBA_FLOAT:
00092 {
00093 float** data_rows = (float **)outgoing->get_rows();
00094 int w = outgoing->get_w();
00095 int h = outgoing->get_h();
00096 for(int i = 0; i < h; i++)
00097 {
00098 float* alpha_chan = data_rows[i] + 3;
00099 for(int j = 0; j < w; j++)
00100 {
00101 *alpha_chan = *alpha_chan * (1-fade);
00102 alpha_chan += sizeof(float);
00103 }
00104 }
00105 break;
00106 }
00107 default:
00108 break;
00109 }
00110
00111
00112 overlayer->overlay(outgoing,
00113 incoming,
00114 0,
00115 0,
00116 incoming->get_w(),
00117 incoming->get_h(),
00118 0,
00119 0,
00120 incoming->get_w(),
00121 incoming->get_h(),
00122 fade,
00123 TRANSFER_NORMAL,
00124 NEAREST_NEIGHBOR);
00125
00126 return 0;
00127 }
00128
00129 int DissolveMain::handle_opengl()
00130 {
00131 #ifdef HAVE_GL
00132
00133
00134 get_input()->to_texture();
00135 get_output()->to_texture();
00136
00137
00138 get_output()->enable_opengl();
00139
00140 VFrame::init_screen(get_output()->get_w(), get_output()->get_h());
00141
00142
00143 get_output()->bind_texture(0);
00144
00145 glDisable(GL_BLEND);
00146 glColor4f(1, 1, 1, 1);
00147 get_output()->draw_texture();
00148
00149
00150 get_input()->bind_texture(0);
00151 glEnable(GL_BLEND);
00152 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00153 glColor4f(1, 1, 1, fade);
00154 get_input()->draw_texture();
00155
00156
00157 glDisable(GL_BLEND);
00158 get_output()->set_opengl_state(VFrame::SCREEN);
00159
00160
00161 #endif
00162 }