X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fpluginfclient.C;h=f4d9ba3a48fe30a9cc874d1d6923d8d6230536b3;hp=fb0329dfcb593c70598ec8f52835927c12702b7e;hb=HEAD;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1 diff --git a/cinelerra-5.1/cinelerra/pluginfclient.C b/cinelerra-5.1/cinelerra/pluginfclient.C index fb0329df..b8694b12 100644 --- a/cinelerra-5.1/cinelerra/pluginfclient.C +++ b/cinelerra-5.1/cinelerra/pluginfclient.C @@ -1,3 +1,23 @@ +/* + * CINELERRA + * Copyright (C) 2016-2020 William Morrow + * + * 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 #include #include @@ -8,6 +28,7 @@ #include "bcwindowbase.h" #include "bctitle.h" #include "cstrdup.h" +#include "keys.h" #include "language.h" #include "mwindow.h" #include "pluginfclient.h" @@ -16,6 +37,8 @@ #include "vframe.h" #include "filexml.h" +#include "libavfilter/version.h" + #ifdef FFMPEG3 #define av_filter_iterate(p) ((*(const AVFilter**)(p))=avfilter_next(*(const AVFilter **)(p))) #endif @@ -186,6 +209,10 @@ PluginFClientText:: int PluginFClientText::handle_event() { + if( get_keypress() == RETURN ) { + fwin->update(); + activate(); + } return 0; } @@ -285,7 +312,7 @@ int PluginFClientPot::handle_event() } 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; } @@ -426,7 +453,7 @@ int PluginFClient_Opt::types(char *rp) case AV_OPT_TYPE_SAMPLE_FMT: cp = ""; break; case AV_OPT_TYPE_DURATION: cp = ""; break; case AV_OPT_TYPE_COLOR: cp = ""; break; - case AV_OPT_TYPE_CHANNEL_LAYOUT: cp = ""; break; + case AV_OPT_TYPE_CHLAYOUT: cp = ""; break; default: cp = ""; break; } return sprintf(rp, "%s", cp); @@ -522,7 +549,7 @@ const char *PluginFClient_Opt::tip() 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()); @@ -531,7 +558,7 @@ int PluginFClient_OptPanel::update() 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; @@ -543,41 +570,42 @@ PluginFClientWindow::~PluginFClientWindow() void PluginFClientWindow::create_objects() { + int xs8 = xS(8), xs10 = xS(10), ys10 = yS(10); 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)); - 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)); - x0 += title->get_w() + 8; + x0 += title->get_w() + xs8; 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)); - x0 += title->get_w() + 8; + x0 += title->get_w() + xs8; 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)); - y += title->get_h() + 10; + y += title->get_h() + ys10; 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(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)); - 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_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(); @@ -593,21 +621,22 @@ void PluginFClientWindow::draw() 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 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 x0 = units->get_x() + units->get_w() + 8; + int x0 = units->get_x() + units->get_w() + xs8; 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()); - 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; } @@ -635,11 +664,19 @@ PluginFClient::~PluginFClient() bool PluginFClient::is_audio(const AVFilter *fp) { if( !fp->outputs ) return 0; +#if LIBAVFILTER_VERSION_MAJOR > 8 + if( avfilter_filter_pad_count(fp, 1) > 1 ) return 0; +#else if( avfilter_pad_count(fp->outputs) > 1 ) return 0; +#endif if( !avfilter_pad_get_name(fp->outputs, 0) ) return 0; if( avfilter_pad_get_type(fp->outputs, 0) != AVMEDIA_TYPE_AUDIO ) return 0; if( !fp->inputs ) return 1; +#if LIBAVFILTER_VERSION_MAJOR > 8 + if( avfilter_filter_pad_count(fp, 0) > 1 ) return 0; +#else if( avfilter_pad_count(fp->inputs) > 1 ) return 0; +#endif if( !avfilter_pad_get_name(fp->inputs, 0) ) return 0; if( avfilter_pad_get_type(fp->inputs, 0) != AVMEDIA_TYPE_AUDIO ) return 0; return 1; @@ -647,11 +684,19 @@ bool PluginFClient::is_audio(const AVFilter *fp) bool PluginFClient::is_video(const AVFilter *fp) { if( !fp->outputs ) return 0; +#if LIBAVFILTER_VERSION_MAJOR > 8 + if( avfilter_filter_pad_count(fp, 1) > 1 ) return 0; +#else if( avfilter_pad_count(fp->outputs) > 1 ) return 0; +#endif if( !avfilter_pad_get_name(fp->outputs, 0) ) return 0; if( avfilter_pad_get_type(fp->outputs, 0) != AVMEDIA_TYPE_VIDEO ) return 0; if( !fp->inputs ) return 1; +#if LIBAVFILTER_VERSION_MAJOR > 8 + if( avfilter_filter_pad_count(fp, 0) > 1 ) return 0; +#else if( avfilter_pad_count(fp->inputs) > 1 ) return 0; +#endif if( !avfilter_pad_get_name(fp->inputs, 0) ) return 0; if( avfilter_pad_get_type(fp->inputs, 0) != AVMEDIA_TYPE_VIDEO ) return 0; return 1; @@ -800,16 +845,24 @@ int PluginFAClient::activate() } AVSampleFormat sample_fmt = AV_SAMPLE_FMT_FLTP; int channels = PluginClient::total_in_buffers; - uint64_t layout = (((uint64_t)1)<graph; int ret = !graph ? -1 : 0; if( ret >= 0 && ffilt->filter->inputs ) { char args[BCTEXTLEN]; snprintf(args, sizeof(args), - "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%jx", - 1, sample_rate, sample_rate, av_get_sample_fmt_name(sample_fmt), layout); + "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=%s:channels=%i", + 1, sample_rate, sample_rate, av_get_sample_fmt_name(sample_fmt), chLayoutDescription, channels); ret = avfilter_graph_create_filter(&fsrc, avfilter_get_by_name("abuffer"), "in", args, NULL, graph); + if(ret <0) printf("abuffer failed!\n"); } if( ret >= 0 ) ret = avfilter_graph_create_filter(&fsink, avfilter_get_by_name("abuffersink"), @@ -818,8 +871,8 @@ int PluginFAClient::activate() ret = av_opt_set_bin(fsink, "sample_fmts", (uint8_t*)&sample_fmt, sizeof(sample_fmt), AV_OPT_SEARCH_CHILDREN); if( ret >= 0 ) - ret = av_opt_set_bin(fsink, "channel_layouts", - (uint8_t*)&layout, sizeof(layout), AV_OPT_SEARCH_CHILDREN); + ret = av_opt_set(fsink, "ch_layouts", + chLayoutDescription, AV_OPT_SEARCH_CHILDREN); if( ret >= 0 ) ret = av_opt_set_bin(fsink, "sample_rates", (uint8_t*)&sample_rate, sizeof(sample_rate), AV_OPT_SEARCH_CHILDREN); @@ -838,7 +891,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, - 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; @@ -882,7 +936,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", - 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); } @@ -905,14 +959,22 @@ int PluginFAClient::get_inchannels() { AVFilterContext *fctx = ffilt->fctx; AVFilterLink **links = !fctx->nb_inputs ? 0 : fctx->inputs; +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59,24,100) + return !links ? 0 : links[0]->ch_layout.nb_channels; +#else return !links ? 0 : links[0]->channels; +#endif } int PluginFAClient::get_outchannels() { AVFilterContext *fctx = ffilt->fctx; AVFilterLink **links = !fctx->nb_outputs ? 0 : fctx->outputs; +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59,24,100) + return !links ? 0 : links[0]->ch_layout.nb_channels; +#else return !links ? 0 : links[0]->channels; +#endif } int PluginFAClient::process_buffer(int64_t size, Samples **buffer, int64_t start_position, int sample_rate) @@ -936,11 +998,21 @@ int PluginFAClient::process_buffer(int64_t size, Samples **buffer, int64_t start if( ret >= 0 ) { in_channels = get_inchannels(); out_channels = get_outchannels(); +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59,24,100) + AVChannelLayout in_ch_layout; + AVFilterContext *fctx = ffilt->fctx; + AVFilterLink **links = !fctx->nb_outputs ? 0 : fctx->outputs; + av_channel_layout_copy(&in_ch_layout, &links[0]->ch_layout); +#endif frame->nb_samples = size; frame->format = AV_SAMPLE_FMT_FLTP; +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61,3,100) + av_channel_layout_copy(&frame->ch_layout, &in_ch_layout); +#else frame->channel_layout = (1<sample_rate = sample_rate; - frame->pts = local_to_edl(filter_position); + frame->pts = filter_position; } int retry = 10; @@ -1000,7 +1072,9 @@ int PluginFAClient::process_buffer(int64_t size, Samples **buffer, int64_t start PluginFVClient::PluginFVClient(PluginServer *server, const char *name) - : PluginVClient(server), PluginFClient(this, name) + : PluginVClient(server), + PluginFClient(this, name), + FFVideoConvert(server->preferences) { } @@ -1039,11 +1113,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; } - 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->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);