diff options
Diffstat (limited to 'gst-libs/gst/vaapi/gstvaapiimage.c')
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapiimage.c | 1064 |
1 files changed, 507 insertions, 557 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapiimage.c b/gst-libs/gst/vaapi/gstvaapiimage.c index 8a295a5f..98bedcb3 100644 --- a/gst-libs/gst/vaapi/gstvaapiimage.c +++ b/gst-libs/gst/vaapi/gstvaapiimage.c @@ -45,192 +45,184 @@ } while (0) static gboolean -_gst_vaapi_image_map(GstVaapiImage *image, GstVaapiImageRaw *raw_image); +_gst_vaapi_image_map (GstVaapiImage * image, GstVaapiImageRaw * raw_image); -static gboolean -_gst_vaapi_image_unmap(GstVaapiImage *image); +static gboolean _gst_vaapi_image_unmap (GstVaapiImage * image); static gboolean -_gst_vaapi_image_set_image(GstVaapiImage *image, const VAImage *va_image); +_gst_vaapi_image_set_image (GstVaapiImage * image, const VAImage * va_image); /* * VAImage wrapper */ static gboolean -vaapi_image_is_linear(const VAImage *va_image) +vaapi_image_is_linear (const VAImage * va_image) { - guint i, width, height, width2, height2, data_size; - - for (i = 1; i < va_image->num_planes; i++) - if (va_image->offsets[i] < va_image->offsets[i - 1]) - return FALSE; - - width = va_image->width; - height = va_image->height; - width2 = (width + 1) / 2; - height2 = (height + 1) / 2; - - switch (va_image->format.fourcc) { - case VA_FOURCC('N','V','1','2'): - case VA_FOURCC('Y','V','1','2'): - case VA_FOURCC('I','4','2','0'): - data_size = width * height + 2 * width2 * height2; - break; - case VA_FOURCC('Y','U','Y','2'): - case VA_FOURCC('U','Y','V','Y'): - data_size = 2 * width * height; - break; - case VA_FOURCC('Y','8','0','0'): - data_size = width * height; - break; - case VA_FOURCC('A','Y','U','V'): - case VA_FOURCC('A','R','G','B'): - case VA_FOURCC('R','G','B','A'): - case VA_FOURCC('A','B','G','R'): - case VA_FOURCC('B','G','R','A'): - case VA_FOURCC('X','R','G','B'): - case VA_FOURCC('R','G','B','X'): - case VA_FOURCC('X','B','G','R'): - case VA_FOURCC('B','G','R','X'): - data_size = 4 * width * height; - break; + guint i, width, height, width2, height2, data_size; + + for (i = 1; i < va_image->num_planes; i++) + if (va_image->offsets[i] < va_image->offsets[i - 1]) + return FALSE; + + width = va_image->width; + height = va_image->height; + width2 = (width + 1) / 2; + height2 = (height + 1) / 2; + + switch (va_image->format.fourcc) { + case VA_FOURCC ('N', 'V', '1', '2'): + case VA_FOURCC ('Y', 'V', '1', '2'): + case VA_FOURCC ('I', '4', '2', '0'): + data_size = width * height + 2 * width2 * height2; + break; + case VA_FOURCC ('Y', 'U', 'Y', '2'): + case VA_FOURCC ('U', 'Y', 'V', 'Y'): + data_size = 2 * width * height; + break; + case VA_FOURCC ('Y', '8', '0', '0'): + data_size = width * height; + break; + case VA_FOURCC ('A', 'Y', 'U', 'V'): + case VA_FOURCC ('A', 'R', 'G', 'B'): + case VA_FOURCC ('R', 'G', 'B', 'A'): + case VA_FOURCC ('A', 'B', 'G', 'R'): + case VA_FOURCC ('B', 'G', 'R', 'A'): + case VA_FOURCC ('X', 'R', 'G', 'B'): + case VA_FOURCC ('R', 'G', 'B', 'X'): + case VA_FOURCC ('X', 'B', 'G', 'R'): + case VA_FOURCC ('B', 'G', 'R', 'X'): + data_size = 4 * width * height; + break; default: - g_error("FIXME: incomplete formats %" GST_FOURCC_FORMAT, - GST_FOURCC_ARGS(va_image->format.fourcc)); - break; - } - return va_image->data_size == data_size; + g_error ("FIXME: incomplete formats %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (va_image->format.fourcc)); + break; + } + return va_image->data_size == data_size; } static void -gst_vaapi_image_destroy(GstVaapiImage *image) +gst_vaapi_image_destroy (GstVaapiImage * image) { - GstVaapiDisplay * const display = GST_VAAPI_OBJECT_DISPLAY(image); - VAImageID image_id; - VAStatus status; - - _gst_vaapi_image_unmap(image); - - image_id = GST_VAAPI_OBJECT_ID(image); - GST_DEBUG("image %" GST_VAAPI_ID_FORMAT, GST_VAAPI_ID_ARGS(image_id)); - - if (image_id != VA_INVALID_ID) { - GST_VAAPI_DISPLAY_LOCK(display); - status = vaDestroyImage(GST_VAAPI_DISPLAY_VADISPLAY(display), image_id); - GST_VAAPI_DISPLAY_UNLOCK(display); - if (!vaapi_check_status(status, "vaDestroyImage()")) - g_warning("failed to destroy image %" GST_VAAPI_ID_FORMAT, - GST_VAAPI_ID_ARGS(image_id)); - GST_VAAPI_OBJECT_ID(image) = VA_INVALID_ID; - } + GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (image); + VAImageID image_id; + VAStatus status; + + _gst_vaapi_image_unmap (image); + + image_id = GST_VAAPI_OBJECT_ID (image); + GST_DEBUG ("image %" GST_VAAPI_ID_FORMAT, GST_VAAPI_ID_ARGS (image_id)); + + if (image_id != VA_INVALID_ID) { + GST_VAAPI_DISPLAY_LOCK (display); + status = vaDestroyImage (GST_VAAPI_DISPLAY_VADISPLAY (display), image_id); + GST_VAAPI_DISPLAY_UNLOCK (display); + if (!vaapi_check_status (status, "vaDestroyImage()")) + g_warning ("failed to destroy image %" GST_VAAPI_ID_FORMAT, + GST_VAAPI_ID_ARGS (image_id)); + GST_VAAPI_OBJECT_ID (image) = VA_INVALID_ID; + } } static gboolean -_gst_vaapi_image_create(GstVaapiImage *image, GstVideoFormat format) +_gst_vaapi_image_create (GstVaapiImage * image, GstVideoFormat format) { - GstVaapiDisplay * const display = GST_VAAPI_OBJECT_DISPLAY(image); - const VAImageFormat *va_format; - VAStatus status; - - if (!gst_vaapi_display_has_image_format(display, format)) - return FALSE; - - va_format = gst_vaapi_video_format_to_va_format(format); - if (!va_format) - return FALSE; - - GST_VAAPI_DISPLAY_LOCK(display); - status = vaCreateImage( - GST_VAAPI_DISPLAY_VADISPLAY(display), - (VAImageFormat *)va_format, - image->width, - image->height, - &image->internal_image - ); - GST_VAAPI_DISPLAY_UNLOCK(display); - if (status != VA_STATUS_SUCCESS || - image->internal_image.format.fourcc != va_format->fourcc) - return FALSE; - - image->internal_format = format; - return TRUE; + GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (image); + const VAImageFormat *va_format; + VAStatus status; + + if (!gst_vaapi_display_has_image_format (display, format)) + return FALSE; + + va_format = gst_vaapi_video_format_to_va_format (format); + if (!va_format) + return FALSE; + + GST_VAAPI_DISPLAY_LOCK (display); + status = vaCreateImage (GST_VAAPI_DISPLAY_VADISPLAY (display), + (VAImageFormat *) va_format, + image->width, image->height, &image->internal_image); + GST_VAAPI_DISPLAY_UNLOCK (display); + if (status != VA_STATUS_SUCCESS || + image->internal_image.format.fourcc != va_format->fourcc) + return FALSE; + + image->internal_format = format; + return TRUE; } static gboolean -gst_vaapi_image_create(GstVaapiImage *image, GstVideoFormat format, +gst_vaapi_image_create (GstVaapiImage * image, GstVideoFormat format, guint width, guint height) { - const VAImageFormat *va_format; - VAImageID image_id; - - image->format = format; - image->width = width; - image->height = height; - - if (!_gst_vaapi_image_create(image, format)) { - switch (format) { - case GST_VIDEO_FORMAT_I420: - format = GST_VIDEO_FORMAT_YV12; - break; - case GST_VIDEO_FORMAT_YV12: - format = GST_VIDEO_FORMAT_I420; - break; - default: - format = 0; - break; - } - if (!format || !_gst_vaapi_image_create(image, format)) - return FALSE; + const VAImageFormat *va_format; + VAImageID image_id; + + image->format = format; + image->width = width; + image->height = height; + + if (!_gst_vaapi_image_create (image, format)) { + switch (format) { + case GST_VIDEO_FORMAT_I420: + format = GST_VIDEO_FORMAT_YV12; + break; + case GST_VIDEO_FORMAT_YV12: + format = GST_VIDEO_FORMAT_I420; + break; + default: + format = 0; + break; } - image->image = image->internal_image; - image_id = image->image.image_id; - - if (image->format != image->internal_format) { - switch (image->format) { - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_I420: - va_format = gst_vaapi_video_format_to_va_format(image->format); - if (!va_format) - return FALSE; - image->image.format = *va_format; - SWAP_UINT(image->image.offsets[1], image->image.offsets[2]); - SWAP_UINT(image->image.pitches[1], image->image.pitches[2]); - break; - default: - break; - } + if (!format || !_gst_vaapi_image_create (image, format)) + return FALSE; + } + image->image = image->internal_image; + image_id = image->image.image_id; + + if (image->format != image->internal_format) { + switch (image->format) { + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420: + va_format = gst_vaapi_video_format_to_va_format (image->format); + if (!va_format) + return FALSE; + image->image.format = *va_format; + SWAP_UINT (image->image.offsets[1], image->image.offsets[2]); + SWAP_UINT (image->image.pitches[1], image->image.pitches[2]); + break; + default: + break; } - image->is_linear = vaapi_image_is_linear(&image->image); + } + image->is_linear = vaapi_image_is_linear (&image->image); - GST_DEBUG("image %" GST_VAAPI_ID_FORMAT, GST_VAAPI_ID_ARGS(image_id)); - GST_VAAPI_OBJECT_ID(image) = image_id; - return TRUE; + GST_DEBUG ("image %" GST_VAAPI_ID_FORMAT, GST_VAAPI_ID_ARGS (image_id)); + GST_VAAPI_OBJECT_ID (image) = image_id; + return TRUE; } static void -gst_vaapi_image_init(GstVaapiImage *image) +gst_vaapi_image_init (GstVaapiImage * image) { - image->internal_image.image_id = VA_INVALID_ID; - image->internal_image.buf = VA_INVALID_ID; - image->image.image_id = VA_INVALID_ID; - image->image.buf = VA_INVALID_ID; + image->internal_image.image_id = VA_INVALID_ID; + image->internal_image.buf = VA_INVALID_ID; + image->image.image_id = VA_INVALID_ID; + image->image.buf = VA_INVALID_ID; } static void -gst_vaapi_image_class_init(GstVaapiImageClass *klass) +gst_vaapi_image_class_init (GstVaapiImageClass * klass) { - GstVaapiObjectClass * const object_class = - GST_VAAPI_OBJECT_CLASS(klass); + GstVaapiObjectClass *const object_class = GST_VAAPI_OBJECT_CLASS (klass); - object_class->init = (GstVaapiObjectInitFunc)gst_vaapi_image_init; + object_class->init = (GstVaapiObjectInitFunc) gst_vaapi_image_init; } #define gst_vaapi_image_finalize gst_vaapi_image_destroy -GST_VAAPI_OBJECT_DEFINE_CLASS_WITH_CODE( - GstVaapiImage, - gst_vaapi_image, - gst_vaapi_image_class_init(&g_class)) +GST_VAAPI_OBJECT_DEFINE_CLASS_WITH_CODE (GstVaapiImage, + gst_vaapi_image, gst_vaapi_image_class_init (&g_class)) /** * gst_vaapi_image_new: @@ -244,33 +236,28 @@ GST_VAAPI_OBJECT_DEFINE_CLASS_WITH_CODE( * * Return value: the newly allocated #GstVaapiImage object */ -GstVaapiImage * -gst_vaapi_image_new( - GstVaapiDisplay *display, - GstVideoFormat format, - guint width, - guint height -) + GstVaapiImage *gst_vaapi_image_new (GstVaapiDisplay * display, + GstVideoFormat format, guint width, guint height) { - GstVaapiImage *image; + GstVaapiImage *image; - g_return_val_if_fail(width > 0, NULL); - g_return_val_if_fail(height > 0, NULL); + g_return_val_if_fail (width > 0, NULL); + g_return_val_if_fail (height > 0, NULL); - GST_DEBUG("format %s, size %ux%u", gst_vaapi_video_format_to_string(format), - width, height); + GST_DEBUG ("format %s, size %ux%u", gst_vaapi_video_format_to_string (format), + width, height); - image = gst_vaapi_object_new(gst_vaapi_image_class(), display); - if (!image) - return NULL; + image = gst_vaapi_object_new (gst_vaapi_image_class (), display); + if (!image) + return NULL; - if (!gst_vaapi_image_create(image, format, width, height)) - goto error; - return image; + if (!gst_vaapi_image_create (image, format, width, height)) + goto error; + return image; error: - gst_vaapi_object_unref(image); - return NULL; + gst_vaapi_object_unref (image); + return NULL; } /** @@ -286,30 +273,30 @@ error: * Return value: the newly allocated #GstVaapiImage object */ GstVaapiImage * -gst_vaapi_image_new_with_image(GstVaapiDisplay *display, VAImage *va_image) +gst_vaapi_image_new_with_image (GstVaapiDisplay * display, VAImage * va_image) { - GstVaapiImage *image; + GstVaapiImage *image; - g_return_val_if_fail(va_image, NULL); - g_return_val_if_fail(va_image->image_id != VA_INVALID_ID, NULL); - g_return_val_if_fail(va_image->buf != VA_INVALID_ID, NULL); + g_return_val_if_fail (va_image, NULL); + g_return_val_if_fail (va_image->image_id != VA_INVALID_ID, NULL); + g_return_val_if_fail (va_image->buf != VA_INVALID_ID, NULL); - GST_DEBUG("VA image 0x%08x, format %" GST_FOURCC_FORMAT ", size %ux%u", - va_image->image_id, - GST_FOURCC_ARGS(va_image->format.fourcc), - va_image->width, va_image->height); + GST_DEBUG ("VA image 0x%08x, format %" GST_FOURCC_FORMAT ", size %ux%u", + va_image->image_id, + GST_FOURCC_ARGS (va_image->format.fourcc), + va_image->width, va_image->height); - image = gst_vaapi_object_new(gst_vaapi_image_class(), display); - if (!image) - return NULL; + image = gst_vaapi_object_new (gst_vaapi_image_class (), display); + if (!image) + return NULL; - if (!_gst_vaapi_image_set_image(image, va_image)) - goto error; - return image; + if (!_gst_vaapi_image_set_image (image, va_image)) + goto error; + return image; error: - gst_vaapi_object_unref(image); - return NULL; + gst_vaapi_object_unref (image); + return NULL; } /** @@ -321,11 +308,11 @@ error: * Return value: the underlying VA image id */ GstVaapiID -gst_vaapi_image_get_id(GstVaapiImage *image) +gst_vaapi_image_get_id (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, VA_INVALID_ID); + g_return_val_if_fail (image != NULL, VA_INVALID_ID); - return GST_VAAPI_OBJECT_ID(image); + return GST_VAAPI_OBJECT_ID (image); } /** @@ -338,14 +325,14 @@ gst_vaapi_image_get_id(GstVaapiImage *image) * Return value: %TRUE on success */ gboolean -gst_vaapi_image_get_image(GstVaapiImage *image, VAImage *va_image) +gst_vaapi_image_get_image (GstVaapiImage * image, VAImage * va_image) { - g_return_val_if_fail(image != NULL, FALSE); + g_return_val_if_fail (image != NULL, FALSE); - if (va_image) - *va_image = image->image; + if (va_image) + *va_image = image->image; - return TRUE; + return TRUE; } /* @@ -363,55 +350,55 @@ gst_vaapi_image_get_image(GstVaapiImage *image, VAImage *va_image) * Return value: %TRUE on success */ gboolean -_gst_vaapi_image_set_image(GstVaapiImage *image, const VAImage *va_image) +_gst_vaapi_image_set_image (GstVaapiImage * image, const VAImage * va_image) { - GstVideoFormat format; - VAImage alt_va_image; - const VAImageFormat *alt_va_format; - - format = gst_vaapi_video_format_from_va_format(&va_image->format); - if (format == GST_VIDEO_FORMAT_UNKNOWN) - return FALSE; - - image->internal_image = *va_image; - image->internal_format = format; - image->is_linear = vaapi_image_is_linear(va_image); - image->image = *va_image; - image->format = format; - image->width = va_image->width; - image->height = va_image->height; - - GST_VAAPI_OBJECT_ID(image) = va_image->image_id; - - /* Try to linearize image */ - if (!image->is_linear) { - switch (format) { - case GST_VIDEO_FORMAT_I420: - format = GST_VIDEO_FORMAT_YV12; - break; - case GST_VIDEO_FORMAT_YV12: - format = GST_VIDEO_FORMAT_I420; - break; - default: - format = 0; - break; - } - if (format && - (alt_va_format = gst_vaapi_video_format_to_va_format(format))) { - alt_va_image = *va_image; - alt_va_image.format = *alt_va_format; - SWAP_UINT(alt_va_image.offsets[1], alt_va_image.offsets[2]); - SWAP_UINT(alt_va_image.pitches[1], alt_va_image.pitches[2]); - if (vaapi_image_is_linear(&alt_va_image)) { - image->image = alt_va_image; - image->format = format; - image->is_linear = TRUE; - GST_DEBUG("linearized image to %s format", - gst_vaapi_video_format_to_string(format)); - } - } + GstVideoFormat format; + VAImage alt_va_image; + const VAImageFormat *alt_va_format; + + format = gst_vaapi_video_format_from_va_format (&va_image->format); + if (format == GST_VIDEO_FORMAT_UNKNOWN) + return FALSE; + + image->internal_image = *va_image; + image->internal_format = format; + image->is_linear = vaapi_image_is_linear (va_image); + image->image = *va_image; + image->format = format; + image->width = va_image->width; + image->height = va_image->height; + + GST_VAAPI_OBJECT_ID (image) = va_image->image_id; + + /* Try to linearize image */ + if (!image->is_linear) { + switch (format) { + case GST_VIDEO_FORMAT_I420: + format = GST_VIDEO_FORMAT_YV12; + break; + case GST_VIDEO_FORMAT_YV12: + format = GST_VIDEO_FORMAT_I420; + break; + default: + format = 0; + break; } - return TRUE; + if (format && + (alt_va_format = gst_vaapi_video_format_to_va_format (format))) { + alt_va_image = *va_image; + alt_va_image.format = *alt_va_format; + SWAP_UINT (alt_va_image.offsets[1], alt_va_image.offsets[2]); + SWAP_UINT (alt_va_image.pitches[1], alt_va_image.pitches[2]); + if (vaapi_image_is_linear (&alt_va_image)) { + image->image = alt_va_image; + image->format = format; + image->is_linear = TRUE; + GST_DEBUG ("linearized image to %s format", + gst_vaapi_video_format_to_string (format)); + } + } + } + return TRUE; } /** @@ -423,11 +410,11 @@ _gst_vaapi_image_set_image(GstVaapiImage *image, const VAImage *va_image) * Return value: the #GstVideoFormat */ GstVideoFormat -gst_vaapi_image_get_format(GstVaapiImage *image) +gst_vaapi_image_get_format (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, 0); + g_return_val_if_fail (image != NULL, 0); - return image->format; + return image->format; } /** @@ -439,11 +426,11 @@ gst_vaapi_image_get_format(GstVaapiImage *image) * Return value: the image width, in pixels */ guint -gst_vaapi_image_get_width(GstVaapiImage *image) +gst_vaapi_image_get_width (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, 0); + g_return_val_if_fail (image != NULL, 0); - return image->width; + return image->width; } /** @@ -455,11 +442,11 @@ gst_vaapi_image_get_width(GstVaapiImage *image) * Return value: the image height, in pixels. */ guint -gst_vaapi_image_get_height(GstVaapiImage *image) +gst_vaapi_image_get_height (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, 0); + g_return_val_if_fail (image != NULL, 0); - return image->height; + return image->height; } /** @@ -471,15 +458,16 @@ gst_vaapi_image_get_height(GstVaapiImage *image) * Retrieves the dimensions of a #GstVaapiImage. */ void -gst_vaapi_image_get_size(GstVaapiImage *image, guint *pwidth, guint *pheight) +gst_vaapi_image_get_size (GstVaapiImage * image, guint * pwidth, + guint * pheight) { - g_return_if_fail(image != NULL); + g_return_if_fail (image != NULL); - if (pwidth) - *pwidth = image->width; + if (pwidth) + *pwidth = image->width; - if (pheight) - *pheight = image->height; + if (pheight) + *pheight = image->height; } /** @@ -493,11 +481,11 @@ gst_vaapi_image_get_size(GstVaapiImage *image, guint *pwidth, guint *pheight) * Return value: %TRUE if image data planes are allocated from a single buffer */ gboolean -gst_vaapi_image_is_linear(GstVaapiImage *image) +gst_vaapi_image_is_linear (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, FALSE); + g_return_val_if_fail (image != NULL, FALSE); - return image->is_linear; + return image->is_linear; } /** @@ -509,17 +497,17 @@ gst_vaapi_image_is_linear(GstVaapiImage *image) * Return value: %TRUE if the @image is mapped */ static inline gboolean -_gst_vaapi_image_is_mapped(GstVaapiImage *image) +_gst_vaapi_image_is_mapped (GstVaapiImage * image) { - return image->image_data != NULL; + return image->image_data != NULL; } gboolean -gst_vaapi_image_is_mapped(GstVaapiImage *image) +gst_vaapi_image_is_mapped (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, FALSE); + g_return_val_if_fail (image != NULL, FALSE); - return _gst_vaapi_image_is_mapped(image); + return _gst_vaapi_image_is_mapped (image); } /** @@ -532,51 +520,48 @@ gst_vaapi_image_is_mapped(GstVaapiImage *image) * Return value: %TRUE on success */ gboolean -gst_vaapi_image_map(GstVaapiImage *image) +gst_vaapi_image_map (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, FALSE); + g_return_val_if_fail (image != NULL, FALSE); - return _gst_vaapi_image_map(image, NULL); + return _gst_vaapi_image_map (image, NULL); } gboolean -_gst_vaapi_image_map(GstVaapiImage *image, GstVaapiImageRaw *raw_image) +_gst_vaapi_image_map (GstVaapiImage * image, GstVaapiImageRaw * raw_image) { - GstVaapiDisplay *display; - VAStatus status; - guint i; - - if (_gst_vaapi_image_is_mapped(image)) - goto map_success; - - display = GST_VAAPI_OBJECT_DISPLAY(image); - if (!display) - return FALSE; - - GST_VAAPI_DISPLAY_LOCK(display); - status = vaMapBuffer( - GST_VAAPI_DISPLAY_VADISPLAY(display), - image->image.buf, - (void **)&image->image_data - ); - GST_VAAPI_DISPLAY_UNLOCK(display); - if (!vaapi_check_status(status, "vaMapBuffer()")) - return FALSE; + GstVaapiDisplay *display; + VAStatus status; + guint i; + + if (_gst_vaapi_image_is_mapped (image)) + goto map_success; + + display = GST_VAAPI_OBJECT_DISPLAY (image); + if (!display) + return FALSE; + + GST_VAAPI_DISPLAY_LOCK (display); + status = vaMapBuffer (GST_VAAPI_DISPLAY_VADISPLAY (display), + image->image.buf, (void **) &image->image_data); + GST_VAAPI_DISPLAY_UNLOCK (display); + if (!vaapi_check_status (status, "vaMapBuffer()")) + return FALSE; map_success: - if (raw_image) { - const VAImage * const va_image = &image->image; - raw_image->format = image->format; - raw_image->width = va_image->width; - raw_image->height = va_image->height; - raw_image->num_planes = va_image->num_planes; - for (i = 0; i < raw_image->num_planes; i++) { - raw_image->pixels[i] = (guchar *)image->image_data + - va_image->offsets[i]; - raw_image->stride[i] = va_image->pitches[i]; - } + if (raw_image) { + const VAImage *const va_image = &image->image; + raw_image->format = image->format; + raw_image->width = va_image->width; + raw_image->height = va_image->height; + raw_image->num_planes = va_image->num_planes; + for (i = 0; i < raw_image->num_planes; i++) { + raw_image->pixels[i] = (guchar *) image->image_data + + va_image->offsets[i]; + raw_image->stride[i] = va_image->pitches[i]; } - return TRUE; + } + return TRUE; } /** @@ -589,37 +574,35 @@ map_success: * Return value: %TRUE on success */ gboolean -gst_vaapi_image_unmap(GstVaapiImage *image) +gst_vaapi_image_unmap (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, FALSE); + g_return_val_if_fail (image != NULL, FALSE); - return _gst_vaapi_image_unmap(image); + return _gst_vaapi_image_unmap (image); } gboolean -_gst_vaapi_image_unmap(GstVaapiImage *image) +_gst_vaapi_image_unmap (GstVaapiImage * image) { - GstVaapiDisplay *display; - VAStatus status; - - if (!_gst_vaapi_image_is_mapped(image)) - return TRUE; - - display = GST_VAAPI_OBJECT_DISPLAY(image); - if (!display) - return FALSE; - - GST_VAAPI_DISPLAY_LOCK(display); - status = vaUnmapBuffer( - GST_VAAPI_DISPLAY_VADISPLAY(display), - image->image.buf - ); - GST_VAAPI_DISPLAY_UNLOCK(display); - if (!vaapi_check_status(status, "vaUnmapBuffer()")) - return FALSE; - - image->image_data = NULL; + GstVaapiDisplay *display; + VAStatus status; + + if (!_gst_vaapi_image_is_mapped (image)) return TRUE; + + display = GST_VAAPI_OBJECT_DISPLAY (image); + if (!display) + return FALSE; + + GST_VAAPI_DISPLAY_LOCK (display); + status = vaUnmapBuffer (GST_VAAPI_DISPLAY_VADISPLAY (display), + image->image.buf); + GST_VAAPI_DISPLAY_UNLOCK (display); + if (!vaapi_check_status (status, "vaUnmapBuffer()")) + return FALSE; + + image->image_data = NULL; + return TRUE; } /** @@ -632,12 +615,12 @@ _gst_vaapi_image_unmap(GstVaapiImage *image) * Return value: the number of planes available in the @image */ guint -gst_vaapi_image_get_plane_count(GstVaapiImage *image) +gst_vaapi_image_get_plane_count (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, 0); - g_return_val_if_fail(_gst_vaapi_image_is_mapped(image), 0); + g_return_val_if_fail (image != NULL, 0); + g_return_val_if_fail (_gst_vaapi_image_is_mapped (image), 0); - return image->image.num_planes; + return image->image.num_planes; } /** @@ -651,13 +634,13 @@ gst_vaapi_image_get_plane_count(GstVaapiImage *image) * Return value: the pixels data of the specified @plane */ guchar * -gst_vaapi_image_get_plane(GstVaapiImage *image, guint plane) +gst_vaapi_image_get_plane (GstVaapiImage * image, guint plane) { - g_return_val_if_fail(image != NULL, NULL); - g_return_val_if_fail(_gst_vaapi_image_is_mapped(image), NULL); - g_return_val_if_fail(plane < image->image.num_planes, NULL); + g_return_val_if_fail (image != NULL, NULL); + g_return_val_if_fail (_gst_vaapi_image_is_mapped (image), NULL); + g_return_val_if_fail (plane < image->image.num_planes, NULL); - return image->image_data + image->image.offsets[plane]; + return image->image_data + image->image.offsets[plane]; } /** @@ -671,13 +654,13 @@ gst_vaapi_image_get_plane(GstVaapiImage *image, guint plane) * Return value: the line size (stride) of the specified plane */ guint -gst_vaapi_image_get_pitch(GstVaapiImage *image, guint plane) +gst_vaapi_image_get_pitch (GstVaapiImage * image, guint plane) { - g_return_val_if_fail(image != NULL, 0); - g_return_val_if_fail(_gst_vaapi_image_is_mapped(image), 0); - g_return_val_if_fail(plane < image->image.num_planes, 0); + g_return_val_if_fail (image != NULL, 0); + g_return_val_if_fail (_gst_vaapi_image_is_mapped (image), 0); + g_return_val_if_fail (plane < image->image.num_planes, 0); - return image->image.pitches[plane]; + return image->image.pitches[plane]; } /** @@ -691,198 +674,177 @@ gst_vaapi_image_get_pitch(GstVaapiImage *image, guint plane) * Return value: the whole image data size of the @image */ guint -gst_vaapi_image_get_data_size(GstVaapiImage *image) +gst_vaapi_image_get_data_size (GstVaapiImage * image) { - g_return_val_if_fail(image != NULL, 0); + g_return_val_if_fail (image != NULL, 0); - return image->image.data_size; + return image->image.data_size; } #include <gst/video/gstvideometa.h> static gboolean -init_image_from_video_meta(GstVaapiImageRaw *raw_image, GstVideoMeta *vmeta) +init_image_from_video_meta (GstVaapiImageRaw * raw_image, GstVideoMeta * vmeta) { - GST_FIXME("map from GstVideoMeta + add fini_image_from_buffer()"); - return FALSE; + GST_FIXME ("map from GstVideoMeta + add fini_image_from_buffer()"); + return FALSE; } static gboolean -init_image_from_buffer(GstVaapiImageRaw *raw_image, GstBuffer *buffer) +init_image_from_buffer (GstVaapiImageRaw * raw_image, GstBuffer * buffer) { - GstVideoMeta * const vmeta = gst_buffer_get_video_meta(buffer); + GstVideoMeta *const vmeta = gst_buffer_get_video_meta (buffer); - return vmeta ? init_image_from_video_meta(raw_image, vmeta) : FALSE; + return vmeta ? init_image_from_video_meta (raw_image, vmeta) : FALSE; } /* Copy N lines of an image */ static inline void -memcpy_pic( - guchar *dst, - guint dst_stride, - const guchar *src, - guint src_stride, - guint len, - guint height -) +memcpy_pic (guchar * dst, + guint dst_stride, + const guchar * src, guint src_stride, guint len, guint height) { - guint i; + guint i; - for (i = 0; i < height; i++) { - memcpy(dst, src, len); - dst += dst_stride; - src += src_stride; - } + for (i = 0; i < height; i++) { + memcpy (dst, src, len); + dst += dst_stride; + src += src_stride; + } } /* Copy NV12 images */ static void -copy_image_NV12( - GstVaapiImageRaw *dst_image, - GstVaapiImageRaw *src_image, - const GstVaapiRectangle *rect -) +copy_image_NV12 (GstVaapiImageRaw * dst_image, + GstVaapiImageRaw * src_image, const GstVaapiRectangle * rect) { - guchar *dst, *src; - guint dst_stride, src_stride; - - /* Y plane */ - dst_stride = dst_image->stride[0]; - dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x; - src_stride = src_image->stride[0]; - src = src_image->pixels[0] + rect->y * src_stride + rect->x; - memcpy_pic(dst, dst_stride, src, src_stride, rect->width, rect->height); - - /* UV plane */ - dst_stride = dst_image->stride[1]; - dst = dst_image->pixels[1] + (rect->y / 2) * dst_stride + (rect->x & -2); - src_stride = src_image->stride[1]; - src = src_image->pixels[1] + (rect->y / 2) * src_stride + (rect->x & -2); - memcpy_pic(dst, dst_stride, src, src_stride, rect->width, rect->height / 2); + guchar *dst, *src; + guint dst_stride, src_stride; + + /* Y plane */ + dst_stride = dst_image->stride[0]; + dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x; + src_stride = src_image->stride[0]; + src = src_image->pixels[0] + rect->y * src_stride + rect->x; + memcpy_pic (dst, dst_stride, src, src_stride, rect->width, rect->height); + + /* UV plane */ + dst_stride = dst_image->stride[1]; + dst = dst_image->pixels[1] + (rect->y / 2) * dst_stride + (rect->x & -2); + src_stride = src_image->stride[1]; + src = src_image->pixels[1] + (rect->y / 2) * src_stride + (rect->x & -2); + memcpy_pic (dst, dst_stride, src, src_stride, rect->width, rect->height / 2); } /* Copy YV12 images */ static void -copy_image_YV12( - GstVaapiImageRaw *dst_image, - GstVaapiImageRaw *src_image, - const GstVaapiRectangle *rect -) +copy_image_YV12 (GstVaapiImageRaw * dst_image, + GstVaapiImageRaw * src_image, const GstVaapiRectangle * rect) { - guchar *dst, *src; - guint dst_stride, src_stride; - guint i, x, y, w, h; - - /* Y plane */ - dst_stride = dst_image->stride[0]; - dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x; - src_stride = src_image->stride[0]; - src = src_image->pixels[0] + rect->y * src_stride + rect->x; - memcpy_pic(dst, dst_stride, src, src_stride, rect->width, rect->height); - - /* U/V planes */ - x = rect->x / 2; - y = rect->y / 2; - w = rect->width / 2; - h = rect->height / 2; - for (i = 1; i < dst_image->num_planes; i++) { - dst_stride = dst_image->stride[i]; - dst = dst_image->pixels[i] + y * dst_stride + x; - src_stride = src_image->stride[i]; - src = src_image->pixels[i] + y * src_stride + x; - memcpy_pic(dst, dst_stride, src, src_stride, w, h); - } + guchar *dst, *src; + guint dst_stride, src_stride; + guint i, x, y, w, h; + + /* Y plane */ + dst_stride = dst_image->stride[0]; + dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x; + src_stride = src_image->stride[0]; + src = src_image->pixels[0] + rect->y * src_stride + rect->x; + memcpy_pic (dst, dst_stride, src, src_stride, rect->width, rect->height); + + /* U/V planes */ + x = rect->x / 2; + y = rect->y / 2; + w = rect->width / 2; + h = rect->height / 2; + for (i = 1; i < dst_image->num_planes; i++) { + dst_stride = dst_image->stride[i]; + dst = dst_image->pixels[i] + y * dst_stride + x; + src_stride = src_image->stride[i]; + src = src_image->pixels[i] + y * src_stride + x; + memcpy_pic (dst, dst_stride, src, src_stride, w, h); + } } /* Copy YUY2 images */ static void -copy_image_YUY2( - GstVaapiImageRaw *dst_image, - GstVaapiImageRaw *src_image, - const GstVaapiRectangle *rect -) +copy_image_YUY2 (GstVaapiImageRaw * dst_image, + GstVaapiImageRaw * src_image, const GstVaapiRectangle * rect) { - guchar *dst, *src; - guint dst_stride, src_stride; - - /* YUV 4:2:2, full vertical resolution */ - dst_stride = dst_image->stride[0]; - dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x * 2; - src_stride = src_image->stride[0]; - src = src_image->pixels[0] + rect->y * src_stride + rect->x * 2; - memcpy_pic(dst, dst_stride, src, src_stride, rect->width * 2, rect->height); + guchar *dst, *src; + guint dst_stride, src_stride; + + /* YUV 4:2:2, full vertical resolution */ + dst_stride = dst_image->stride[0]; + dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x * 2; + src_stride = src_image->stride[0]; + src = src_image->pixels[0] + rect->y * src_stride + rect->x * 2; + memcpy_pic (dst, dst_stride, src, src_stride, rect->width * 2, rect->height); } /* Copy RGBA images */ static void -copy_image_RGBA( - GstVaapiImageRaw *dst_image, - GstVaapiImageRaw *src_image, - const GstVaapiRectangle *rect -) +copy_image_RGBA (GstVaapiImageRaw * dst_image, + GstVaapiImageRaw * src_image, const GstVaapiRectangle * rect) { - guchar *dst, *src; - guint dst_stride, src_stride; - - dst_stride = dst_image->stride[0]; - dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x; - src_stride = src_image->stride[0]; - src = src_image->pixels[0] + rect->y * src_stride + rect->x; - memcpy_pic(dst, dst_stride, src, src_stride, 4 * rect->width, rect->height); + guchar *dst, *src; + guint dst_stride, src_stride; + + dst_stride = dst_image->stride[0]; + dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x; + src_stride = src_image->stride[0]; + src = src_image->pixels[0] + rect->y * src_stride + rect->x; + memcpy_pic (dst, dst_stride, src, src_stride, 4 * rect->width, rect->height); } static gboolean -copy_image( - GstVaapiImageRaw *dst_image, - GstVaapiImageRaw *src_image, - const GstVaapiRectangle *rect -) +copy_image (GstVaapiImageRaw * dst_image, + GstVaapiImageRaw * src_image, const GstVaapiRectangle * rect) { - GstVaapiRectangle default_rect; - - if (dst_image->format != src_image->format || - dst_image->width != src_image->width || - dst_image->height != src_image->height) - return FALSE; - - if (rect) { - if (rect->x >= src_image->width || - rect->x + rect->width > src_image->width || - rect->y >= src_image->height || - rect->y + rect->height > src_image->height) - return FALSE; - } - else { - default_rect.x = 0; - default_rect.y = 0; - default_rect.width = src_image->width; - default_rect.height = src_image->height; - rect = &default_rect; - } + GstVaapiRectangle default_rect; + + if (dst_image->format != src_image->format || + dst_image->width != src_image->width || + dst_image->height != src_image->height) + return FALSE; - switch (dst_image->format) { + if (rect) { + if (rect->x >= src_image->width || + rect->x + rect->width > src_image->width || + rect->y >= src_image->height || + rect->y + rect->height > src_image->height) + return FALSE; + } else { + default_rect.x = 0; + default_rect.y = 0; + default_rect.width = src_image->width; + default_rect.height = src_image->height; + rect = &default_rect; + } + + switch (dst_image->format) { case GST_VIDEO_FORMAT_NV12: - copy_image_NV12(dst_image, src_image, rect); - break; + copy_image_NV12 (dst_image, src_image, rect); + break; case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_I420: - copy_image_YV12(dst_image, src_image, rect); - break; + copy_image_YV12 (dst_image, src_image, rect); + break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_UYVY: - copy_image_YUY2(dst_image, src_image, rect); - break; + copy_image_YUY2 (dst_image, src_image, rect); + break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_BGRA: - copy_image_RGBA(dst_image, src_image, rect); - break; + copy_image_RGBA (dst_image, src_image, rect); + break; default: - GST_ERROR("unsupported image format for copy"); - return FALSE; - } - return TRUE; + GST_ERROR ("unsupported image format for copy"); + return FALSE; + } + return TRUE; } /** @@ -898,34 +860,31 @@ copy_image( * Return value: %TRUE on success */ gboolean -gst_vaapi_image_get_buffer( - GstVaapiImage *image, - GstBuffer *buffer, - GstVaapiRectangle *rect -) +gst_vaapi_image_get_buffer (GstVaapiImage * image, + GstBuffer * buffer, GstVaapiRectangle * rect) { - GstVaapiImageRaw dst_image, src_image; - gboolean success; + GstVaapiImageRaw dst_image, src_image; + gboolean success; - g_return_val_if_fail(image != NULL, FALSE); - g_return_val_if_fail(GST_IS_BUFFER(buffer), FALSE); + g_return_val_if_fail (image != NULL, FALSE); + g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE); - if (!init_image_from_buffer(&dst_image, buffer)) - return FALSE; - if (dst_image.format != image->format) - return FALSE; - if (dst_image.width != image->width || dst_image.height != image->height) - return FALSE; + if (!init_image_from_buffer (&dst_image, buffer)) + return FALSE; + if (dst_image.format != image->format) + return FALSE; + if (dst_image.width != image->width || dst_image.height != image->height) + return FALSE; - if (!_gst_vaapi_image_map(image, &src_image)) - return FALSE; + if (!_gst_vaapi_image_map (image, &src_image)) + return FALSE; - success = copy_image(&dst_image, &src_image, rect); + success = copy_image (&dst_image, &src_image, rect); - if (!_gst_vaapi_image_unmap(image)) - return FALSE; + if (!_gst_vaapi_image_unmap (image)) + return FALSE; - return success; + return success; } /** @@ -941,26 +900,23 @@ gst_vaapi_image_get_buffer( * Return value: %TRUE on success */ gboolean -gst_vaapi_image_get_raw( - GstVaapiImage *image, - GstVaapiImageRaw *dst_image, - GstVaapiRectangle *rect -) +gst_vaapi_image_get_raw (GstVaapiImage * image, + GstVaapiImageRaw * dst_image, GstVaapiRectangle * rect) { - GstVaapiImageRaw src_image; - gboolean success; + GstVaapiImageRaw src_image; + gboolean success; - g_return_val_if_fail(image != NULL, FALSE); + g_return_val_if_fail (image != NULL, FALSE); - if (!_gst_vaapi_image_map(image, &src_image)) - return FALSE; + if (!_gst_vaapi_image_map (image, &src_image)) + return FALSE; - success = copy_image(dst_image, &src_image, rect); + success = copy_image (dst_image, &src_image, rect); - if (!_gst_vaapi_image_unmap(image)) - return FALSE; + if (!_gst_vaapi_image_unmap (image)) + return FALSE; - return success; + return success; } /** @@ -976,34 +932,31 @@ gst_vaapi_image_get_raw( * Return value: %TRUE on success */ gboolean -gst_vaapi_image_update_from_buffer( - GstVaapiImage *image, - GstBuffer *buffer, - GstVaapiRectangle *rect -) +gst_vaapi_image_update_from_buffer (GstVaapiImage * image, + GstBuffer * buffer, GstVaapiRectangle * rect) { - GstVaapiImageRaw dst_image, src_image; - gboolean success; + GstVaapiImageRaw dst_image, src_image; + gboolean success; - g_return_val_if_fail(image != NULL, FALSE); - g_return_val_if_fail(GST_IS_BUFFER(buffer), FALSE); + g_return_val_if_fail (image != NULL, FALSE); + g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE); - if (!init_image_from_buffer(&src_image, buffer)) - return FALSE; - if (src_image.format != image->format) - return FALSE; - if (src_image.width != image->width || src_image.height != image->height) - return FALSE; + if (!init_image_from_buffer (&src_image, buffer)) + return FALSE; + if (src_image.format != image->format) + return FALSE; + if (src_image.width != image->width || src_image.height != image->height) + return FALSE; - if (!_gst_vaapi_image_map(image, &dst_image)) - return FALSE; + if (!_gst_vaapi_image_map (image, &dst_image)) + return FALSE; - success = copy_image(&dst_image, &src_image, rect); + success = copy_image (&dst_image, &src_image, rect); - if (!_gst_vaapi_image_unmap(image)) - return FALSE; + if (!_gst_vaapi_image_unmap (image)) + return FALSE; - return success; + return success; } /** @@ -1020,26 +973,23 @@ gst_vaapi_image_update_from_buffer( * Return value: %TRUE on success */ gboolean -gst_vaapi_image_update_from_raw( - GstVaapiImage *image, - GstVaapiImageRaw *src_image, - GstVaapiRectangle *rect -) +gst_vaapi_image_update_from_raw (GstVaapiImage * image, + GstVaapiImageRaw * src_image, GstVaapiRectangle * rect) { - GstVaapiImageRaw dst_image; - gboolean success; + GstVaapiImageRaw dst_image; + gboolean success; - g_return_val_if_fail(image != NULL, FALSE); + g_return_val_if_fail (image != NULL, FALSE); - if (!_gst_vaapi_image_map(image, &dst_image)) - return FALSE; + if (!_gst_vaapi_image_map (image, &dst_image)) + return FALSE; - success = copy_image(&dst_image, src_image, rect); + success = copy_image (&dst_image, src_image, rect); - if (!_gst_vaapi_image_unmap(image)) - return FALSE; + if (!_gst_vaapi_image_unmap (image)) + return FALSE; - return success; + return success; } /** @@ -1053,23 +1003,23 @@ gst_vaapi_image_update_from_raw( * Return value: %TRUE on success */ gboolean -gst_vaapi_image_copy(GstVaapiImage *dst_image, GstVaapiImage *src_image) +gst_vaapi_image_copy (GstVaapiImage * dst_image, GstVaapiImage * src_image) { - GstVaapiImageRaw dst_image_raw, src_image_raw; - gboolean success = FALSE; + GstVaapiImageRaw dst_image_raw, src_image_raw; + gboolean success = FALSE; - g_return_val_if_fail(dst_image != NULL, FALSE); - g_return_val_if_fail(src_image != NULL, FALSE); + g_return_val_if_fail (dst_image != NULL, FALSE); + g_return_val_if_fail (src_image != NULL, FALSE); - if (!_gst_vaapi_image_map(dst_image, &dst_image_raw)) - goto end; - if (!_gst_vaapi_image_map(src_image, &src_image_raw)) - goto end; + if (!_gst_vaapi_image_map (dst_image, &dst_image_raw)) + goto end; + if (!_gst_vaapi_image_map (src_image, &src_image_raw)) + goto end; - success = copy_image(&dst_image_raw, &src_image_raw, NULL); + success = copy_image (&dst_image_raw, &src_image_raw, NULL); end: - _gst_vaapi_image_unmap(src_image); - _gst_vaapi_image_unmap(dst_image); - return success; + _gst_vaapi_image_unmap (src_image); + _gst_vaapi_image_unmap (dst_image); + return success; } |