summaryrefslogtreecommitdiff
path: root/libavdevice/xcbgrab.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2019-12-03 21:33:12 +0100
committerMarton Balint <cus@passwd.hu>2019-12-06 10:09:49 +0100
commit648b8cca6c56a4fa1760efc72dfe1363a5c6e31e (patch)
treea79f6c82bdce45f13a99290c1198042b788f53b5 /libavdevice/xcbgrab.c
parentb66a800877d6f97fa94b41533e3d6a6273f7fb9f (diff)
downloadffmpeg-648b8cca6c56a4fa1760efc72dfe1363a5c6e31e.tar.gz
avdevice/xcbgrab: wrap non-shm image replies in a buffer ref
This avoids a memcpy improving performance if SHM is not used. Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavdevice/xcbgrab.c')
-rw-r--r--libavdevice/xcbgrab.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/libavdevice/xcbgrab.c b/libavdevice/xcbgrab.c
index 063fecf838..158f381c04 100644
--- a/libavdevice/xcbgrab.c
+++ b/libavdevice/xcbgrab.c
@@ -146,6 +146,11 @@ static int xcbgrab_reposition(AVFormatContext *s,
return 0;
}
+static void xcbgrab_image_reply_free(void *opaque, uint8_t *data)
+{
+ free(opaque);
+}
+
static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt)
{
XCBGrabContext *c = s->priv_data;
@@ -154,7 +159,7 @@ static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt)
xcb_drawable_t drawable = c->screen->root;
xcb_generic_error_t *e = NULL;
uint8_t *data;
- int length, ret;
+ int length;
iq = xcb_get_image(c->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, drawable,
c->x, c->y, c->width, c->height, ~0);
@@ -178,14 +183,18 @@ static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt)
data = xcb_get_image_data(img);
length = xcb_get_image_data_length(img);
- ret = av_new_packet(pkt, length);
+ av_init_packet(pkt);
- if (!ret)
- memcpy(pkt->data, data, length);
+ pkt->buf = av_buffer_create(data, length, xcbgrab_image_reply_free, img, 0);
+ if (!pkt->buf) {
+ free(img);
+ return AVERROR(ENOMEM);
+ }
- free(img);
+ pkt->data = data;
+ pkt->size = length;
- return ret;
+ return 0;
}
static void wait_frame(AVFormatContext *s, AVPacket *pkt)