From patchwork Tue Nov 19 13:59:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kusanagi Kouichi X-Patchwork-Id: 16335 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id DB67D44AD26 for ; Tue, 19 Nov 2019 16:00:06 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C350D689FE7; Tue, 19 Nov 2019 16:00:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from dmta0004.auone-net.jp (snd00011.auone-net.jp [111.86.247.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BE919689EA8 for ; Tue, 19 Nov 2019 15:59:59 +0200 (EET) Received: from ppp.dion.ne.jp by dmta0004.auone-net.jp with ESMTP id <20191119135956578.DUDW.12759.ppp.dion.ne.jp@dmta0004.auone-net.jp> for ; Tue, 19 Nov 2019 22:59:56 +0900 Date: Tue, 19 Nov 2019 22:59:56 +0900 From: Kusanagi Kouichi To: ffmpeg-devel@ffmpeg.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.12.2 (2019-09-21) Message-Id: <20191119135956578.DUDW.12759.ppp.dion.ne.jp@dmta0004.auone-net.jp> Subject: [FFmpeg-devel] [PATCH] avdevice/xcbgrab: Improve non-shm performance X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Use AVBufferPool. before: $ ffmpeg -benchmark -f x11grab -video_size 1920x1200 -r 200 -t 3 -i +0,0 -f null - ... frame= 600 fps=102 q=-0.0 Lsize=N/A time=00:00:03.00 bitrate=N/A speed=0.51x video:314kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown bench: utime=1.551s stime=3.428s rtime=5.884s bench: maxrss=40132kB after: $ ffmpeg -benchmark -f x11grab -video_size 1920x1200 -r 200 -t 3 -i +0,0 -f null - ... frame= 600 fps=138 q=-0.0 Lsize=N/A time=00:00:03.00 bitrate=N/A speed=0.69x video:314kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown bench: utime=1.231s stime=2.407s rtime=4.349s bench: maxrss=40096kB Signed-off-by: Kusanagi Kouichi --- libavdevice/xcbgrab.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/libavdevice/xcbgrab.c b/libavdevice/xcbgrab.c index b7e689343e..fde9c534cd 100644 --- a/libavdevice/xcbgrab.c +++ b/libavdevice/xcbgrab.c @@ -42,6 +42,7 @@ #include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "libavutil/time.h" +#include "libavutil/buffer.h" #include "libavformat/avformat.h" #include "libavformat/internal.h" @@ -71,6 +72,8 @@ typedef struct XCBGrabContext { int region_border; int centered; + AVBufferPool *buf_pool; + const char *video_size; const char *framerate; @@ -146,6 +149,16 @@ static int xcbgrab_reposition(AVFormatContext *s, return 0; } +static AVBufferRef *xcbgrab_allocate_buffer(const int size) +{ + AVPacket pkt; + + if (av_new_packet(&pkt, size)) + return NULL; + + return pkt.buf; +} + static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt) { XCBGrabContext *c = s->priv_data; @@ -154,7 +167,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); @@ -174,17 +187,21 @@ static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt) if (!img) return AVERROR(EAGAIN); + pkt->buf = av_buffer_pool_get(c->buf_pool); + if (!pkt->buf) { + free(img); + return AVERROR(ENOMEM); + } + data = xcb_get_image_data(img); length = xcb_get_image_data_length(img); - ret = av_new_packet(pkt, length); - - if (!ret) - memcpy(pkt->data, data, length); - + memcpy(pkt->buf->data, data, length); free(img); + pkt->data = pkt->buf->data; + pkt->size = pkt->buf->size; - return ret; + return 0; } static void wait_frame(AVFormatContext *s, AVPacket *pkt) @@ -442,6 +459,7 @@ static av_cold int xcbgrab_read_close(AVFormatContext *s) #endif xcb_disconnect(ctx->conn); + av_buffer_pool_uninit(&ctx->buf_pool); return 0; } @@ -665,6 +683,12 @@ static av_cold int xcbgrab_read_header(AVFormatContext *s) return ret; } + c->buf_pool = av_buffer_pool_init(c->frame_size, xcbgrab_allocate_buffer); + if (ret < 0) { + xcbgrab_read_close(s); + return AVERROR(ENOMEM); + } + #if CONFIG_LIBXCB_SHM if ((c->has_shm = check_shm(c->conn))) c->segment = xcb_generate_id(c->conn);