bool MovieDecoder::initFilterGraph(enum AVPixelFormat pixfmt, int width, int height) { AVFilterInOut *inputs = nullptr, *outputs = nullptr; deleteFilterGraph(); m_filterGraph = avfilter_graph_alloc(); QByteArray arguments("buffer="); arguments += "video_size=" + QByteArray::number(width) + "x" + QByteArray::number(height) + ":"; arguments += "pix_fmt=" + QByteArray::number(pixfmt) + ":"; arguments += "time_base=1/1:pixel_aspect=0/1[in];"; arguments += "[in]yadif[out];"; arguments += "[out]buffersink"; int ret = avfilter_graph_parse2(m_filterGraph, arguments.constData(), &inputs, &outputs); if (ret < 0) { qWarning() << "Unable to parse filter graph"; return false; } if(inputs || outputs) return -1; ret = avfilter_graph_config(m_filterGraph, nullptr); if (ret < 0) { qWarning() << "Unable to validate filter graph"; return false; } m_bufferSourceContext = avfilter_graph_get_filter(m_filterGraph, "Parsed_buffer_0"); m_bufferSinkContext = avfilter_graph_get_filter(m_filterGraph, "Parsed_buffersink_2"); if (!m_bufferSourceContext || !m_bufferSinkContext) { qWarning() << "Unable to get source or sink"; return false; } m_filterFrame = av_frame_alloc(); m_lastWidth = width; m_lastHeight = height; m_lastPixfmt = pixfmt; return true; }
FilterContext FilterGraph::filter(const string &name, error_code &ec) { clear_if(ec); if (!m_raw) { throws_if(ec, Errors::Unallocated); return FilterContext(); } AVFilterContext *ctx = avfilter_graph_get_filter(m_raw, name.c_str()); if (!ctx) return FilterContext(); return FilterContext(ctx); }
JNIEXPORT jlong JNICALL Java_org_jitsi_impl_neomedia_codec_FFmpeg_avfilter_1graph_1get_1filter (JNIEnv *env, jclass clazz, jlong graph, jstring name) { const char *name_ = (*env)->GetStringUTFChars(env, name, NULL); AVFilterContext *filter; if (name_) { filter = avfilter_graph_get_filter( (AVFilterGraph *) (intptr_t) graph, (char *) name_); (*env)->ReleaseStringUTFChars(env, name, name_); } else filter = NULL; return (jlong) (intptr_t) filter; }