13 #include <QRegularExpression>
15 #define LOC QString("V4L2(%1): ").arg(m_deviceName)
25 Open(dev_name, vbi_dev_name);
40 m_fd = open(dev_name.toLatin1().constData(), O_RDWR);
43 LOG(VB_CHANNEL, LOG_INFO,
LOC +
44 QString(
"Could not open '%1': ").arg(dev_name) +
ENO);
49 struct v4l2_query_ext_ctrl qc {};
50 qc.id = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
58 struct v4l2_capability capability {};
59 if (ioctl(
m_fd, VIDIOC_QUERYCAP, &capability) >= 0)
61 m_cardName = QString::fromLatin1((
const char*)capability.card);
62 m_driverName = QString::fromLatin1((
const char*)capability.driver);
72 static const QRegularExpression kDigitsRE { R
"(\[[0-9]\]$)" };
78 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Opened");
87 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Closed");
98 struct v4l2_requestbuffers reqbuf {};
100 if (-1 == ioctl (
m_fd, VIDIOC_REQBUFS, &reqbuf))
104 LOG(VB_CHANNEL, LOG_INFO,
LOC +
105 "Video capturing or mmap-streaming is not supported");
109 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
"VIDIOC_REQBUFS" +
ENO);
123 uint32_t mask,
const QString& desc)
127 if (!result.isEmpty())
165 case V4L2_CTRL_TYPE_INTEGER:
167 case V4L2_CTRL_TYPE_INTEGER64:
169 case V4L2_CTRL_TYPE_STRING:
171 case V4L2_CTRL_TYPE_BOOLEAN:
173 case V4L2_CTRL_TYPE_MENU:
175 case V4L2_CTRL_TYPE_INTEGER_MENU:
177 case V4L2_CTRL_TYPE_BUTTON:
179 case V4L2_CTRL_TYPE_BITMASK:
181 case V4L2_CTRL_TYPE_U8:
183 case V4L2_CTRL_TYPE_U16:
185 case V4L2_CTRL_TYPE_U32:
195 struct v4l2_querymenu qmenu {};
196 QString nameStr((
char *)queryctrl.name);
198 qmenu.id = queryctrl.id;
201 static const QRegularExpression kNonPrintableRE {
"[^a-zA-Z\\d\\s]" };
202 nameStr.replace(kNonPrintableRE,
"_");
207 drv_opt.
m_step = queryctrl.step;
210 if (nameStr ==
"Stream Type")
212 else if (nameStr ==
"Video Encoding")
214 else if (nameStr ==
"Video Aspect")
216 else if (nameStr ==
"Video B Frames")
218 else if (nameStr ==
"Video GOP Size")
220 else if (nameStr ==
"Video Bitrate Mode")
222 else if (nameStr ==
"Video Bitrate")
224 else if (nameStr ==
"Video Peak Bitrate")
226 else if (nameStr ==
"Audio Encoding")
228 else if (nameStr ==
"Audio Bitrate Mode")
230 else if (nameStr ==
"Audio Bitrate")
232 else if (nameStr ==
"Brightness")
234 else if (nameStr ==
"Contrast")
236 else if (nameStr ==
"Saturation")
238 else if (nameStr ==
"Hue")
240 else if (nameStr ==
"Sharpness")
242 else if (nameStr ==
"Volume")
247 switch (queryctrl.type)
249 case V4L2_CTRL_TYPE_INTEGER:
250 case V4L2_CTRL_TYPE_INTEGER64:
251 case V4L2_CTRL_TYPE_U8:
252 case V4L2_CTRL_TYPE_U16:
253 case V4L2_CTRL_TYPE_U32:
254 msg = QString(
"%1 : min=%2 max=%3 step=%4 default=%5")
255 .arg(QString(
"%1 (%2)").arg(nameStr,
queryctrl_toString(queryctrl.type)), 31, QChar(
' '))
256 .arg(queryctrl.minimum)
257 .arg(queryctrl.maximum)
259 .arg(queryctrl.default_value);
262 case V4L2_CTRL_TYPE_STRING:
263 msg = QString(
"%1 : min=%2 max=%3 step=%4")
264 .arg(QString(
"%1 (%2)").arg(nameStr,
queryctrl_toString(queryctrl.type)), 31, QChar(
' '))
265 .arg(queryctrl.minimum)
266 .arg(queryctrl.maximum)
267 .arg(queryctrl.step);
270 case V4L2_CTRL_TYPE_BOOLEAN:
271 msg = QString(
"%1 : default=%2")
272 .arg(QString(
"%1 (%2)").arg(nameStr,
queryctrl_toString(queryctrl.type)), 31, QChar(
' '))
273 .arg(queryctrl.default_value);
276 case V4L2_CTRL_TYPE_MENU:
277 case V4L2_CTRL_TYPE_INTEGER_MENU:
279 msg = QString(
"%1 : min=%3 max=%4 default=%5")
280 .arg(QString(
"%1 (%2)").arg(nameStr,
queryctrl_toString(queryctrl.type)), 31, QChar(
' '))
281 .arg(queryctrl.minimum)
282 .arg(queryctrl.maximum)
283 .arg(queryctrl.default_value);
285 struct v4l2_querymenu querymenu = { 0, };
286 memset (&querymenu, 0,
sizeof (querymenu));
287 querymenu.id = queryctrl.id;
289 for (querymenu.index = queryctrl.minimum;
290 static_cast<int>(querymenu.index) <= queryctrl.maximum;
293 drv_opt.menu.clear();
294 if (0 == ioctl(
m_fd, VIDIOC_QUERYMENU, &querymenu))
296 msg += QString(
" menu>%1").arg((
char *)querymenu.name);
297 drv_opt.menu[querymenu.index] =
298 QString((
char *)querymenu.name);
305 case V4L2_CTRL_TYPE_BUTTON:
306 msg = QString(
"%1 :")
307 .arg(QString(
"%1 (%2)").arg(nameStr,
queryctrl_toString(queryctrl.type)), 31, QChar(
' '));
310 case V4L2_CTRL_TYPE_BITMASK:
311 msg = QString(
"%1 : max=0x%2 default=0x%3")
312 .arg(QString(
"%1 (%2)").arg(nameStr,
queryctrl_toString(queryctrl.type)), 31, QChar(
' '))
313 .arg(queryctrl.maximum, 8, 16, QChar(
' '))
314 .arg(queryctrl.default_value, 8, 16, QChar(
' '));
319 msg = QString(
"%1 : type=%2")
320 .arg(QString(
"%1 (%2)").arg(nameStr,
queryctrl_toString(queryctrl.type)), 31, QChar(
' '))
321 .arg(queryctrl.type);
329 if (queryctrl.type == V4L2_CTRL_TYPE_MENU ||
330 queryctrl.type == V4L2_CTRL_TYPE_INTEGER_MENU)
332 for (
int idx = queryctrl.minimum; idx <= queryctrl.maximum; ++idx)
335 if (ioctl(
m_fd, VIDIOC_QUERYMENU, &qmenu))
338 drv_opt.
m_menu[idx] = QString((
char *)qmenu.name);
339 if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
340 msg += QString(
"\t\t%1: %2").arg(idx).arg((
char *)qmenu.name);
343 msg += QString(
"\t\t%1: %2 (0x%3)")
344 .arg(idx).arg(qmenu.value)
345 .arg(qmenu.value, 0, 16, QChar(
'0'));
350 LOG(VB_CHANNEL, LOG_INFO,
LOC + msg);
356 struct v4l2_control ctrl {};
357 struct v4l2_ext_control ext_ctrl {};
358 struct v4l2_ext_controls ctrls {};
360 if (qctrl.flags& V4L2_CTRL_FLAG_DISABLED)
362 msg += QString(
"'%1' Disabled").arg((
char *)qctrl.name);
366 if (qctrl.type == V4L2_CTRL_TYPE_CTRL_CLASS)
368 msg += QString(
"'%1' V4L2_CTRL_TYPE_CTRL_CLASS").arg((
char *)qctrl.name);
372 ext_ctrl.id = qctrl.id;
373 if ((qctrl.flags& V4L2_CTRL_FLAG_WRITE_ONLY) ||
374 qctrl.type == V4L2_CTRL_TYPE_BUTTON)
380 if (qctrl.type >= V4L2_CTRL_COMPOUND_TYPES)
386 ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(qctrl.id);
388 ctrls.controls = &ext_ctrl;
389 if (qctrl.type == V4L2_CTRL_TYPE_INTEGER64 ||
390 qctrl.type == V4L2_CTRL_TYPE_STRING ||
391 (V4L2_CTRL_ID2CLASS(qctrl.id) != V4L2_CTRL_CLASS_USER &&
392 qctrl.id < V4L2_CID_PRIVATE_BASE))
394 if (qctrl.type == V4L2_CTRL_TYPE_STRING)
396 ext_ctrl.size = qctrl.maximum + 1;
397 ext_ctrl.string = (
char *)malloc(ext_ctrl.size);
398 ext_ctrl.string[0] = 0;
400 if (ioctl(
m_fd, VIDIOC_G_EXT_CTRLS, &ctrls))
402 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
403 QString(
"Failed to get ext_ctr %1: ")
404 .arg((
char *)qctrl.name) +
ENO);
410 if (ioctl(
m_fd, VIDIOC_G_CTRL, &ctrl))
412 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
413 QString(
"Failed to get ctrl %1: ")
414 .arg((
char *)qctrl.name) +
ENO);
417 ext_ctrl.value = ctrl.value;
421 if (qctrl.type == V4L2_CTRL_TYPE_STRING)
422 free(ext_ctrl.string);
433 drv_opt.
m_name =
"Video Encoding";
435 V4L2_MPEG_VIDEO_ENCODING_MPEG_2;
446 drv_opt.
m_name =
"Audio Encoding";
448 V4L2_MPEG_AUDIO_ENCODING_LAYER_2;
453 drv_opt.
m_name =
"Audio Bitrate";
455 V4L2_MPEG_AUDIO_ENCODING_LAYER_2;
461 drv_opt.
m_name =
"MPEG Audio sampling frequency";
463 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
469 drv_opt.
m_name =
"Tuner Audio Modes";
471 V4L2_TUNER_MODE_STEREO;
476 DriverOption::Options::iterator Iopt =
options.begin();
477 for ( ; Iopt !=
options.end(); ++Iopt)
480 if (!(*Iopt).m_menu.isEmpty())
482 int minimum = INT_MAX;
485 DriverOption::menu_t::iterator Imenu = (*Iopt).m_menu.begin();
486 for ( ; Imenu != (*Iopt).m_menu.end(); ++Imenu)
488 if (Imenu.key() < minimum) minimum = Imenu.key();
489 if (Imenu.key() > maximum) maximum = Imenu.key();
491 if ((*Iopt).m_minimum != minimum)
493 LOG(VB_CHANNEL, LOG_INFO,
LOC +
494 QString(
"%1 menu options overrides minimum from %2 to %3")
495 .arg((*Iopt).m_name).arg((*Iopt).m_minimum).arg(minimum));
496 (*Iopt).m_minimum = minimum;
498 if ((*Iopt).m_maximum != maximum)
500 LOG(VB_CHANNEL, LOG_INFO,
LOC +
501 QString(
"%1 menu options overrides maximum from %2 to %3")
502 .arg((*Iopt).m_name).arg((*Iopt).m_maximum).arg(maximum));
503 (*Iopt).m_maximum = maximum;
511 struct v4l2_fmtdesc vid_fmtdesc {};
512 const std::array<const QString,2> flags {
"uncompressed",
"compressed"};
514 vid_fmtdesc.index = 0;
515 vid_fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
516 while(ioctl(
m_fd, VIDIOC_ENUM_FMT, &vid_fmtdesc) == 0)
518 formats << QString(
"%1 (%2)").arg((
char *)vid_fmtdesc.description,
519 flags[vid_fmtdesc.flags]);
530 LOG(VB_CHANNEL, LOG_DEBUG,
LOC + QString(
"GetFormats: %1")
538 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Options");
546 struct v4l2_queryctrl qctrl {};
547 qctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;
548 while (0 == ioctl (
m_fd, VIDIOC_QUERYCTRL, &qctrl))
556 qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
571 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
572 QString(
"Driver does not support option."));
577 DriverOption::menu_t::iterator Imenu = drv_opt.
m_menu.begin();
578 for ( ; Imenu != drv_opt.
m_menu.end(); ++Imenu)
580 if ((*Imenu) == desc)
582 LOG(VB_CHANNEL, LOG_INFO,
LOC + QString(
"GetOptionValue '%1' = %2")
583 .arg(desc).arg(Imenu.key()));
588 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
589 QString(
"'%1' not found in driver options menu.").arg(desc));
595 v4l2_std_id std_id = 0;
596 struct v4l2_standard standard {};
598 if (-1 == ioctl (
m_fd, VIDIOC_G_STD, &std_id))
603 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
604 "GetVideoStandard: Failed to detect signal." +
ENO);
610 while (0 == ioctl (
m_fd, VIDIOC_ENUMSTD, &standard))
612 if (standard.id & std_id)
614 name = (
char *)standard.name;
623 if (errno == EINVAL || standard.index == 0)
625 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
626 "GetVideoStandard: Failed to find signal." +
ENO);
636 struct v4l2_tuner tuner {};
638 if (ioctl(
m_fd, VIDIOC_G_TUNER, &tuner, 0) != 0)
640 LOG(VB_GENERAL, LOG_ERR,
"GetSignalStrength() : "
641 "Failed to probe signal (v4l2)" +
ENO);
645 tuner.signal /= 655.35;
647 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"GetSignalStrength() : "
655 struct v4l2_format vfmt {};
657 vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
658 if (ioctl(
m_fd, VIDIOC_G_FMT, &vfmt) != 0)
660 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
661 "Failed to determine resolution: " +
ENO);
666 width = vfmt.fmt.pix.width;
667 height = vfmt.fmt.pix.height;
668 LOG(VB_CHANNEL, LOG_INFO,
LOC +
669 QString(
"Resolution: %1x%2").arg(width).arg(height));
700 struct v4l2_queryctrl qctrl {};
702 qctrl.id = V4L2_CTRL_CLASS_MPEG | V4L2_CTRL_FLAG_NEXT_CTRL;
703 return (0 == ioctl (
m_fd, VIDIOC_QUERYCTRL, &qctrl) &&
704 V4L2_CTRL_ID2CLASS (qctrl.id) == V4L2_CTRL_CLASS_MPEG);
717 struct v4l2_ext_control ctrl {};
718 struct v4l2_ext_controls ctrls {};
723 ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
724 ctrls.controls = &ctrl;
726 if (ioctl(
m_fd, VIDIOC_G_EXT_CTRLS, &ctrls) != 0)
728 LOG(VB_GENERAL, LOG_ERR,
LOC +
729 QString(
"Failed to retrieve current %1 value.")
730 .arg(ctrl_desc) +
ENO);
734 return ctrls.controls->value;
739 const QString& value_desc)
743 if (current_value < 0)
745 if (current_value == value)
747 LOG(VB_CHANNEL, LOG_INFO,
LOC +
748 QString(
"%1 value is already %2 (%3).")
749 .arg(ctrl_desc, value_desc, QString::number(value)));
753 struct v4l2_ext_control ctrl {};
754 struct v4l2_ext_controls ctrls {};
760 ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
761 ctrls.controls = &ctrl;
763 if (ioctl(
m_fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
765 LOG(VB_GENERAL, LOG_ERR,
LOC +
766 QString(
"Failed to set %1 value to %2 (%3).")
767 .arg(ctrl_desc, value_desc, QString::number(value)) +
ENO);
771 LOG(VB_CHANNEL, LOG_INFO,
LOC +
772 QString(
"%1 value set to %2 (%3).")
773 .arg(ctrl_desc, value_desc, QString::number(value)));
782 case V4L2_MPEG_STREAM_TYPE_MPEG2_PS:
783 return "MPEG-2 program stream";
784 case V4L2_MPEG_STREAM_TYPE_MPEG2_TS:
785 return "MPEG-2 transport stream";
786 case V4L2_MPEG_STREAM_TYPE_MPEG1_SS:
787 return "MPEG-1 system stream";
788 case V4L2_MPEG_STREAM_TYPE_MPEG2_DVD:
789 return "MPEG-2 DVD-compatible stream";
790 case V4L2_MPEG_STREAM_TYPE_MPEG1_VCD:
791 return "MPEG-1 VCD-compatible stream";
792 case V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD:
793 return "MPEG-2 SVCD-compatible stream";
800 int type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS;
805 type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS;
810 LOG(VB_CHANNEL, LOG_INFO,
LOC +
811 QString(
"MPEG Stream Type is currently set to %1 (%2)")
823 value = V4L2_MPEG_STREAM_TYPE_MPEG2_PS;
836 case V4L2_MPEG_VIDEO_ASPECT_1x1:
839 case V4L2_MPEG_VIDEO_ASPECT_4x3:
842 case V4L2_MPEG_VIDEO_ASPECT_16x9:
845 case V4L2_MPEG_VIDEO_ASPECT_221x100:
853 "Video Aspect ratio", desc);
861 case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
864 case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
869 return SetExtControl(V4L2_CID_MPEG_VIDEO_BITRATE_MODE, value,
870 "Video Bitrate Mode", desc);
875 QString desc = QString(
"%1").arg(value);
877 "Video Average Bitrate", desc);
882 QString desc = QString(
"%1").arg(value);
883 return SetExtControl(V4L2_CID_MPEG_VIDEO_BITRATE_PEAK, value,
884 "Video Peak Bitrate", desc);
889 struct v4l2_format vfmt {};
891 vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
893 if (ioctl(
m_fd, VIDIOC_G_FMT, &vfmt) < 0)
895 LOG(VB_GENERAL, LOG_ERR,
LOC +
896 "SetResolution() -- Error getting format" +
ENO);
900 if ((vfmt.fmt.pix.width == width) && (vfmt.fmt.pix.height == height))
902 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"Resolution is already %1x%2")
903 .arg(width).arg(height));
907 vfmt.fmt.pix.width = width;
908 vfmt.fmt.pix.height = height;
910 if (ioctl(
m_fd, VIDIOC_S_FMT, &vfmt) < 0)
912 LOG(VB_GENERAL, LOG_ERR,
LOC +
913 "SetResolution() -- Error setting format" +
ENO);
917 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"Resolution set to %1x%2")
918 .arg(width).arg(height));
925 struct v4l2_audio ain {};
928 if (ioctl(
m_fd, VIDIOC_ENUMAUDIO, &ain) < 0)
930 LOG(VB_GENERAL, LOG_WARNING,
LOC +
931 QString(
"Failed to retrieve audio input.") +
ENO);
936 if (ioctl(
m_fd, VIDIOC_S_AUDIO, &ain) < 0)
938 LOG(VB_GENERAL, LOG_WARNING,
939 LOC + QString(
"Failed to set audio input to %1.").arg(value) +
ENO);
943 LOG(VB_CHANNEL, LOG_INFO,
LOC + QString(
"Audio input set to %1.")
952 value = V4L2_MPEG_AUDIO_ENCODING_LAYER_2;
958 case V4L2_MPEG_AUDIO_ENCODING_LAYER_1:
961 case V4L2_MPEG_AUDIO_ENCODING_LAYER_2:
964 case V4L2_MPEG_AUDIO_ENCODING_LAYER_3:
967 case V4L2_MPEG_AUDIO_ENCODING_AAC:
970 case V4L2_MPEG_AUDIO_ENCODING_AC3:
981 LOG(VB_CHANNEL, LOG_INFO,
LOC +
982 QString(
"Overriding AudioCodec for %1 to %2")
988 "Audio Codec", desc);
995 struct v4l2_queryctrl qctrl {};
996 qctrl.id = V4L2_CID_AUDIO_VOLUME;
997 if ((ioctl(
m_fd, VIDIOC_QUERYCTRL, &qctrl) < 0) ||
998 (qctrl.flags & V4L2_CTRL_FLAG_DISABLED))
1000 LOG(VB_CHANNEL, LOG_WARNING,
1001 LOC +
"SetRecordingVolume() -- Audio volume control not supported.");
1006 int range = qctrl.maximum - qctrl.minimum;
1007 int value = (int) ((range * volume * 0.01F) + qctrl.minimum);
1008 int ctrl_volume = std::min(qctrl.maximum, std::max(qctrl.minimum, value));
1011 struct v4l2_control ctrl {};
1012 ctrl.id = V4L2_CID_AUDIO_VOLUME;
1013 ctrl.value = ctrl_volume;
1015 if (ioctl(
m_fd, VIDIOC_S_CTRL, &ctrl) < 0)
1017 LOG(VB_GENERAL, LOG_WARNING,
LOC +
1018 "SetRecordingVolume() -- Failed to set recording volume" +
ENO);
1023 LOG(VB_RECORD, LOG_INFO,
LOC +
"SetRecordingVolume() -- volume set.");
1029 struct v4l2_tuner vt {};
1031 if (ioctl(
m_fd, VIDIOC_G_TUNER, &vt) < 0)
1033 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
1034 "SetLanguageMode() -- Failed to retrieve audio mode" +
ENO);
1040 if (ioctl(
m_fd, VIDIOC_S_TUNER, &vt) < 0)
1042 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
1043 "SetLanguageMode -- Failed to set audio mode" +
ENO);
1050 case V4L2_TUNER_MODE_MONO:
1053 case V4L2_TUNER_MODE_STEREO:
1057 case V4L2_TUNER_MODE_LANG2:
1061 case V4L2_TUNER_MODE_SAP:
1064 case V4L2_TUNER_MODE_LANG1:
1067 case V4L2_TUNER_MODE_LANG1_LANG2:
1068 desc =
"LANG1&Lang2";
1075 LOG(VB_CHANNEL, LOG_INFO,
LOC + QString(
"Language Mode set to %1 (%2)")
1076 .arg(desc).arg(mode));
1086 value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
1091 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100:
1094 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000:
1097 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000:
1107 LOG(VB_CHANNEL, LOG_INFO,
LOC +
1108 QString(
"Overriding sampling frequence for %1 to %2")
1113 return SetExtControl(V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ, value,
1114 "Audio Sample Rate", desc);
1122 case V4L2_MPEG_AUDIO_L2_BITRATE_32K:
1125 case V4L2_MPEG_AUDIO_L2_BITRATE_48K:
1128 case V4L2_MPEG_AUDIO_L2_BITRATE_56K:
1131 case V4L2_MPEG_AUDIO_L2_BITRATE_64K:
1134 case V4L2_MPEG_AUDIO_L2_BITRATE_80K:
1137 case V4L2_MPEG_AUDIO_L2_BITRATE_96K:
1140 case V4L2_MPEG_AUDIO_L2_BITRATE_112K:
1143 case V4L2_MPEG_AUDIO_L2_BITRATE_128K:
1146 case V4L2_MPEG_AUDIO_L2_BITRATE_160K:
1149 case V4L2_MPEG_AUDIO_L2_BITRATE_192K:
1152 case V4L2_MPEG_AUDIO_L2_BITRATE_224K:
1155 case V4L2_MPEG_AUDIO_L2_BITRATE_256K:
1158 case V4L2_MPEG_AUDIO_L2_BITRATE_320K:
1161 case V4L2_MPEG_AUDIO_L2_BITRATE_384K:
1169 "Audio L2 Bitrate", desc);
1175 struct v4l2_encoder_cmd command {};
1178 if (ioctl(
m_fd, VIDIOC_ENCODER_CMD, &command) != 0 && errno != ENOTTY)
1183 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
1184 QString(
"SetEncoderState(%1) -- failed").arg(desc) +
ENO);
1187 LOG(VB_CHANNEL, LOG_INFO,
LOC +
1188 QString(
"SetEncoderState(%1) -- success").arg(desc));
1219 struct v4l2_format vbifmt {};
1221 vbifmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
1223 V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1227 if (ioctl(fd, VIDIOC_S_FMT, &vbifmt) < 0)
1229 LOG(VB_CHANNEL, LOG_WARNING,
LOC +
"ConfigureVBI() -- " +
1230 "Failed to enable VBI embedding (/dev/videoX)" +
ENO);
1234 if (ioctl(fd, VIDIOC_G_FMT, &vbifmt) >= 0)
1236 LOG(VB_RECORD, LOG_INFO,
1237 LOC + QString(
"VBI service: %1, io size: %2")
1238 .arg(vbifmt.fmt.sliced.service_set)
1239 .arg(vbifmt.fmt.sliced.io_size));
1244 V4L2_MPEG_STREAM_VBI_FMT_IVTV,
1245 "MPEG Stream VBI format",
1246 "VBI in private packets, IVTV form");