+/*
+ * 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 <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#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
}
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;
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;
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;
{
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)