static void gst_vaapi_image_pool_set_caps(GstVaapiVideoPool *pool, GstCaps *caps) { GstVaapiImagePoolPrivate * const priv = GST_VAAPI_IMAGE_POOL(pool)->priv; GstStructure *structure; gint width, height; structure = gst_caps_get_structure(caps, 0); gst_structure_get_int(structure, "width", &width); gst_structure_get_int(structure, "height", &height); priv->format = gst_vaapi_image_format_from_caps(caps); priv->width = width; priv->height = height; }
static gboolean init_image_from_buffer(GstVaapiImageRaw *raw_image, GstBuffer *buffer) { GstStructure *structure; GstCaps *caps; GstVaapiImageFormat format; guint width2, height2, size2; gint width, height; guchar *data; guint32 data_size; data = GST_BUFFER_DATA(buffer); data_size = GST_BUFFER_SIZE(buffer); caps = GST_BUFFER_CAPS(buffer); if (!caps) return FALSE; format = gst_vaapi_image_format_from_caps(caps); structure = gst_caps_get_structure(caps, 0); gst_structure_get_int(structure, "width", &width); gst_structure_get_int(structure, "height", &height); /* XXX: copied from gst_video_format_get_row_stride() -- no NV12? */ raw_image->format = format; raw_image->width = width; raw_image->height = height; width2 = (width + 1) / 2; height2 = (height + 1) / 2; size2 = 0; switch (format) { case GST_VAAPI_IMAGE_NV12: raw_image->num_planes = 2; raw_image->pixels[0] = data; raw_image->stride[0] = GST_ROUND_UP_4(width); size2 += height * raw_image->stride[0]; raw_image->pixels[1] = data + size2; raw_image->stride[1] = raw_image->stride[0]; size2 += height2 * raw_image->stride[1]; break; case GST_VAAPI_IMAGE_YV12: case GST_VAAPI_IMAGE_I420: raw_image->num_planes = 3; raw_image->pixels[0] = data; raw_image->stride[0] = GST_ROUND_UP_4(width); size2 += height * raw_image->stride[0]; raw_image->pixels[1] = data + size2; raw_image->stride[1] = GST_ROUND_UP_4(width2); size2 += height2 * raw_image->stride[1]; raw_image->pixels[2] = data + size2; raw_image->stride[2] = raw_image->stride[1]; size2 += height2 * raw_image->stride[2]; break; case GST_VAAPI_IMAGE_ARGB: case GST_VAAPI_IMAGE_RGBA: case GST_VAAPI_IMAGE_ABGR: case GST_VAAPI_IMAGE_BGRA: raw_image->num_planes = 1; raw_image->pixels[0] = data; raw_image->stride[0] = width * 4; size2 += height * raw_image->stride[0]; break; default: g_error("could not compute row-stride for %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS(format)); return FALSE; } if (size2 != data_size) { g_error("data_size mismatch %d / %u", size2, data_size); if (size2 > data_size) return FALSE; } return TRUE; }