summaryrefslogtreecommitdiffstats
path: root/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch')
-rw-r--r--abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch658
1 files changed, 0 insertions, 658 deletions
diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch
deleted file mode 100644
index f292b7f..0000000
--- a/abs/core-testing/mythtv/trunk/mythtv-svn/patches/mpegrecorder-hdpvr-v1.1.patch
+++ /dev/null
@@ -1,658 +0,0 @@
-Index: libs/libmythtv/mpegrecorder.h
-===================================================================
---- libs/libmythtv/mpegrecorder.h (revision 19056)
-+++ libs/libmythtv/mpegrecorder.h (working copy)
-@@ -80,11 +80,13 @@
- uint GetFilteredAudioLayer(void) const;
- uint GetFilteredAudioBitRate(uint audio_layer) const;
-
-+ void RestartEncoding(void);
- bool StartEncoding(int fd);
- bool StopEncoding(int fd);
-
- void ResetForNewFile(void);
-
-+ bool WaitFor_HDPVR(void);
- void HandleResolutionChanges(void);
-
- inline bool CheckCC(uint pid, uint cc);
-@@ -104,7 +106,6 @@
- // State
- bool recording;
- bool encoding;
-- bool needs_resolution;
- mutable QMutex start_stop_encoding_lock;
- QMutex recording_wait_lock;
- QWaitCondition recording_wait;
-@@ -113,7 +114,7 @@
- bool cleartimeonpause;
-
- // Encoding info
-- int width, height;
-+ uint width, height;
- int bitrate, maxbitrate, streamtype, aspectratio;
- int audtype, audsamplerate, audbitratel1, audbitratel2, audbitratel3;
- int audvolume;
-Index: libs/libmythtv/mpegrecorder.cpp
-===================================================================
---- libs/libmythtv/mpegrecorder.cpp (revision 19056)
-+++ libs/libmythtv/mpegrecorder.cpp (working copy)
-@@ -19,6 +19,7 @@
- #include <sys/stat.h>
- #include <sys/ioctl.h>
- #include <sys/time.h>
-+#include <sys/poll.h>
-
- // avlib headers
- extern "C" {
-@@ -86,7 +87,7 @@
- requires_special_pause(false),
- // State
- recording(false), encoding(false),
-- needs_resolution(false), start_stop_encoding_lock(QMutex::Recursive),
-+ start_stop_encoding_lock(QMutex::Recursive),
- recording_wait_lock(), recording_wait(),
- // Pausing state
- cleartimeonpause(false),
-@@ -487,13 +488,21 @@
-
- bool MpegRecorder::SetFormat(int chanfd)
- {
-+ uint idx;
- struct v4l2_format vfmt;
- bzero(&vfmt, sizeof(vfmt));
-
- vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
-- if (ioctl(chanfd, VIDIOC_G_FMT, &vfmt) < 0)
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(chanfd, VIDIOC_G_FMT, &vfmt) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 10)
-+ {
- VERBOSE(VB_IMPORTANT, LOC_ERR + "Error getting format" + ENO);
- return false;
- }
-@@ -501,8 +510,15 @@
- vfmt.fmt.pix.width = width;
- vfmt.fmt.pix.height = height;
-
-- if (ioctl(chanfd, VIDIOC_S_FMT, &vfmt) < 0)
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(chanfd, VIDIOC_S_FMT, &vfmt) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
- VERBOSE(VB_IMPORTANT, LOC_ERR + "Error setting format" + ENO);
- return false;
- }
-@@ -513,10 +529,19 @@
- /// Set audio language mode
- bool MpegRecorder::SetLanguageMode(int chanfd)
- {
-+ uint idx;
- struct v4l2_tuner vt;
- bzero(&vt, sizeof(struct v4l2_tuner));
-- if (ioctl(chanfd, VIDIOC_G_TUNER, &vt) < 0)
-+
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(chanfd, VIDIOC_G_TUNER, &vt) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
- VERBOSE(VB_IMPORTANT, LOC_WARN + "Unable to get audio mode" + ENO);
- return false;
- }
-@@ -549,8 +574,15 @@
- success = false;
- }
-
-- if (ioctl(chanfd, VIDIOC_S_TUNER, &vt) < 0)
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(chanfd, VIDIOC_S_TUNER, &vt) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
- VERBOSE(VB_IMPORTANT, LOC_WARN + "Unable to set audio mode" + ENO);
- success = false;
- }
-@@ -561,10 +593,19 @@
- bool MpegRecorder::SetRecordingVolume(int chanfd)
- {
- // Get volume min/max values
-+ uint idx;
- struct v4l2_queryctrl qctrl;
- qctrl.id = V4L2_CID_AUDIO_VOLUME;
-- if (ioctl(chanfd, VIDIOC_QUERYCTRL, &qctrl) < 0)
-+
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(chanfd, VIDIOC_QUERYCTRL, &qctrl) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
- VERBOSE(VB_IMPORTANT, LOC_WARN +
- "Unable to get recording volume parameters(max/min)" + ENO +
- "\n\t\t\tusing default range [0,65535].");
-@@ -582,8 +623,15 @@
- ctrl.id = V4L2_CID_AUDIO_VOLUME;
- ctrl.value = ctrl_volume;
-
-- if (ioctl(chanfd, VIDIOC_S_CTRL, &ctrl) < 0)
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(chanfd, VIDIOC_S_CTRL, &ctrl) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
- VERBOSE(VB_IMPORTANT, LOC_WARN +
- "Unable to set recording volume" + ENO + "\n\t\t\t" +
- "If you are using an AverMedia M179 card this is normal.");
-@@ -765,6 +813,7 @@
-
- for (uint i = 0; i < ext_ctrls.size(); i++)
- {
-+ uint idx;
- struct v4l2_ext_controls ctrls;
- bzero(&ctrls, sizeof(struct v4l2_ext_controls));
-
-@@ -774,8 +823,15 @@
- ctrls.count = 1;
- ctrls.controls = &ext_ctrls[i];
-
-- if (ioctl(fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(fd, VIDIOC_S_EXT_CTRLS, &ctrls) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
- QMutexLocker locker(&control_description_lock);
- VERBOSE(VB_IMPORTANT, QString("mpegrecorder.cpp:set_ctrls(): ") +
- QString("Could not set %1 to %2")
-@@ -814,6 +870,30 @@
- {
- maxbitrate = high_mpeg4peakbitrate;
- bitrate = high_mpeg4avgbitrate;
-+
-+ // query supported audio codecs and prefer AC3
-+ uint idx;
-+ struct v4l2_queryctrl qctrl;
-+ qctrl.id = V4L2_CID_MPEG_AUDIO_ENCODING;
-+
-+ for (idx = 0; idx < 20; ++idx)
-+ {
-+ if (ioctl(chanfd, VIDIOC_QUERYCTRL, &qctrl) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
-+ VERBOSE(VB_IMPORTANT, LOC_WARN +
-+ "Unable to get supported audio codecs." + ENO);
-+ }
-+ else
-+ {
-+ if (qctrl.minimum != qctrl.maximum)
-+ add_ext_ctrl(ext_ctrls, V4L2_CID_MPEG_AUDIO_ENCODING,
-+ qctrl.maximum);
-+ }
- }
- maxbitrate = std::max(maxbitrate, bitrate);
-
-@@ -837,19 +917,36 @@
- int audioinput = audiodevice.toUInt(&ok);
- if (ok)
- {
-+ uint idx;
- struct v4l2_audio ain;
- bzero(&ain, sizeof(ain));
- ain.index = audioinput;
-- if (ioctl(chanfd, VIDIOC_ENUMAUDIO, &ain) < 0)
-+
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(chanfd, VIDIOC_ENUMAUDIO, &ain) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
- VERBOSE(VB_IMPORTANT, LOC_WARN +
- "Unable to get audio input.");
- }
- else
- {
- ain.index = audioinput;
-- if (ioctl(chanfd, VIDIOC_S_AUDIO, &ain) < 0)
-+
-+ for (idx = 0; idx < 20; ++idx)
- {
-+ if (ioctl(chanfd, VIDIOC_S_AUDIO, &ain) == 0)
-+ break;
-+ usleep(100 * 1000);
-+ }
-+
-+ if (idx == 20)
-+ {
- VERBOSE(VB_IMPORTANT, LOC_WARN +
- "Unable to set audio input.");
- }
-@@ -1036,17 +1133,26 @@
- if (deviceIsMpegFile)
- elapsedTimer.start();
- else if (_device_read_buffer)
-- _device_read_buffer->Start();
-+ {
-+ VERBOSE(VB_RECORD, LOC + "Initial startup of recorder");
-
-- needs_resolution = (driver == "hdpvr");
-+ if (StartEncoding(readfd))
-+ _device_read_buffer->Start();
-+ else
-+ {
-+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to start recording");
-+ recording = false;
-+ QMutexLocker locker(&recording_wait_lock);
-+ recording_wait.wakeAll();
-+ _error = true;
-+ }
-+ }
-
- QByteArray vdevice = videodevice.toAscii();
- while (encoding && !_error)
- {
- if (PauseAndWait(100))
- continue;
--
-- HandleResolutionChanges();
-
- if (deviceIsMpegFile)
- {
-@@ -1090,35 +1196,7 @@
- {
- VERBOSE(VB_IMPORTANT, LOC_ERR + "Device error detected");
-
-- _device_read_buffer->Stop();
--
-- QMutexLocker locker(&start_stop_encoding_lock);
--
-- StopEncoding(readfd);
--
-- // Make sure the next things in the file are a PAT & PMT
-- if (_stream_data->PATSingleProgram() &&
-- _stream_data->PMTSingleProgram())
-- {
-- bool tmp = _wait_for_keyframe_option;
-- _wait_for_keyframe_option = false;
-- HandleSingleProgramPAT(_stream_data->PATSingleProgram());
-- HandleSingleProgramPMT(_stream_data->PMTSingleProgram());
-- _wait_for_keyframe_option = tmp;
-- }
--
-- if (StartEncoding(readfd))
-- {
-- _device_read_buffer->Start();
-- }
-- else
-- {
-- if (0 != close(readfd))
-- VERBOSE(VB_IMPORTANT, LOC_ERR + "Close error" + ENO);
--
-- // Force card to be reopened on next iteration..
-- readfd = -1;
-- }
-+ RestartEncoding();
- }
- else if (_device_read_buffer->IsEOF())
- {
-@@ -1216,6 +1294,8 @@
- }
- }
-
-+ VERBOSE(VB_RECORD, LOC + "StartRecording finishing up");
-+
- if (_device_read_buffer)
- {
- if (_device_read_buffer->IsRunning())
-@@ -1224,6 +1304,7 @@
- delete _device_read_buffer;
- _device_read_buffer = NULL;
- }
-+
- StopEncoding(readfd);
-
- FinishRecording();
-@@ -1373,52 +1454,95 @@
-
- if (!paused)
- {
-+ VERBOSE(VB_RECORD, LOC + "PauseAndWait pause");
-+
-+ // Some drivers require streaming to be disabled before
-+ // an input switch and other channel format setting.
-+ if (requires_special_pause)
-+ StopEncoding(readfd);
-+
- if (_device_read_buffer)
- {
- QMutex drb_lock;
- drb_lock.lock();
--
- _device_read_buffer->SetRequestPause(true);
--
- pauseWait.wait(&drb_lock, timeout);
- }
- else
-- {
-- paused = true;
- pauseWait.wakeAll();
-- }
-
-- // Some drivers require streaming to be disabled before
-- // an input switch and other channel format setting.
-- if (requires_special_pause)
-- StopEncoding(readfd);
--
-+ paused = true;
- if (tvrec)
- tvrec->RecorderPaused();
- }
-
- unpauseWait.wait(&waitlock, timeout);
- }
-- if (!request_pause)
-+
-+ if (!request_pause && paused)
- {
-- if (paused)
-+ VERBOSE(VB_RECORD, LOC + "PauseAndWait unpause");
-+
-+ if (driver == "hdpvr")
- {
-- // Some drivers require streaming to be disabled before
-- // an input switch and other channel format setting.
-- if (requires_special_pause)
-- StartEncoding(readfd);
-+ m_h264_parser.Reset();
-+ _wait_for_keyframe_option = true;
-+ _seen_sps = false;
-
-- if (_device_read_buffer)
-- _device_read_buffer->SetRequestPause(false);
-+ // Sleep any less than 1.5 seconds, and the HD-PVR will
-+ // return the old resolution, when the resolution is changing.
-+ usleep(1500 * 1000);
-+ }
-
-- if (_stream_data)
-- _stream_data->Reset(_stream_data->DesiredProgram());
-- }
-+ // Some drivers require streaming to be disabled before
-+ // an input switch and other channel format setting.
-+ if (requires_special_pause)
-+ StartEncoding(readfd);
-+
-+ if (_device_read_buffer)
-+ _device_read_buffer->SetRequestPause(false);
-+
-+ if (_stream_data)
-+ _stream_data->Reset(_stream_data->DesiredProgram());
-+
- paused = false;
- }
-+
- return paused;
- }
-
-+void MpegRecorder::RestartEncoding(void)
-+{
-+ VERBOSE(VB_RECORD, LOC + "RestartEncoding");
-+
-+ _device_read_buffer->Stop();
-+
-+ QMutexLocker locker(&start_stop_encoding_lock);
-+
-+ StopEncoding(readfd);
-+
-+ // Make sure the next things in the file are a PAT & PMT
-+ if (_stream_data->PATSingleProgram() &&
-+ _stream_data->PMTSingleProgram())
-+ {
-+ _wait_for_keyframe_option = false;
-+ HandleSingleProgramPAT(_stream_data->PATSingleProgram());
-+ HandleSingleProgramPMT(_stream_data->PMTSingleProgram());
-+ }
-+
-+ if (StartEncoding(readfd))
-+ {
-+ _device_read_buffer->Start();
-+ }
-+ else
-+ {
-+ if (0 != close(readfd))
-+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Close error" + ENO);
-+
-+ readfd = -1;
-+ }
-+}
-+
- bool MpegRecorder::StartEncoding(int fd)
- {
- QMutexLocker locker(&start_stop_encoding_lock);
-@@ -1427,13 +1551,22 @@
- memset(&command, 0, sizeof(struct v4l2_encoder_cmd));
- command.cmd = V4L2_ENC_CMD_START;
-
-+ if (driver == "hdpvr")
-+ HandleResolutionChanges();
-+
- VERBOSE(VB_RECORD, LOC + "StartEncoding");
-- needs_resolution = (driver == "hdpvr");
-
-- for (int idx = 0; idx < 10; ++idx)
-+ for (int idx = 0; idx < 20; ++idx)
- {
- if (ioctl(fd, VIDIOC_ENCODER_CMD, &command) == 0)
- {
-+ if (driver == "hdpvr")
-+ {
-+ m_h264_parser.Reset();
-+ _wait_for_keyframe_option = true;
-+ _seen_sps = false;
-+ }
-+
- VERBOSE(VB_RECORD, LOC + "Encoding started");
- return true;
- }
-@@ -1444,7 +1577,7 @@
- return false;
- }
-
-- usleep(250 * 1000);
-+ usleep(100 * 1000);
- }
-
- VERBOSE(VB_IMPORTANT, LOC_ERR + "StartEncoding - giving up" + ENO);
-@@ -1461,9 +1594,8 @@
-
- VERBOSE(VB_RECORD, LOC + "StopEncoding");
-
-- for (int idx = 0; idx < 10; ++idx)
-+ for (int idx = 0; idx < 20; ++idx)
- {
--
- if (ioctl(fd, VIDIOC_ENCODER_CMD, &command) == 0)
- {
- VERBOSE(VB_RECORD, LOC + "Encoding stopped");
-@@ -1476,7 +1608,7 @@
- return false;
- }
-
-- usleep(250 * 1000);
-+ usleep(100 * 1000);
- }
-
- VERBOSE(VB_IMPORTANT, LOC_ERR + "StopEncoding - giving up" + ENO);
-@@ -1544,7 +1676,7 @@
- void MpegRecorder::HandleSingleProgramPMT(ProgramMapTable *pmt)
- {
- if (!pmt)
--{
-+ {
- return;
- }
-
-@@ -1564,27 +1696,89 @@
- DTVRecorder::BufferedWrite(*(reinterpret_cast<TSPacket*>(&buf[i])));
- }
-
-+bool MpegRecorder::WaitFor_HDPVR(void)
-+{
-+ // After a resolution change, it can take the HD-PVR a few
-+ // seconds before it is usable again.
-+
-+ // Tell it to start encoding, then wait for it to actually feed us
-+ // some data.
-+ QMutexLocker locker(&start_stop_encoding_lock);
-+
-+ struct v4l2_encoder_cmd command;
-+ struct pollfd polls;
-+ int idx;
-+
-+ 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;
-+
-+ for (idx = 0; idx < 10; ++idx)
-+ {
-+ if (poll(&polls, 1, 250) > 0)
-+ break;
-+ }
-+
-+ if (idx == 10)
-+ return false;
-+
-+ // HD-PVR should now be "ready"
-+ command.cmd = V4L2_ENC_CMD_STOP;
-+
-+ for (idx = 0; idx < 20; ++idx)
-+ {
-+ if (ioctl(readfd, VIDIOC_ENCODER_CMD, &command) == 0)
-+ return true;
-+ usleep(100 * 1000);
-+ }
-+
-+ return false;
-+}
-+
- void MpegRecorder::HandleResolutionChanges(void)
- {
-- if (!needs_resolution)
-- return;
--
- VERBOSE(VB_RECORD, LOC + "Checking Resolution");
- struct v4l2_format vfmt;
- memset(&vfmt, 0, sizeof(vfmt));
- vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
-+ if (driver == "hdpvr")
-+ WaitFor_HDPVR();
-+
-+ uint idx;
- uint pix = 0;
-+
-+ for (idx = 0; idx < 20; ++idx)
-+ {
- if (0 == ioctl(chanfd, VIDIOC_G_FMT, &vfmt))
- {
- VERBOSE(VB_RECORD, LOC + QString("Got Resolution %1x%2")
- .arg(vfmt.fmt.pix.width).arg(vfmt.fmt.pix.height));
- pix = vfmt.fmt.pix.width * vfmt.fmt.pix.height;
-- needs_resolution = false;
-+ break;
-+ }
-+ // Typically takes 0.9 seconds after a resolution change
-+ usleep(100 * 1000);
- }
-
- if (!pix)
-+ {
-+ VERBOSE(VB_RECORD, LOC + "Giving up detecting resolution");
- return; // nothing to do, we don't have a resolution yet
-+ }
-
- int old_max = maxbitrate, old_avg = bitrate;
- if (pix <= 768*568)
-@@ -1609,13 +1803,14 @@
- if (old_max == old_avg)
- {
- VERBOSE(VB_RECORD, LOC +
-- QString("Old bitrate %1 CBR").arg(old_avg));
-+ QString("Old bitrate %1 CBR for %2x%3")
-+ .arg(old_avg).arg(width).arg(height));
- }
- else
- {
- VERBOSE(VB_RECORD, LOC +
-- QString("Old bitrate %1/%2 VBR")
-- .arg(old_avg).arg(old_max));
-+ QString("Old bitrate %1/%2 VBR for %3x%4")
-+ .arg(old_avg).arg(old_max).arg(width).arg(height));
- }
-
- if (maxbitrate == bitrate)
-@@ -1642,12 +1837,6 @@
- maxbitrate * 1000);
-
- set_ctrls(readfd, ext_ctrls);
-+
- }
--
-- // Restart streaming. Shouldn't be needed? seems to be with current driver.
-- QMutexLocker locker(&start_stop_encoding_lock);
-- StopEncoding(readfd);
-- StartEncoding(readfd);
--
-- needs_resolution = false;
- }