Ticket #2073: NVR_V4L2_reset_capture_buffers.diff

File NVR_V4L2_reset_capture_buffers.diff, 2.4 KB (added by gnome42@…, 14 years ago)

V4L2 capture buffer reset

  • libs/libmythtv/NuppelVideoRecorder.cpp

     
    13651365
    13661366    encoding = true;
    13671367    recording = true;
     1368    resetcapture = false;
    13681369
    1369     while (encoding) {
    1370 again:
     1370    while (encoding)
     1371    {
    13711372        if (request_pause)
    13721373        {
    13731374            mainpaused = true;
     
    13821383        }
    13831384        mainpaused = false;
    13841385
    1385         if (resetcapture && go7007)
     1386        if (resetcapture)
    13861387        {
    1387             int turnon = V4L2_BUF_TYPE_VIDEO_CAPTURE;
     1388            VERBOSE(VB_IMPORTANT, LOC + "Reset and requeue capture buffers.");
     1389            turnon = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    13881390            ioctl(fd, VIDIOC_STREAMOFF, &turnon);
    13891391
    13901392            for (int i = 0; i < numbuffers; i++)
     
    14071409        switch (select(fd+1, &rdset, NULL, NULL, &tv))
    14081410        {
    14091411            case -1:
    1410                   if (errno == EINTR)
    1411                       goto again;
    1412                   perror("select");
    1413                   continue;
     1412                if (errno != EINTR)
     1413                    perror("select");
     1414                continue;
    14141415            case 0:
    1415                   printf("select timeout\n");
    1416                   continue;
    1417            default: break;
     1416                printf("select timeout\n");
     1417                continue;
     1418            default: break;
    14181419        }
    14191420
    14201421        memset(&vbuf, 0, sizeof(vbuf));
     
    14231424        if (ioctl(fd, VIDIOC_DQBUF, &vbuf) < 0)
    14241425        {
    14251426            perror("VIDIOC_DQBUF");
    1426             if (errno == -EINVAL)
     1427            switch(errno)
    14271428            {
    1428                 for (int i = 0; i < numbuffers; i++)
    1429                 {
    1430                     vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    1431                     vbuf.index = i;
    1432                     ioctl(fd, VIDIOC_QBUF, &vbuf);
    1433                 }
    1434                 continue;
     1429                case EINVAL:
     1430                case EIO:
     1431                    resetcapture = true;
     1432                case EAGAIN:
     1433                    continue;
     1434                default: break;
    14351435            }
    14361436        }
    14371437
     
    28552855    positionMapDelta.clear();
    28562856    positionMapLock.unlock();
    28572857
    2858     resetcapture = true;
     2858    if (go7007)
     2859        resetcapture = true;
    28592860}
    28602861
    28612862void NuppelVideoRecorder::StartNewFile(void)