applemedia: corevideobuffer: fix for planar formats

This commit is contained in:
Alessandro Decina 2013-12-19 08:57:41 +01:00
parent a75ddf446b
commit cf2cf20cc3

View File

@ -61,12 +61,10 @@ gst_core_video_meta_get_info (void)
GstBuffer * GstBuffer *
gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo) gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo)
{ {
void *data;
size_t size;
CVPixelBufferRef pixbuf = NULL; CVPixelBufferRef pixbuf = NULL;
GstBuffer *buf; GstBuffer *buf;
GstCoreVideoMeta *meta; GstCoreVideoMeta *meta;
guint width, height, n_planes, i; guint n_planes;
gsize offset[GST_VIDEO_MAX_PLANES]; gsize offset[GST_VIDEO_MAX_PLANES];
gint stride[GST_VIDEO_MAX_PLANES]; gint stride[GST_VIDEO_MAX_PLANES];
@ -93,37 +91,42 @@ gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo)
memset (&offset, 0, sizeof (offset)); memset (&offset, 0, sizeof (offset));
memset (&stride, 0, sizeof (stride)); memset (&stride, 0, sizeof (stride));
data = CVPixelBufferGetBaseAddress (pixbuf);
height = CVPixelBufferGetHeight (pixbuf);
if (CVPixelBufferIsPlanar (pixbuf)) { if (CVPixelBufferIsPlanar (pixbuf)) {
GstVideoInfo tmp_vinfo; int i, size, off;
n_planes = CVPixelBufferGetPlaneCount (pixbuf); n_planes = CVPixelBufferGetPlaneCount (pixbuf);
for (i = 0; i < n_planes; ++i) off = 0;
for (i = 0; i < n_planes; ++i) {
stride[i] = CVPixelBufferGetBytesPerRowOfPlane (pixbuf, i); stride[i] = CVPixelBufferGetBytesPerRowOfPlane (pixbuf, i);
size = stride[i] * CVPixelBufferGetHeightOfPlane (pixbuf, i);
offset[i] = off;
off += size;
gst_video_info_init (&tmp_vinfo); gst_buffer_append_memory (buf,
gst_video_info_set_format (&tmp_vinfo, gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE,
vinfo->finfo->format, stride[0], height); CVPixelBufferGetBaseAddressOfPlane (pixbuf, i), size, 0, size,
offset[1] = tmp_vinfo.offset[1]; NULL, NULL));
size = tmp_vinfo.size; }
} else { } else {
int size;
n_planes = 1; n_planes = 1;
stride[0] = CVPixelBufferGetBytesPerRow (pixbuf); stride[0] = CVPixelBufferGetBytesPerRow (pixbuf);
size = stride[0] * height; offset[0] = 0;
} size = stride[0] * vinfo->height;
gst_buffer_append_memory (buf, gst_buffer_append_memory (buf,
gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, data, gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE,
size, 0, size, NULL, NULL)); CVPixelBufferGetBaseAddress (pixbuf), size, 0, size, NULL, NULL));
}
if (vinfo) { if (vinfo) {
GstVideoMeta *video_meta; GstVideoMeta *video_meta;
width = vinfo->width;
video_meta = video_meta =
gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE, gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE,
vinfo->finfo->format, width, height, n_planes, offset, stride); vinfo->finfo->format, vinfo->width, vinfo->height,
n_planes, offset, stride);
} }
return buf; return buf;