2016-11-16 81 views
0

私はgstreamer-1.0プラグインをcで書いています。 他の要素を通すことによって、あるプラグインから別のプラグインにパイプラインを通じてパラメータを渡す必要があります。私はメタデータを使用したい。私は "double"型の変数を送信するだけで、新しいメタデータとそのAPIを定義する必要はありません。私は既に定義されたメタデータのリストを検索しようとしましたが、何も見つかりませんでした。gstreamerメタデータの標準テンプレートは既に定義されていますか?

私の質問は これらの特性を持つメタデータがすでに定義されていますか?

+0

あなたが解決しようとする問題点を説明してきました。今あなたの質問は何ですか?何を試しましたか?あなたの試みはどうやって動いたのですか?最後に、何を試しましたか?あなたの試みはどのようにして行われましたか?そして[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)と、[最小限で完全で証明可能な例](http: /stackoverflow.com/help/mcve)。 –

答えて

0

私は残念なことに、あなたが元気づけることができる一般的なメタタイプは知らない。どのタイプのデータを渡したいのか、私たちと共有したい場合は、誰かが回避策を提案できる可能性があります。

ここでは、単純なGstClockTime値を渡すために行ったサンプルMeta APIを示します。その後

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; 
} 

メタデータを追加するには:

GstMetaMarking* meta = GST_META_MARKING_ADD(in); 
関連する問題