From 0a7d047b1f9fc43ecccec1eb52e0bafaf070a378 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 24 Apr 2012 10:09:57 +0200 Subject: [PATCH] video: Add GST_VIDEO_FORMAT_ENCODED --- gst-libs/gst/video/video-blend.c | 2 +- gst-libs/gst/video/video.c | 24 ++++++++++++++++++------ gst-libs/gst/video/video.h | 10 +++++----- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/gst-libs/gst/video/video-blend.c b/gst-libs/gst/video/video-blend.c index 140e2bbb79..e156ed4e80 100644 --- a/gst-libs/gst/video/video-blend.c +++ b/gst-libs/gst/video/video-blend.c @@ -231,7 +231,7 @@ fill_planes (GstBlendVideoFormatInfo * info) info->offset[1] = info->offset[2] + info->stride[1] * (GST_ROUND_UP_4 (height) / 4); break; - case GST_VIDEO_FORMAT_UNKNOWN: + default: GST_ERROR ("invalid format"); g_warning ("invalid format"); break; diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c index 1922832bbb..5cf9a75105 100644 --- a/gst-libs/gst/video/video.c +++ b/gst-libs/gst/video/video.c @@ -141,7 +141,6 @@ static VideoFormat formats[] = { {0x00000000, {GST_VIDEO_FORMAT_UNKNOWN, "UNKNOWN", "unknown video", 0, DPTH0, PSTR0, PLANE_NA, OFFS0}}, - MAKE_YUV_FORMAT (I420, "raw video", GST_MAKE_FOURCC ('I', '4', '2', '0'), DPTH888, PSTR111, PLANE012, OFFS0, SUB420), @@ -258,6 +257,8 @@ static VideoFormat formats[] = { MAKE_YUV_FORMAT (r210, "raw video", GST_MAKE_FOURCC ('r', '2', '1', '0'), DPTH10_10_10, PSTR444, PLANE0, OFFS0, SUB444), + {0x00000000, {GST_VIDEO_FORMAT_ENCODED, "ENCODED", "encoded video", + GST_VIDEO_FORMAT_FLAG_COMPLEX, DPTH0, PSTR0, PLANE_NA, OFFS0}}, }; /** @@ -1373,7 +1374,7 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps) GstStructure *structure; const gchar *s; GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; - gint width, height; + gint width = 0, height = 0; gint fps_n, fps_d; gint par_n, par_d; gboolean interlaced; @@ -1436,14 +1437,19 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps) } else if (depth == 16 && bpp == 16 && endianness == G_LITTLE_ENDIAN) { format = GST_VIDEO_FORMAT_GRAY16_LE; } - } + } else if (g_str_has_prefix (gst_structure_get_name (structure), "video/") || + g_str_has_prefix (gst_structure_get_name (structure), "image/")) + format = GST_VIDEO_FORMAT_ENCODED; if (format == GST_VIDEO_FORMAT_UNKNOWN) goto unknown_format; - if (!gst_structure_get_int (structure, "width", &width)) + /* width and height are mandatory, except for non-raw-formats */ + if (!gst_structure_get_int (structure, "width", &width) && + format != GST_VIDEO_FORMAT_ENCODED) goto no_width; - if (!gst_structure_get_int (structure, "height", &height)) + if (!gst_structure_get_int (structure, "height", &height) && + format != GST_VIDEO_FORMAT_ENCODED) goto no_height; gst_video_info_set_format (info, format, width, height); @@ -1557,6 +1563,10 @@ gst_video_info_to_caps (GstVideoInfo * info) if (GST_VIDEO_INFO_IS_YUV (info)) gst_caps_set_simple (caps, "format", GST_TYPE_FOURCC, gst_video_format_to_fourcc (info->finfo->format), NULL); + else if (GST_VIDEO_INFO_IS_RGB (info) || GST_VIDEO_INFO_IS_GRAY (info)) + gst_caps_set_simple (caps, "depth", G_TYPE_INT, + info->finfo->bits * GST_VIDEO_INFO_N_COMPONENTS (info), NULL); + gst_caps_set_simple (caps, "interlaced", G_TYPE_BOOLEAN, GST_VIDEO_INFO_IS_INTERLACED (info), NULL); @@ -1745,7 +1755,9 @@ fill_planes (GstVideoInfo * info) info->size = info->offset[2] + info->stride[2] * (GST_ROUND_UP_4 (height) / 4); break; - case GST_VIDEO_FORMAT_UNKNOWN: + default: + if (GST_VIDEO_FORMAT_INFO_IS_COMPLEX (info->finfo)) + break; GST_ERROR ("invalid format"); g_warning ("invalid format"); break; diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h index d1a19322d0..73e4b473ad 100644 --- a/gst-libs/gst/video/video.h +++ b/gst-libs/gst/video/video.h @@ -30,6 +30,7 @@ G_BEGIN_DECLS /** * GstVideoFormat: * @GST_VIDEO_FORMAT_UNKNOWN: Unknown or unset video format id + * @GST_VIDEO_FORMAT_ENCODED: Encoded video format * @GST_VIDEO_FORMAT_I420: planar 4:2:0 YUV * @GST_VIDEO_FORMAT_YV12: planar 4:2:0 YVU (like I420 but UV planes swapped) * @GST_VIDEO_FORMAT_YUY2: packed 4:2:2 YUV (Y0-U0-Y1-V0 Y2-U2-Y3-V2 Y4 ...) @@ -118,7 +119,8 @@ typedef enum { GST_VIDEO_FORMAT_IYU1, GST_VIDEO_FORMAT_ARGB64, GST_VIDEO_FORMAT_AYUV64, - GST_VIDEO_FORMAT_r210 + GST_VIDEO_FORMAT_r210, + GST_VIDEO_FORMAT_ENCODED } GstVideoFormat; #define GST_VIDEO_BYTE1_MASK_32 "0xFF000000" @@ -582,6 +584,7 @@ struct _GstVideoFormatInfo { #define GST_VIDEO_FORMAT_INFO_HAS_ALPHA(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_ALPHA) #define GST_VIDEO_FORMAT_INFO_IS_LE(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_LE) #define GST_VIDEO_FORMAT_INFO_HAS_PALETTE(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_PALETTE) +#define GST_VIDEO_FORMAT_INFO_IS_COMPLEX(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_COMPLEX) #define GST_VIDEO_FORMAT_INFO_BITS(info) ((info)->bits) #define GST_VIDEO_FORMAT_INFO_N_COMPONENTS(info) ((info)->n_components) @@ -616,8 +619,6 @@ const GstVideoFormatInfo * * are interlaced in one frame. * @GST_VIDEO_INTERLACE_MODE_MIXED: video contains both interlaced and * progressive frames, the buffer flags describe the frame and fields. - * @GST_VIDEO_INTERLACE_MODE_FIELDS: video is interlaced and fields are stored - * separately. Use the id property to get access to the required field. * * The possible values of the #GstVideoInterlaceMode describing the interlace * mode of the stream. @@ -625,8 +626,7 @@ const GstVideoFormatInfo * typedef enum { GST_VIDEO_INTERLACE_MODE_PROGRESSIVE = 0, GST_VIDEO_INTERLACE_MODE_INTERLEAVED, - GST_VIDEO_INTERLACE_MODE_MIXED, - GST_VIDEO_INTERLACE_MODE_FIELDS + GST_VIDEO_INTERLACE_MODE_MIXED } GstVideoInterlaceMode; /**