Получать сообщения шины gstreamer, используя нестатический обработчик сообщений

Функция:

public float simpleSimilarity(String u, String v) {
    String[] a = u.split(" ");
    String[] b = v.split(" ");

    long correct = 0;
    int minLen = Math.min(a.length, b.length);

    for (int i = 0; i < minLen; i++) {
        String aa = a[i];
        String bb = b[i];
        int minWordLength = Math.min(aa.length(), bb.length());

        for (int j = 0; j < minWordLength; j++) {
            if (aa.charAt(j) == bb.charAt(j)) {
                correct++;
            }
        }
    }

    return (float) (((double) correct) / Math.max(u.length(), v.length()));
}

Тест:

String a = "This is the first string.";

String b = "this is not 1st string!";

// for exact string comparison, use .equals

boolean exact = a.equals(b);

// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote

float similarity = simple_similarity(a,b);
0
задан RC0993 26 February 2019 в 07:28
поделиться

1 ответ

Я не думаю, что вы можете уйти с тем, что вы хотите. Сигнатура для GstBusFunc (), обратного вызова, предназначена для указателя на функцию, а не для указателя на функцию-член. Они разные вещи . (Я также потерпел неудачу с std :: bind, fwiw).

Я сделал нечто очень похожее на то, что вы описываете, но не совсем то же самое, но я выбрал другой подход, который может вам помочь. Вы можете использовать статический метод, но вы должны передать указатель на ваш класс конвейера в gst_bus_add_watch. Внутри вашего автобуса вы можете разыменовать указатель и вперед! Возможно, вам также потребуется реализовать какую-то схему блокировки.

class MyPipeline {

   GstElement *m_pipeline;

   public:

   MyPipeline(...);
   static void gboolean busCallback(GstBus *bus, GstMessage *msg, gpointer p);

}

MyPipeline::MyPipeline(...)
{
    // create pipeline...

    m_pipeline = ...;

    // bus callback, pass 'this' as arg for callback

    GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline));
    gst_bus_add_watch(bus, &MyPipeline::busCallback, this);
    gst_object_unref(bus);

    // ...
}

gboolean MyPipeline::busCallback(GstBus *, GstMessage *msg, gpointer p)
{

    // get lock if needed...

    // recover your class instance
    MyPipeline *myPipeline = (MyPipeline *)p;

    // do what you need to, free lock

    return TRUE;
}
0
ответ дан howlin_walleye 26 February 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: