video: update interlace caps and docs

Remove interlaced boolean from caps and replace with an interlace-mode enum.
document this new property in the video caps document. With the enum we can
put fields into separate video meta.
Add enum for this interlace-mode in the VideoInfo.
Update the buffer flags.
This commit is contained in:
Wim Taymans 2011-12-19 18:03:45 +01:00
parent 81d351b5f0
commit 6241ff63f8
3 changed files with 97 additions and 24 deletions

View file

@ -16,12 +16,43 @@ Media Types
For variable framerates this would be the maximum framerate that For variable framerates this would be the maximum framerate that
is expected. This value is only valid when the framerate is 0/1 is expected. This value is only valid when the framerate is 0/1
pixel-aspect-ratio, GST_TYPE_FRACTION, default 1/1
The pixel aspect ration of the video
views, G_TYPE_INT, default 1 views, G_TYPE_INT, default 1
The number of views for multiview video. Each buffer contains The number of views for multiview video. Each buffer contains
multiple GstMetaVideo buffers that describe each view. multiple GstMetaVideo buffers that describe each view. use the frame id to
get access to the different views.
interlace-mode, G_TYPE_STRING, default progressive
The interlace mode. The following values are possible:
"progressive" : all frames are progressive
"interleaved" : 2 fields are interleaved in one video frame. Extra buffer
flags describe the field order.
"mixed" : progressive and interleaved frames, extra buffer flags describe
the frame and fields.
"fields" : 2 fields are stored in one buffer, use the frame ID
to get access to the required field. For multiview (the
views property > 1) the second field of view N is at N * 2.
Each view has only half the amount of lines as noted in the
height property, pads specifying the "fields" property
must be prepared for this.
chroma-site, G_TYPE_STRING, default UNKNOWN
The chroma siting of the video frames.
"jpeg" : GST_VIDEO_CHROMA_SITE_JPEG
"mpeg2": GST_VIDEO_CHROMA_SITE_MPEG2
"dv" : GST_VIDEO_CHROMA_SITE_DV
colorimetry, G_TYPE_STRING, default UNKNOWN
The colorimetry of the video frames predefined colorimetry is given with
the following values:
"bt601"
"bt709"
"smpte240m"
pixel-aspect-ratio, GST_TYPE_FRACTION, default 1/1
The pixel aspect ration of the video
format, G_TYPE_STRING, mandatory format, G_TYPE_STRING, mandatory
The format of the video The format of the video

View file

@ -647,6 +647,33 @@ gst_video_info_set_format (GstVideoInfo * info, GstVideoFormat format,
fill_planes (info); fill_planes (info);
} }
static const gchar *interlace_mode[] = {
"progressive",
"interleaved",
"mixed",
"fields"
};
static const gchar *
gst_interlace_mode_to_string (GstVideoInterlaceMode mode)
{
if (mode < 0 || mode >= G_N_ELEMENTS (interlace_mode))
return NULL;
return interlace_mode[mode];
}
static GstVideoInterlaceMode
gst_interlace_mode_from_string (const gchar * mode)
{
gint i;
for (i = 0; i < G_N_ELEMENTS (interlace_mode); i++) {
if (g_str_equal (interlace_mode[i], mode))
return i;
}
return GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
}
typedef struct typedef struct
{ {
const gchar *name; const gchar *name;
@ -797,7 +824,6 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps)
GstVideoFormat format; GstVideoFormat format;
gint width, height, views; gint width, height, views;
gint fps_n, fps_d; gint fps_n, fps_d;
gboolean interlaced;
gint par_n, par_d; gint par_n, par_d;
g_return_val_if_fail (info != NULL, FALSE); g_return_val_if_fail (info != NULL, FALSE);
@ -840,12 +866,10 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps)
info->fps_d = 1; info->fps_d = 1;
} }
if (!gst_structure_get_boolean (structure, "interlaced", &interlaced)) if ((s = gst_structure_get_string (structure, "interlace-mode")))
interlaced = FALSE; info->interlace_mode = gst_interlace_mode_from_string (s);
if (interlaced)
info->flags |= GST_VIDEO_FLAG_INTERLACED;
else else
info->flags &= ~GST_VIDEO_FLAG_INTERLACED; info->interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
if (gst_structure_get_int (structure, "views", &views)) if (gst_structure_get_int (structure, "views", &views))
info->views = views; info->views = views;
@ -928,8 +952,8 @@ gst_video_info_to_caps (GstVideoInfo * info)
"height", G_TYPE_INT, info->height, "height", G_TYPE_INT, info->height,
"pixel-aspect-ratio", GST_TYPE_FRACTION, info->par_n, info->par_d, NULL); "pixel-aspect-ratio", GST_TYPE_FRACTION, info->par_n, info->par_d, NULL);
if (info->flags & GST_VIDEO_FLAG_INTERLACED) gst_caps_set_simple (caps, "interlace-mode", G_TYPE_STRING,
gst_caps_set_simple (caps, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL); gst_interlace_mode_to_string (info->interlace_mode), NULL);
if (info->chroma_site != GST_VIDEO_CHROMA_SITE_UNKNOWN) if (info->chroma_site != GST_VIDEO_CHROMA_SITE_UNKNOWN)
gst_caps_set_simple (caps, "chroma-site", G_TYPE_STRING, gst_caps_set_simple (caps, "chroma-site", G_TYPE_STRING,

View file

@ -303,6 +303,26 @@ const GstVideoFormatInfo *
typedef struct _GstVideoInfo GstVideoInfo; typedef struct _GstVideoInfo GstVideoInfo;
typedef struct _GstVideoFrame GstVideoFrame; typedef struct _GstVideoFrame GstVideoFrame;
/**
* GstVideoInterlaceMode:
* GST_VIDEO_INTERLACE_MODE_PROGRESSIVE: all frames are progressive
* GST_VIDEO_INTERLACE_MODE_INTERLEAVED: video is interlaced and all fields
* 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.
*/
typedef enum {
GST_VIDEO_INTERLACE_MODE_PROGRESSIVE = 0,
GST_VIDEO_INTERLACE_MODE_INTERLEAVED,
GST_VIDEO_INTERLACE_MODE_MIXED,
GST_VIDEO_INTERLACE_MODE_FIELDS
} GstVideoInterlaceMode;
/** /**
* GstVideoFlags: * GstVideoFlags:
* @GST_VIDEO_FLAG_NONE: no flags * @GST_VIDEO_FLAG_NONE: no flags
@ -310,8 +330,6 @@ typedef struct _GstVideoFrame GstVideoFrame;
* @GST_VIDEO_FLAG_TFF: The video has the top field first * @GST_VIDEO_FLAG_TFF: The video has the top field first
* @GST_VIDEO_FLAG_RFF: The video has the repeat flag * @GST_VIDEO_FLAG_RFF: The video has the repeat flag
* @GST_VIDEO_FLAG_ONEFIELD: one field * @GST_VIDEO_FLAG_ONEFIELD: one field
* @GST_VIDEO_FLAG_TELECINE: telecine
* @GST_VIDEO_FLAG_PROGRESSIVE: video is progressive
* @GST_VIDEO_FLAG_VARIABLE_FPS: a variable fps is selected, fps_n and fps_d * @GST_VIDEO_FLAG_VARIABLE_FPS: a variable fps is selected, fps_n and fps_d
* denote the maximum fps of the video * denote the maximum fps of the video
* *
@ -323,9 +341,7 @@ typedef enum {
GST_VIDEO_FLAG_TFF = (1 << 1), GST_VIDEO_FLAG_TFF = (1 << 1),
GST_VIDEO_FLAG_RFF = (1 << 2), GST_VIDEO_FLAG_RFF = (1 << 2),
GST_VIDEO_FLAG_ONEFIELD = (1 << 3), GST_VIDEO_FLAG_ONEFIELD = (1 << 3),
GST_VIDEO_FLAG_TELECINE = (1 << 4), GST_VIDEO_FLAG_VARIABLE_FPS = (1 << 4)
GST_VIDEO_FLAG_PROGRESSIVE = (1 << 5),
GST_VIDEO_FLAG_VARIABLE_FPS = (1 << 6)
} GstVideoFlags; } GstVideoFlags;
/** /**
@ -479,6 +495,7 @@ gchar * gst_video_colorimetry_to_string (GstVideoColorimetry *cinfo);
/** /**
* GstVideoInfo: * GstVideoInfo:
* @finfo: the format info of the video * @finfo: the format info of the video
* @interlace_mode: the interlace mode
* @flags: additional video flags * @flags: additional video flags
* @width: the width of the video * @width: the width of the video
* @height: the height of the video * @height: the height of the video
@ -503,6 +520,8 @@ gchar * gst_video_colorimetry_to_string (GstVideoColorimetry *cinfo);
*/ */
struct _GstVideoInfo { struct _GstVideoInfo {
const GstVideoFormatInfo *finfo; const GstVideoFormatInfo *finfo;
GstVideoInterlaceMode interlace_mode;
GstVideoFlags flags; GstVideoFlags flags;
gint width; gint width;
gint height; gint height;
@ -531,6 +550,7 @@ struct _GstVideoInfo {
#define GST_VIDEO_INFO_IS_GRAY(i) (GST_VIDEO_FORMAT_INFO_IS_GRAY((i)->finfo)) #define GST_VIDEO_INFO_IS_GRAY(i) (GST_VIDEO_FORMAT_INFO_IS_GRAY((i)->finfo))
#define GST_VIDEO_INFO_HAS_ALPHA(i) (GST_VIDEO_FORMAT_INFO_HAS_ALPHA((i)->finfo)) #define GST_VIDEO_INFO_HAS_ALPHA(i) (GST_VIDEO_FORMAT_INFO_HAS_ALPHA((i)->finfo))
#define GST_VIDEO_INFO_INTERLACE_MODE(i) ((i)->interlace_mode)
#define GST_VIDEO_INFO_FLAGS(i) ((i)->flags) #define GST_VIDEO_INFO_FLAGS(i) ((i)->flags)
#define GST_VIDEO_INFO_WIDTH(i) ((i)->width) #define GST_VIDEO_INFO_WIDTH(i) ((i)->width)
#define GST_VIDEO_INFO_HEIGHT(i) ((i)->height) #define GST_VIDEO_INFO_HEIGHT(i) ((i)->height)
@ -662,6 +682,7 @@ gboolean gst_video_frame_copy (GstVideoFrame *dest, const GstVideoFr
/** /**
* GstVideoBufferFlags: * GstVideoBufferFlags:
* @GST_VIDEO_BUFFER_FLAG_INTERLACED: Mark #GstBuffer as interlaced
* @GST_VIDEO_BUFFER_FLAG_TFF: If the #GstBuffer is interlaced, then the first field * @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 * in the video frame is the top field. If unset, the
* bottom field is first. * bottom field is first.
@ -671,17 +692,14 @@ gboolean gst_video_frame_copy (GstVideoFrame *dest, const GstVideoFr
* @GST_VIDEO_BUFFER_FLAG_ONEFIELD: If the #GstBuffer is interlaced, then only the * @GST_VIDEO_BUFFER_FLAG_ONEFIELD: If the #GstBuffer is interlaced, then only the
* first field (as defined by the %GST_VIDEO_BUFFER_TFF * first field (as defined by the %GST_VIDEO_BUFFER_TFF
* flag setting) is to be displayed. * flag setting) is to be displayed.
* @GST_VIDEO_BUFFER_FLAG_PROGRESSIVE: If the #GstBuffer is telecined, then the
* buffer is progressive if the %GST_VIDEO_BUFFER_PROGRESSIVE
* flag is set, else it is telecine mixed.
* *
* Additional video buffer flags. * Additional video buffer flags.
*/ */
typedef enum { typedef enum {
GST_VIDEO_BUFFER_FLAG_TFF = (GST_BUFFER_FLAG_LAST << 0), GST_VIDEO_BUFFER_FLAG_INTERLACED = (GST_BUFFER_FLAG_LAST << 0),
GST_VIDEO_BUFFER_FLAG_RFF = (GST_BUFFER_FLAG_LAST << 1), GST_VIDEO_BUFFER_FLAG_TFF = (GST_BUFFER_FLAG_LAST << 1),
GST_VIDEO_BUFFER_FLAG_ONEFIELD = (GST_BUFFER_FLAG_LAST << 2), GST_VIDEO_BUFFER_FLAG_RFF = (GST_BUFFER_FLAG_LAST << 2),
GST_VIDEO_BUFFER_FLAG_PROGRESSIVE = (GST_BUFFER_FLAG_LAST << 3), GST_VIDEO_BUFFER_FLAG_ONEFIELD = (GST_BUFFER_FLAG_LAST << 3),
GST_VIDEO_BUFFER_FLAG_LAST = (GST_BUFFER_FLAG_LAST << 8) GST_VIDEO_BUFFER_FLAG_LAST = (GST_BUFFER_FLAG_LAST << 8)
} GstVideoBufferFlags; } GstVideoBufferFlags;