2016-11-16 7 views
0

Ich schreibe ein gstreamer-1.0 Plugin in c. Ich würde einen Parameter durch die Pipeline von einem Plugin zu einem anderen durch Passieren anderer Elemente übergeben müssen. Ich möchte Metadaten verwenden. Ich muss nur eine Variable vom Typ "Double" übertragen und möchte vermeiden, dass ich neue Metadaten und deren API definieren muss. Ich habe versucht, eine Liste von bereits definierten Metadaten zu durchsuchen, aber noch nichts gefunden.Es ist bereits eine Standardvorlage von gstreamer Metadaten definiert?

Meine Frage ist: Gibt es bereits Metadaten mit diesen Eigenschaften?

+0

Sie das Problem, das Sie zu lösen versuchen beschrieben haben. Nun, was ist deine Frage? Was hast du probiert? Wie hat dein Versuch funktioniert oder nicht funktioniert? Zuletzt, was hast du probiert? Wie hat oder hat dein Versuch funktioniert? Und bitte [lesen Sie, wie Sie gute Fragen stellen können] (http://stackoverflow.com/help/how-to-ask), und erfahren Sie, wie Sie ein [minimales, vollständiges und verifizierbares Beispiel] erstellen können (http://stackoverflow.com/help/mcve). –

Antwort

0

Ich kenne keinen generischen Meta-Typ, auf den Sie leider zurückgreifen könnten. Wenn Sie uns mitteilen möchten, welche Art von Daten Sie weitergeben möchten, kann Ihnen jemand eine Umgehungslösung vorschlagen.

Hier ist eine Beispiel-Meta-API, die wir getan haben, um einen einfachen GstClockTime-Wert zu übergeben.

gstmark.h

#ifndef __GST_MARK_H__ 
#define __GST_MARK_H__ 

#include <gst/gst.h> 
#include <gst/gstmeta.h> 

G_BEGIN_DECLS 

typedef struct _GstMetaMarking GstMetaMarking; 

struct _GstMetaMarking { 
    GstMeta meta; 
    GstClockTime in_timestamp; 
}; 

GType gst_meta_marking_api_get_type (void); 
const GstMetaInfo* gst_meta_marking_get_info (void); 
#define GST_META_MARKING_GET(buf) ((GstMetaMarking *)gst_buffer_get_meta(buf,gst_meta_marking_api_get_type())) 
#define GST_META_MARKING_ADD(buf) ((GstMetaMarking *)gst_buffer_add_meta(buf,gst_meta_marking_get_info(),(gpointer)NULL)) 

G_END_DECLS 

#endif 

gstmark.c

#include "gstmark.h" 

GType 
gst_meta_marking_api_get_type (void) 
{ 
    static volatile GType type; 
    static const gchar *tags[] = { NULL }; 

    if (g_once_init_enter (&type)) { 
    GType _type = gst_meta_api_type_register ("GstMetaMarkingAPI", tags); 
    g_once_init_leave (&type, _type); 
    } 
    return type; 
} 

gboolean 
gst_meta_marking_init(GstMeta *meta, gpointer params, GstBuffer *buffer) 
{ 
    GstMetaMarking* marking_meta = (GstMetaMarking*)meta; 

    marking_meta->in_timestamp = GST_CLOCK_TIME_NONE; 

    return TRUE; 
} 

gboolean 
gst_meta_marking_transform (GstBuffer *dest_buf, 
          GstMeta *src_meta, 
          GstBuffer *src_buf, 
          GQuark type, 
          gpointer data) { 
    GstMeta* dest_meta = GST_META_MARKING_ADD(dest_buf); 

    GstMetaMarking* src_meta_marking = (GstMetaMarking*)src_meta; 
    GstMetaMarking* dest_meta_marking = (GstMetaMarking*)dest_meta; 

    dest_meta_marking->in_timestamp = src_meta_marking->in_timestamp; 

    return TRUE; 
} 

void 
gst_meta_marking_free (GstMeta *meta, GstBuffer *buffer) { 
} 

const GstMetaInfo * 
gst_meta_marking_get_info (void) 
{ 
    static const GstMetaInfo *meta_info = NULL; 

    if (g_once_init_enter (&meta_info)) { 
    const GstMetaInfo *meta = 
     gst_meta_register (gst_meta_marking_api_get_type(), "GstMetaMarking", 
     sizeof (GstMetaMarking), (GstMetaInitFunction)gst_meta_marking_init, 
     (GstMetaFreeFunction)gst_meta_marking_free, (GstMetaTransformFunction) gst_meta_marking_transform); 
    g_once_init_leave (&meta_info, meta); 
    } 
    return meta_info; 
} 

dann die Metadaten hinzuzufügen:

GstMetaMarking* meta = GST_META_MARKING_ADD(in); 
Verwandte Themen