Dear all ~~

I have met a issue when I used the mmap method for previewing . I just
used the standard code as spec to get the image data :
status_t CameraHardwareProwave::V4l2Camera::v4l2CaptureMainloop()
{
        LOG_FUNCTION_NAME
        int rt  ;
        unsigned int i ;
        fd_set fds ;
        struct timeval tv ;
        struct v4l2_buffer buf ;

        for(;;){
                FD_ZERO(&fds) ;
                FD_SET(v4l2Fd, &fds) ;
                //now the time is long ,just for debug
                tv.tv_sec = 2 ;
                tv.tv_usec = 0 ;

                rt = select(v4l2Fd + 1, &fds, NULL, NULL, &tv) ;
                LOGD("The value of select return : %d\n", rt) ;
                
                /********** for debug
                if(V4L2_NOERROR != v4l2ReadFrame()){
                        LOGE("READ ERROR") ;
                }
                ***********/
                
                if(-1 == rt){
                        LOGE("there is something wrong in select 
function(select)") ;
                        //no defined error manage
                        return V4L2_IOCTL_ERROR ;
                }
                if(0 == rt){
                        LOGE("wait for data timeout in select") ;
                        return V4L2_TIMEOUT ;
                }

                memset(&buf, 0, sizeof(buf)) ;
                buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
                buf.memory = V4L2_MEMORY_MMAP ;
                if(-1 == ioctl(v4l2Fd, VIDIOC_DQBUF, &buf)){
                    LOGE("there is something wrong in dequeue 
buffer(VIDIOC_DQBUF)") ;
                        return V4L2_IOCTL_ERROR ;
                }
                
                assert(i < n_buf) ;
                LOGE("buf.index  0buf.length = %d %d \n", buf.index , 
buf.length) ;
        memcpy((mCameraProwave->getPreviewHeap())->base(),
v4l2Buffer[buf.index].start, buf.length) ;
                if(-1 == ioctl(v4l2Fd, VIDIOC_QBUF, &buf)){
                    LOGE("there is something wrong in enqueue 
buffer(VIDIOC_QBUF)") ;
                        return V4L2_IOCTL_ERROR ;
                }
                //break ;   //i don't know whether the break is needed ;
                 
        }
        return V4L2_NOERROR ;
}

when executed the VIDIOC_DQBUF IOCTL,the return value was right, but the
value of buf.length would always  be zero. Then I used the read()
function to read raw data in the file handle for debug, and I can get
the raw data. Anybody have met this issue before ? Who can give me some
advices or tell me what is wrong , thanks a lot ~

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to