From 3c915afc392e6caf0806b30a38b1278ae53ae07a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 9 Aug 2012 16:02:15 +0200 Subject: [PATCH] videoencoder: Add API to conveniently handle tags --- gst-libs/gst/video/gstvideoencoder.c | 48 ++++++++++++++++++++++++++++++++++++ gst-libs/gst/video/gstvideoencoder.h | 5 ++++ 2 files changed, 53 insertions(+) diff --git a/gst-libs/gst/video/gstvideoencoder.c b/gst-libs/gst/video/gstvideoencoder.c index 85a8a8d..013af31 100644 --- a/gst-libs/gst/video/gstvideoencoder.c +++ b/gst-libs/gst/video/gstvideoencoder.c @@ -166,6 +166,9 @@ struct _GstVideoEncoderPrivate GstAllocator *allocator; GstAllocationParams params; + + GstTagList *tags; + gboolean tags_changed; }; typedef struct _ForcedKeyUnitEvent ForcedKeyUnitEvent; @@ -341,6 +344,11 @@ gst_video_encoder_reset (GstVideoEncoder * encoder) gst_video_codec_state_unref (priv->output_state); priv->output_state = NULL; + if (priv->tags) + gst_tag_list_unref (priv->tags); + priv->tags = NULL; + priv->tags_changed = FALSE; + GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder); } @@ -1634,6 +1642,12 @@ gst_video_encoder_finish_frame (GstVideoEncoder * encoder, break; } + if (priv->tags && priv->tags_changed) { + gst_video_encoder_push_event (encoder, + gst_event_new_tag (gst_tag_list_ref (priv->tags))); + priv->tags_changed = FALSE; + } + /* no buffer data means this frame is skipped/dropped */ if (!frame->output_buffer) { GST_DEBUG_OBJECT (encoder, "skipping frame %" GST_TIME_FORMAT, @@ -1962,3 +1976,37 @@ gst_video_encoder_get_frame (GstVideoEncoder * encoder, int frame_number) return frame; } + +/** + * gst_video_encoder_merge_tags: + * @encoder: a #GstVideoEncoder + * @tags: a #GstTagList to merge + * @mode: the #GstTagMergeMode to use + * + * Adds tags to so-called pending tags, which will be processed + * before pushing out data downstream. + * + * Note that this is provided for convenience, and the subclass is + * not required to use this and can still do tag handling on its own. + * + * MT safe. + */ +void +gst_video_encoder_merge_tags (GstVideoEncoder * encoder, + const GstTagList * tags, GstTagMergeMode mode) +{ + GstTagList *otags; + + g_return_if_fail (GST_IS_VIDEO_ENCODER (encoder)); + g_return_if_fail (tags == NULL || GST_IS_TAG_LIST (tags)); + + GST_VIDEO_ENCODER_STREAM_LOCK (encoder); + if (tags) + GST_DEBUG_OBJECT (encoder, "merging tags %" GST_PTR_FORMAT, tags); + otags = encoder->priv->tags; + encoder->priv->tags = gst_tag_list_merge (encoder->priv->tags, tags, mode); + if (otags) + gst_tag_list_unref (otags); + encoder->priv->tags_changed = TRUE; + GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder); +} diff --git a/gst-libs/gst/video/gstvideoencoder.h b/gst-libs/gst/video/gstvideoencoder.h index 1f71507..933e080 100644 --- a/gst-libs/gst/video/gstvideoencoder.h +++ b/gst-libs/gst/video/gstvideoencoder.h @@ -293,6 +293,11 @@ void gst_video_encoder_get_latency (GstVideoEncoder *encoder, void gst_video_encoder_set_headers (GstVideoEncoder *encoder, GList *headers); + +void gst_video_encoder_merge_tags (GstVideoEncoder *encoder, + const GstTagList *tags, + GstTagMergeMode mode); + G_END_DECLS #endif -- 2.7.4