pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pkg/54409: ffmpeg4 cannot capture video via X11grab



>Number:         54409
>Category:       pkg
>Synopsis:       ffmpeg4 cannot capture video via X11grab
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Jul 25 15:10:00 +0000 2019
>Originator:     Aran Clauson
>Release:        2019Q2
>Organization:
Personal
>Environment:
NetBSD owl 8.99.47 NetBSD 8.99.47 (GENERIC) #0: Mon Jun 24 09:49:56 PDT 2019  aran@owl:/home/NetBSD/obj/sys/arch/amd64/compile/GENERIC amd64

>Description:
ffmpeg cannot capture video from xorg.  For example, the following command produces an error and no usable output.

ffmpeg4 -r 30 -f x11grab -s 800x600 -i :0.0+1080,869 -c:v libx264 -pix_fmt yuv420p -qp 0 -preset ultrafast -t 10 -y out.mov

>How-To-Repeat:
ffmpeg4 -r 30 -f x11grab -s 800x600 -i :0.0+1080,869 -c:v libx264 -pix_fmt yuv420p -qp 0 -preset ultrafast -t 10 -y out.mov

>Fix:
The following patch fixes the problem.  I've sent this to the FFmpeg development team.  I don't know if they will incorporate the patch. 

$NetBSD$

--- libavdevice/xcbgrab.c.orig	2019-07-25 14:58:08.498136541 +0000
+++ libavdevice/xcbgrab.c
@@ -75,6 +75,7 @@ typedef struct XCBGrabContext {
     const char *framerate;
 
     int has_shm;
+    int shmid;
 } XCBGrabContext;
 
 #define FOLLOW_CENTER -1
@@ -221,6 +222,14 @@ static int check_shm(xcb_connection_t *c
     return 0;
 }
 
+static void rm_shmid(AVFormatContext *s) {
+    XCBGrabContext *c = s->priv_data;
+    if(c->shmid != -1) {
+      shmctl(c->shmid, IPC_RMID, 0);
+      c->shmid = -1;
+    }
+}
+
 static int allocate_shm(AVFormatContext *s)
 {
     XCBGrabContext *c = s->priv_data;
@@ -230,7 +239,8 @@ static int allocate_shm(AVFormatContext 
 
     if (c->buffer)
         return 0;
-    id = shmget(IPC_PRIVATE, size, IPC_CREAT | 0777);
+    
+    id = shmget(IPC_PRIVATE, size, IPC_CREAT | 0666);
     if (id == -1) {
         char errbuf[1024];
         int err = AVERROR(errno);
@@ -239,15 +249,20 @@ static int allocate_shm(AVFormatContext 
                size, errbuf);
         return err;
     }
+    
     xcb_shm_attach(c->conn, c->segment, id, 0);
     data = shmat(id, NULL, 0);
-    shmctl(id, IPC_RMID, 0);
-    if ((intptr_t)data == -1 || !data)
-        return AVERROR(errno);
+
+    if ((intptr_t)data == -1 || !data) {
+      shmctl(id, IPC_RMID, 0);
+      return AVERROR(errno);
+    }
     c->buffer = data;
+    c->shmid = id;
     return 0;
 }
 
+
 static int xcbgrab_frame_shm(AVFormatContext *s, AVPacket *pkt)
 {
     XCBGrabContext *c = s->priv_data;
@@ -268,6 +283,8 @@ static int xcbgrab_frame_shm(AVFormatCon
 
     xcb_flush(c->conn);
 
+    rm_shmid(s);
+
     if (e) {
         av_log(s, AV_LOG_ERROR,
                "Cannot get the image data "



Home | Main Index | Thread Index | Old Index