v4l2-mmap-Funktion liefert nur eine Adresse



  • Hallo c-community,

    ich habe folgende Funktion nach Quellen aus dem Netz geschrieben:

    void	CAMERA_Init_MMAP(tds_obj_camera* This)
    {
    	struct v4l2_requestbuffers req;
    	char ErrMessage[256];
    	int i;
    
        CLEAR(req);
    
        req.count = This->iBuffers;
        req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        req.memory = V4L2_MEMORY_MMAP;
    
        if (-1 == CAMERA_ioctl(This->iCameraHandle, VIDIOC_REQBUFS, &req))
    	{
            if (EINVAL == errno) 
    		{
    			sprintf(ErrMessage, "%s does not support memory mapping\tobj_camera.c line 133", This->caDeviceName);
    			CAMERA_errno_exit(ErrMessage);
    		}
            else CAMERA_errno_exit("VIDIOC_REQBUFS obj_camera.c line 140");
        }
    
        if (req.count < 2)
    	{
    		sprintf(ErrMessage, "Insufficient buffer memory on %s\tobj_camera.c line 141\n", This->caDeviceName, This->caDeviceName);
    		CAMERA_errno_exit(ErrMessage);
    
        	This->PictureBuffer = calloc(req.count, sizeof(*This->PictureBuffer));
    
        	if (!This->PictureBuffer) CAMERA_errno_exit("Out of memory\tobj_camera.c line 146");
        }
    
        for (i = 0; i < This->iBuffers; ++i)
    	{
            struct v4l2_buffer buf;
    
    		This->PictureBuffer = calloc(req.count, sizeof(*This->PictureBuffer));
    
            CLEAR(buf);
    
            buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
            buf.memory      = V4L2_MEMORY_MMAP;
            buf.index       = i;
    
            if (-1 == CAMERA_ioctl(This->iCameraHandle, VIDIOC_QUERYBUF, &buf)) CAMERA_errno_exit("VIDIOC_QUERYBUF\tobj_camera.c line 139");
    
    		//
            This->PictureBuffer[i].s_tLength = buf.length;
            This->PictureBuffer[i].pStart = mmap((void*)NULL , // <-- Hier Problem
                          buf.length,
                          PROT_READ /*| PROT_WRITE /* required */,
                          MAP_SHARED /* recommended */,
                          This->iCameraHandle, buf.m.offset);
    
            if (MAP_FAILED == This->PictureBuffer[i].pStart) CAMERA_errno_exit("mmap\tobj_camera.c line 169");
        }
    }
    

    in der for-Schleife sollen 5 Buffer (iBuffers = 5) erstellt werden. Hierfür nutze ich die v4l2-mmap-Funktion. Diese liefert beim ersten Durchlauf eine Adresse für den Speicher. Beim 2. Durchlauf sehe ich aber im Debugger, dass die Adresse bei 0x0 bleibt.
    Weiß jemand, was ich hier falsch mache? Erklären kann ich mir das bisher leider nicht, da der erste Durchlauf ja ein Ergebnis erhalte.

    MfG
    mirrowwinger

    [Edit1]Ok habe jetzt ein wenig mit dem Debugger gespielt und festgestellt, dass zwar der Zeiger 0x0 ist aber der Offset für die Schleifendurchläufe sich ändert. Kann es also sein, dass meine eine Adresse + Offset[i] meine Bilder enthält?[/Edit1]


Anmelden zum Antworten