Andrew has fixed Export EDL for CMX3600 output
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / pluginfclient.C
index fb0329dfcb593c70598ec8f52835927c12702b7e..f4d9ba3a48fe30a9cc874d1d6923d8d6230536b3 100644 (file)
@@ -8,6 +8,7 @@
 #include "bcwindowbase.h"
 #include "bctitle.h"
 #include "cstrdup.h"
 #include "bcwindowbase.h"
 #include "bctitle.h"
 #include "cstrdup.h"
+#include "keys.h"
 #include "language.h"
 #include "mwindow.h"
 #include "pluginfclient.h"
 #include "language.h"
 #include "mwindow.h"
 #include "pluginfclient.h"
@@ -186,6 +187,10 @@ PluginFClientText::
 
 int PluginFClientText::handle_event()
 {
 
 int PluginFClientText::handle_event()
 {
+       if( get_keypress() == RETURN ) {
+               fwin->update();
+               activate();
+       }
        return 0;
 }
 
        return 0;
 }
 
@@ -285,7 +290,7 @@ int PluginFClientPot::handle_event()
 }
 
 PluginFClientSlider::PluginFClientSlider(PluginFClientWindow *fwin, int x, int y)
 }
 
 PluginFClientSlider::PluginFClientSlider(PluginFClientWindow *fwin, int x, int y)
- : BC_FSlider(x, y, 0, fwin->get_w()-x-20, fwin->get_w()-x-20, 0.f, 0.f, 0.f)
+ : BC_FSlider(x, y, 0, fwin->get_w()-x-xS(20), fwin->get_w()-x-xS(20), 0.f, 0.f, 0.f)
 {
        this->fwin = fwin;
 }
 {
        this->fwin = fwin;
 }
@@ -522,7 +527,7 @@ const char *PluginFClient_Opt::tip()
 int PluginFClient_OptPanel::update()
 {
        const char *cols[] = { "option", "value", };
 int PluginFClient_OptPanel::update()
 {
        const char *cols[] = { "option", "value", };
-       const int col1_w = 150;
+       const int col1_w = xS(150);
        int wids[] = { col1_w, get_w()-col1_w };
        BC_ListBox::update(&items[0], &cols[0], &wids[0], sizeof(items)/sizeof(items[0]),
                get_xposition(), get_yposition(), get_highlighted_item());
        int wids[] = { col1_w, get_w()-col1_w };
        BC_ListBox::update(&items[0], &cols[0], &wids[0], sizeof(items)/sizeof(items[0]),
                get_xposition(), get_yposition(), get_highlighted_item());
@@ -531,7 +536,7 @@ int PluginFClient_OptPanel::update()
 
 
 PluginFClientWindow::PluginFClientWindow(PluginFClient *ffmpeg)
 
 
 PluginFClientWindow::PluginFClientWindow(PluginFClient *ffmpeg)
- : PluginClientWindow(ffmpeg->plugin, 600, 300, 600, 300, 1)
+ : PluginClientWindow(ffmpeg->plugin, xS(600), yS(300), xS(600), yS(300), 1)
 {
        this->ffmpeg = ffmpeg;
        this->selected = 0;
 {
        this->ffmpeg = ffmpeg;
        this->selected = 0;
@@ -543,41 +548,42 @@ PluginFClientWindow::~PluginFClientWindow()
 
 void PluginFClientWindow::create_objects()
 {
 
 void PluginFClientWindow::create_objects()
 {
+       int xs8 = xS(8), xs10 = xS(10), ys10 = yS(10);
        char string[BCTEXTLEN];
        BC_Title *title;
        char string[BCTEXTLEN];
        BC_Title *title;
-       int x = 10, y = 10;
+       int x = xs10, y = ys10;
        const char *descr = ffmpeg->config.ffilt->description();
        if( !descr ) descr = ffmpeg->config.ffilt->filter_name();
        add_subwindow(title = new BC_Title(x, y, descr));
        const char *descr = ffmpeg->config.ffilt->description();
        if( !descr ) descr = ffmpeg->config.ffilt->filter_name();
        add_subwindow(title = new BC_Title(x, y, descr));
-       y += title->get_h() + 10;
+       y += title->get_h() + ys10;
        int x0 = x;
        sprintf(string, _("Type: "));
        add_subwindow(title = new BC_Title(x0, y, string));
        int x0 = x;
        sprintf(string, _("Type: "));
        add_subwindow(title = new BC_Title(x0, y, string));
-       x0 += title->get_w() + 8;
+       x0 += title->get_w() + xs8;
        add_subwindow(type = new BC_Title(x0, y, (char *)""));
        add_subwindow(type = new BC_Title(x0, y, (char *)""));
-       x0 = x + 150;
+       x0 = x + xS(150);
        sprintf(string, _("Range: "));
        add_subwindow(title = new BC_Title(x0, y, string));
        sprintf(string, _("Range: "));
        add_subwindow(title = new BC_Title(x0, y, string));
-       x0 += title->get_w() + 8;
+       x0 += title->get_w() + xs8;
        add_subwindow(range = new BC_Title(x0, y, (char *)""));
        add_subwindow(range = new BC_Title(x0, y, (char *)""));
-       int x1 = get_w() - BC_GenericButton::calculate_w(this, _("Reset")) - 8;
+       int x1 = get_w() - BC_GenericButton::calculate_w(this, _("Reset")) - xs8;
        add_subwindow(reset = new PluginFClientReset(this, x1, y));
        add_subwindow(reset = new PluginFClientReset(this, x1, y));
-       y += title->get_h() + 10;
+       y += title->get_h() + ys10;
        x0 = x;
        x0 = x;
-       add_subwindow(units = new PluginFClientUnits(this, x0, y, 120));
-       x0 += units->get_w() + 8;
-       x1 = get_w() - BC_GenericButton::calculate_w(this, _("Apply")) - 8;
+       add_subwindow(units = new PluginFClientUnits(this, x0, y, xS(120)));
+       x0 += units->get_w() + xs8;
+       x1 = get_w() - BC_GenericButton::calculate_w(this, _("Apply")) - xs8;
        add_subwindow(apply = new PluginFClientApply(this, x1, y));
        add_subwindow(apply = new PluginFClientApply(this, x1, y));
-       add_subwindow(text = new PluginFClientText(this, x0, y, x1-x0 - 8));
-       y += title->get_h() + 10;
+       add_subwindow(text = new PluginFClientText(this, x0, y, x1-x0 - xs8));
+       y += title->get_h() + ys10;
        add_subwindow(pot = new PluginFClientPot(this, x, y));
        add_subwindow(pot = new PluginFClientPot(this, x, y));
-       x1 = x + pot->get_w() + 10;
-       add_subwindow(slider = new PluginFClientSlider(this, x1, y+10));
-       y += pot->get_h() + 10;
+       x1 = x + pot->get_w() + xs10;
+       add_subwindow(slider = new PluginFClientSlider(this, x1, y+ys10));
+       y += pot->get_h() + ys10;
 
        panel_x = x;  panel_y = y;
 
        panel_x = x;  panel_y = y;
-       panel_w = get_w()-10 - panel_x;
-       panel_h = get_h()-10 - panel_y;
+       panel_w = get_w()-xs10 - panel_x;
+       panel_h = get_h()-ys10 - panel_y;
        panel = new PluginFClient_OptPanel(this, panel_x, panel_y, panel_w, panel_h);
        add_subwindow(panel);
        panel->create_objects();
        panel = new PluginFClient_OptPanel(this, panel_x, panel_y, panel_w, panel_h);
        add_subwindow(panel);
        panel->create_objects();
@@ -593,21 +599,22 @@ void PluginFClientWindow::draw()
 
 int PluginFClientWindow::resize_event(int w, int h)
 {
 
 int PluginFClientWindow::resize_event(int w, int h)
 {
-       int x = get_w() - BC_GenericButton::calculate_w(this, _("Reset")) - 8;
+       int xs8 = xS(8), xs10 = xS(10), ys10 = yS(10);
+       int x = get_w() - BC_GenericButton::calculate_w(this, _("Reset")) - xs8;
        int y = reset->get_y();
        reset->reposition_window(x, y);
        int y = reset->get_y();
        reset->reposition_window(x, y);
-       int x1 = get_w() - BC_GenericButton::calculate_w(this, _("Apply")) - 8;
+       int x1 = get_w() - BC_GenericButton::calculate_w(this, _("Apply")) - xs8;
        int y1 = units->get_y();
        apply->reposition_window(x1, y1);
        int y1 = units->get_y();
        apply->reposition_window(x1, y1);
-       int x0 = units->get_x() + units->get_w() + 8;
+       int x0 = units->get_x() + units->get_w() + xs8;
        int y0 = units->get_y();
        int y0 = units->get_y();
-       text->reposition_window(x0,y0, x1-x0-8);
-       x1 = pot->get_x() + pot->get_w() + 10;
-       int w1 = w - slider->get_x() - 20;
+       text->reposition_window(x0,y0, x1-x0-xs8);
+       x1 = pot->get_x() + pot->get_w() + xs10;
+       int w1 = w - slider->get_x() - xS(20);
        slider->set_pointer_motion_range(w1);
        slider->reposition_window(x1, slider->get_y(), w1, slider->get_h());
        slider->set_pointer_motion_range(w1);
        slider->reposition_window(x1, slider->get_y(), w1, slider->get_h());
-       panel_w = get_w()-10 - panel_x;
-       panel_h = get_h()-10 - panel_y;
+       panel_w = get_w()-xs10 - panel_x;
+       panel_h = get_h()-ys10 - panel_y;
        panel->reposition_window(panel_x,panel_y, panel_w, panel_h);
        return 1;
 }
        panel->reposition_window(panel_x,panel_y, panel_w, panel_h);
        return 1;
 }
@@ -838,7 +845,8 @@ static AVRational best_frame_rate(double frame_rate)
        static const int m1 = 1001*12, m2 = 1000*12;
        static const int freqs[] = {
                40*m1, 48*m1, 50*m1, 60*m1, 80*m1,120*m1, 240*m1,
        static const int m1 = 1001*12, m2 = 1000*12;
        static const int freqs[] = {
                40*m1, 48*m1, 50*m1, 60*m1, 80*m1,120*m1, 240*m1,
-               24*m2, 30*m2, 60*m2, 12*m2, 15*m2, 48*m2, 0,
+               24*m2, 30*m2, 60*m2, 12*m2, 15*m2, 48*m2, 90*m2,
+               100*m2, 120*m2, 144*m2, 72*m2, 0,
        };
        double max_err = 1.;
        int freq, best_freq = 0;
        };
        double max_err = 1.;
        int freq, best_freq = 0;
@@ -882,7 +890,7 @@ int PluginFVClient::activate(int width, int height, int color_model)
                char args[BCTEXTLEN];
                snprintf(args, sizeof(args),
                        "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
                char args[BCTEXTLEN];
                snprintf(args, sizeof(args),
                        "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
-                       width, height, pix_fmt, best_rate.num, best_rate.den, aspect_w, aspect_h);
+                       width, height, pix_fmt, best_rate.den, best_rate.num, aspect_w, aspect_h);
                ret = avfilter_graph_create_filter(&fsrc, avfilter_get_by_name("buffer"),
                        "in", args, NULL, graph);
        }
                ret = avfilter_graph_create_filter(&fsrc, avfilter_get_by_name("buffer"),
                        "in", args, NULL, graph);
        }
@@ -940,7 +948,7 @@ int PluginFAClient::process_buffer(int64_t size, Samples **buffer, int64_t start
                frame->format = AV_SAMPLE_FMT_FLTP;
                frame->channel_layout = (1<<in_channels)-1;
                frame->sample_rate = sample_rate;
                frame->format = AV_SAMPLE_FMT_FLTP;
                frame->channel_layout = (1<<in_channels)-1;
                frame->sample_rate = sample_rate;
-               frame->pts = local_to_edl(filter_position);
+               frame->pts = filter_position;
        }
 
        int retry = 10;
        }
 
        int retry = 10;
@@ -1000,7 +1008,9 @@ int PluginFAClient::process_buffer(int64_t size, Samples **buffer, int64_t start
 
 
 PluginFVClient::PluginFVClient(PluginServer *server, const char *name)
 
 
 PluginFVClient::PluginFVClient(PluginServer *server, const char *name)
- : PluginVClient(server), PluginFClient(this, name)
+ : PluginVClient(server),
+   PluginFClient(this, name),
+   FFVideoConvert(server->preferences)
 {
 }
 
 {
 }
 
@@ -1039,11 +1049,11 @@ int PluginFVClient::process_buffer(VFrame **frames, int64_t position, double fra
                ret = av_buffersink_get_frame(fsink, frame);
                if( ret >= 0 || ret != AVERROR(EAGAIN) ) break;
                if( !fsrc ) { ret = AVERROR(EIO);  break; }
                ret = av_buffersink_get_frame(fsink, frame);
                if( ret >= 0 || ret != AVERROR(EAGAIN) ) break;
                if( !fsrc ) { ret = AVERROR(EIO);  break; }
-               read_frame(vframe, 0, filter_position++, frame_rate, 0);
+               read_frame(vframe, 0, filter_position, frame_rate, 0);
                frame->format = pix_fmt;
                frame->width  = width;
                frame->height = height;
                frame->format = pix_fmt;
                frame->width  = width;
                frame->height = height;
-               frame->pts = local_to_edl(position);
+               frame->pts = filter_position++;
                ret = av_frame_get_buffer(frame, 32);
                if( ret < 0 ) break;
                ret = transfer_pixfmt(vframe, frame);
                ret = av_frame_get_buffer(frame, 32);
                if( ret < 0 ) break;
                ret = transfer_pixfmt(vframe, frame);