- gst_vaapi_surface_proxy_replace(&mem->proxy,
- gst_vaapi_video_meta_get_surface_proxy(mem->meta));
+ switch (flags & GST_MAP_READWRITE) {
+ case 0:
+ // No flags set: return a GstVaapiSurfaceProxy
+ gst_vaapi_surface_proxy_replace(&mem->proxy,
+ gst_vaapi_video_meta_get_surface_proxy(mem->meta));
+ if (!mem->proxy)
+ goto error_no_surface_proxy;
+ mem->map_type = GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_SURFACE;
+ break;
+ case GST_MAP_READ:
+ // Only read flag set: return raw pixels
+ if (!ensure_surface(mem))
+ return NULL;
+ if (!ensure_image(mem))
+ goto error_ensure_image;
+ if (!mem->use_direct_rendering)
+ gst_vaapi_surface_get_image(mem->surface, mem->image);
+ if (!gst_vaapi_image_map(mem->image))
+ goto error_map_image;
+ mem->map_type = GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_LINEAR;
+ break;
+ default:
+ goto error_unsupported_map;
+ }
+ }
+
+ switch (mem->map_type) {
+ case GST_VAAPI_VIDEO_MEMORY_MAP_TYPE_SURFACE: