Skip to content

Commit

Permalink
Add the REC_STARTED_WRITING system event.
Browse files Browse the repository at this point in the history
This system event is sent when the recorder starts writing the first
keyframe.  This allows a client to get better precision than the
REC_STARTED event, which is sent before other actions such as channel
changing, tuning, and waiting to see the first keyframe.  Thanks to
John Poet for direction on where in the recorder code to send the
event.

The initial intention is to facilitate simplifying the external
scripts that allow capturing subtitles from an HD-PVR, currently
documented at http://www.mythtv.org/wiki/Captions_with_HD-PVR .
  • Loading branch information
stichnot committed Jun 15, 2013
1 parent 0cbca16 commit 8491c5e
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 35 deletions.
107 changes: 73 additions & 34 deletions mythtv/libs/libmythtv/mythsystemevent.cpp
Expand Up @@ -375,40 +375,79 @@ MythSystemEventEditor::MythSystemEventEditor(MythScreenStack *parent,
{
m_title = tr("System Event Command Editor");

m_settings["EventCmdRecPending"] = tr("Recording pending");
m_settings["EventCmdRecStarted"] = tr("Recording started");
m_settings["EventCmdRecFinished"] = tr("Recording finished");
m_settings["EventCmdRecDeleted"] = tr("Recording deleted");
m_settings["EventCmdRecExpired"] = tr("Recording expired");
m_settings["EventCmdLivetvStarted"] = tr("LiveTV started");
m_settings["EventCmdPlayStarted"] = tr("Playback started");
m_settings["EventCmdPlayStopped"] = tr("Playback stopped");
m_settings["EventCmdPlayPaused"] = tr("Playback paused");
m_settings["EventCmdPlayUnpaused"] = tr("Playback unpaused");
m_settings["EventCmdPlayChanged"] = tr("Playback program changed");
m_settings["EventCmdMasterStarted"] = tr("Master backend started");
m_settings["EventCmdMasterShutdown"] = tr("Master backend shutdown");
m_settings["EventCmdClientConnected"] = tr("Client connected to master backend");
m_settings["EventCmdClientDisconnected"] = tr("Client disconnected from master backend");
m_settings["EventCmdSlaveConnected"] = tr("Slave backend connected to master");
m_settings["EventCmdSlaveDisconnected"] = tr("Slave backend disconnected from master");
m_settings["EventCmdNetCtrlConnected"] = tr("Network Control client connected");
m_settings["EventCmdNetCtrlDisconnected"] = tr("Network Control client disconnected");
m_settings["EventCmdMythfilldatabaseRan"] = tr("mythfilldatabase ran");
m_settings["EventCmdSchedulerRan"] = tr("Scheduler ran");
m_settings["EventCmdSettingsCacheCleared"] = tr("Settings cache cleared");
m_settings["EventCmdScreenType"] = tr("Screen created or destroyed");
m_settings["EventCmdKey01"] = tr("Keystroke event #1");
m_settings["EventCmdKey02"] = tr("Keystroke event #2");
m_settings["EventCmdKey03"] = tr("Keystroke event #3");
m_settings["EventCmdKey04"] = tr("Keystroke event #4");
m_settings["EventCmdKey05"] = tr("Keystroke event #5");
m_settings["EventCmdKey06"] = tr("Keystroke event #6");
m_settings["EventCmdKey07"] = tr("Keystroke event #7");
m_settings["EventCmdKey08"] = tr("Keystroke event #8");
m_settings["EventCmdKey09"] = tr("Keystroke event #9");
m_settings["EventCmdKey10"] = tr("Keystroke event #10");
m_settings["EventCmdAll"] = tr("Any event");
// Event names are programmatically converted to settings names in
// EventNameToSetting(). For convenience of searching the code
// base, the event names are listed in comments.
m_settings["EventCmdRecPending"] = // REC_PENDING
tr("Recording pending");
m_settings["EventCmdRecStarted"] = // REC_STARTED
tr("Recording started");
m_settings["EventCmdRecStartedWriting"] = // REC_STARTED_WRITING
tr("Recording started writing");
m_settings["EventCmdRecFinished"] = // REC_FINISHED
tr("Recording finished");
m_settings["EventCmdRecDeleted"] = // REC_DELETED
tr("Recording deleted");
m_settings["EventCmdRecExpired"] = // REC_EXPIRED
tr("Recording expired");
m_settings["EventCmdLivetvStarted"] = // LIVETV_STARTED
tr("LiveTV started");
m_settings["EventCmdPlayStarted"] = // PLAY_STARTED
tr("Playback started");
m_settings["EventCmdPlayStopped"] = // PLAY_STOPPED
tr("Playback stopped");
m_settings["EventCmdPlayPaused"] = // PLAY_PAUSED
tr("Playback paused");
m_settings["EventCmdPlayUnpaused"] = // PLAY_UNPAUSED
tr("Playback unpaused");
m_settings["EventCmdPlayChanged"] = // PLAY_CHANGED
tr("Playback program changed");
m_settings["EventCmdMasterStarted"] = // MASTER_STARTED
tr("Master backend started");
m_settings["EventCmdMasterShutdown"] = // MASTER_SHUTDOWN
tr("Master backend shutdown");
m_settings["EventCmdClientConnected"] = // CLIENT_CONNECTED
tr("Client connected to master backend");
m_settings["EventCmdClientDisconnected"] = // CLIENT_DISCONNECTED
tr("Client disconnected from master backend");
m_settings["EventCmdSlaveConnected"] = // SLAVE_CONNECTED
tr("Slave backend connected to master");
m_settings["EventCmdSlaveDisconnected"] = // SLAVE_DISCONNECTED
tr("Slave backend disconnected from master");
m_settings["EventCmdNetCtrlConnected"] = // NET_CTRL_CONNECTED
tr("Network Control client connected");
m_settings["EventCmdNetCtrlDisconnected"] = // NET_CTRL_DISCONNECTED
tr("Network Control client disconnected");
m_settings["EventCmdMythfilldatabaseRan"] = // MYTHFILLDATABASE_RAN
tr("mythfilldatabase ran");
m_settings["EventCmdSchedulerRan"] = // SCHEDULER_RAN
tr("Scheduler ran");
m_settings["EventCmdSettingsCacheCleared"] = // SETTINGS_CACHE_CLEARED
tr("Settings cache cleared");
m_settings["EventCmdScreenType"] = // SCREEN_TYPE
tr("Screen created or destroyed");
m_settings["EventCmdKey01"] = // KEY_%1
tr("Keystroke event #1");
m_settings["EventCmdKey02"] = // KEY_%1
tr("Keystroke event #2");
m_settings["EventCmdKey03"] = // KEY_%1
tr("Keystroke event #3");
m_settings["EventCmdKey04"] = // KEY_%1
tr("Keystroke event #4");
m_settings["EventCmdKey05"] = // KEY_%1
tr("Keystroke event #5");
m_settings["EventCmdKey06"] = // KEY_%1
tr("Keystroke event #6");
m_settings["EventCmdKey07"] = // KEY_%1
tr("Keystroke event #7");
m_settings["EventCmdKey08"] = // KEY_%1
tr("Keystroke event #8");
m_settings["EventCmdKey09"] = // KEY_%1
tr("Keystroke event #9");
m_settings["EventCmdKey10"] = // KEY_%1
tr("Keystroke event #10");
m_settings["EventCmdAll"] = // EventCmdAll
tr("Any event");
}

/* vim: set expandtab tabstop=4 shiftwidth=4: */
8 changes: 7 additions & 1 deletion mythtv/libs/libmythtv/recorders/dtvrecorder.cpp
Expand Up @@ -27,6 +27,7 @@
#include "mpegtables.h"
#include "ringbuffer.h"
#include "tv_rec.h"
#include "mythsystemevent.h"

extern "C" {
#include "libavcodec/mpegvideo.h"
Expand Down Expand Up @@ -771,7 +772,11 @@ void DTVRecorder::HandleKeyframe(int64_t extra)
CheckForRingBufferSwitch();

uint64_t frameNum = _frames_written_count;
_first_keyframe = (_first_keyframe < 0) ? frameNum : _first_keyframe;
if (_first_keyframe < 0)
{
_first_keyframe = frameNum;
SendMythSystemRecEvent("REC_STARTED_WRITING", curRecording);
}

// Add key frame to position map
positionMapLock.lock();
Expand Down Expand Up @@ -995,6 +1000,7 @@ void DTVRecorder::HandleH264Keyframe(void)
{
_first_keyframe = frameNum;
startpos = 0;
SendMythSystemRecEvent("REC_STARTED_WRITING", curRecording);
}
else
startpos = m_h264_parser.keyframeAUstreamOffset();
Expand Down
6 changes: 6 additions & 0 deletions mythtv/programs/mythbackend/config_backend_general.xml
Expand Up @@ -790,6 +790,12 @@
placeholder_text="Enter a command to run when this occurs"
help_text="EventCmdRecStarted"
data_type="string" />
<setting
value="EventCmdRecStartedWriting" label="Recording started writing"
setting_type="host" default_data=""
placeholder_text="Enter a command to run when this occurs"
help_text="EventCmdRecStartedWriting"
data_type="string" />
<setting
value="EventCmdRecFinished" label="Recording finished"
setting_type="host" default_data=""
Expand Down

0 comments on commit 8491c5e

Please sign in to comment.