mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
applemedia: lock CVPixelBuffer read-only
As per Apple's docs, this may improve performance by avoiding redundant invalidations of existing caches of the buffer contents.
This commit is contained in:
parent
6867ec5627
commit
b4654f537f
3 changed files with 17 additions and 5 deletions
|
@ -34,7 +34,8 @@ gst_core_media_buffer_finalize (GstMiniObject * mini_object)
|
||||||
|
|
||||||
if (self->image_buf != NULL) {
|
if (self->image_buf != NULL) {
|
||||||
GstCVApi *cv = self->ctx->cv;
|
GstCVApi *cv = self->ctx->cv;
|
||||||
cv->CVPixelBufferUnlockBaseAddress (self->image_buf, 0);
|
cv->CVPixelBufferUnlockBaseAddress (self->image_buf,
|
||||||
|
kCVPixelBufferLock_ReadOnly);
|
||||||
}
|
}
|
||||||
self->ctx->cm->FigSampleBufferRelease (self->sample_buf);
|
self->ctx->cm->FigSampleBufferRelease (self->sample_buf);
|
||||||
g_object_unref (self->ctx);
|
g_object_unref (self->ctx);
|
||||||
|
@ -64,8 +65,10 @@ gst_core_media_buffer_new (GstCoreMediaCtx * ctx, CMSampleBufferRef sample_buf)
|
||||||
CFGetTypeID (image_buf) == cv->CVPixelBufferGetTypeID ()) {
|
CFGetTypeID (image_buf) == cv->CVPixelBufferGetTypeID ()) {
|
||||||
pixel_buf = (CVPixelBufferRef) image_buf;
|
pixel_buf = (CVPixelBufferRef) image_buf;
|
||||||
|
|
||||||
if (cv->CVPixelBufferLockBaseAddress (pixel_buf, 0) != kCVReturnSuccess)
|
if (cv->CVPixelBufferLockBaseAddress (pixel_buf,
|
||||||
|
kCVPixelBufferLock_ReadOnly) != kCVReturnSuccess) {
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (cv->CVPixelBufferIsPlanar (pixel_buf)) {
|
if (cv->CVPixelBufferIsPlanar (pixel_buf)) {
|
||||||
gint plane_count, plane_idx;
|
gint plane_count, plane_idx;
|
||||||
|
|
|
@ -33,8 +33,10 @@ gst_core_video_buffer_finalize (GstMiniObject * mini_object)
|
||||||
GstCoreVideoBuffer *self = GST_CORE_VIDEO_BUFFER_CAST (mini_object);
|
GstCoreVideoBuffer *self = GST_CORE_VIDEO_BUFFER_CAST (mini_object);
|
||||||
GstCVApi *cv = self->ctx->cv;
|
GstCVApi *cv = self->ctx->cv;
|
||||||
|
|
||||||
if (self->pixbuf != NULL)
|
if (self->pixbuf != NULL) {
|
||||||
cv->CVPixelBufferUnlockBaseAddress (self->pixbuf, 0);
|
cv->CVPixelBufferUnlockBaseAddress (self->pixbuf,
|
||||||
|
kCVPixelBufferLock_ReadOnly);
|
||||||
|
}
|
||||||
|
|
||||||
cv->CVBufferRelease (self->cvbuf);
|
cv->CVBufferRelease (self->cvbuf);
|
||||||
|
|
||||||
|
@ -56,8 +58,10 @@ gst_core_video_buffer_new (GstCoreMediaCtx * ctx, CVBufferRef cvbuf)
|
||||||
if (CFGetTypeID (cvbuf) == cv->CVPixelBufferGetTypeID ()) {
|
if (CFGetTypeID (cvbuf) == cv->CVPixelBufferGetTypeID ()) {
|
||||||
pixbuf = (CVPixelBufferRef) cvbuf;
|
pixbuf = (CVPixelBufferRef) cvbuf;
|
||||||
|
|
||||||
if (cv->CVPixelBufferLockBaseAddress (pixbuf, 0) != kCVReturnSuccess)
|
if (cv->CVPixelBufferLockBaseAddress (pixbuf,
|
||||||
|
kCVPixelBufferLock_ReadOnly) != kCVReturnSuccess) {
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
data = cv->CVPixelBufferGetBaseAddress (pixbuf);
|
data = cv->CVPixelBufferGetBaseAddress (pixbuf);
|
||||||
size = cv->CVPixelBufferGetBytesPerRow (pixbuf) *
|
size = cv->CVPixelBufferGetBytesPerRow (pixbuf) *
|
||||||
cv->CVPixelBufferGetHeight (pixbuf);
|
cv->CVPixelBufferGetHeight (pixbuf);
|
||||||
|
|
|
@ -52,6 +52,11 @@ enum _CVPixelFormatType
|
||||||
kCVPixelFormatType_422YpCbCr8 = '2vuy'
|
kCVPixelFormatType_422YpCbCr8 = '2vuy'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum _CVPixelBufferLockFlags
|
||||||
|
{
|
||||||
|
kCVPixelBufferLock_ReadOnly = 0x00000001
|
||||||
|
};
|
||||||
|
|
||||||
struct _GstCVApi
|
struct _GstCVApi
|
||||||
{
|
{
|
||||||
GstDynApi parent;
|
GstDynApi parent;
|
||||||
|
|
Loading…
Reference in a new issue