2 * gstvaapiutils.c - VA-API utilities
4 * Copyright (C) 2010-2011 Splitted-Desktop Systems
5 * Author: Gwenole Beauchesne <gwenole.beauchesne@splitted-desktop.com>
6 * Copyright (C) 2011-2014 Intel Corporation
7 * Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 2.1
12 * of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301 USA
26 #include "gstvaapicompat.h"
27 #include "gstvaapiutils.h"
28 #include "gstvaapibufferproxy.h"
29 #include "gstvaapifilter.h"
30 #include "gstvaapisubpicture.h"
31 #include "gstvaapisurface.h"
36 #include "gstvaapidebug.h"
38 /* string case an enum */
39 #define STRCASEP(p, x) STRCASE(G_PASTE(p, x))
40 #define STRCASE(x) case x: return G_STRINGIFY(x)
42 /* string case a macro */
43 #define STRCASEM(p, x) case G_PASTE(p, x): return G_STRINGIFY(x)
45 #if VA_CHECK_VERSION (0,40,0)
47 strip_msg (const char *message)
51 msg = g_strdup (message);
54 return g_strstrip (msg);
57 #if VA_CHECK_VERSION (1,0,0)
59 gst_vaapi_err (void *data, const char *message)
63 msg = strip_msg (message);
66 GST_ERROR ("%s", msg);
71 gst_vaapi_warning (void *data, const char *message)
75 msg = strip_msg (message);
78 GST_WARNING ("%s", msg);
85 #if VA_CHECK_VERSION (1,0,0)
92 msg = strip_msg (message);
101 vaapi_initialize (VADisplay dpy)
103 gint major_version, minor_version;
106 #if VA_CHECK_VERSION (1,0,0)
107 vaSetErrorCallback (dpy, gst_vaapi_warning, NULL);
108 vaSetInfoCallback (dpy, gst_vaapi_log, NULL);
109 #elif VA_CHECK_VERSION (0,40,0)
110 vaSetInfoCallback (gst_vaapi_log);
113 status = vaInitialize (dpy, &major_version, &minor_version);
115 #if VA_CHECK_VERSION (1,0,0)
116 vaSetErrorCallback (dpy, gst_vaapi_err, NULL);
119 if (!vaapi_check_status (status, "vaInitialize()"))
122 GST_INFO ("VA-API version %d.%d", major_version, minor_version);
126 /* Check VA status for success or print out an error */
128 vaapi_check_status (VAStatus status, const gchar * msg)
130 if (status != VA_STATUS_SUCCESS) {
131 GST_DEBUG ("%s: %s", msg, vaErrorStr (status));
139 vaapi_map_buffer (VADisplay dpy, VABufferID buf_id)
142 gpointer data = NULL;
144 status = vaMapBuffer (dpy, buf_id, &data);
145 if (!vaapi_check_status (status, "vaMapBuffer()"))
150 /* Unmaps VA buffer */
152 vaapi_unmap_buffer (VADisplay dpy, VABufferID buf_id, gpointer * pbuf)
159 status = vaUnmapBuffer (dpy, buf_id);
160 if (!vaapi_check_status (status, "vaUnmapBuffer()"))
164 /* Creates and maps VA buffer */
166 vaapi_create_buffer (VADisplay dpy, VAContextID ctx, int type, guint size,
167 gconstpointer buf, VABufferID * buf_id_ptr, gpointer * mapped_data)
169 return vaapi_create_n_elements_buffer (dpy, ctx, type, size, buf, buf_id_ptr,
174 vaapi_create_n_elements_buffer (VADisplay dpy, VAContextID ctx, int type,
175 guint size, gconstpointer buf, VABufferID * buf_id_ptr,
176 gpointer * mapped_data, int num_elements)
180 gpointer data = (gpointer) buf;
182 status = vaCreateBuffer (dpy, ctx, type, size, num_elements, data, &buf_id);
183 if (!vaapi_check_status (status, "vaCreateBuffer()"))
187 data = vaapi_map_buffer (dpy, buf_id);
193 *buf_id_ptr = buf_id;
199 vaapi_destroy_buffer (dpy, &buf_id);
204 /* Destroy VA buffer */
206 vaapi_destroy_buffer (VADisplay dpy, VABufferID * buf_id_ptr)
208 if (!buf_id_ptr || *buf_id_ptr == VA_INVALID_ID)
211 vaDestroyBuffer (dpy, *buf_id_ptr);
212 *buf_id_ptr = VA_INVALID_ID;
215 /* Return a string representation of a VAProfile */
217 string_of_VAProfile (VAProfile profile)
220 #define MAP(profile) \
221 STRCASEP(VAProfile, profile)
225 MAP (MPEG4AdvancedSimple);
229 MAP (H264ConstrainedBaseline);
230 #if !VA_CHECK_VERSION(1,0,0)
235 MAP (H264MultiviewHigh);
236 MAP (H264StereoHigh);
237 #if VA_CHECK_VERSION(1,2,0)
238 MAP (HEVCMain422_10);
240 MAP (HEVCMain444_10);
243 MAP (HEVCSccMain444);
245 #if VA_CHECK_VERSION(1,8,0)
246 MAP (HEVCSccMain444_10);
258 #if VA_CHECK_VERSION(1,8,0)
269 /* Return a string representation of a VAEntrypoint */
271 string_of_VAEntrypoint (VAEntrypoint entrypoint)
273 switch (entrypoint) {
274 #define MAP(entrypoint) \
275 STRCASEP(VAEntrypoint, entrypoint)
283 #if VA_CHECK_VERSION(0,39,1)
287 #if VA_CHECK_VERSION(1,0,0)
297 /* Return a string representation of a VADisplayAttributeType */
299 string_of_VADisplayAttributeType (VADisplayAttribType attribute_type)
301 switch (attribute_type) {
302 #define MAP(attribute_type) \
303 STRCASEP(VADisplayAttrib, attribute_type)
308 MAP (BackgroundColor);
310 MAP (OutofLoopDeblock);
313 MAP (OverlayAutoPaintColorKey);
314 MAP (OverlayColorKey);
325 /* Return a string representation of a VA chroma format */
327 string_of_va_chroma_format (guint chroma_format)
329 switch (chroma_format) {
331 STRCASEM(VA_RT_FORMAT_, value)
340 #if VA_CHECK_VERSION(1,2,0)
356 string_of_VARateControl (guint rate_control)
358 switch (rate_control) {
369 case VA_RC_VBR_CONSTRAINED:
370 return "VBR-Constrained";
371 #if VA_CHECK_VERSION(0,39,1)
375 #if VA_CHECK_VERSION(1,1,0)
379 #if VA_CHECK_VERSION(1,3,0)
390 * to_GstVaapiChromaType:
391 * @va_rt_format: the value of VAConfigAttribRTFormat
393 * Converts the VA_RT_FORMAT_* to #GstVaapiChromaType
395 * Returns: the #GstVaapiChromaType associated to @va_rt_format or
399 to_GstVaapiChromaType (guint va_rt_format)
401 if (va_rt_format & VA_RT_FORMAT_YUV420)
402 return GST_VAAPI_CHROMA_TYPE_YUV420;
403 if (va_rt_format & VA_RT_FORMAT_YUV422)
404 return GST_VAAPI_CHROMA_TYPE_YUV422;
405 if (va_rt_format & VA_RT_FORMAT_YUV444)
406 return GST_VAAPI_CHROMA_TYPE_YUV444;
407 if (va_rt_format & VA_RT_FORMAT_YUV411)
408 return GST_VAAPI_CHROMA_TYPE_YUV411;
409 if (va_rt_format & VA_RT_FORMAT_YUV400)
410 return GST_VAAPI_CHROMA_TYPE_YUV400;
411 if (va_rt_format & VA_RT_FORMAT_RGB32)
412 return GST_VAAPI_CHROMA_TYPE_RGB32;
413 if (va_rt_format & VA_RT_FORMAT_RGB16)
414 return GST_VAAPI_CHROMA_TYPE_RGB16;
415 if (va_rt_format & VA_RT_FORMAT_RGBP)
416 return GST_VAAPI_CHROMA_TYPE_RGBP;
417 if (va_rt_format & VA_RT_FORMAT_YUV420_10BPP)
418 return GST_VAAPI_CHROMA_TYPE_YUV420_10BPP;
419 #if VA_CHECK_VERSION(1,2,0)
420 if (va_rt_format & VA_RT_FORMAT_YUV422_10)
421 return GST_VAAPI_CHROMA_TYPE_YUV422_10BPP;
422 if (va_rt_format & VA_RT_FORMAT_YUV444_10)
423 return GST_VAAPI_CHROMA_TYPE_YUV444_10BPP;
424 if (va_rt_format & VA_RT_FORMAT_YUV420_12)
425 return GST_VAAPI_CHROMA_TYPE_YUV420_12BPP;
426 if (va_rt_format & VA_RT_FORMAT_YUV422_12)
427 return GST_VAAPI_CHROMA_TYPE_YUV422_12BPP;
428 if (va_rt_format & VA_RT_FORMAT_YUV444_12)
429 return GST_VAAPI_CHROMA_TYPE_YUV444_12BPP;
430 if (va_rt_format & VA_RT_FORMAT_RGB32_10)
431 return GST_VAAPI_CHROMA_TYPE_RGB32_10BPP;
437 * from_GstVaapiChromaType:
438 * @chroma_type: the #GstVaapiChromaType
440 * Converts #GstVaapiChromaType to a chroma format suitable for
441 * vaCreateSurfaces().
444 from_GstVaapiChromaType (guint chroma_type)
448 switch (chroma_type) {
449 case GST_VAAPI_CHROMA_TYPE_YUV420:
450 format = VA_RT_FORMAT_YUV420;
452 case GST_VAAPI_CHROMA_TYPE_YUV422:
453 format = VA_RT_FORMAT_YUV422;
455 case GST_VAAPI_CHROMA_TYPE_YUV444:
456 format = VA_RT_FORMAT_YUV444;
458 case GST_VAAPI_CHROMA_TYPE_YUV411:
459 format = VA_RT_FORMAT_YUV411;
461 case GST_VAAPI_CHROMA_TYPE_YUV400:
462 format = VA_RT_FORMAT_YUV400;
464 case GST_VAAPI_CHROMA_TYPE_RGB32:
465 format = VA_RT_FORMAT_RGB32;
467 case GST_VAAPI_CHROMA_TYPE_RGB16:
468 format = VA_RT_FORMAT_RGB16;
470 case GST_VAAPI_CHROMA_TYPE_RGBP:
471 format = VA_RT_FORMAT_RGBP;
473 case GST_VAAPI_CHROMA_TYPE_YUV420_10BPP:
474 format = VA_RT_FORMAT_YUV420_10BPP;
476 #if VA_CHECK_VERSION(1,2,0)
477 case GST_VAAPI_CHROMA_TYPE_YUV422_10BPP:
478 format = VA_RT_FORMAT_YUV422_10;
480 case GST_VAAPI_CHROMA_TYPE_YUV444_10BPP:
481 format = VA_RT_FORMAT_YUV444_10;
483 case GST_VAAPI_CHROMA_TYPE_YUV420_12BPP:
484 format = VA_RT_FORMAT_YUV420_12;
486 case GST_VAAPI_CHROMA_TYPE_YUV422_12BPP:
487 format = VA_RT_FORMAT_YUV422_12;
489 case GST_VAAPI_CHROMA_TYPE_YUV444_12BPP:
490 format = VA_RT_FORMAT_YUV444_12;
492 case GST_VAAPI_CHROMA_TYPE_RGB32_10BPP:
493 format = VA_RT_FORMAT_RGB32_10;
504 * from_GstVaapiSubpictureFlags:
505 * @flags: the #GstVaapiSubpictureFlags
507 * Converts #GstVaapiSubpictureFlags to flags suitable for
508 * vaAssociateSubpicture().
511 from_GstVaapiSubpictureFlags (guint flags)
515 if (flags & GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA)
516 va_flags |= VA_SUBPICTURE_GLOBAL_ALPHA;
517 #ifdef VA_SUBPICTURE_PREMULTIPLIED_ALPHA
518 if (flags & GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA)
519 flags |= VA_SUBPICTURE_PREMULTIPLIED_ALPHA;
525 * to_GstVaapiSubpictureFlags:
526 * @flags: the #GstVaapiSubpictureFlags flags to translate
528 * Converts vaQuerySubpictureFormats() @flags to #GstVaapiSubpictureFlags
531 * Return value: the #GstVaapiSubpictureFlags flags
534 to_GstVaapiSubpictureFlags (guint va_flags)
538 if (va_flags & VA_SUBPICTURE_GLOBAL_ALPHA)
539 flags |= GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA;
540 #ifdef VA_SUBPICTURE_PREMULTIPLIED_ALPHA
541 if (va_flags & VA_SUBPICTURE_PREMULTIPLIED_ALPHA)
542 flags |= GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA;
548 * from_GstVideoOverlayFormatFlags:
549 * @flags: the #GstVideoOverlayFormatFlags flags to translate
551 * Converts #GstVaapiSubpictureFlags to #GstVaapiSubpictureFlags.
553 * Return value: the #GstVaapiSubpictureFlags flags
556 from_GstVideoOverlayFormatFlags (guint ovl_flags)
560 if (ovl_flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA)
561 flags |= GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA;
562 if (ovl_flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA)
563 flags |= GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA;
568 * to_GstVideoOverlayFormatFlags:
569 * @flags: the #GstVaapiSubpictureFlags flags to translate
571 * Converts #GstVaapiSubpictureFlags to #GstVideoOverlayFormatFlags.
573 * Return value: the #GstVideoOverlayFormatFlags flags
576 to_GstVideoOverlayFormatFlags (guint flags)
580 if (flags & GST_VAAPI_SUBPICTURE_FLAG_PREMULTIPLIED_ALPHA)
581 ovl_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA;
582 if (flags & GST_VAAPI_SUBPICTURE_FLAG_GLOBAL_ALPHA)
583 ovl_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_GLOBAL_ALPHA;
588 * from_GstVaapiSurfaceRenderFlags:
589 * @flags: the #GstVaapiSurfaceRenderFlags
591 * Converts #GstVaapiSurfaceRenderFlags to flags suitable for
595 from_GstVaapiSurfaceRenderFlags (guint flags)
597 guint va_fields, va_csc;
599 /* Picture structure */
600 switch (flags & GST_VAAPI_PICTURE_STRUCTURE_MASK) {
601 case GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD:
602 va_fields = VA_TOP_FIELD;
604 case GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD:
605 va_fields = VA_BOTTOM_FIELD;
608 va_fields = VA_FRAME_PICTURE;
613 switch (flags & GST_VAAPI_COLOR_STANDARD_MASK) {
615 case GST_VAAPI_COLOR_STANDARD_ITUR_BT_601:
616 va_csc = VA_SRC_BT601;
620 case GST_VAAPI_COLOR_STANDARD_ITUR_BT_709:
621 va_csc = VA_SRC_BT709;
624 #ifdef VA_SRC_SMPTE_240
625 case GST_VAAPI_COLOR_STANDARD_SMPTE_240M:
626 va_csc = VA_SRC_SMPTE_240;
633 return va_fields | va_csc;
637 * to_GstVaapiSurfaceStatus:
638 * @flags: the #GstVaapiSurfaceStatus flags to translate
640 * Converts vaQuerySurfaceStatus() @flags to #GstVaapiSurfaceStatus
643 * Return value: the #GstVaapiSurfaceStatus flags
646 to_GstVaapiSurfaceStatus (guint va_flags)
649 const guint va_flags_mask = (VASurfaceReady |
650 VASurfaceRendering | VASurfaceDisplaying);
652 /* Check for core status */
653 switch (va_flags & va_flags_mask) {
655 flags = GST_VAAPI_SURFACE_STATUS_IDLE;
657 case VASurfaceRendering:
658 flags = GST_VAAPI_SURFACE_STATUS_RENDERING;
660 case VASurfaceDisplaying:
661 flags = GST_VAAPI_SURFACE_STATUS_DISPLAYING;
668 /* Check for encoder status */
669 if (va_flags & VASurfaceSkipped)
670 flags |= GST_VAAPI_SURFACE_STATUS_SKIPPED;
674 /* Translate GstVaapiRotation value to VA-API rotation value */
676 from_GstVaapiRotation (guint value)
679 case GST_VAAPI_ROTATION_0:
680 return VA_ROTATION_NONE;
681 case GST_VAAPI_ROTATION_90:
682 return VA_ROTATION_90;
683 case GST_VAAPI_ROTATION_180:
684 return VA_ROTATION_180;
685 case GST_VAAPI_ROTATION_270:
686 return VA_ROTATION_270;
688 GST_ERROR ("unsupported GstVaapiRotation value %d", value);
689 return VA_ROTATION_NONE;
692 /* Translate VA-API rotation value to GstVaapiRotation value */
694 to_GstVaapiRotation (guint value)
697 case VA_ROTATION_NONE:
698 return GST_VAAPI_ROTATION_0;
700 return GST_VAAPI_ROTATION_90;
701 case VA_ROTATION_180:
702 return GST_VAAPI_ROTATION_180;
703 case VA_ROTATION_270:
704 return GST_VAAPI_ROTATION_270;
706 GST_ERROR ("unsupported VA-API rotation value %d", value);
707 return GST_VAAPI_ROTATION_0;
711 from_GstVaapiRateControl (guint value)
714 case GST_VAAPI_RATECONTROL_NONE:
716 case GST_VAAPI_RATECONTROL_CQP:
718 case GST_VAAPI_RATECONTROL_CBR:
720 case GST_VAAPI_RATECONTROL_VCM:
722 case GST_VAAPI_RATECONTROL_VBR:
724 case GST_VAAPI_RATECONTROL_VBR_CONSTRAINED:
725 return VA_RC_VBR_CONSTRAINED;
726 #if VA_CHECK_VERSION(0,39,1)
727 case GST_VAAPI_RATECONTROL_MB:
730 #if VA_CHECK_VERSION(1,1,0)
731 case GST_VAAPI_RATECONTROL_ICQ:
734 #if VA_CHECK_VERSION(1,3,0)
735 case GST_VAAPI_RATECONTROL_QVBR:
739 GST_ERROR ("unsupported GstVaapiRateControl value %u", value);
744 to_GstVaapiRateControl (guint value)
748 return GST_VAAPI_RATECONTROL_NONE;
750 return GST_VAAPI_RATECONTROL_CQP;
752 return GST_VAAPI_RATECONTROL_CBR;
754 return GST_VAAPI_RATECONTROL_VCM;
756 return GST_VAAPI_RATECONTROL_VBR;
757 case VA_RC_VBR_CONSTRAINED:
758 return GST_VAAPI_RATECONTROL_VBR_CONSTRAINED;
759 #if VA_CHECK_VERSION(0,39,1)
761 return GST_VAAPI_RATECONTROL_MB;
763 #if VA_CHECK_VERSION(1,1,0)
765 return GST_VAAPI_RATECONTROL_ICQ;
767 #if VA_CHECK_VERSION(1,3,0)
769 return GST_VAAPI_RATECONTROL_QVBR;
773 GST_ERROR ("unsupported VA-API Rate Control value %u", value);
774 return GST_VAAPI_RATECONTROL_NONE;
777 /* VPP: translate GstVaapiDeinterlaceMethod to VA deinterlacing algorithm */
779 from_GstVaapiDeinterlaceMethod (guint value)
782 case GST_VAAPI_DEINTERLACE_METHOD_NONE:
784 case GST_VAAPI_DEINTERLACE_METHOD_BOB:
785 return VAProcDeinterlacingBob;
786 case GST_VAAPI_DEINTERLACE_METHOD_WEAVE:
787 return VAProcDeinterlacingWeave;
788 case GST_VAAPI_DEINTERLACE_METHOD_MOTION_ADAPTIVE:
789 return VAProcDeinterlacingMotionAdaptive;
790 case GST_VAAPI_DEINTERLACE_METHOD_MOTION_COMPENSATED:
791 return VAProcDeinterlacingMotionCompensated;
793 GST_ERROR ("unsupported GstVaapiDeinterlaceMethod value %d", value);
797 /* VPP: translate GstVaapiDeinterlaceFlags into VA deinterlacing flags */
799 from_GstVaapiDeinterlaceFlags (guint flags)
803 if (!(flags & GST_VAAPI_DEINTERLACE_FLAG_TFF))
804 va_flags |= VA_DEINTERLACING_BOTTOM_FIELD_FIRST;
806 if (flags & GST_VAAPI_DEINTERLACE_FLAG_ONEFIELD)
807 va_flags |= VA_DEINTERLACING_ONE_FIELD;
809 if (!(flags & GST_VAAPI_DEINTERLACE_FLAG_TOPFIELD))
810 va_flags |= VA_DEINTERLACING_BOTTOM_FIELD;
814 /* VPP: translate GstVaapiScaleMethod into VA scaling flags */
816 from_GstVaapiScaleMethod (guint value)
821 case GST_VAAPI_SCALE_METHOD_DEFAULT:
822 va_flags = VA_FILTER_SCALING_DEFAULT;
824 case GST_VAAPI_SCALE_METHOD_FAST:
825 va_flags = VA_FILTER_SCALING_FAST;
827 case GST_VAAPI_SCALE_METHOD_HQ:
828 va_flags = VA_FILTER_SCALING_HQ;
837 /* VPP: translate VA scaling flags into GstVaapiScale Method */
839 to_GstVaapiScaleMethod (guint flags)
841 GstVaapiScaleMethod method;
844 case VA_FILTER_SCALING_FAST:
845 method = GST_VAAPI_SCALE_METHOD_FAST;
847 case VA_FILTER_SCALING_HQ:
848 method = GST_VAAPI_SCALE_METHOD_HQ;
851 method = GST_VAAPI_SCALE_METHOD_DEFAULT;
857 /* VPP: translate GstVideoOrientationMethod into VA mirror/rotation flags */
859 from_GstVideoOrientationMethod (guint value, guint * va_mirror,
866 #if VA_CHECK_VERSION(1,1,0)
867 case GST_VIDEO_ORIENTATION_IDENTITY:
868 *va_mirror = VA_MIRROR_NONE;
869 *va_rotation = VA_ROTATION_NONE;
871 case GST_VIDEO_ORIENTATION_HORIZ:
872 *va_mirror = VA_MIRROR_HORIZONTAL;
873 *va_rotation = VA_ROTATION_NONE;
875 case GST_VIDEO_ORIENTATION_VERT:
876 *va_mirror = VA_MIRROR_VERTICAL;
877 *va_rotation = VA_ROTATION_NONE;
879 case GST_VIDEO_ORIENTATION_90R:
880 *va_mirror = VA_MIRROR_NONE;
881 *va_rotation = VA_ROTATION_90;
883 case GST_VIDEO_ORIENTATION_180:
884 *va_mirror = VA_MIRROR_NONE;
885 *va_rotation = VA_ROTATION_180;
887 case GST_VIDEO_ORIENTATION_90L:
888 *va_mirror = VA_MIRROR_NONE;
889 *va_rotation = VA_ROTATION_270;
891 case GST_VIDEO_ORIENTATION_UL_LR:
892 *va_mirror = VA_MIRROR_HORIZONTAL;
893 *va_rotation = VA_ROTATION_90;
895 case GST_VIDEO_ORIENTATION_UR_LL:
896 *va_mirror = VA_MIRROR_VERTICAL;
897 *va_rotation = VA_ROTATION_90;
906 * from_GstVaapiBufferMemoryType:
907 * @type: a #GstVaapiBufferMemoryType
909 * Returns: the VA's memory type symbol
912 from_GstVaapiBufferMemoryType (guint type)
917 #if VA_CHECK_VERSION(1,1,0)
918 case GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF2:
919 va_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2;
922 case GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF:
923 va_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
925 case GST_VAAPI_BUFFER_MEMORY_TYPE_GEM_BUF:
926 va_type = VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM;
928 case GST_VAAPI_BUFFER_MEMORY_TYPE_V4L2:
929 va_type = VA_SURFACE_ATTRIB_MEM_TYPE_V4L2;
931 case GST_VAAPI_BUFFER_MEMORY_TYPE_USER_PTR:
932 va_type = VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR;
942 * to_GstVaapiBufferMemoryType:
943 * @va_type: a VA's memory type symbol
945 * It will return the first "supported" memory type from @va_type bit
948 * Returns: a #GstVaapiBufferMemoryType or 0 if unknown.
951 to_GstVaapiBufferMemoryType (guint va_type)
953 #if VA_CHECK_VERSION(1,1,0)
954 if ((va_type & VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2))
955 return GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF2;
957 if ((va_type & VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME))
958 return GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF;
959 if ((va_type & VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM))
960 return GST_VAAPI_BUFFER_MEMORY_TYPE_GEM_BUF;
961 if ((va_type & VA_SURFACE_ATTRIB_MEM_TYPE_V4L2))
962 return GST_VAAPI_BUFFER_MEMORY_TYPE_V4L2;
963 if ((va_type & VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR))
964 return GST_VAAPI_BUFFER_MEMORY_TYPE_USER_PTR;
969 * from_GstVideoColorimetry:
970 * @colorimetry: a #GstVideoColorimetry type
972 * VPP: maps the #GstVideoColorimetry type to the VAProcColorStandardType. If
973 * @colorimetry is NULL or colorimetry->primaries are unknown, then returns
974 * VAProcColorStandardNone. If there is no 1:1 correlation, then returns
975 * VAProcColorStandardExplicit. Otherwise, the correlating
976 * VAProcColorStandardType is returned.
978 * Returns: a VAProcColorStandardType.
981 from_GstVideoColorimetry (const GstVideoColorimetry * const colorimetry)
983 #if VA_CHECK_VERSION(1,2,0)
985 || colorimetry->primaries == GST_VIDEO_COLOR_PRIMARIES_UNKNOWN)
986 return VAProcColorStandardNone;
987 if (gst_video_colorimetry_matches (colorimetry, GST_VIDEO_COLORIMETRY_BT709))
988 return VAProcColorStandardBT709;
989 /* NOTE: VAProcColorStandardBT2020 in VAAPI is the same as
990 * GST_VIDEO_COLORIMETRY_BT2020_10 in gstreamer. */
991 if (gst_video_colorimetry_matches (colorimetry,
992 GST_VIDEO_COLORIMETRY_BT2020_10) ||
993 gst_video_colorimetry_matches (colorimetry, GST_VIDEO_COLORIMETRY_BT2020))
994 return VAProcColorStandardBT2020;
995 if (gst_video_colorimetry_matches (colorimetry, GST_VIDEO_COLORIMETRY_BT601))
996 return VAProcColorStandardBT601;
997 if (gst_video_colorimetry_matches (colorimetry,
998 GST_VIDEO_COLORIMETRY_SMPTE240M))
999 return VAProcColorStandardSMPTE240M;
1001 return VAProcColorStandardExplicit;
1003 return VAProcColorStandardNone;
1008 * from_GstVideoColorRange:
1009 * @value: a #GstVideoColorRange
1011 * VPP: maps the #GstVideoColorRange to the VA value.
1013 * Returns: the VA color range.
1016 from_GstVideoColorRange (const GstVideoColorRange value)
1018 #if VA_CHECK_VERSION(1,2,0)
1020 case GST_VIDEO_COLOR_RANGE_0_255:
1021 return VA_SOURCE_RANGE_FULL;
1022 case GST_VIDEO_COLOR_RANGE_16_235:
1023 return VA_SOURCE_RANGE_REDUCED;
1025 return VA_SOURCE_RANGE_UNKNOWN;