GstreamerカスタマイズMetaDataの使用

# 概要
ストリームに付属する情報である。

- 1 つはストリームタグで、技術とは無関係の方法でストリームの内容について記述したものです。たとえば、曲の作者、曲のタイトル、曲が含まれているアルバムなどがこれにあたります。
- もう 1 つのメタデータはストリーム情報で、ストリームのさまざまなプロパティに関する技術的記述です。

# 実装

## 処理流れ
MetaData追加(PluginA) -->  MetaData取得(PluginB) 
1. 追加:buffer転送関数（transform/transform_ip）でgst_buffer_add_meta追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/c4dbe5cd-8028-b954-95bc-bcb7733ff7ee.png)
2. 取得
 - buffer転送関数でGstMeta名前からGstMetaInfo取得（GstMeta名前：gstnvdsaudiotemplate_meta.hのgst_meta_registerで定義した名称。転送関数：transform/transform_ip）
 - 取得したGstMetaInfoからapiを使って、bufferと関連するmetaと取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/8001275e-bbc9-e7ef-b830-9f5867ba29d7.png)

## カスタマイズMetaData作成
カスタマイズのmetadataクラスの参考はdeepstreamサンプルです。（deepstream\deepstream-X.X\sources\gst-plugins\gst-nvdsaudiotemplate\includes\gstnvdsaudiotemplate_meta.h）

    #ifndef __GST_NVDSAUDIOTEMPLATE_META_H__
    #define __GST_NVDSAUDIOTEMPLATE_META_H__
    #include <stdio.h>
    GType gst_mpeg_video_meta_api_get_type (void);
    #define GST_AUDIO_TEMPLATE_META_API_TYPE  (gst_audio_template_meta_api_get_type())
    #define GST_AUDIO_TEMPLATE_META_INFO  (gst_audio_template_meta_get_info())
    #define CUSTOM_METADATA_TYPE 0x100
    #define CUSTOM_METADATA_SIZE 64

    typedef struct _GstAudio
    {
        GstMeta meta;
        guint frame_count;
        guint custom_metadata_type;
        guint custom_metadata_size;
        void *custom_metadata_ptr;
    }GstAudioTemplateMeta;


    static gboolean
        gst_audio_template_meta_transform (GstBuffer * dest, GstMeta * meta,
        GstBuffer * buffer, GQuark type, gpointer data);

    static gboolean
    gst_audio_template_meta_init (GstAudioTemplateMeta * audio_template_meta,
        gpointer params, GstBuffer * buffer)
    {
      audio_template_meta->custom_metadata_size = 0;
      audio_template_meta->custom_metadata_ptr = NULL;
      return TRUE;
    }

    static void
    gst_audio_template_meta_free (GstAudioTemplateMeta * audio_template_meta,
        GstBuffer * buffer)
    {
        if (audio_template_meta && audio_template_meta->custom_metadata_ptr)
        {
            //g_print ("freeing %p\n", audio_template_meta->custom_metadata_ptr);
            free (audio_template_meta->custom_metadata_ptr);
            audio_template_meta->custom_metadata_ptr = NULL;
        }
    }

    static gboolean
    gst_audio_template_meta_transform (GstBuffer * dest, GstMeta * meta,
        GstBuffer * buffer, GQuark type, gpointer data)
    {
        //TODO :
        printf("gst_audio_template_meta_transform\n");
        //GstAudioTemplateMeta *smeta = (GstAudioTemplateMeta *) meta;
        return TRUE;
    }

    GType
    gst_audio_template_meta_api_get_type (void)
    {
        static volatile GType type;
        static const gchar *tags[] = { "memory", NULL };      /* don't know what to set here */
        if (g_once_init_enter (&type)) {
            GType _type = gst_meta_api_type_register ("GstAudioTemplateMetaAPI", tags);
            g_once_init_leave (&type, _type);
        }
        printf("type = %ld\n",type);
        return type;
    }


    const GstMetaInfo *
    gst_audio_template_meta_get_info (void)
    {
        static const GstMetaInfo *audio_template_meta_info = NULL;

        if (g_once_init_enter ((GstMetaInfo **) & audio_template_meta_info))
        {
            const GstMetaInfo *meta = gst_meta_register (GST_AUDIO_TEMPLATE_META_API_TYPE,
                "GstAudioTemplateMeta", sizeof (GstAudioTemplateMeta),
                (GstMetaInitFunction) gst_audio_template_meta_init,
                (GstMetaFreeFunction) gst_audio_template_meta_free,
                (GstMetaTransformFunction) gst_audio_template_meta_transform);

            g_once_init_leave ((GstMetaInfo **) & audio_template_meta_info, (GstMetaInfo *) meta);
        }

        return audio_template_meta_info;
    }
    #endif /*__GST_NVDSAUDIOTEMPLATE_META_H__*/


# 参考
1. 日本語MetaData:http://oss.infoscience.co.jp/gstreamer/chapter-metadata.html
1. MetaData:https://gstreamer.freedesktop.org/documentation/gstreamer/gstmeta.html?gi-language=c