/* Check VA status for success or print out an error */
gboolean
-vaapi_check_status(VAStatus status, const char *msg)
+vaapi_check_status (VAStatus status, const gchar * msg)
{
- if (status != VA_STATUS_SUCCESS) {
- GST_DEBUG("%s: %s", msg, vaErrorStr(status));
- return FALSE;
- }
- return TRUE;
+ if (status != VA_STATUS_SUCCESS) {
+ GST_DEBUG ("%s: %s", msg, vaErrorStr (status));
+ return FALSE;
+ }
+ return TRUE;
}
/* Maps VA buffer */
-void *
-vaapi_map_buffer(VADisplay dpy, VABufferID buf_id)
+gpointer
+vaapi_map_buffer (VADisplay dpy, VABufferID buf_id)
{
- VAStatus status;
- void *data = NULL;
+ VAStatus status;
+ gpointer data = NULL;
- status = vaMapBuffer(dpy, buf_id, &data);
- if (!vaapi_check_status(status, "vaMapBuffer()"))
- return NULL;
- return data;
+ status = vaMapBuffer (dpy, buf_id, &data);
+ if (!vaapi_check_status (status, "vaMapBuffer()"))
+ return NULL;
+ return data;
}
/* Unmaps VA buffer */
void
-vaapi_unmap_buffer(VADisplay dpy, VABufferID buf_id, void **pbuf)
+vaapi_unmap_buffer (VADisplay dpy, VABufferID buf_id, gpointer * pbuf)
{
- VAStatus status;
+ VAStatus status;
- if (pbuf)
- *pbuf = NULL;
+ if (pbuf)
+ *pbuf = NULL;
- status = vaUnmapBuffer(dpy, buf_id);
- if (!vaapi_check_status(status, "vaUnmapBuffer()"))
- return;
+ status = vaUnmapBuffer (dpy, buf_id);
+ if (!vaapi_check_status (status, "vaUnmapBuffer()"))
+ return;
}
/* Creates and maps VA buffer */
gboolean
-vaapi_create_buffer(
- VADisplay dpy,
- VAContextID ctx,
- int type,
- unsigned int size,
- gconstpointer buf,
- VABufferID *buf_id_ptr,
- gpointer *mapped_data
-)
+vaapi_create_buffer (VADisplay dpy, VAContextID ctx, int type, guint size,
+ gconstpointer buf, VABufferID * buf_id_ptr, gpointer * mapped_data)
{
- VABufferID buf_id;
- VAStatus status;
- gpointer data = (gpointer)buf;
+ VABufferID buf_id;
+ VAStatus status;
+ gpointer data = (gpointer) buf;
- status = vaCreateBuffer(dpy, ctx, type, size, 1, data, &buf_id);
- if (!vaapi_check_status(status, "vaCreateBuffer()"))
- return FALSE;
+ status = vaCreateBuffer (dpy, ctx, type, size, 1, data, &buf_id);
+ if (!vaapi_check_status (status, "vaCreateBuffer()"))
+ return FALSE;
- if (mapped_data) {
- data = vaapi_map_buffer(dpy, buf_id);
- if (!data)
- goto error;
- *mapped_data = data;
- }
+ if (mapped_data) {
+ data = vaapi_map_buffer (dpy, buf_id);
+ if (!data)
+ goto error;
+ *mapped_data = data;
+ }
- *buf_id_ptr = buf_id;
- return TRUE;
+ *buf_id_ptr = buf_id;
+ return TRUE;
error:
- vaapi_destroy_buffer(dpy, &buf_id);
- return FALSE;
+ vaapi_destroy_buffer (dpy, &buf_id);
+ return FALSE;
}
/* Destroy VA buffer */
void
-vaapi_destroy_buffer(VADisplay dpy, VABufferID *buf_id_ptr)
+vaapi_destroy_buffer (VADisplay dpy, VABufferID * buf_id_ptr)
{
- if (!buf_id_ptr || *buf_id_ptr == VA_INVALID_ID)
- return;
+ if (!buf_id_ptr || *buf_id_ptr == VA_INVALID_ID)
+ return;
- vaDestroyBuffer(dpy, *buf_id_ptr);
- *buf_id_ptr = VA_INVALID_ID;
+ vaDestroyBuffer (dpy, *buf_id_ptr);
+ *buf_id_ptr = VA_INVALID_ID;
}
/* Return a string representation of a VAProfile */
-const char *string_of_VAProfile(VAProfile profile)
+const gchar *
+string_of_VAProfile (VAProfile profile)
{
- switch (profile) {
+ switch (profile) {
#define MAP(profile) \
STRCASEP(VAProfile, profile)
- MAP(MPEG2Simple);
- MAP(MPEG2Main);
- MAP(MPEG4Simple);
- MAP(MPEG4AdvancedSimple);
- MAP(MPEG4Main);
+ MAP (MPEG2Simple);
+ MAP (MPEG2Main);
+ MAP (MPEG4Simple);
+ MAP (MPEG4AdvancedSimple);
+ MAP (MPEG4Main);
#if VA_CHECK_VERSION(0,32,0)
- MAP(JPEGBaseline);
- MAP(H263Baseline);
- MAP(H264ConstrainedBaseline);
+ MAP (JPEGBaseline);
+ MAP (H263Baseline);
+ MAP (H264ConstrainedBaseline);
#endif
- MAP(H264Baseline);
- MAP(H264Main);
- MAP(H264High);
- MAP(VC1Simple);
- MAP(VC1Main);
- MAP(VC1Advanced);
+ MAP (H264Baseline);
+ MAP (H264Main);
+ MAP (H264High);
+ MAP (VC1Simple);
+ MAP (VC1Main);
+ MAP (VC1Advanced);
#undef MAP
- default: break;
- }
- return "<unknown>";
+ default:
+ break;
+ }
+ return "<unknown>";
}
/* Return a string representation of a VAEntrypoint */
-const char *string_of_VAEntrypoint(VAEntrypoint entrypoint)
+const gchar *
+string_of_VAEntrypoint (VAEntrypoint entrypoint)
{
- switch (entrypoint) {
+ switch (entrypoint) {
#define MAP(entrypoint) \
STRCASEP(VAEntrypoint, entrypoint)
- MAP(VLD);
- MAP(IZZ);
- MAP(IDCT);
- MAP(MoComp);
- MAP(Deblocking);
+ MAP (VLD);
+ MAP (IZZ);
+ MAP (IDCT);
+ MAP (MoComp);
+ MAP (Deblocking);
#undef MAP
- default: break;
- }
- return "<unknown>";
+ default:
+ break;
+ }
+ return "<unknown>";
}
/* Return a string representation of a VADisplayAttributeType */
-const char *
-string_of_VADisplayAttributeType(VADisplayAttribType attribute_type)
+const gchar *
+string_of_VADisplayAttributeType (VADisplayAttribType attribute_type)
{
- switch (attribute_type) {
+ switch (attribute_type) {
#define MAP(attribute_type) \
STRCASEP(VADisplayAttrib, attribute_type)
- MAP(Brightness);
- MAP(Contrast);
- MAP(Hue);
- MAP(Saturation);
- MAP(BackgroundColor);
+ MAP (Brightness);
+ MAP (Contrast);
+ MAP (Hue);
+ MAP (Saturation);
+ MAP (BackgroundColor);
#if !VA_CHECK_VERSION(0,34,0)
- MAP(DirectSurface);
+ MAP (DirectSurface);
#endif
- MAP(Rotation);
- MAP(OutofLoopDeblock);
+ MAP (Rotation);
+ MAP (OutofLoopDeblock);
#if VA_CHECK_VERSION(0,31,1) && !VA_CHECK_VERSION(0,34,0)
- MAP(BLEBlackMode);
- MAP(BLEWhiteMode);
- MAP(BlueStretch);
- MAP(SkinColorCorrection);
+ MAP (BLEBlackMode);
+ MAP (BLEWhiteMode);
+ MAP (BlueStretch);
+ MAP (SkinColorCorrection);
#endif
- MAP(CSCMatrix);
- MAP(BlendColor);
- MAP(OverlayAutoPaintColorKey);
- MAP(OverlayColorKey);
- MAP(RenderMode);
- MAP(RenderDevice);
- MAP(RenderRect);
+ MAP (CSCMatrix);
+ MAP (BlendColor);
+ MAP (OverlayAutoPaintColorKey);
+ MAP (OverlayColorKey);
+ MAP (RenderMode);
+ MAP (RenderDevice);
+ MAP (RenderRect);
#undef MAP
- default: break;
- }
- return "<unknown>";
+ default:
+ break;
+ }
+ return "<unknown>";
}
-const char *
-string_of_VARateControl(guint rate_control)
+const gchar *
+string_of_VARateControl (guint rate_control)
{
- switch (rate_control) {
- case VA_RC_NONE: return "None";
- case VA_RC_CQP: return "CQP";
- case VA_RC_CBR: return "CBR";
- case VA_RC_VCM: return "VCM";
- case VA_RC_VBR: return "VBR";
- case VA_RC_VBR_CONSTRAINED: return "VBR-Constrained";
- default: break;
- }
- return "<unknown>";
+ switch (rate_control) {
+ case VA_RC_NONE:
+ return "None";
+ case VA_RC_CQP:
+ return "CQP";
+ case VA_RC_CBR:
+ return "CBR";
+ case VA_RC_VCM:
+ return "VCM";
+ case VA_RC_VBR:
+ return "VBR";
+ case VA_RC_VBR_CONSTRAINED:
+ return "VBR-Constrained";
+ default:
+ break;
+ }
+ return "<unknown>";
}
/**
* vaCreateSurfaces().
*/
guint
-from_GstVaapiChromaType(guint chroma_type)
+from_GstVaapiChromaType (guint chroma_type)
{
- guint format;
+ guint format;
- switch (chroma_type) {
+ switch (chroma_type) {
case GST_VAAPI_CHROMA_TYPE_YUV420:
- format = VA_RT_FORMAT_YUV420;
- break;
+ format = VA_RT_FORMAT_YUV420;
+ break;
case GST_VAAPI_CHROMA_TYPE_YUV422:
- format = VA_RT_FORMAT_YUV422;
- break;
+ format = VA_RT_FORMAT_YUV422;
+ break;
case GST_VAAPI_CHROMA_TYPE_YUV444:
- format = VA_RT_FORMAT_YUV444;
- break;
+ format = VA_RT_FORMAT_YUV444;
+ break;
#if VA_CHECK_VERSION(0,34,0)
case GST_VAAPI_CHROMA_TYPE_YUV411:
- format = VA_RT_FORMAT_YUV411;
- break;
+ format = VA_RT_FORMAT_YUV411;
+ break;
case GST_VAAPI_CHROMA_TYPE_YUV400:
- format = VA_RT_FORMAT_YUV400;
- break;
+ format = VA_RT_FORMAT_YUV400;
+ break;
case GST_VAAPI_CHROMA_TYPE_RGB32:
- format = VA_RT_FORMAT_RGB32;
- break;
+ format = VA_RT_FORMAT_RGB32;
+ break;
case GST_VAAPI_CHROMA_TYPE_RGB16:
- format = VA_RT_FORMAT_RGB16;
- break;
+ format = VA_RT_FORMAT_RGB16;
+ break;
#endif
default:
- format = 0;
- break;
- }
- return format;
+ format = 0;
+ break;
+ }
+ return format;
}
/**
* vaAssociateSubpicture().
*/
guint
-from_GstVaapiSubpictureFlags(guint flags)
+from_GstVaapiSubpictureFlags (guint flags)
{
- guint va_flags = 0;
+ guint va_flags = 0;
- if (flags & GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA)
- va_flags |= VA_SUBPICTURE_GLOBAL_ALPHA;
+ if (flags & GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA)
+ va_flags |= VA_SUBPICTURE_GLOBAL_ALPHA;
#ifdef VA_SUBPICTURE_PREMULTIPLIED_ALPHA
- if (flags & GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA)
- flags |= VA_SUBPICTURE_PREMULTIPLIED_ALPHA;
+ if (flags & GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA)
+ flags |= VA_SUBPICTURE_PREMULTIPLIED_ALPHA;
#endif
- return va_flags;
+ return va_flags;
}
/**
* Return value: the #GstVaapiSubpictureFlags flags
*/
guint
-to_GstVaapiSubpictureFlags(guint va_flags)
+to_GstVaapiSubpictureFlags (guint va_flags)
{
- guint flags = 0;
+ guint flags = 0;
- if (va_flags & VA_SUBPICTURE_GLOBAL_ALPHA)
- flags |= GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA;
+ if (va_flags & VA_SUBPICTURE_GLOBAL_ALPHA)
+ flags |= GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA;
#ifdef VA_SUBPICTURE_PREMULTIPLIED_ALPHA
- if (va_flags & VA_SUBPICTURE_PREMULTIPLIED_ALPHA)
- flags |= GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA;
+ if (va_flags & VA_SUBPICTURE_PREMULTIPLIED_ALPHA)
+ flags |= GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA;
#endif
- return flags;
+ return flags;
}
/**
* Return value: the #GstVaapiSubpictureFlags flags
*/
guint
-from_GstVideoOverlayFormatFlags(guint ovl_flags)
+from_GstVideoOverlayFormatFlags (guint ovl_flags)
{
- guint flags = 0;
+ guint flags = 0;
#ifdef HAVE_GST_VIDEO_OVERLAY_HWCAPS
- if (ovl_flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA)
- flags |= GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA;
- if (ovl_flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA)
- flags |= GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA;
+ if (ovl_flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA)
+ flags |= GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA;
+ if (ovl_flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA)
+ flags |= GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA;
#endif
- return flags;
+ return flags;
}
/**
* Return value: the #GstVideoOverlayFormatFlags flags
*/
guint
-to_GstVideoOverlayFormatFlags(guint flags)
+to_GstVideoOverlayFormatFlags (guint flags)
{
- guint ovl_flags = 0;
+ guint ovl_flags = 0;
#ifdef HAVE_GST_VIDEO_OVERLAY_HWCAPS
- if (flags & GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA)
- ovl_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA;
- if (flags & GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA)
- ovl_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA;
+ if (flags & GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA)
+ ovl_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA;
+ if (flags & GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA)
+ ovl_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA;
#endif
- return ovl_flags;
+ return ovl_flags;
}
/**
* vaPutSurface().
*/
guint
-from_GstVaapiSurfaceRenderFlags(guint flags)
+from_GstVaapiSurfaceRenderFlags (guint flags)
{
- guint va_fields, va_csc;
+ guint va_fields, va_csc;
- /* Picture structure */
- switch (flags & GST_VAAPI_PICTURE_STRUCTURE_MASK) {
+ /* Picture structure */
+ switch (flags & GST_VAAPI_PICTURE_STRUCTURE_MASK) {
case GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD:
- va_fields = VA_TOP_FIELD;
- break;
+ va_fields = VA_TOP_FIELD;
+ break;
case GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD:
- va_fields = VA_BOTTOM_FIELD;
- break;
+ va_fields = VA_BOTTOM_FIELD;
+ break;
default:
- va_fields = VA_FRAME_PICTURE;
- break;
- }
+ va_fields = VA_FRAME_PICTURE;
+ break;
+ }
- /* Color standard */
- switch (flags & GST_VAAPI_COLOR_STANDARD_MASK) {
+ /* Color standard */
+ switch (flags & GST_VAAPI_COLOR_STANDARD_MASK) {
#ifdef VA_SRC_BT601
case GST_VAAPI_COLOR_STANDARD_ITUR_BT_601:
- va_csc = VA_SRC_BT601;
- break;
+ va_csc = VA_SRC_BT601;
+ break;
#endif
#ifdef VA_SRC_BT709
case GST_VAAPI_COLOR_STANDARD_ITUR_BT_709:
- va_csc = VA_SRC_BT709;
- break;
+ va_csc = VA_SRC_BT709;
+ break;
#endif
#ifdef VA_SRC_SMPTE_240
case GST_VAAPI_COLOR_STANDARD_SMPTE_240M:
- va_csc = VA_SRC_SMPTE_240;
- break;
+ va_csc = VA_SRC_SMPTE_240;
+ break;
#endif
default:
- va_csc = 0;
- break;
- }
- return va_fields|va_csc;
+ va_csc = 0;
+ break;
+ }
+ return va_fields | va_csc;
}
/**
* Return value: the #GstVaapiSurfaceStatus flags
*/
guint
-to_GstVaapiSurfaceStatus(guint va_flags)
+to_GstVaapiSurfaceStatus (guint va_flags)
{
- guint flags;
- const guint va_flags_mask = (VASurfaceReady|
- VASurfaceRendering|
- VASurfaceDisplaying);
+ guint flags;
+ const guint va_flags_mask = (VASurfaceReady |
+ VASurfaceRendering | VASurfaceDisplaying);
- /* Check for core status */
- switch (va_flags & va_flags_mask) {
+ /* Check for core status */
+ switch (va_flags & va_flags_mask) {
case VASurfaceReady:
- flags = GST_VAAPI_SURFACE_STATUS_IDLE;
- break;
+ flags = GST_VAAPI_SURFACE_STATUS_IDLE;
+ break;
case VASurfaceRendering:
- flags = GST_VAAPI_SURFACE_STATUS_RENDERING;
- break;
+ flags = GST_VAAPI_SURFACE_STATUS_RENDERING;
+ break;
case VASurfaceDisplaying:
- flags = GST_VAAPI_SURFACE_STATUS_DISPLAYING;
- break;
+ flags = GST_VAAPI_SURFACE_STATUS_DISPLAYING;
+ break;
default:
- flags = 0;
- break;
- }
+ flags = 0;
+ break;
+ }
- /* Check for encoder status */
+ /* Check for encoder status */
#if VA_CHECK_VERSION(0,30,0)
- if (va_flags & VASurfaceSkipped)
- flags |= GST_VAAPI_SURFACE_STATUS_SKIPPED;
+ if (va_flags & VASurfaceSkipped)
+ flags |= GST_VAAPI_SURFACE_STATUS_SKIPPED;
#endif
- return flags;
+ return flags;
}
/* Translate GstVaapiRotation value to VA-API rotation value */
guint
-from_GstVaapiRotation(guint value)
+from_GstVaapiRotation (guint value)
{
- switch (value) {
- case GST_VAAPI_ROTATION_0: return VA_ROTATION_NONE;
- case GST_VAAPI_ROTATION_90: return VA_ROTATION_90;
- case GST_VAAPI_ROTATION_180: return VA_ROTATION_180;
- case GST_VAAPI_ROTATION_270: return VA_ROTATION_270;
- }
- GST_ERROR("unsupported GstVaapiRotation value %d", value);
- return VA_ROTATION_NONE;
+ switch (value) {
+ case GST_VAAPI_ROTATION_0:
+ return VA_ROTATION_NONE;
+ case GST_VAAPI_ROTATION_90:
+ return VA_ROTATION_90;
+ case GST_VAAPI_ROTATION_180:
+ return VA_ROTATION_180;
+ case GST_VAAPI_ROTATION_270:
+ return VA_ROTATION_270;
+ }
+ GST_ERROR ("unsupported GstVaapiRotation value %d", value);
+ return VA_ROTATION_NONE;
}
/* Translate VA-API rotation value to GstVaapiRotation value */
guint
-to_GstVaapiRotation(guint value)
+to_GstVaapiRotation (guint value)
{
- switch (value) {
- case VA_ROTATION_NONE: return GST_VAAPI_ROTATION_0;
- case VA_ROTATION_90: return GST_VAAPI_ROTATION_90;
- case VA_ROTATION_180: return GST_VAAPI_ROTATION_180;
- case VA_ROTATION_270: return GST_VAAPI_ROTATION_270;
- }
- GST_ERROR("unsupported VA-API rotation value %d", value);
- return GST_VAAPI_ROTATION_0;
+ switch (value) {
+ case VA_ROTATION_NONE:
+ return GST_VAAPI_ROTATION_0;
+ case VA_ROTATION_90:
+ return GST_VAAPI_ROTATION_90;
+ case VA_ROTATION_180:
+ return GST_VAAPI_ROTATION_180;
+ case VA_ROTATION_270:
+ return GST_VAAPI_ROTATION_270;
+ }
+ GST_ERROR ("unsupported VA-API rotation value %d", value);
+ return GST_VAAPI_ROTATION_0;
}
guint
-from_GstVaapiRateControl(guint value)
+from_GstVaapiRateControl (guint value)
{
- switch (value) {
- case GST_VAAPI_RATECONTROL_NONE: return VA_RC_NONE;
- case GST_VAAPI_RATECONTROL_CQP: return VA_RC_CQP;
- case GST_VAAPI_RATECONTROL_CBR: return VA_RC_CBR;
- case GST_VAAPI_RATECONTROL_VCM: return VA_RC_VCM;
- case GST_VAAPI_RATECONTROL_VBR: return VA_RC_VBR;
- case GST_VAAPI_RATECONTROL_VBR_CONSTRAINED: return VA_RC_VBR_CONSTRAINED;
- }
- GST_ERROR("unsupported GstVaapiRateControl value %u", value);
- return VA_RC_NONE;
+ switch (value) {
+ case GST_VAAPI_RATECONTROL_NONE:
+ return VA_RC_NONE;
+ case GST_VAAPI_RATECONTROL_CQP:
+ return VA_RC_CQP;
+ case GST_VAAPI_RATECONTROL_CBR:
+ return VA_RC_CBR;
+ case GST_VAAPI_RATECONTROL_VCM:
+ return VA_RC_VCM;
+ case GST_VAAPI_RATECONTROL_VBR:
+ return VA_RC_VBR;
+ case GST_VAAPI_RATECONTROL_VBR_CONSTRAINED:
+ return VA_RC_VBR_CONSTRAINED;
+ }
+ GST_ERROR ("unsupported GstVaapiRateControl value %u", value);
+ return VA_RC_NONE;
}
guint
-to_GstVaapiRateControl(guint value)
+to_GstVaapiRateControl (guint value)
{
- switch (value) {
- case VA_RC_NONE: return GST_VAAPI_RATECONTROL_NONE;
- case VA_RC_CQP: return GST_VAAPI_RATECONTROL_CQP;
- case VA_RC_CBR: return GST_VAAPI_RATECONTROL_CBR;
- case VA_RC_VCM: return GST_VAAPI_RATECONTROL_VCM;
- case VA_RC_VBR: return GST_VAAPI_RATECONTROL_VBR;
- case VA_RC_VBR_CONSTRAINED: return GST_VAAPI_RATECONTROL_VBR_CONSTRAINED;
- }
- GST_ERROR("unsupported VA-API Rate Control value %u", value);
- return GST_VAAPI_RATECONTROL_NONE;
+ switch (value) {
+ case VA_RC_NONE:
+ return GST_VAAPI_RATECONTROL_NONE;
+ case VA_RC_CQP:
+ return GST_VAAPI_RATECONTROL_CQP;
+ case VA_RC_CBR:
+ return GST_VAAPI_RATECONTROL_CBR;
+ case VA_RC_VCM:
+ return GST_VAAPI_RATECONTROL_VCM;
+ case VA_RC_VBR:
+ return GST_VAAPI_RATECONTROL_VBR;
+ case VA_RC_VBR_CONSTRAINED:
+ return GST_VAAPI_RATECONTROL_VBR_CONSTRAINED;
+ }
+ GST_ERROR ("unsupported VA-API Rate Control value %u", value);
+ return GST_VAAPI_RATECONTROL_NONE;
}
/* VPP: translate GstVaapiDeinterlaceMethod to VA deinterlacing algorithm */
guint
-from_GstVaapiDeinterlaceMethod(guint value)
+from_GstVaapiDeinterlaceMethod (guint value)
{
- switch (value) {
+ switch (value) {
case GST_VAAPI_DEINTERLACE_METHOD_NONE:
- return 0;
+ return 0;
#if USE_VA_VPP
case GST_VAAPI_DEINTERLACE_METHOD_BOB:
- return VAProcDeinterlacingBob;
+ return VAProcDeinterlacingBob;
case GST_VAAPI_DEINTERLACE_METHOD_WEAVE:
- return VAProcDeinterlacingWeave;
+ return VAProcDeinterlacingWeave;
case GST_VAAPI_DEINTERLACE_METHOD_MOTION_ADAPTIVE:
- return VAProcDeinterlacingMotionAdaptive;
+ return VAProcDeinterlacingMotionAdaptive;
case GST_VAAPI_DEINTERLACE_METHOD_MOTION_COMPENSATED:
- return VAProcDeinterlacingMotionCompensated;
+ return VAProcDeinterlacingMotionCompensated;
#endif
- }
- GST_ERROR("unsupported GstVaapiDeinterlaceMethod value %d", value);
- return 0;
+ }
+ GST_ERROR ("unsupported GstVaapiDeinterlaceMethod value %d", value);
+ return 0;
}
/* VPP: translate GstVaapiDeinterlaceFlags into VA deinterlacing flags */
guint
-from_GstVaapiDeinterlaceFlags(guint flags)
+from_GstVaapiDeinterlaceFlags (guint flags)
{
- guint va_flags = 0;
+ guint va_flags = 0;
#if USE_VA_VPP
- if (!(flags & GST_VAAPI_DEINTERLACE_FLAG_TFF))
- va_flags |= VA_DEINTERLACING_BOTTOM_FIELD_FIRST;
+ if (!(flags & GST_VAAPI_DEINTERLACE_FLAG_TFF))
+ va_flags |= VA_DEINTERLACING_BOTTOM_FIELD_FIRST;
- if (flags & GST_VAAPI_DEINTERLACE_FLAG_ONEFIELD)
- va_flags |= VA_DEINTERLACING_ONE_FIELD;
+ if (flags & GST_VAAPI_DEINTERLACE_FLAG_ONEFIELD)
+ va_flags |= VA_DEINTERLACING_ONE_FIELD;
- if (!(flags & GST_VAAPI_DEINTERLACE_FLAG_TOPFIELD))
- va_flags |= VA_DEINTERLACING_BOTTOM_FIELD;
+ if (!(flags & GST_VAAPI_DEINTERLACE_FLAG_TOPFIELD))
+ va_flags |= VA_DEINTERLACING_BOTTOM_FIELD;
#endif
- return va_flags;
+ return va_flags;
}
* Boston, MA 02110-1301 USA
*/
-#define _GNU_SOURCE 1 /* RTLD_DEFAULT */
+#define _GNU_SOURCE 1 /* RTLD_DEFAULT */
#include "sysdeps.h"
#include <string.h>
#include <math.h>
/** Lookup for substring NAME in string EXT using SEP as separators */
static gboolean
-find_string(const char *name, const char *ext, const char *sep)
+find_string (const gchar *name, const gchar *ext, const gchar *sep)
{
- const char *end;
- int name_len, n;
-
- if (!name || !ext)
- return FALSE;
-
- end = ext + strlen(ext);
- name_len = strlen(name);
- while (ext < end) {
- n = strcspn(ext, sep);
- if (n == name_len && strncmp(name, ext, n) == 0)
- return TRUE;
- ext += (n + 1);
- }
+ const gchar *end;
+ int name_len, n;
+
+ if (!name || !ext)
return FALSE;
+
+ end = ext + strlen (ext);
+ name_len = strlen (name);
+ while (ext < end) {
+ n = strcspn (ext, sep);
+ if (n == name_len && strncmp (name, ext, n) == 0)
+ return TRUE;
+ ext += (n + 1);
+ }
+ return FALSE;
}
/**
*
* Return error: the static string representing the OpenGL @error
*/
-const char *
-gl_get_error_string(GLenum error)
+const gchar *
+gl_get_error_string (GLenum error)
{
- switch (error) {
+ switch (error) {
#define MAP(id, str) \
case id: return str " (" #id ")"
- MAP(GL_NO_ERROR, "no error");
- MAP(GL_INVALID_ENUM, "invalid enumerant");
- MAP(GL_INVALID_VALUE, "invalid value");
- MAP(GL_INVALID_OPERATION, "invalid operation");
- MAP(GL_STACK_OVERFLOW, "stack overflow");
- MAP(GL_STACK_UNDERFLOW, "stack underflow");
- MAP(GL_OUT_OF_MEMORY, "out of memory");
+ MAP (GL_NO_ERROR, "no error");
+ MAP (GL_INVALID_ENUM, "invalid enumerant");
+ MAP (GL_INVALID_VALUE, "invalid value");
+ MAP (GL_INVALID_OPERATION, "invalid operation");
+ MAP (GL_STACK_OVERFLOW, "stack overflow");
+ MAP (GL_STACK_UNDERFLOW, "stack underflow");
+ MAP (GL_OUT_OF_MEMORY, "out of memory");
#ifdef GL_INVALID_FRAMEBUFFER_OPERATION_EXT
- MAP(GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
- "invalid framebuffer operation");
+ MAP (GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
+ "invalid framebuffer operation");
#endif
#undef MAP
- default: break;
- };
- return "<unknown>";
+ default:
+ break;
+ };
+ return "<unknown>";
}
/**
* clear up the pending errors prior to calling gl_check_error().
*/
void
-gl_purge_errors(void)
+gl_purge_errors (void)
{
- while (glGetError() != GL_NO_ERROR)
- ; /* nothing */
+ while (glGetError () != GL_NO_ERROR); /* nothing */
}
/**
* Return value: %TRUE if an error was encountered
*/
gboolean
-gl_check_error(void)
+gl_check_error (void)
{
- GLenum error;
- gboolean has_errors = FALSE;
-
- while ((error = glGetError()) != GL_NO_ERROR) {
- GST_DEBUG("glError: %s caught", gl_get_error_string(error));
- has_errors = TRUE;
- }
- return has_errors;
+ GLenum error;
+ gboolean has_errors = FALSE;
+
+ while ((error = glGetError ()) != GL_NO_ERROR) {
+ GST_DEBUG ("glError: %s caught", gl_get_error_string (error));
+ has_errors = TRUE;
+ }
+ return has_errors;
}
/**
* Return value: %TRUE on success
*/
gboolean
-gl_get_param(GLenum param, guint *pval)
+gl_get_param (GLenum param, guint * pval)
{
- GLint val;
+ GLint val;
- gl_purge_errors();
- glGetIntegerv(param, &val);
- if (gl_check_error())
- return FALSE;
+ gl_purge_errors ();
+ glGetIntegerv (param, &val);
+ if (gl_check_error ())
+ return FALSE;
- if (pval)
- *pval = val;
- return TRUE;
+ if (pval)
+ *pval = val;
+ return TRUE;
}
/**
* Return value: %TRUE on success
*/
gboolean
-gl_get_texture_param(GLenum target, GLenum param, guint *pval)
+gl_get_texture_param (GLenum target, GLenum param, guint * pval)
{
- GLint val;
+ GLint val;
- gl_purge_errors();
- glGetTexLevelParameteriv(target, 0, param, &val);
- if (gl_check_error())
- return FALSE;
+ gl_purge_errors ();
+ glGetTexLevelParameteriv (target, 0, param, &val);
+ if (gl_check_error ())
+ return FALSE;
- if (pval)
- *pval = val;
- return TRUE;
+ if (pval)
+ *pval = val;
+ return TRUE;
}
/**
* Return value: texture binding type for @target
*/
static GLenum
-gl_get_texture_binding(GLenum target)
+gl_get_texture_binding (GLenum target)
{
- GLenum binding;
+ GLenum binding;
- switch (target) {
+ switch (target) {
case GL_TEXTURE_1D:
- binding = GL_TEXTURE_BINDING_1D;
- break;
+ binding = GL_TEXTURE_BINDING_1D;
+ break;
case GL_TEXTURE_2D:
- binding = GL_TEXTURE_BINDING_2D;
- break;
+ binding = GL_TEXTURE_BINDING_2D;
+ break;
case GL_TEXTURE_3D:
- binding = GL_TEXTURE_BINDING_3D;
- break;
+ binding = GL_TEXTURE_BINDING_3D;
+ break;
case GL_TEXTURE_RECTANGLE_ARB:
- binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
- break;
+ binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
+ break;
default:
- binding = 0;
- break;
- }
- return binding;
+ binding = 0;
+ break;
+ }
+ return binding;
}
/**
* wrapper around glClearColor().
*/
void
-gl_set_bgcolor(guint32 color)
+gl_set_bgcolor (guint32 color)
{
- glClearColor(
- ((color >> 16) & 0xff) / 255.0f,
- ((color >> 8) & 0xff) / 255.0f,
- ( color & 0xff) / 255.0f,
- 1.0f
- );
+ glClearColor (
+ ((color >> 16) & 0xff) / 255.0f,
+ ((color >> 8) & 0xff) / 255.0f, (color & 0xff) / 255.0f, 1.0f);
}
/**
* basically is the Mesa implementation of gluPerspective().
*/
static void
-gl_perspective(GLdouble fovy, GLdouble aspect, GLdouble near_val, GLdouble far_val)
+gl_perspective (GLdouble fovy, GLdouble aspect, GLdouble near_val,
+ GLdouble far_val)
{
- GLdouble left, right, top, bottom;
-
- /* Source (Q 9.085):
- <http://www.opengl.org/resources/faq/technical/transformations.htm> */
- top = tan(fovy * M_PI / 360.0) * near_val;
- bottom = -top;
- left = aspect * bottom;
- right = aspect * top;
- glFrustum(left, right, bottom, top, near_val, far_val);
+ GLdouble left, right, top, bottom;
+
+ /* Source (Q 9.085):
+ <http://www.opengl.org/resources/faq/technical/transformations.htm> */
+ top = tan (fovy * M_PI / 360.0) * near_val;
+ bottom = -top;
+ left = aspect * bottom;
+ right = aspect * top;
+ glFrustum (left, right, bottom, top, near_val, far_val);
}
/**
* window.
*/
void
-gl_resize(guint width, guint height)
+gl_resize (guint width, guint height)
{
#define FOVY 60.0f
#define ASPECT 1.0f
#define Z_FAR 100.0f
#define Z_CAMERA 0.869f
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gl_perspective(FOVY, ASPECT, Z_NEAR, Z_FAR);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
+ glViewport (0, 0, width, height);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ gl_perspective (FOVY, ASPECT, Z_NEAR, Z_FAR);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
- glTranslatef(-0.5f, -0.5f, -Z_CAMERA);
- glScalef(1.0f/width, -1.0f/height, 1.0f/width);
- glTranslatef(0.0f, -1.0f*height, 0.0f);
+ glTranslatef (-0.5f, -0.5f, -Z_CAMERA);
+ glScalef (1.0f / width, -1.0f / height, 1.0f / width);
+ glTranslatef (0.0f, -1.0f * height, 0.0f);
}
/**
* Return value: the newly created GLX context
*/
GLContextState *
-gl_create_context(Display *dpy, int screen, GLContextState *parent)
+gl_create_context (Display * dpy, int screen, GLContextState * parent)
{
- GLContextState *cs;
- GLXFBConfig *fbconfigs = NULL;
- int fbconfig_id, val, n, n_fbconfigs;
- Status status;
-
- static GLint fbconfig_attrs[] = {
- GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
- GLX_RENDER_TYPE, GLX_RGBA_BIT,
- GLX_DOUBLEBUFFER, True,
- GLX_RED_SIZE, 8,
- GLX_GREEN_SIZE, 8,
- GLX_BLUE_SIZE, 8,
- None
- };
-
- cs = malloc(sizeof(*cs));
- if (!cs)
- goto error;
-
- if (parent) {
- cs->display = parent->display;
- cs->window = parent->window;
- screen = DefaultScreen(parent->display);
- }
- else {
- cs->display = dpy;
- cs->window = None;
- }
- cs->visual = NULL;
- cs->context = NULL;
- cs->swapped_buffers = FALSE;
-
- if (parent && parent->context) {
- status = glXQueryContext(
- parent->display,
- parent->context,
- GLX_FBCONFIG_ID, &fbconfig_id
- );
- if (status != Success)
- goto error;
-
- if (fbconfig_id == GLX_DONT_CARE)
- goto choose_fbconfig;
-
- fbconfigs = glXGetFBConfigs(parent->display, screen, &n_fbconfigs);
- if (!fbconfigs)
- goto error;
-
- /* Find out a GLXFBConfig compatible with the parent context */
- for (n = 0; n < n_fbconfigs; n++) {
- status = glXGetFBConfigAttrib(
- parent->display,
- fbconfigs[n],
- GLX_FBCONFIG_ID, &val
- );
- if (status == Success && val == fbconfig_id)
- break;
- }
- if (n == n_fbconfigs)
- goto error;
- }
- else {
- choose_fbconfig:
- fbconfigs = glXChooseFBConfig(
- cs->display,
- screen,
- fbconfig_attrs, &n_fbconfigs
- );
- if (!fbconfigs)
- goto error;
-
- /* Select the first one */
- n = 0;
+ GLContextState *cs;
+ GLXFBConfig *fbconfigs = NULL;
+ int fbconfig_id, val, n, n_fbconfigs;
+ Status status;
+
+ static GLint fbconfig_attrs[] = {
+ GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
+ GLX_RENDER_TYPE, GLX_RGBA_BIT,
+ GLX_DOUBLEBUFFER, True,
+ GLX_RED_SIZE, 8,
+ GLX_GREEN_SIZE, 8,
+ GLX_BLUE_SIZE, 8,
+ None
+ };
+
+ cs = malloc (sizeof (*cs));
+ if (!cs)
+ goto error;
+
+ if (parent) {
+ cs->display = parent->display;
+ cs->window = parent->window;
+ screen = DefaultScreen (parent->display);
+ } else {
+ cs->display = dpy;
+ cs->window = None;
+ }
+ cs->visual = NULL;
+ cs->context = NULL;
+ cs->swapped_buffers = FALSE;
+
+ if (parent && parent->context) {
+ status = glXQueryContext (parent->display,
+ parent->context, GLX_FBCONFIG_ID, &fbconfig_id);
+ if (status != Success)
+ goto error;
+
+ if (fbconfig_id == GLX_DONT_CARE)
+ goto choose_fbconfig;
+
+ fbconfigs = glXGetFBConfigs (parent->display, screen, &n_fbconfigs);
+ if (!fbconfigs)
+ goto error;
+
+ /* Find out a GLXFBConfig compatible with the parent context */
+ for (n = 0; n < n_fbconfigs; n++) {
+ status = glXGetFBConfigAttrib (parent->display,
+ fbconfigs[n], GLX_FBCONFIG_ID, &val);
+ if (status == Success && val == fbconfig_id)
+ break;
}
-
- cs->visual = glXGetVisualFromFBConfig(cs->display, fbconfigs[n]);
- cs->context = glXCreateNewContext(
- cs->display,
- fbconfigs[n],
- GLX_RGBA_TYPE,
- parent ? parent->context : NULL,
- True
- );
- if (cs->context)
- goto end;
+ if (n == n_fbconfigs)
+ goto error;
+ } else {
+ choose_fbconfig:
+ fbconfigs = glXChooseFBConfig (cs->display,
+ screen, fbconfig_attrs, &n_fbconfigs);
+ if (!fbconfigs)
+ goto error;
+
+ /* Select the first one */
+ n = 0;
+ }
+
+ cs->visual = glXGetVisualFromFBConfig (cs->display, fbconfigs[n]);
+ cs->context = glXCreateNewContext (cs->display,
+ fbconfigs[n], GLX_RGBA_TYPE, parent ? parent->context : NULL, True);
+ if (cs->context)
+ goto end;
error:
- gl_destroy_context(cs);
- cs = NULL;
+ gl_destroy_context (cs);
+ cs = NULL;
end:
- if (fbconfigs)
- XFree(fbconfigs);
- return cs;
+ if (fbconfigs)
+ XFree (fbconfigs);
+ return cs;
}
/**
* Destroys the GLX context @cs
*/
void
-gl_destroy_context(GLContextState *cs)
+gl_destroy_context (GLContextState * cs)
{
- if (!cs)
- return;
-
- if (cs->visual) {
- XFree(cs->visual);
- cs->visual = NULL;
- }
-
- if (cs->display && cs->context) {
- if (glXGetCurrentContext() == cs->context) {
- /* XXX: if buffers were never swapped, the application
- will crash later with the NVIDIA driver */
- if (!cs->swapped_buffers)
- gl_swap_buffers(cs);
- glXMakeCurrent(cs->display, None, NULL);
- }
- glXDestroyContext(cs->display, cs->context);
- cs->display = NULL;
- cs->context = NULL;
+ if (!cs)
+ return;
+
+ if (cs->visual) {
+ XFree (cs->visual);
+ cs->visual = NULL;
+ }
+
+ if (cs->display && cs->context) {
+ if (glXGetCurrentContext () == cs->context) {
+ /* XXX: if buffers were never swapped, the application
+ will crash later with the NVIDIA driver */
+ if (!cs->swapped_buffers)
+ gl_swap_buffers (cs);
+ glXMakeCurrent (cs->display, None, NULL);
}
- free(cs);
+ glXDestroyContext (cs->display, cs->context);
+ cs->display = NULL;
+ cs->context = NULL;
+ }
+ free (cs);
}
/**
* the #GLContextState struct.
*/
void
-gl_get_current_context(GLContextState *cs)
+gl_get_current_context (GLContextState * cs)
{
- cs->display = glXGetCurrentDisplay();
- cs->window = glXGetCurrentDrawable();
- cs->context = glXGetCurrentContext();
+ cs->display = glXGetCurrentDisplay ();
+ cs->window = glXGetCurrentDrawable ();
+ cs->context = glXGetCurrentContext ();
}
/**
* Return value: %TRUE on success
*/
gboolean
-gl_set_current_context(GLContextState *new_cs, GLContextState *old_cs)
+gl_set_current_context (GLContextState * new_cs, GLContextState * old_cs)
{
- /* If display is NULL, this could be that new_cs was retrieved from
- gl_get_current_context() with none set previously. If that case,
- the other fields are also NULL and we don't return an error */
- if (!new_cs->display)
- return !new_cs->window && !new_cs->context;
-
- if (old_cs) {
- if (old_cs == new_cs)
- return TRUE;
- gl_get_current_context(old_cs);
- if (old_cs->display == new_cs->display &&
- old_cs->window == new_cs->window &&
- old_cs->context == new_cs->context)
- return TRUE;
- }
- return glXMakeCurrent(new_cs->display, new_cs->window, new_cs->context);
+ /* If display is NULL, this could be that new_cs was retrieved from
+ gl_get_current_context() with none set previously. If that case,
+ the other fields are also NULL and we don't return an error */
+ if (!new_cs->display)
+ return !new_cs->window && !new_cs->context;
+
+ if (old_cs) {
+ if (old_cs == new_cs)
+ return TRUE;
+ gl_get_current_context (old_cs);
+ if (old_cs->display == new_cs->display &&
+ old_cs->window == new_cs->window && old_cs->context == new_cs->context)
+ return TRUE;
+ }
+ return glXMakeCurrent (new_cs->display, new_cs->window, new_cs->context);
}
/**
* around glXSwapBuffers().
*/
void
-gl_swap_buffers(GLContextState *cs)
+gl_swap_buffers (GLContextState * cs)
{
- glXSwapBuffers(cs->display, cs->window);
- cs->swapped_buffers = TRUE;
+ glXSwapBuffers (cs->display, cs->window);
+ cs->swapped_buffers = TRUE;
}
/**
* Return value: %TRUE on success
*/
gboolean
-gl_bind_texture(GLTextureState *ts, GLenum target, GLuint texture)
+gl_bind_texture (GLTextureState * ts, GLenum target, GLuint texture)
{
- GLenum binding;
-
- ts->target = target;
-
- if (glIsEnabled(target)) {
- binding = gl_get_texture_binding(target);
- if (!binding)
- return FALSE;
- if (!gl_get_param(binding, &ts->old_texture))
- return FALSE;
- ts->was_enabled = TRUE;
- ts->was_bound = texture == ts->old_texture;
- if (ts->was_bound)
- return TRUE;
- }
- else {
- glEnable(target);
- ts->old_texture = 0;
- ts->was_enabled = FALSE;
- ts->was_bound = FALSE;
- }
-
- gl_purge_errors();
- glBindTexture(target, texture);
- if (gl_check_error())
- return FALSE;
- return TRUE;
+ GLenum binding;
+
+ ts->target = target;
+
+ if (glIsEnabled (target)) {
+ binding = gl_get_texture_binding (target);
+ if (!binding)
+ return FALSE;
+ if (!gl_get_param (binding, &ts->old_texture))
+ return FALSE;
+ ts->was_enabled = TRUE;
+ ts->was_bound = texture == ts->old_texture;
+ if (ts->was_bound)
+ return TRUE;
+ } else {
+ glEnable (target);
+ ts->old_texture = 0;
+ ts->was_enabled = FALSE;
+ ts->was_bound = FALSE;
+ }
+
+ gl_purge_errors ();
+ glBindTexture (target, texture);
+ if (gl_check_error ())
+ return FALSE;
+ return TRUE;
}
/**
* Rebinds the texture that was previously bound and recorded in @ts.
*/
void
-gl_unbind_texture(GLTextureState *ts)
+gl_unbind_texture (GLTextureState * ts)
{
- if (!ts->was_bound && ts->old_texture)
- glBindTexture(ts->target, ts->old_texture);
- if (!ts->was_enabled)
- glDisable(ts->target);
+ if (!ts->was_bound && ts->old_texture)
+ glBindTexture (ts->target, ts->old_texture);
+ if (!ts->was_enabled)
+ glDisable (ts->target);
}
/**
* Return value: the newly created texture name
*/
GLuint
-gl_create_texture(GLenum target, GLenum format, guint width, guint height)
+gl_create_texture (GLenum target, GLenum format, guint width, guint height)
{
- GLenum internal_format;
- GLuint texture;
- GLTextureState ts;
- guint bytes_per_component;
+ GLenum internal_format;
+ GLuint texture;
+ GLTextureState ts;
+ guint bytes_per_component;
- internal_format = format;
- switch (format) {
+ internal_format = format;
+ switch (format) {
case GL_LUMINANCE:
- bytes_per_component = 1;
- break;
+ bytes_per_component = 1;
+ break;
case GL_LUMINANCE_ALPHA:
- bytes_per_component = 2;
- break;
+ bytes_per_component = 2;
+ break;
case GL_RGBA:
case GL_BGRA:
- internal_format = GL_RGBA;
- bytes_per_component = 4;
- break;
+ internal_format = GL_RGBA;
+ bytes_per_component = 4;
+ break;
default:
- bytes_per_component = 0;
- break;
- }
- g_assert(bytes_per_component > 0);
-
- glGenTextures(1, &texture);
- if (!gl_bind_texture(&ts, target, texture))
- return 0;
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glPixelStorei(GL_UNPACK_ALIGNMENT, bytes_per_component);
- glTexImage2D(
- target,
- 0,
- internal_format,
- width, height,
- 0,
- format,
- GL_UNSIGNED_BYTE,
- NULL
- );
- gl_unbind_texture(&ts);
- return texture;
+ bytes_per_component = 0;
+ break;
+ }
+ g_assert (bytes_per_component > 0);
+
+ glGenTextures (1, &texture);
+ if (!gl_bind_texture (&ts, target, texture))
+ return 0;
+ glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, bytes_per_component);
+ glTexImage2D (target,
+ 0, internal_format, width, height, 0, format, GL_UNSIGNED_BYTE, NULL);
+ gl_unbind_texture (&ts);
+ return texture;
}
/**
* Return value: the OpenGL extension matching @name, or %NULL if none
* was found
*/
-typedef void (*GLFuncPtr)(void);
-typedef GLFuncPtr (*GLXGetProcAddressProc)(const char *);
+typedef void (*GLFuncPtr) (void);
+typedef GLFuncPtr (*GLXGetProcAddressProc) (const gchar *);
static GLFuncPtr
-get_proc_address_default(const char *name)
+get_proc_address_default (const gchar *name)
{
- return NULL;
+ return NULL;
}
static GLXGetProcAddressProc
-get_proc_address_func(void)
+get_proc_address_func (void)
{
- GLXGetProcAddressProc get_proc_func;
+ GLXGetProcAddressProc get_proc_func;
- dlerror();
- *(void **)(&get_proc_func) = dlsym(RTLD_DEFAULT, "glXGetProcAddress");
- if (!dlerror())
- return get_proc_func;
+ dlerror ();
+ *(void **) (&get_proc_func) = dlsym (RTLD_DEFAULT, "glXGetProcAddress");
+ if (!dlerror ())
+ return get_proc_func;
- *(void **)(&get_proc_func) = dlsym(RTLD_DEFAULT, "glXGetProcAddressARB");
- if (!dlerror())
- return get_proc_func;
+ *(void **) (&get_proc_func) = dlsym (RTLD_DEFAULT, "glXGetProcAddressARB");
+ if (!dlerror ())
+ return get_proc_func;
- return get_proc_address_default;
+ return get_proc_address_default;
}
static inline GLFuncPtr
-get_proc_address(const char *name)
+get_proc_address (const gchar *name)
{
- static GLXGetProcAddressProc get_proc_func = NULL;
- if (!get_proc_func)
- get_proc_func = get_proc_address_func();
- return get_proc_func(name);
+ static GLXGetProcAddressProc get_proc_func = NULL;
+ if (!get_proc_func)
+ get_proc_func = get_proc_address_func ();
+ return get_proc_func (name);
}
/**
static GLVTable gl_vtable_static;
static GLVTable *
-gl_init_vtable(void)
+gl_init_vtable (void)
{
- GLVTable * const gl_vtable = &gl_vtable_static;
- const gchar *gl_extensions = (const gchar *)glGetString(GL_EXTENSIONS);
- gboolean has_extension;
-
- /* GLX_EXT_texture_from_pixmap */
- gl_vtable->glx_create_pixmap = (PFNGLXCREATEPIXMAPPROC)
- get_proc_address("glXCreatePixmap");
- if (!gl_vtable->glx_create_pixmap)
- return NULL;
- gl_vtable->glx_destroy_pixmap = (PFNGLXDESTROYPIXMAPPROC)
- get_proc_address("glXDestroyPixmap");
- if (!gl_vtable->glx_destroy_pixmap)
- return NULL;
- gl_vtable->glx_bind_tex_image = (PFNGLXBINDTEXIMAGEEXTPROC)
- get_proc_address("glXBindTexImageEXT");
- if (!gl_vtable->glx_bind_tex_image)
- return NULL;
- gl_vtable->glx_release_tex_image = (PFNGLXRELEASETEXIMAGEEXTPROC)
- get_proc_address("glXReleaseTexImageEXT");
- if (!gl_vtable->glx_release_tex_image)
- return NULL;
-
- /* GL_ARB_framebuffer_object */
- has_extension = (
- find_string("GL_ARB_framebuffer_object", gl_extensions, " ") ||
- find_string("GL_EXT_framebuffer_object", gl_extensions, " ")
- );
- if (has_extension) {
- gl_vtable->gl_gen_framebuffers = (PFNGLGENFRAMEBUFFERSEXTPROC)
- get_proc_address("glGenFramebuffersEXT");
- if (!gl_vtable->gl_gen_framebuffers)
- return NULL;
- gl_vtable->gl_delete_framebuffers = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
- get_proc_address("glDeleteFramebuffersEXT");
- if (!gl_vtable->gl_delete_framebuffers)
- return NULL;
- gl_vtable->gl_bind_framebuffer = (PFNGLBINDFRAMEBUFFEREXTPROC)
- get_proc_address("glBindFramebufferEXT");
- if (!gl_vtable->gl_bind_framebuffer)
- return NULL;
- gl_vtable->gl_gen_renderbuffers = (PFNGLGENRENDERBUFFERSEXTPROC)
- get_proc_address("glGenRenderbuffersEXT");
- if (!gl_vtable->gl_gen_renderbuffers)
- return NULL;
- gl_vtable->gl_delete_renderbuffers = (PFNGLDELETERENDERBUFFERSEXTPROC)
- get_proc_address("glDeleteRenderbuffersEXT");
- if (!gl_vtable->gl_delete_renderbuffers)
- return NULL;
- gl_vtable->gl_bind_renderbuffer = (PFNGLBINDRENDERBUFFEREXTPROC)
- get_proc_address("glBindRenderbufferEXT");
- if (!gl_vtable->gl_bind_renderbuffer)
- return NULL;
- gl_vtable->gl_renderbuffer_storage = (PFNGLRENDERBUFFERSTORAGEEXTPROC)
- get_proc_address("glRenderbufferStorageEXT");
- if (!gl_vtable->gl_renderbuffer_storage)
- return NULL;
- gl_vtable->gl_framebuffer_renderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)
- get_proc_address("glFramebufferRenderbufferEXT");
- if (!gl_vtable->gl_framebuffer_renderbuffer)
- return NULL;
- gl_vtable->gl_framebuffer_texture_2d = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
- get_proc_address("glFramebufferTexture2DEXT");
- if (!gl_vtable->gl_framebuffer_texture_2d)
- return NULL;
- gl_vtable->gl_check_framebuffer_status = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
- get_proc_address("glCheckFramebufferStatusEXT");
- if (!gl_vtable->gl_check_framebuffer_status)
- return NULL;
- gl_vtable->has_framebuffer_object = TRUE;
- }
- return gl_vtable;
+ GLVTable *const gl_vtable = &gl_vtable_static;
+ const gchar *gl_extensions = (const gchar *) glGetString (GL_EXTENSIONS);
+ gboolean has_extension;
+
+ /* GLX_EXT_texture_from_pixmap */
+ gl_vtable->glx_create_pixmap = (PFNGLXCREATEPIXMAPPROC)
+ get_proc_address ("glXCreatePixmap");
+ if (!gl_vtable->glx_create_pixmap)
+ return NULL;
+ gl_vtable->glx_destroy_pixmap = (PFNGLXDESTROYPIXMAPPROC)
+ get_proc_address ("glXDestroyPixmap");
+ if (!gl_vtable->glx_destroy_pixmap)
+ return NULL;
+ gl_vtable->glx_bind_tex_image = (PFNGLXBINDTEXIMAGEEXTPROC)
+ get_proc_address ("glXBindTexImageEXT");
+ if (!gl_vtable->glx_bind_tex_image)
+ return NULL;
+ gl_vtable->glx_release_tex_image = (PFNGLXRELEASETEXIMAGEEXTPROC)
+ get_proc_address ("glXReleaseTexImageEXT");
+ if (!gl_vtable->glx_release_tex_image)
+ return NULL;
+
+ /* GL_ARB_framebuffer_object */
+ has_extension = (find_string ("GL_ARB_framebuffer_object", gl_extensions, " ")
+ || find_string ("GL_EXT_framebuffer_object", gl_extensions, " ")
+ );
+ if (has_extension) {
+ gl_vtable->gl_gen_framebuffers = (PFNGLGENFRAMEBUFFERSEXTPROC)
+ get_proc_address ("glGenFramebuffersEXT");
+ if (!gl_vtable->gl_gen_framebuffers)
+ return NULL;
+ gl_vtable->gl_delete_framebuffers = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
+ get_proc_address ("glDeleteFramebuffersEXT");
+ if (!gl_vtable->gl_delete_framebuffers)
+ return NULL;
+ gl_vtable->gl_bind_framebuffer = (PFNGLBINDFRAMEBUFFEREXTPROC)
+ get_proc_address ("glBindFramebufferEXT");
+ if (!gl_vtable->gl_bind_framebuffer)
+ return NULL;
+ gl_vtable->gl_gen_renderbuffers = (PFNGLGENRENDERBUFFERSEXTPROC)
+ get_proc_address ("glGenRenderbuffersEXT");
+ if (!gl_vtable->gl_gen_renderbuffers)
+ return NULL;
+ gl_vtable->gl_delete_renderbuffers = (PFNGLDELETERENDERBUFFERSEXTPROC)
+ get_proc_address ("glDeleteRenderbuffersEXT");
+ if (!gl_vtable->gl_delete_renderbuffers)
+ return NULL;
+ gl_vtable->gl_bind_renderbuffer = (PFNGLBINDRENDERBUFFEREXTPROC)
+ get_proc_address ("glBindRenderbufferEXT");
+ if (!gl_vtable->gl_bind_renderbuffer)
+ return NULL;
+ gl_vtable->gl_renderbuffer_storage = (PFNGLRENDERBUFFERSTORAGEEXTPROC)
+ get_proc_address ("glRenderbufferStorageEXT");
+ if (!gl_vtable->gl_renderbuffer_storage)
+ return NULL;
+ gl_vtable->gl_framebuffer_renderbuffer =
+ (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)
+ get_proc_address ("glFramebufferRenderbufferEXT");
+ if (!gl_vtable->gl_framebuffer_renderbuffer)
+ return NULL;
+ gl_vtable->gl_framebuffer_texture_2d = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
+ get_proc_address ("glFramebufferTexture2DEXT");
+ if (!gl_vtable->gl_framebuffer_texture_2d)
+ return NULL;
+ gl_vtable->gl_check_framebuffer_status =
+ (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
+ get_proc_address ("glCheckFramebufferStatusEXT");
+ if (!gl_vtable->gl_check_framebuffer_status)
+ return NULL;
+ gl_vtable->has_framebuffer_object = TRUE;
+ }
+ return gl_vtable;
}
/**
* Return value: VTable for OpenGL extensions
*/
GLVTable *
-gl_get_vtable(void)
+gl_get_vtable (void)
{
- static gsize gl_vtable_init = FALSE;
- static GLVTable *gl_vtable = NULL;
-
- if (g_once_init_enter(&gl_vtable_init)) {
- gl_vtable = gl_init_vtable();
- g_once_init_leave(&gl_vtable_init, TRUE);
- }
- return gl_vtable;
+ static gsize gl_vtable_init = FALSE;
+ static GLVTable *gl_vtable = NULL;
+
+ if (g_once_init_enter (&gl_vtable_init)) {
+ gl_vtable = gl_init_vtable ();
+ g_once_init_leave (&gl_vtable_init, TRUE);
+ }
+ return gl_vtable;
}
/**
* Return value: the newly created #GLPixmapObject object
*/
GLPixmapObject *
-gl_create_pixmap_object(Display *dpy, guint width, guint height)
+gl_create_pixmap_object (Display * dpy, guint width, guint height)
{
- GLVTable * const gl_vtable = gl_get_vtable();
- GLPixmapObject *pixo;
- GLXFBConfig *fbconfig;
- int screen;
- Window rootwin;
- XWindowAttributes wattr;
- int *attr;
- int n_fbconfig_attrs;
-
- int fbconfig_attrs[32] = {
- GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
- GLX_DOUBLEBUFFER, GL_FALSE,
- GLX_RENDER_TYPE, GLX_RGBA_BIT,
- GLX_X_RENDERABLE, GL_TRUE,
- GLX_Y_INVERTED_EXT, GL_TRUE,
- GLX_RED_SIZE, 8,
- GLX_GREEN_SIZE, 8,
- GLX_BLUE_SIZE, 8,
- GL_NONE,
- };
-
- int pixmap_attrs[10] = {
- GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
- GLX_MIPMAP_TEXTURE_EXT, GL_FALSE,
- GL_NONE,
- };
-
- if (!gl_vtable)
- return NULL;
-
- screen = DefaultScreen(dpy);
- rootwin = RootWindow(dpy, screen);
-
- /* XXX: this won't work for different displays */
- if (!gl_vtable->has_texture_from_pixmap) {
- const char *glx_extensions = glXQueryExtensionsString(dpy, screen);
- if (!glx_extensions)
- return NULL;
- if (!find_string("GLX_EXT_texture_from_pixmap", glx_extensions, " "))
- return NULL;
- gl_vtable->has_texture_from_pixmap = TRUE;
- }
+ GLVTable *const gl_vtable = gl_get_vtable ();
+ GLPixmapObject *pixo;
+ GLXFBConfig *fbconfig;
+ int screen;
+ Window rootwin;
+ XWindowAttributes wattr;
+ int *attr;
+ int n_fbconfig_attrs;
+
+ int fbconfig_attrs[32] = {
+ GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
+ GLX_DOUBLEBUFFER, GL_FALSE,
+ GLX_RENDER_TYPE, GLX_RGBA_BIT,
+ GLX_X_RENDERABLE, GL_TRUE,
+ GLX_Y_INVERTED_EXT, GL_TRUE,
+ GLX_RED_SIZE, 8,
+ GLX_GREEN_SIZE, 8,
+ GLX_BLUE_SIZE, 8,
+ GL_NONE,
+ };
+
+ int pixmap_attrs[10] = {
+ GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
+ GLX_MIPMAP_TEXTURE_EXT, GL_FALSE,
+ GL_NONE,
+ };
+
+ if (!gl_vtable)
+ return NULL;
- pixo = calloc(1, sizeof(*pixo));
- if (!pixo)
- return NULL;
-
- pixo->dpy = dpy;
- pixo->width = width;
- pixo->height = height;
- pixo->pixmap = None;
- pixo->glx_pixmap = None;
- pixo->is_bound = FALSE;
-
- XGetWindowAttributes(dpy, rootwin, &wattr);
- pixo->pixmap = XCreatePixmap(dpy, rootwin, width, height, wattr.depth);
- if (!pixo->pixmap)
- goto error;
-
- /* Initialize FBConfig attributes */
- for (attr = fbconfig_attrs; *attr != GL_NONE; attr += 2)
- ;
- *attr++ = GLX_DEPTH_SIZE; *attr++ = wattr.depth;
- if (wattr.depth == 32) {
- *attr++ = GLX_ALPHA_SIZE; *attr++ = 8;
- *attr++ = GLX_BIND_TO_TEXTURE_RGBA_EXT; *attr++ = GL_TRUE;
- }
- else {
- *attr++ = GLX_BIND_TO_TEXTURE_RGB_EXT; *attr++ = GL_TRUE;
- }
- *attr++ = GL_NONE;
-
- fbconfig = glXChooseFBConfig(
- dpy,
- screen,
- fbconfig_attrs, &n_fbconfig_attrs
- );
- if (!fbconfig)
- goto error;
-
- /* Initialize GLX Pixmap attributes */
- for (attr = pixmap_attrs; *attr != GL_NONE; attr += 2)
- ;
- *attr++ = GLX_TEXTURE_FORMAT_EXT;
- if (wattr.depth == 32)
+ screen = DefaultScreen (dpy);
+ rootwin = RootWindow (dpy, screen);
+
+ /* XXX: this won't work for different displays */
+ if (!gl_vtable->has_texture_from_pixmap) {
+ const gchar *glx_extensions = glXQueryExtensionsString (dpy, screen);
+ if (!glx_extensions)
+ return NULL;
+ if (!find_string ("GLX_EXT_texture_from_pixmap", glx_extensions, " "))
+ return NULL;
+ gl_vtable->has_texture_from_pixmap = TRUE;
+ }
+
+ pixo = calloc (1, sizeof (*pixo));
+ if (!pixo)
+ return NULL;
+
+ pixo->dpy = dpy;
+ pixo->width = width;
+ pixo->height = height;
+ pixo->pixmap = None;
+ pixo->glx_pixmap = None;
+ pixo->is_bound = FALSE;
+
+ XGetWindowAttributes (dpy, rootwin, &wattr);
+ pixo->pixmap = XCreatePixmap (dpy, rootwin, width, height, wattr.depth);
+ if (!pixo->pixmap)
+ goto error;
+
+ /* Initialize FBConfig attributes */
+ for (attr = fbconfig_attrs; *attr != GL_NONE; attr += 2);
+ *attr++ = GLX_DEPTH_SIZE;
+ *attr++ = wattr.depth;
+ if (wattr.depth == 32) {
+ *attr++ = GLX_ALPHA_SIZE;
+ *attr++ = 8;
+ *attr++ = GLX_BIND_TO_TEXTURE_RGBA_EXT;
+ *attr++ = GL_TRUE;
+ } else {
+ *attr++ = GLX_BIND_TO_TEXTURE_RGB_EXT;
+ *attr++ = GL_TRUE;
+ }
+ *attr++ = GL_NONE;
+
+ fbconfig = glXChooseFBConfig (dpy, screen, fbconfig_attrs, &n_fbconfig_attrs);
+ if (!fbconfig)
+ goto error;
+
+ /* Initialize GLX Pixmap attributes */
+ for (attr = pixmap_attrs; *attr != GL_NONE; attr += 2);
+ *attr++ = GLX_TEXTURE_FORMAT_EXT;
+ if (wattr.depth == 32)
*attr++ = GLX_TEXTURE_FORMAT_RGBA_EXT;
- else
+ else
*attr++ = GLX_TEXTURE_FORMAT_RGB_EXT;
- *attr++ = GL_NONE;
-
- x11_trap_errors();
- pixo->glx_pixmap = gl_vtable->glx_create_pixmap(
- dpy,
- fbconfig[0],
- pixo->pixmap,
- pixmap_attrs
- );
- free(fbconfig);
- if (x11_untrap_errors() != 0)
- goto error;
-
- pixo->target = GL_TEXTURE_2D;
- glGenTextures(1, &pixo->texture);
- if (!gl_bind_texture(&pixo->old_texture, pixo->target, pixo->texture))
- goto error;
- glTexParameteri(pixo->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(pixo->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gl_unbind_texture(&pixo->old_texture);
- return pixo;
+ *attr++ = GL_NONE;
+
+ x11_trap_errors ();
+ pixo->glx_pixmap = gl_vtable->glx_create_pixmap (dpy,
+ fbconfig[0], pixo->pixmap, pixmap_attrs);
+ free (fbconfig);
+ if (x11_untrap_errors () != 0)
+ goto error;
+
+ pixo->target = GL_TEXTURE_2D;
+ glGenTextures (1, &pixo->texture);
+ if (!gl_bind_texture (&pixo->old_texture, pixo->target, pixo->texture))
+ goto error;
+ glTexParameteri (pixo->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (pixo->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl_unbind_texture (&pixo->old_texture);
+ return pixo;
error:
- gl_destroy_pixmap_object(pixo);
- return NULL;
+ gl_destroy_pixmap_object (pixo);
+ return NULL;
}
/**
* Destroys the #GLPixmapObject object.
*/
void
-gl_destroy_pixmap_object(GLPixmapObject *pixo)
+gl_destroy_pixmap_object (GLPixmapObject * pixo)
{
- GLVTable * const gl_vtable = gl_get_vtable();
+ GLVTable *const gl_vtable = gl_get_vtable ();
- if (!pixo)
- return;
+ if (!pixo)
+ return;
- gl_unbind_pixmap_object(pixo);
+ gl_unbind_pixmap_object (pixo);
- if (pixo->texture) {
- glDeleteTextures(1, &pixo->texture);
- pixo->texture = 0;
- }
+ if (pixo->texture) {
+ glDeleteTextures (1, &pixo->texture);
+ pixo->texture = 0;
+ }
- if (pixo->glx_pixmap) {
- gl_vtable->glx_destroy_pixmap(pixo->dpy, pixo->glx_pixmap);
- pixo->glx_pixmap = None;
- }
+ if (pixo->glx_pixmap) {
+ gl_vtable->glx_destroy_pixmap (pixo->dpy, pixo->glx_pixmap);
+ pixo->glx_pixmap = None;
+ }
- if (pixo->pixmap) {
- XFreePixmap(pixo->dpy, pixo->pixmap);
- pixo->pixmap = None;
- }
- free(pixo);
+ if (pixo->pixmap) {
+ XFreePixmap (pixo->dpy, pixo->pixmap);
+ pixo->pixmap = None;
+ }
+ free (pixo);
}
/**
* Return value: %TRUE on success
*/
gboolean
-gl_bind_pixmap_object(GLPixmapObject *pixo)
+gl_bind_pixmap_object (GLPixmapObject * pixo)
{
- GLVTable * const gl_vtable = gl_get_vtable();
-
- if (pixo->is_bound)
- return TRUE;
-
- if (!gl_bind_texture(&pixo->old_texture, pixo->target, pixo->texture))
- return FALSE;
-
- x11_trap_errors();
- gl_vtable->glx_bind_tex_image(
- pixo->dpy,
- pixo->glx_pixmap,
- GLX_FRONT_LEFT_EXT,
- NULL
- );
- XSync(pixo->dpy, False);
- if (x11_untrap_errors() != 0) {
- GST_DEBUG("failed to bind pixmap");
- return FALSE;
- }
+ GLVTable *const gl_vtable = gl_get_vtable ();
- pixo->is_bound = TRUE;
+ if (pixo->is_bound)
return TRUE;
+
+ if (!gl_bind_texture (&pixo->old_texture, pixo->target, pixo->texture))
+ return FALSE;
+
+ x11_trap_errors ();
+ gl_vtable->glx_bind_tex_image (pixo->dpy,
+ pixo->glx_pixmap, GLX_FRONT_LEFT_EXT, NULL);
+ XSync (pixo->dpy, False);
+ if (x11_untrap_errors () != 0) {
+ GST_DEBUG ("failed to bind pixmap");
+ return FALSE;
+ }
+
+ pixo->is_bound = TRUE;
+ return TRUE;
}
/**
* Return value: %TRUE on success
*/
gboolean
-gl_unbind_pixmap_object(GLPixmapObject *pixo)
+gl_unbind_pixmap_object (GLPixmapObject * pixo)
{
- GLVTable * const gl_vtable = gl_get_vtable();
-
- if (!pixo->is_bound)
- return TRUE;
-
- x11_trap_errors();
- gl_vtable->glx_release_tex_image(
- pixo->dpy,
- pixo->glx_pixmap,
- GLX_FRONT_LEFT_EXT
- );
- XSync(pixo->dpy, False);
- if (x11_untrap_errors() != 0) {
- GST_DEBUG("failed to release pixmap");
- return FALSE;
- }
-
- gl_unbind_texture(&pixo->old_texture);
+ GLVTable *const gl_vtable = gl_get_vtable ();
- pixo->is_bound = FALSE;
+ if (!pixo->is_bound)
return TRUE;
+
+ x11_trap_errors ();
+ gl_vtable->glx_release_tex_image (pixo->dpy,
+ pixo->glx_pixmap, GLX_FRONT_LEFT_EXT);
+ XSync (pixo->dpy, False);
+ if (x11_untrap_errors () != 0) {
+ GST_DEBUG ("failed to release pixmap");
+ return FALSE;
+ }
+
+ gl_unbind_texture (&pixo->old_texture);
+
+ pixo->is_bound = FALSE;
+ return TRUE;
}
/**
* an error occurred
*/
GLFramebufferObject *
-gl_create_framebuffer_object(
- GLenum target,
- GLuint texture,
- guint width,
- guint height
-)
+gl_create_framebuffer_object (GLenum target,
+ GLuint texture, guint width, guint height)
{
- GLVTable * const gl_vtable = gl_get_vtable();
- GLFramebufferObject *fbo;
- GLenum status;
-
- if (!gl_vtable || !gl_vtable->has_framebuffer_object)
- return NULL;
-
- /* XXX: we only support GL_TEXTURE_2D at this time */
- if (target != GL_TEXTURE_2D)
- return NULL;
-
- fbo = calloc(1, sizeof(*fbo));
- if (!fbo)
- return NULL;
-
- fbo->width = width;
- fbo->height = height;
- fbo->fbo = 0;
- fbo->old_fbo = 0;
- fbo->is_bound = FALSE;
-
- gl_get_param(GL_FRAMEBUFFER_BINDING, &fbo->old_fbo);
- gl_vtable->gl_gen_framebuffers(1, &fbo->fbo);
- gl_vtable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, fbo->fbo);
- gl_vtable->gl_framebuffer_texture_2d(
- GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- target, texture,
- 0
- );
-
- status = gl_vtable->gl_check_framebuffer_status(GL_DRAW_FRAMEBUFFER_EXT);
- gl_vtable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, fbo->old_fbo);
- if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
- goto error;
- return fbo;
+ GLVTable *const gl_vtable = gl_get_vtable ();
+ GLFramebufferObject *fbo;
+ GLenum status;
-error:
- gl_destroy_framebuffer_object(fbo);
+ if (!gl_vtable || !gl_vtable->has_framebuffer_object)
return NULL;
+
+ /* XXX: we only support GL_TEXTURE_2D at this time */
+ if (target != GL_TEXTURE_2D)
+ return NULL;
+
+ fbo = calloc (1, sizeof (*fbo));
+ if (!fbo)
+ return NULL;
+
+ fbo->width = width;
+ fbo->height = height;
+ fbo->fbo = 0;
+ fbo->old_fbo = 0;
+ fbo->is_bound = FALSE;
+
+ gl_get_param (GL_FRAMEBUFFER_BINDING, &fbo->old_fbo);
+ gl_vtable->gl_gen_framebuffers (1, &fbo->fbo);
+ gl_vtable->gl_bind_framebuffer (GL_FRAMEBUFFER_EXT, fbo->fbo);
+ gl_vtable->gl_framebuffer_texture_2d (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT, target, texture, 0);
+
+ status = gl_vtable->gl_check_framebuffer_status (GL_DRAW_FRAMEBUFFER_EXT);
+ gl_vtable->gl_bind_framebuffer (GL_FRAMEBUFFER_EXT, fbo->old_fbo);
+ if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
+ goto error;
+ return fbo;
+
+error:
+ gl_destroy_framebuffer_object (fbo);
+ return NULL;
}
/**
* Destroys the @fbo object.
*/
void
-gl_destroy_framebuffer_object(GLFramebufferObject *fbo)
+gl_destroy_framebuffer_object (GLFramebufferObject * fbo)
{
- GLVTable * const gl_vtable = gl_get_vtable();
+ GLVTable *const gl_vtable = gl_get_vtable ();
- if (!fbo)
- return;
+ if (!fbo)
+ return;
- gl_unbind_framebuffer_object(fbo);
+ gl_unbind_framebuffer_object (fbo);
- if (fbo->fbo) {
- gl_vtable->gl_delete_framebuffers(1, &fbo->fbo);
- fbo->fbo = 0;
- }
- free(fbo);
+ if (fbo->fbo) {
+ gl_vtable->gl_delete_framebuffers (1, &fbo->fbo);
+ fbo->fbo = 0;
+ }
+ free (fbo);
}
/**
* Return value: %TRUE on success
*/
gboolean
-gl_bind_framebuffer_object(GLFramebufferObject *fbo)
+gl_bind_framebuffer_object (GLFramebufferObject * fbo)
{
- GLVTable * const gl_vtable = gl_get_vtable();
- const guint width = fbo->width;
- const guint height = fbo->height;
-
- const guint attribs = (GL_VIEWPORT_BIT|
- GL_CURRENT_BIT|
- GL_ENABLE_BIT|
- GL_TEXTURE_BIT|
- GL_COLOR_BUFFER_BIT);
-
- if (fbo->is_bound)
- return TRUE;
-
- gl_get_param(GL_FRAMEBUFFER_BINDING, &fbo->old_fbo);
- gl_vtable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, fbo->fbo);
- glPushAttrib(attribs);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- glViewport(0, 0, width, height);
- glTranslatef(-1.0f, -1.0f, 0.0f);
- glScalef(2.0f / width, 2.0f / height, 1.0f);
-
- fbo->is_bound = TRUE;
+ GLVTable *const gl_vtable = gl_get_vtable ();
+ const guint width = fbo->width;
+ const guint height = fbo->height;
+
+ const guint attribs = (GL_VIEWPORT_BIT |
+ GL_CURRENT_BIT | GL_ENABLE_BIT | GL_TEXTURE_BIT | GL_COLOR_BUFFER_BIT);
+
+ if (fbo->is_bound)
return TRUE;
+
+ gl_get_param (GL_FRAMEBUFFER_BINDING, &fbo->old_fbo);
+ gl_vtable->gl_bind_framebuffer (GL_FRAMEBUFFER_EXT, fbo->fbo);
+ glPushAttrib (attribs);
+ glMatrixMode (GL_PROJECTION);
+ glPushMatrix ();
+ glLoadIdentity ();
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+ glLoadIdentity ();
+ glViewport (0, 0, width, height);
+ glTranslatef (-1.0f, -1.0f, 0.0f);
+ glScalef (2.0f / width, 2.0f / height, 1.0f);
+
+ fbo->is_bound = TRUE;
+ return TRUE;
}
/**
* Return value: %TRUE on success
*/
gboolean
-gl_unbind_framebuffer_object(GLFramebufferObject *fbo)
+gl_unbind_framebuffer_object (GLFramebufferObject * fbo)
{
- GLVTable * const gl_vtable = gl_get_vtable();
+ GLVTable *const gl_vtable = gl_get_vtable ();
- if (!fbo->is_bound)
- return TRUE;
+ if (!fbo->is_bound)
+ return TRUE;
- glPopAttrib();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- gl_vtable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, fbo->old_fbo);
+ glPopAttrib ();
+ glMatrixMode (GL_PROJECTION);
+ glPopMatrix ();
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix ();
+ gl_vtable->gl_bind_framebuffer (GL_FRAMEBUFFER_EXT, fbo->old_fbo);
- fbo->is_bound = FALSE;
- return TRUE;
+ fbo->is_bound = FALSE;
+ return TRUE;
}