X-Git-Url: https://cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fpluginfclient.C;h=2d57743ca3447ef22473bc47fa698505879098cf;hb=fdf615e4b9eb6ce8faecc7f138c28edf0efac3be;hp=03ad7e25df9f1e7e8cbe51f310a8c9a45a9e36a5;hpb=0df48ad2d876409c5beeae2e21933a728ea76c33;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/pluginfclient.C b/cinelerra-5.1/cinelerra/pluginfclient.C index 03ad7e25..2d57743c 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; } @@ -637,11 +664,19 @@ PluginFClient::~PluginFClient() bool PluginFClient::is_audio(const AVFilter *fp) { if( !fp->outputs ) return 0; +#if LIBAVFILTER_VERSION_MINOR > 2 && LIBAVFILTER_VERSION_MAJOR > 7 + 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_MINOR > 2 && LIBAVFILTER_VERSION_MAJOR > 7 + 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; @@ -649,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_MINOR > 2 && LIBAVFILTER_VERSION_MAJOR > 7 + 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_MINOR > 2 && LIBAVFILTER_VERSION_MAJOR > 7 + 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; @@ -840,7 +883,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; @@ -884,7 +928,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); } @@ -907,14 +951,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) @@ -942,7 +994,7 @@ int PluginFAClient::process_buffer(int64_t size, Samples **buffer, int64_t start frame->format = AV_SAMPLE_FMT_FLTP; frame->channel_layout = (1<sample_rate = sample_rate; - frame->pts = local_to_edl(filter_position); + frame->pts = filter_position; } int retry = 10; @@ -1002,7 +1054,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) { } @@ -1041,11 +1095,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);