Ticket #11723: V4L2-VBI.patch

File V4L2-VBI.patch, 2.2 KB (added by jpoet, 7 years ago)

Updated version with fall back to /dev/videoX

  • mythtv/libs/libmythtv/recorders/mpegrecorder.cpp

    diff --git a/mythtv/libs/libmythtv/recorders/mpegrecorder.cpp b/mythtv/libs/libmythtv/recorders/mpegrecorder.cpp
    index 371fb13..d6b1f96 100644
    a b bool MpegRecorder::SetVBIOptions(int chanfd) 
    853853#ifdef V4L2_CAP_SLICED_VBI_CAPTURE
    854854    if (supports_sliced_vbi)
    855855    {
     856        int fd;
     857
     858        if (OpenVBIDevice() >= 0)
     859            fd = vbi_fd;
     860        else
     861            fd = chanfd;
     862
    856863        struct v4l2_format vbifmt;
    857864        memset(&vbifmt, 0, sizeof(struct v4l2_format));
    858865        vbifmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
    859866        vbifmt.fmt.sliced.service_set |= (VBIMode::PAL_TT == vbimode) ?
    860867            V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
    861868
    862         if (ioctl(chanfd, VIDIOC_S_FMT, &vbifmt) < 0)
     869        if (ioctl(fd, VIDIOC_S_FMT, &vbifmt) < 0)
    863870        {
    864             LOG(VB_GENERAL, LOG_WARNING, LOC +
    865                 "Unable to enable VBI embedding" + ENO);
     871            if (vbi_fd >= 0)
     872            {
     873                fd = chanfd; // Retry with video device instead
     874                if (ioctl(fd, VIDIOC_S_FMT, &vbifmt) < 0)
     875                {
     876                    LOG(VB_GENERAL, LOG_WARNING, LOC +
     877                        "Unable to enable VBI embedding (/dev/vbiX)" + ENO);
     878                    return false;
     879                }
     880            }
     881            else
     882            {
     883                LOG(VB_GENERAL, LOG_WARNING, LOC +
     884                    "Unable to enable VBI embedding (/dev/videoX)" + ENO);
     885                return false;
     886            }
    866887        }
    867         else if (ioctl(chanfd, VIDIOC_G_FMT, &vbifmt) >= 0)
     888
     889        if (ioctl(fd, VIDIOC_G_FMT, &vbifmt) >= 0)
    868890        {
    869891            LOG(VB_RECORD, LOG_INFO,
    870892                LOC + QString("VBI service: %1, io size: %2")
    bool MpegRecorder::SetVBIOptions(int chanfd) 
    881903            ctrls.count      = 1;
    882904            ctrls.controls   = &vbi_ctrl;
    883905
    884             if (ioctl(chanfd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
     906            if (ioctl(fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
    885907            {
    886908                LOG(VB_GENERAL, LOG_WARNING, LOC +
    887909                    "Unable to set VBI embedding format" + ENO);