diff options
author | Marton Balint <cus@passwd.hu> | 2019-12-03 21:33:12 +0100 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2019-12-06 10:09:49 +0100 |
commit | 648b8cca6c56a4fa1760efc72dfe1363a5c6e31e (patch) | |
tree | a79f6c82bdce45f13a99290c1198042b788f53b5 | |
parent | b66a800877d6f97fa94b41533e3d6a6273f7fb9f (diff) | |
download | ffmpeg-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>
-rw-r--r-- | libavdevice/xcbgrab.c | 21 |
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) |