From 91ffe7dd5e2fbdae73c0402fb5ea71639bb35ec0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 19 Apr 2012 12:03:19 +0200 Subject: [PATCH] video: Clean up interlaced flags and enums There's a new GstVideoFrameFlags enum now that contains the frame specific flags only. GstVideoFlags does not contain the TFF/TFF/ONEFIELD flags anymore because these are strictly frame specific. Also add fallback to parse these fields from the GstBufferFlags in gst_video_frame_map() if there's no GstVideoMeta attached to the buffer. --- gst-libs/gst/video/gstvideometa.c | 24 ++++++++++++---------- gst-libs/gst/video/gstvideometa.h | 10 ++++----- gst-libs/gst/video/gstvideopool.c | 3 ++- gst-libs/gst/video/video.c | 15 +++++++++++--- gst-libs/gst/video/video.h | 34 ++++++++++++++++++------------- 5 files changed, 52 insertions(+), 34 deletions(-) diff --git a/gst-libs/gst/video/gstvideometa.c b/gst-libs/gst/video/gstvideometa.c index 2c970c6c7a..f8d14aafa9 100644 --- a/gst-libs/gst/video/gstvideometa.c +++ b/gst-libs/gst/video/gstvideometa.c @@ -39,8 +39,8 @@ gst_video_meta_transform (GstBuffer * dest, GstMeta * meta, dmeta->buffer = dest; GST_DEBUG ("copy video metadata"); - dmeta->flags = smeta->flags; dmeta->format = smeta->format; + dmeta->frame_flags = smeta->frame_flags; dmeta->id = smeta->id; dmeta->width = smeta->width; dmeta->height = smeta->height; @@ -164,8 +164,8 @@ default_unmap (GstVideoMeta * meta, guint plane, GstMapInfo * info) /** * gst_buffer_add_video_meta: * @buffer: a #GstBuffer - * @flags: #GstVideoFlags * @format: a #GstVideoFormat + * @frame_flags: #GstVideoFrameFlags * @width: the width * @height: the height * @@ -178,16 +178,18 @@ default_unmap (GstVideoMeta * meta, guint plane, GstMapInfo * info) * Returns: the #GstVideoMeta on @buffer. */ GstVideoMeta * -gst_buffer_add_video_meta (GstBuffer * buffer, GstVideoFlags flags, - GstVideoFormat format, guint width, guint height) +gst_buffer_add_video_meta (GstBuffer * buffer, + GstVideoFormat format, GstVideoFrameFlags frame_flags, guint width, + guint height) { GstVideoMeta *meta; GstVideoInfo info; gst_video_info_set_format (&info, format, width, height); - meta = gst_buffer_add_video_meta_full (buffer, flags, format, width, height, - info.finfo->n_planes, info.offset, info.stride); + meta = + gst_buffer_add_video_meta_full (buffer, format, frame_flags, width, + height, info.finfo->n_planes, info.offset, info.stride); return meta; } @@ -195,8 +197,8 @@ gst_buffer_add_video_meta (GstBuffer * buffer, GstVideoFlags flags, /** * gst_buffer_add_video_meta_full: * @buffer: a #GstBuffer - * @flags: #GstVideoFlags * @format: a #GstVideoFormat + * @frame_flags: #GstVideoFrameFlags * @width: the width * @height: the height * @n_planes: number of planes @@ -208,9 +210,9 @@ gst_buffer_add_video_meta (GstBuffer * buffer, GstVideoFlags flags, * Returns: the #GstVideoMeta on @buffer. */ GstVideoMeta * -gst_buffer_add_video_meta_full (GstBuffer * buffer, GstVideoFlags flags, - GstVideoFormat format, guint width, guint height, - guint n_planes, gsize offset[GST_VIDEO_MAX_PLANES], +gst_buffer_add_video_meta_full (GstBuffer * buffer, + GstVideoFormat format, GstVideoFrameFlags frame_flags, guint width, + guint height, guint n_planes, gsize offset[GST_VIDEO_MAX_PLANES], gint stride[GST_VIDEO_MAX_PLANES]) { GstVideoMeta *meta; @@ -219,8 +221,8 @@ gst_buffer_add_video_meta_full (GstBuffer * buffer, GstVideoFlags flags, meta = (GstVideoMeta *) gst_buffer_add_meta (buffer, GST_VIDEO_META_INFO, NULL); - meta->flags = flags; meta->format = format; + meta->frame_flags = frame_flags; meta->id = 0; meta->width = width; meta->height = height; diff --git a/gst-libs/gst/video/gstvideometa.h b/gst-libs/gst/video/gstvideometa.h index a9d77d7808..097d0a09c8 100644 --- a/gst-libs/gst/video/gstvideometa.h +++ b/gst-libs/gst/video/gstvideometa.h @@ -58,8 +58,8 @@ struct _GstVideoMeta { GstBuffer *buffer; - GstVideoFlags flags; GstVideoFormat format; + GstVideoFrameFlags frame_flags; gint id; guint width; guint height; @@ -79,10 +79,10 @@ const GstMetaInfo * gst_video_meta_get_info (void); #define gst_buffer_get_video_meta(b) ((GstVideoMeta*)gst_buffer_get_meta((b),GST_VIDEO_META_API_TYPE)) GstVideoMeta * gst_buffer_get_video_meta_id (GstBuffer *buffer, gint id); -GstVideoMeta * gst_buffer_add_video_meta (GstBuffer *buffer, GstVideoFlags flags, - GstVideoFormat format, guint width, guint height); -GstVideoMeta * gst_buffer_add_video_meta_full (GstBuffer *buffer, GstVideoFlags flags, - GstVideoFormat format, guint width, guint height, +GstVideoMeta * gst_buffer_add_video_meta (GstBuffer *buffer, GstVideoFormat format, + GstVideoFrameFlags frame_flags, guint width, guint height); +GstVideoMeta * gst_buffer_add_video_meta_full (GstBuffer *buffer, GstVideoFormat format, + GstVideoFrameFlags frame_flags, guint width, guint height, guint n_planes, gsize offset[GST_VIDEO_MAX_PLANES], gint stride[GST_VIDEO_MAX_PLANES]); diff --git a/gst-libs/gst/video/gstvideopool.c b/gst-libs/gst/video/gstvideopool.c index 6246d37f00..c0f9bad587 100644 --- a/gst-libs/gst/video/gstvideopool.c +++ b/gst-libs/gst/video/gstvideopool.c @@ -260,7 +260,8 @@ video_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, if (priv->add_videometa) { GST_DEBUG_OBJECT (pool, "adding GstVideoMeta"); - gst_buffer_add_video_meta_full (*buffer, 0, GST_VIDEO_INFO_FORMAT (info), + gst_buffer_add_video_meta_full (*buffer, GST_VIDEO_INFO_FORMAT (info), + GST_VIDEO_FRAME_FLAG_NONE, GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), GST_VIDEO_INFO_N_PLANES (info), info->offset, info->stride); } diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c index de66de5f15..2fe216f685 100644 --- a/gst-libs/gst/video/video.c +++ b/gst-libs/gst/video/video.c @@ -1030,12 +1030,15 @@ gst_video_frame_map_id (GstVideoFrame * frame, GstVideoInfo * info, else meta = gst_buffer_get_video_meta_id (buffer, id); + /* copy the info */ + frame->info = *info; + if (meta) { - frame->info.flags = meta->flags; frame->info.finfo = &formats[meta->format].info; frame->info.width = meta->width; frame->info.height = meta->height; frame->id = meta->id; + frame->frame_flags = meta->frame_flags; for (i = 0; i < info->finfo->n_planes; i++) gst_video_meta_map (meta, i, &frame->map[i], &frame->data[i], @@ -1046,9 +1049,15 @@ gst_video_frame_map_id (GstVideoFrame * frame, GstVideoInfo * info, if (id != -1) goto no_metadata; - /* copy the info */ - frame->info = *info; frame->id = id; + frame->frame_flags = 0; + + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_FLAG_TFF)) + frame->frame_flags |= GST_VIDEO_FRAME_FLAG_TFF; + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_FLAG_RFF)) + frame->frame_flags |= GST_VIDEO_FRAME_FLAG_RFF; + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_FLAG_ONEFIELD)) + frame->frame_flags |= GST_VIDEO_FRAME_FLAG_ONEFIELD; gst_buffer_map (buffer, &frame->map[0], flags); diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h index 226c589310..4699baa180 100644 --- a/gst-libs/gst/video/video.h +++ b/gst-libs/gst/video/video.h @@ -329,10 +329,6 @@ typedef enum { /** * GstVideoFlags: * @GST_VIDEO_FLAG_NONE: no flags - * @GST_VIDEO_FLAG_INTERLACED: The video is interlaced - * @GST_VIDEO_FLAG_TFF: The video has the top field first - * @GST_VIDEO_FLAG_RFF: The video has the repeat flag - * @GST_VIDEO_FLAG_ONEFIELD: one field * @GST_VIDEO_FLAG_VARIABLE_FPS: a variable fps is selected, fps_n and fps_d * denote the maximum fps of the video * @@ -340,11 +336,7 @@ typedef enum { */ typedef enum { GST_VIDEO_FLAG_NONE = 0, - GST_VIDEO_FLAG_INTERLACED = (1 << 0), - GST_VIDEO_FLAG_TFF = (1 << 1), - GST_VIDEO_FLAG_RFF = (1 << 2), - GST_VIDEO_FLAG_ONEFIELD = (1 << 3), - GST_VIDEO_FLAG_VARIABLE_FPS = (1 << 4) + GST_VIDEO_FLAG_VARIABLE_FPS = (1 << 0) } GstVideoFlags; /** @@ -601,6 +593,21 @@ gboolean gst_video_info_convert (GstVideoInfo *info, gint64 src_value, GstFormat dest_format, gint64 *dest_value); +/** + * GstVideoFrameFlags: + * @GST_VIDEO_FRAME_FLAG_NONE: no flags + * @GST_VIDEO_FRAME_FLAG_TFF: The video frame has the top field first + * @GST_VIDEO_FRAME_FLAG_RFF: The video frame has the repeat flag + * @GST_VIDEO_FRAME_FLAG_ONEFIELD: The video frame has one field + * + * Extra video frame flags + */ +typedef enum { + GST_VIDEO_FRAME_FLAG_NONE = 0, + GST_VIDEO_FRAME_FLAG_TFF = (1 << 0), + GST_VIDEO_FRAME_FLAG_RFF = (1 << 1), + GST_VIDEO_FRAME_FLAG_ONEFIELD = (1 << 2) +} GstVideoFrameFlags; /** * GstVideoFrame: @@ -616,6 +623,7 @@ gboolean gst_video_info_convert (GstVideoInfo *info, */ struct _GstVideoFrame { GstVideoInfo info; + GstVideoFrameFlags frame_flags; GstBuffer *buffer; gpointer meta; @@ -693,7 +701,6 @@ gboolean gst_video_frame_copy_plane (GstVideoFrame *dest, const GstVideoFr /** * GstVideoBufferFlags: - * @GST_VIDEO_BUFFER_FLAG_INTERLACED: Mark #GstBuffer as interlaced * @GST_VIDEO_BUFFER_FLAG_TFF: If the #GstBuffer is interlaced, then the first field * in the video frame is the top field. If unset, the * bottom field is first. @@ -707,10 +714,9 @@ gboolean gst_video_frame_copy_plane (GstVideoFrame *dest, const GstVideoFr * Additional video buffer flags. */ typedef enum { - GST_VIDEO_BUFFER_FLAG_INTERLACED = (GST_BUFFER_FLAG_LAST << 0), - GST_VIDEO_BUFFER_FLAG_TFF = (GST_BUFFER_FLAG_LAST << 1), - GST_VIDEO_BUFFER_FLAG_RFF = (GST_BUFFER_FLAG_LAST << 2), - GST_VIDEO_BUFFER_FLAG_ONEFIELD = (GST_BUFFER_FLAG_LAST << 3), + GST_VIDEO_BUFFER_FLAG_TFF = (GST_BUFFER_FLAG_LAST << 0), + GST_VIDEO_BUFFER_FLAG_RFF = (GST_BUFFER_FLAG_LAST << 1), + GST_VIDEO_BUFFER_FLAG_ONEFIELD = (GST_BUFFER_FLAG_LAST << 2), GST_VIDEO_BUFFER_FLAG_LAST = (GST_BUFFER_FLAG_LAST << 8) } GstVideoBufferFlags; -- 2.34.1