X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fpluginfclient.C;h=2a35e96c7539c2039e2914471d1926502f9e484e;hb=2451d3174f3b64d3ce4e311b125813cf2881eca4;hp=6ff20fd9fbd800e27c3b114931c4176691fa79fe;hpb=28327674e68a9641ffc542190a95fad05e1023ac;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/pluginfclient.C b/cinelerra-5.1/cinelerra/pluginfclient.C index 6ff20fd9..2a35e96c 100644 --- a/cinelerra-5.1/cinelerra/pluginfclient.C +++ b/cinelerra-5.1/cinelerra/pluginfclient.C @@ -101,6 +101,13 @@ void PluginFClientConfig::initialize(const char *name) append(fopt); } } + if( (ffilt->filter->flags & AVFILTER_FLAG_SLICE_THREADS) != 0 ) { + opt = av_opt_find(ffilt->fctx, "threads", NULL, 0, 0); + if( opt ) { + PluginFClient_Opt *fopt = new PluginFClient_Opt(this, opt); + append(fopt); + } + } } int PluginFClientConfig::update() @@ -616,6 +623,13 @@ void PluginFClient::save_data(KeyFrame *keyframe) av_freep(&buf); } } + if( (config.ffilt->filter->flags & AVFILTER_FLAG_SLICE_THREADS) != 0 ) { + uint8_t *buf = 0; + if( av_opt_get(config.ffilt->fctx, "threads", 0, &buf) >= 0 && buf ) { + output.tag.set_property("threads", (const char *)buf); + av_freep(&buf); + } + } output.append_tag(); output.terminate_string(); @@ -624,7 +638,7 @@ void PluginFClient::save_data(KeyFrame *keyframe) void PluginFClient::read_data(KeyFrame *keyframe) { FileXML input; - char string[BCTEXTLEN], value[BCTEXTLEN]; + char string[BCTEXTLEN]; input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data())); while( !input.read_tag() ) { @@ -635,9 +649,12 @@ void PluginFClient::read_data(KeyFrame *keyframe) void *obj = config.filter_config(); const AVOption *opt = NULL; while( (opt=av_opt_next(obj, opt)) != 0 ) { - to_upper(string, opt->name); - if( !input.tag.get_property(string, value) ) continue; - av_opt_set(obj, opt->name, value, 0); + const char *v = input.tag.get_property(opt->name); + if( v ) av_opt_set(obj, opt->name, v, 0); + } + if( (config.ffilt->filter->flags & AVFILTER_FLAG_SLICE_THREADS) != 0 ) { + const char *v = input.tag.get_property("threads"); + if( v ) av_opt_set(config.ffilt->fctx, "threads", v, 0); } } } @@ -819,6 +836,11 @@ int PluginFAClient::process_buffer(int64_t size, Samples **buffer, int64_t start if( ret >= 0 ) { in_channels = get_inchannels(); out_channels = get_outchannels(); + frame->nb_samples = size; + frame->format = AV_SAMPLE_FMT_FLTP; + frame->channel_layout = (1<sample_rate = sample_rate; + frame->pts = local_to_edl(filter_position); } int retry = 10; @@ -829,11 +851,6 @@ int PluginFAClient::process_buffer(int64_t size, Samples **buffer, int64_t start for( int i=0; inb_samples = size; - frame->format = AV_SAMPLE_FMT_FLTP; - frame->channel_layout = (1<sample_rate = sample_rate; - frame->pts = local_to_edl(filter_position); ret = av_frame_get_buffer(frame, 0); if( ret < 0 ) break; float **in_buffers = (float **)&frame->extended_data[0]; @@ -985,23 +1002,35 @@ PluginFClient_Opt::~PluginFClient_Opt() delete item_value; } -char *PluginFClient_Opt::get(char *vp, int sz) +const char *PluginFClientConfig::get(const char *name) { - char *ret = 0; - void *obj = filter_config(); uint8_t *bp = 0; - if( av_opt_get(obj, opt->name, 0, &bp) >= 0 && bp != 0 ) { - const char *val = (const char *)bp; - ret = sz >= 0 ? strncpy(vp,val,sz) : strcpy(vp, val); - if( sz > 0 ) vp[sz-1] = 0; - av_freep(&bp); + if( av_opt_get(filter_config(), name, 0, &bp) >= 0 || + av_opt_get(ffilt->fctx, name, 0, &bp) >= 0 ) + return (const char *)bp; + return 0; +} +char *PluginFClient_Opt::get(char *vp, int sz) +{ + const char *val = conf->get(opt->name); + if( val ) { + strncpy(vp, val, sz); + vp[sz-1] = 0; } - return ret; + else + vp = 0; + av_freep(&val); + return vp; +} + +void PluginFClientConfig::set(const char *name, const char *val) +{ + if( av_opt_set(filter_config(), name, val, 0) < 0 ) + av_opt_set(ffilt->fctx, name, val, 0); } void PluginFClient_Opt::set(const char *val) { - void *obj = filter_config(); - av_opt_set(obj , opt->name, val, 0); + conf->set(opt->name, val); } void PluginFFilter::uninit() @@ -1016,13 +1045,14 @@ static int get_defaults(const char *name, char *args) FILE *fp = fopen(defaults_path,"r"); if( !fp ) return 0; char ff_plugin[BCSTRLEN], ff_args[BCTEXTLEN], *ap = 0; - while( !ap && fgets(ff_args, sizeof(ff_args), fp) ) { - if( *(ap=ff_args) == ';' ) continue; - if( *(ap=ff_args) == '#' ) ++ap; + while( fgets(ff_args, sizeof(ff_args), fp) ) { + char *cp = ff_args; + if( *cp == ';' ) continue; + if( *cp == '#' ) ++cp; char *bp = ff_plugin, *ep = bp + sizeof(ff_plugin)-1; - while( bp < ep && *ap && *ap != '\n' && *ap != ' ' ) *bp++ = *ap++; + while( bp < ep && *cp && *cp != '\n' && *cp != ' ' ) *bp++ = *cp++; *bp = 0; - if( strcmp(ff_plugin, name) ) ap = 0; + if( !strcmp(ff_plugin, name) ) { ap = cp; break; } } fclose(fp); if( !ap ) return 0; @@ -1059,9 +1089,16 @@ int PluginFFilter::init(const char *name, PluginFClientConfig *conf) static int inst = 0; char inst_name[BCSTRLEN]; sprintf(inst_name,"%s_%d", name, ++inst); - graph->thread_type = 0; - graph->nb_threads = 1; + if( conf && (filter->flags & AVFILTER_FLAG_SLICE_THREADS) != 0 ) { + graph->thread_type = AVFILTER_THREAD_SLICE; + graph->nb_threads = atoi(conf->get("threads")); + } + else { + graph->thread_type = 0; + graph->nb_threads = 0; + } fctx = avfilter_graph_alloc_filter(graph, filter, inst_name); + fctx->thread_type = graph->thread_type; // bug in avfilter if( !fctx ) return AVERROR(ENOMEM); if( conf ) { AVDictionary *opts = 0;