diff options
Diffstat (limited to 'abs/core-testing/mythtv/trunk/mythtv/hdpvr-signalmonitor.patch')
-rw-r--r-- | abs/core-testing/mythtv/trunk/mythtv/hdpvr-signalmonitor.patch | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/abs/core-testing/mythtv/trunk/mythtv/hdpvr-signalmonitor.patch b/abs/core-testing/mythtv/trunk/mythtv/hdpvr-signalmonitor.patch new file mode 100644 index 0000000..2465cfe --- /dev/null +++ b/abs/core-testing/mythtv/trunk/mythtv/hdpvr-signalmonitor.patch @@ -0,0 +1,292 @@ +Index: libs/libmythtv/analogsignalmonitor.cpp +=================================================================== +--- libs/libmythtv/analogsignalmonitor.cpp.orig ++++ libs/libmythtv/analogsignalmonitor.cpp +@@ -4,23 +4,92 @@ + #include <cerrno> + #include <unistd.h> + #include <sys/ioctl.h> ++#include <poll.h> + + #include "videodev_myth.h" + #include "mythcontext.h" + #include "analogsignalmonitor.h" + #include "v4lchannel.h" + +-#define LOC QString("AnalogSM: ").arg(channel->GetDevice()) +-#define LOC_ERR QString("AnalogSM, Error: ").arg(channel->GetDevice()) ++#define LOC QString("AnalogSM: %1 ").arg(channel->GetDevice()) ++#define LOC_ERR QString("AnalogSM, Error: %1 ").arg(channel->GetDevice()) + +-AnalogSignalMonitor::AnalogSignalMonitor( +- int db_cardnum, V4LChannel *_channel, uint64_t _flags) : ++AnalogSignalMonitor::AnalogSignalMonitor(int db_cardnum, V4LChannel *_channel, ++ uint64_t _flags) : + SignalMonitor(db_cardnum, _channel, _flags), +- usingv4l2(false) ++ m_usingv4l2(false), ++ m_stage(0) + { + int videofd = channel->GetFd(); + if (videofd >= 0) +- usingv4l2 = CardUtil::hasV4L2(videofd); ++ { ++ m_usingv4l2 = CardUtil::hasV4L2(videofd); ++ CardUtil::GetV4LInfo(videofd, m_card, m_driver, m_version); ++ VERBOSE(VB_RECORD, LOC + QString("card '%1' driver '%2' version '%3'") ++ .arg(m_card).arg(m_driver).arg(m_version)); ++ } ++} ++ ++bool AnalogSignalMonitor::handleHDPVR(int videofd) ++{ ++ struct v4l2_encoder_cmd command; ++ struct pollfd polls; ++ int idx; ++ ++ if (m_stage == 0) ++ { ++ VERBOSE(VB_RECORD, LOC + "hd-pvr start encoding"); ++ // Tell it to start encoding, then wait for it to actually feed us ++ // some data. ++ memset(&command, 0, sizeof(struct v4l2_encoder_cmd)); ++ command.cmd = V4L2_ENC_CMD_START; ++ if (ioctl(videofd, VIDIOC_ENCODER_CMD, &command) == 0) ++ m_stage = 1; ++ else ++ VERBOSE(VB_IMPORTANT, LOC_ERR + "Start encoding failed" + ENO); ++ } ++ ++ if (m_stage == 1) ++ { ++ VERBOSE(VB_RECORD, LOC + "hd-pvr wait for data"); ++ ++ polls.fd = videofd; ++ polls.events = POLLIN; ++ polls.revents = 0; ++ ++ if (poll(&polls, 1, 1500) > 0) ++ m_stage = 2; ++ else ++ { ++ VERBOSE(VB_RECORD, LOC + "Poll timed-out. Resetting"); ++ memset(&command, 0, sizeof(struct v4l2_encoder_cmd)); ++ command.cmd = V4L2_ENC_CMD_STOP; ++ ioctl(videofd, VIDIOC_ENCODER_CMD, &command); ++ m_stage = 0; ++ } ++ } ++ ++ if (m_stage == 2) ++ { ++ VERBOSE(VB_RECORD, LOC + "hd-pvr data ready. Stop encoding"); ++ ++ command.cmd = V4L2_ENC_CMD_STOP; ++ if (ioctl(videofd, VIDIOC_ENCODER_CMD, &command) == 0) ++ m_stage = 3; ++ } ++ ++ if (m_stage == 3) ++ { ++ struct v4l2_format vfmt; ++ memset(&vfmt, 0, sizeof(vfmt)); ++ vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ ++ VERBOSE(VB_RECORD, LOC + "hd-pvr waiting for valid resolution"); ++ if ((ioctl(videofd, VIDIOC_G_FMT, &vfmt) == 0) && vfmt.fmt.pix.width) ++ m_stage = 4; ++ } ++ ++ return (m_stage == 4); + } + + void AnalogSignalMonitor::UpdateValues(void) +@@ -33,19 +102,24 @@ void AnalogSignalMonitor::UpdateValues(v + return; + + bool isLocked = false; +- if (usingv4l2) ++ if (m_usingv4l2) + { +- struct v4l2_tuner tuner; +- bzero(&tuner, sizeof(tuner)); +- +- if (ioctl(videofd, VIDIOC_G_TUNER, &tuner, 0) < 0) +- { +- VERBOSE(VB_IMPORTANT, +- LOC_ERR + "Failed to probe signal (v4l2)" + ENO); +- } ++ if (m_driver == "hdpvr") ++ isLocked = handleHDPVR(videofd); + else + { +- isLocked = tuner.signal; ++ struct v4l2_tuner tuner; ++ bzero(&tuner, sizeof(tuner)); ++ ++ if (ioctl(videofd, VIDIOC_G_TUNER, &tuner, 0) < 0) ++ { ++ VERBOSE(VB_IMPORTANT, ++ LOC_ERR + "Failed to probe signal (v4l2)" + ENO); ++ } ++ else ++ { ++ isLocked = tuner.signal; ++ } + } + } + else +Index: libs/libmythtv/analogsignalmonitor.h +=================================================================== +--- libs/libmythtv/analogsignalmonitor.h.orig ++++ libs/libmythtv/analogsignalmonitor.h +@@ -19,7 +19,13 @@ class AnalogSignalMonitor : public Signa + virtual void UpdateValues(void); + + private: +- bool usingv4l2; ++ bool handleHDPVR(int videofd); ++ ++ bool m_usingv4l2; ++ QString m_card; ++ QString m_driver; ++ uint32_t m_version; ++ int m_stage; + }; + + #endif // _ANALOG_SIGNAL_MONITOR_H_ +Index: libs/libmythtv/mpegrecorder.cpp +=================================================================== +--- libs/libmythtv/mpegrecorder.cpp.orig ++++ libs/libmythtv/mpegrecorder.cpp +@@ -1041,14 +1041,6 @@ void MpegRecorder::StartRecording(void) + + if (driver == "hdpvr") + { +- if (curRecording->recgroup == "LiveTV") +- { +- // Don't bother checking resolution, always use best bitrate +- int maxbitrate = std::max(high_mpeg4peakbitrate, +- high_mpeg4avgbitrate); +- SetBitrate(high_mpeg4avgbitrate, maxbitrate, "LiveTV"); +- } +- + int progNum = 1; + MPEGStreamData *sd = new MPEGStreamData(progNum, true); + sd->SetRecordingType(_recording_type); +@@ -1492,7 +1484,7 @@ bool MpegRecorder::StartEncoding(int fd) + memset(&command, 0, sizeof(struct v4l2_encoder_cmd)); + command.cmd = V4L2_ENC_CMD_START; + +- if (driver == "hdpvr" && curRecording->recgroup != "LiveTV") ++ if (driver == "hdpvr") + HandleResolutionChanges(); + + VERBOSE(VB_RECORD, LOC + "StartEncoding"); +@@ -1615,64 +1607,6 @@ void MpegRecorder::HandleSingleProgramPM + DTVRecorder::BufferedWrite(*(reinterpret_cast<TSPacket*>(&buf[i]))); + } + +-/// After a resolution change, it can take the HD-PVR a few +-/// seconds before it is usable again. +-bool MpegRecorder::WaitFor_HDPVR(void) +-{ +- struct v4l2_encoder_cmd command; +- struct v4l2_format vfmt; +- struct pollfd polls; +- int idx; +- +- // Tell it to start encoding, then wait for it to actually feed us +- // some data. +- QMutexLocker locker(&start_stop_encoding_lock); +- +- // Sleep any less than 1.5 seconds, and the HD-PVR will +- // return the old resolution, when the resolution is changing. +- usleep(1500 * 1000); +- +- memset(&command, 0, sizeof(struct v4l2_encoder_cmd)); +- command.cmd = V4L2_ENC_CMD_START; +- +- for (idx = 0; idx < 20; ++idx) +- { +- if (ioctl(readfd, VIDIOC_ENCODER_CMD, &command) == 0) +- break; +- usleep(100 * 1000); +- } +- +- if (idx == 20) +- return false; +- +- polls.fd = readfd; +- polls.events = POLLIN; +- polls.revents = 0; +- +- if (poll(&polls, 1, 5000) <= 0) +- return false; +- +- // HD-PVR should now be "ready" +- command.cmd = V4L2_ENC_CMD_STOP; +- +- if (ioctl(readfd, VIDIOC_ENCODER_CMD, &command) < 0) +- return false; +- +- memset(&vfmt, 0, sizeof(vfmt)); +- vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; +- +- for (idx = 0; idx < 20; ++idx) +- { +- if (0 == ioctl(chanfd, VIDIOC_G_FMT, &vfmt)) +- return true; +- // Typically takes 0.9 seconds after a resolution change +- usleep(100 * 1000); +- } +- +- VERBOSE(VB_RECORD, LOC + "WaitForHDPVR failed"); +- return false; +-} +- + void MpegRecorder::SetBitrate(int bitrate, int maxbitrate, + const QString & reason) + { +@@ -1710,9 +1644,6 @@ void MpegRecorder::HandleResolutionChang + memset(&vfmt, 0, sizeof(vfmt)); + vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + +- if (driver == "hdpvr") +- WaitFor_HDPVR(); +- + if (0 == ioctl(chanfd, VIDIOC_G_FMT, &vfmt)) + { + VERBOSE(VB_RECORD, LOC + QString("Got Resolution %1x%2") +Index: libs/libmythtv/mpegrecorder.h +=================================================================== +--- libs/libmythtv/mpegrecorder.h.orig ++++ libs/libmythtv/mpegrecorder.h +@@ -86,7 +86,6 @@ class MpegRecorder : public DTVRecorder, + + void ResetForNewFile(void); + +- bool WaitFor_HDPVR(void); + void SetBitrate(int bitrate, int maxbitrate, const QString & reason); + void HandleResolutionChanges(void); + +Index: libs/libmythtv/signalmonitor.h +=================================================================== +--- libs/libmythtv/signalmonitor.h.orig ++++ libs/libmythtv/signalmonitor.h +@@ -287,6 +287,7 @@ inline bool SignalMonitor::IsRequired(co + return (CardUtil::IsDVBCardType(cardtype) || + (cardtype.toUpper() == "HDTV") || + (cardtype.toUpper() == "HDHOMERUN") || ++ (cardtype.toUpper() == "HDPVR") || + (cardtype.toUpper() == "FIREWIRE") || + (cardtype.toUpper() == "FREEBOX")); + } +@@ -295,6 +296,7 @@ inline bool SignalMonitor::IsSupported(c + { + return (IsRequired(cardtype) || + (cardtype.toUpper() == "V4L") || ++ (cardtype.toUpper() == "HDPVR") || + (cardtype.toUpper() == "MPEG")); + } + |