diff options
Diffstat (limited to 'gst-libs')
-rw-r--r-- | gst-libs/gst/audio/audio.h | 8 | ||||
-rw-r--r-- | gst-libs/gst/video/video.c | 72 | ||||
-rw-r--r-- | gst-libs/gst/video/video.h | 150 |
3 files changed, 194 insertions, 36 deletions
diff --git a/gst-libs/gst/audio/audio.h b/gst-libs/gst/audio/audio.h index 2b27d0feb..4bf62d493 100644 --- a/gst-libs/gst/audio/audio.h +++ b/gst-libs/gst/audio/audio.h @@ -52,8 +52,6 @@ #define GST_AUDIO_INT_PAD_TEMPLATE_PROPS \ gst_props_new (\ - "format", GST_PROPS_STRING ("int"),\ - "law", GST_PROPS_INT (0),\ "endianness", GST_PROPS_INT (G_BYTE_ORDER),\ "signed", GST_PROPS_LIST (\ GST_PROPS_BOOLEAN (TRUE),\ @@ -70,8 +68,6 @@ #define GST_AUDIO_INT_MONO_PAD_TEMPLATE_PROPS \ gst_props_new (\ - "format", GST_PROPS_STRING ("int"),\ - "law", GST_PROPS_INT (0),\ "endianness", GST_PROPS_INT (G_BYTE_ORDER),\ "signed", GST_PROPS_LIST (\ GST_PROPS_BOOLEAN (TRUE),\ @@ -88,8 +84,8 @@ #define GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS \ gst_props_new (\ - "format", GST_PROPS_STRING ("float"),\ - "layout", GST_PROPS_STRING ("gfloat"),\ + "depth", GST_PROPS_INT (32),\ + "endianness", GST_PROPS_INT (G_BYTE_ORDER),\ "intercept", GST_PROPS_FLOAT (0.0),\ "slope", GST_PROPS_FLOAT (1.0),\ "rate", GST_PROPS_INT_RANGE (GST_AUDIO_MIN_RATE, \ diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c index 6eba0d7b5..11e26c96d 100644 --- a/gst-libs/gst/video/video.c +++ b/gst-libs/gst/video/video.c @@ -20,31 +20,36 @@ #include "video.h" -#define NUM_UNITS 1000000000 - /* This is simply a convenience function, nothing more or less */ -gdouble +gfloat gst_video_frame_rate (GstPad *pad) { - GstFormat dest_format = GST_FORMAT_DEFAULT; - gint64 dest_value = 0; - gdouble fps; - - /* do a convert request on the source pad */ - if (!gst_pad_convert(pad, - GST_FORMAT_TIME, GST_SECOND * NUM_UNITS, - &dest_format, &dest_value)) - { - g_warning("gstvideo: pad %s:%s failed to convert time to unit!\n", - GST_ELEMENT_NAME(gst_pad_get_parent (pad)), GST_PAD_NAME(pad)); + gfloat fps = 0.; + GstCaps *caps; + + /* get pad caps */ + caps = GST_PAD_CAPS (pad); + if (caps == NULL) { + g_warning ("gstvideo: failed to get caps of pad %s:%s", + GST_ELEMENT_NAME (gst_pad_get_parent (pad)), + GST_PAD_NAME(pad)); + return 0.; + } + + if (!gst_caps_has_property_typed (caps, "framerate", + GST_PROPS_FLOAT_TYPE)) { + g_warning ("gstvideo: failed to get framerate property of pad %s:%s", + GST_ELEMENT_NAME (gst_pad_get_parent (pad)), + GST_PAD_NAME (pad)); return 0.; } - fps = ((gdouble) dest_value) / NUM_UNITS; + gst_caps_get_float (caps, "framerate", &fps); - GST_DEBUG ("Framerate request on pad %s:%s - %f fps", - GST_ELEMENT_NAME(gst_pad_get_parent (pad)), GST_PAD_NAME(pad), fps); + GST_DEBUG ("Framerate request on pad %s:%s: %f", + GST_ELEMENT_NAME (gst_pad_get_parent (pad)), + GST_PAD_NAME(pad), fps); return fps; } @@ -56,28 +61,37 @@ gst_video_get_size (GstPad *pad, { GstCaps *caps; - g_return_val_if_fail(pad != NULL, FALSE); + g_return_val_if_fail (pad != NULL, FALSE); - caps = GST_PAD_CAPS(pad); - if (!caps) { - g_warning("gstvideo: failed to get caps of pad %s:%s", - GST_ELEMENT_NAME(gst_pad_get_parent (pad)), GST_PAD_NAME(pad)); + caps = GST_PAD_CAPS (pad); + + if (caps == NULL) { + g_warning ("gstvideo: failed to get caps of pad %s:%s", + GST_ELEMENT_NAME (gst_pad_get_parent (pad)), + GST_PAD_NAME(pad)); return FALSE; } - if (!gst_caps_has_property(caps, "width") || - !gst_caps_has_property(caps, "height")) { - g_warning("gstvideo: resulting caps doesn't have width/height properties"); + + if (!gst_caps_has_property_typed (caps, "width", + GST_PROPS_INT_TYPE) || + !gst_caps_has_property_typed (caps, "height", + GST_PROPS_FLOAT_TYPE)) { + g_warning ("gstvideo: failed to get size properties on pad %s:%s", + GST_ELEMENT_NAME (gst_pad_get_parent (pad)), + GST_PAD_NAME(pad)); return FALSE; } if (width) - gst_caps_get_int(caps, "width", width); + gst_caps_get_int (caps, "width", width); if (height) - gst_caps_get_int(caps, "height", height); + gst_caps_get_int (caps, "height", height); GST_DEBUG ("size request on pad %s:%s: %dx%d", - GST_ELEMENT_NAME(gst_pad_get_parent (pad)), GST_PAD_NAME(pad), - width?*width:0, height?*height:0); + GST_ELEMENT_NAME (gst_pad_get_parent (pad)), + GST_PAD_NAME (pad), + width ? *width : -1, + height ? *height : -1); return TRUE; } diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h index 802520dac..9ff57f780 100644 --- a/gst-libs/gst/video/video.h +++ b/gst-libs/gst/video/video.h @@ -23,7 +23,155 @@ #include <gst/gst.h> -gdouble gst_video_frame_rate (GstPad *pad); +#if (G_BYTE_ORDER == G_BIG_ENDIAN) + +#define R_MASK_32 0xff000000 +#define G_MASK_32 0x00ff0000 +#define B_MASK_32 0x0000ff00 + +#define R_MASK_24 0xff0000 +#define G_MASK_24 0x00ff00 +#define B_MASK_24 0x0000ff + +#else + +#define R_MASK_32 0x000000ff +#define G_MASK_32 0x0000ff00 +#define B_MASK_32 0x00ff0000 + +#define R_MASK_24 0x0000ff +#define G_MASK_24 0x00ff00 +#define B_MASK_24 0xff0000 + +#endif + +#define R_MASK_16 0xf800 +#define G_MASK_16 0x07e0 +#define B_MASK_16 0x001f + +#define R_MASK_15 0x8c00 +#define G_MASK_15 0x03e0 +#define B_MASK_15 0x001f + +#define SIZE_RANGE GST_PROPS_INT_RANGE (16, 4096) +#define FPS_RANGE GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT) + +/* properties for pad templates */ +#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_24_32 \ + gst_props_new ( \ + "bpp", GST_PROPS_LIST ( \ + GST_PROPS_INT (24), \ + GST_PROPS_INT (32) \ + ), \ + "depth", GST_PROPS_LIST ( \ + GST_PROPS_INT (24), \ + GST_PROPS_INT (32) \ + ), \ + "endianness", GST_PROPS_INT (G_BIG_ENDIAN), \ + "red_mask", GST_PROPS_LIST ( \ + GST_PROPS_INT (R_MASK_32), \ + GST_PROPS_INT (R_MASK_24) \ + ), \ + "green_mask", GST_PROPS_LIST ( \ + GST_PROPS_INT (G_MASK_32), \ + GST_PROPS_INT (G_MASK_24) \ + ), \ + "blue_mask", GST_PROPS_LIST ( \ + GST_PROPS_INT (B_MASK_32), \ + GST_PROPS_INT (B_MASK_24) \ + ), \ + "width", SIZE_RANGE, \ + "height", SIZE_RANGE, \ + "framerate", FPS_RANGE, \ + NULL) + +#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_32 \ + gst_props_new ( \ + "bpp", GST_PROPS_INT (32), \ + "depth", GST_PROPS_INT (32), \ + "endianness", GST_PROPS_INT (G_BIG_ENDIAN), \ + "red_mask", GST_PROPS_INT (R_MASK_32), \ + "green_mask", GST_PROPS_INT (G_MASK_32), \ + "blue_mask", GST_PROPS_INT (B_MASK_32), \ + "width", SIZE_RANGE, \ + "height", SIZE_RANGE, \ + "framerate", FPS_RANGE, \ + NULL) + +#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_24 \ + gst_props_new ( \ + "bpp", GST_PROPS_INT (24), \ + "depth", GST_PROPS_INT (24), \ + "endianness", GST_PROPS_INT (G_BIG_ENDIAN), \ + "red_mask", GST_PROPS_INT (R_MASK_24), \ + "green_mask", GST_PROPS_INT (G_MASK_24), \ + "blue_mask", GST_PROPS_INT (B_MASK_24), \ + "width", SIZE_RANGE, \ + "height", SIZE_RANGE, \ + "framerate", FPS_RANGE, \ + NULL) + +#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_15_16 \ + gst_props_new ( \ + "bpp", GST_PROPS_INT (16), \ + "depth", GST_PROPS_LIST ( \ + GST_PROPS_INT (15), \ + GST_PROPS_INT (16) \ + ), \ + "endianness", GST_PROPS_INT (G_BYTE_ORDER), \ + "red_mask", GST_PROPS_LIST ( \ + GST_PROPS_INT (R_MASK_15), \ + GST_PROPS_INT (R_MASK_16) \ + ), \ + "green_mask", GST_PROPS_LIST ( \ + GST_PROPS_INT (G_MASK_15), \ + GST_PROPS_INT (G_MASK_16) \ + ), \ + "blue_mask", GST_PROPS_LIST ( \ + GST_PROPS_INT (B_MASK_15), \ + GST_PROPS_INT (B_MASK_16) \ + ), \ + "width", SIZE_RANGE, \ + "height", SIZE_RANGE, \ + "framerate", FPS_RANGE, \ + NULL) + +#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_16 \ + gst_props_new ( \ + "bpp", GST_PROPS_INT (16), \ + "depth", GST_PROPS_INT (16), \ + "endianness", GST_PROPS_INT (G_BYTE_ORDER), \ + "red_mask", GST_PROPS_INT (R_MASK_16), \ + "green_mask", GST_PROPS_INT (G_MASK_16), \ + "blue_mask", GST_PROPS_INT (B_MASK_16), \ + "width", SIZE_RANGE, \ + "height", SIZE_RANGE, \ + "framerate", FPS_RANGE, \ + NULL) + +#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_15 \ + gst_props_new ( \ + "bpp", GST_PROPS_INT (15), \ + "depth", GST_PROPS_INT (15), \ + "endianness", GST_PROPS_INT (G_BYTE_ORDER), \ + "red_mask", GST_PROPS_INT (R_MASK_15), \ + "green_mask", GST_PROPS_INT (G_MASK_15), \ + "blue_mask", GST_PROPS_INT (B_MASK_15), \ + "width", SIZE_RANGE, \ + "height", SIZE_RANGE, \ + "framerate", FPS_RANGE, \ + NULL) + +#define GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(fourcc) \ + gst_props_new (\ + "format", fourcc, \ + "width", SIZE_RANGE, \ + "height", SIZE_RANGE, \ + "framerate", FPS_RANGE, \ + NULL) + +/* functions */ +gfloat gst_video_frame_rate (GstPad *pad); gboolean gst_video_get_size (GstPad *pad, gint *width, gint *height); |