-add record option for teletext & dvbsub pids

This commit is contained in:
Jacek Jendrzej
2013-03-19 17:14:04 +01:00
parent 9755751217
commit d9c7739aa6
13 changed files with 181 additions and 23 deletions

View File

@@ -944,6 +944,9 @@ menu.hint_record_apid_std Schließt bei einer Aufnahme die durch den Sender defi
menu.hint_record_apids Konfigurieren Sie die Tonspuren für die Aufnahme
menu.hint_record_apply Hiermit werden die Aufnahmeoptionen übernommen
menu.hint_record_chandir Diese Option speichert Aufnahmen mit dem Namen des Kanals in ein eigenes Verzeichnis
menu.hint_record_data Dataspuren ( Teletext, Untertitel) für die Aufnahme
menu.hint_record_data_dvbsub Untertitel Spur zu Aufnehme Hinzufügen
menu.hint_record_data_vtxt Teletext Spur zu Aufnehme Hinzufügen
menu.hint_record_dir Wählen Sie das Aufnahmeverzeichnis
menu.hint_record_end Wählen Sie zwischen max. Aufnahmezeit oder einem Aufnahmeende anhand der EPG-Daten
menu.hint_record_slow_warn Zeige Warnung, wenn der Aufnahmepuffer zu überlaufen droht
@@ -1515,7 +1518,9 @@ recordingmenu.apids Tonspuren
recordingmenu.apids_ac3 AC3 Tonspuren aufnehmen
recordingmenu.apids_alt Alternative Tonspuren aufn.
recordingmenu.apids_std Standard Tonspur aufnehmen
recordingmenu.datapdis Dataspuren
recordingmenu.defdir Aufnahmeverzeichnis
recordingmenu.dvbsub_pids Untertitel aufnahmen
recordingmenu.end_of_recording_epg EPG aktuelles Event
recordingmenu.end_of_recording_max max. Aufnahmezeit
recordingmenu.end_of_recording_name Ende der Sofortaufnahme
@@ -1537,6 +1542,7 @@ recordingmenu.slow_warn Warnung bei langsamen Aufnahmemedien
recordingmenu.timeshift Timeshift
recordingmenu.tsdir Timeshift Aufnahmeverzeichnis
recordingmenu.vcr Videorekorder
recordingmenu.vtxt_pid Teletext aufnehmen
recordingmenu.zap_on_announce Umschalten bei Ankündigung
recordtimer.announce Die Aufnahme beginnt in wenigen Minuten.
repeatblocker.hint_1 Mindestzeit (in ms) zwischen 2 Tastendrücken

View File

@@ -944,6 +944,9 @@ menu.hint_record_apid_std Record first audio pid
menu.hint_record_apids Configure audio pids to record
menu.hint_record_apply Apply record options
menu.hint_record_chandir Create directory with name of channel\nto store recording
menu.hint_record_data Record (VideoText, subtitles) data streams
menu.hint_record_data_dvbsub subtitle stream
menu.hint_record_data_vtxt VideoText stream
menu.hint_record_dir Select directory to store recordings
menu.hint_record_end Stop direct record after max. time\nor after current event end time
menu.hint_record_slow_warn Show warning, when record buffer is close to overflow
@@ -1515,7 +1518,9 @@ recordingmenu.apids Audio streams
recordingmenu.apids_ac3 record AC3 streams
recordingmenu.apids_alt record alternative streams
recordingmenu.apids_std record standard stream
recordingmenu.datapdis Data streams
recordingmenu.defdir Recording directory
recordingmenu.dvbsub_pids record dvbsub stream
recordingmenu.end_of_recording_epg EPG act. Event
recordingmenu.end_of_recording_max max. Recordingtime
recordingmenu.end_of_recording_name Endtime of Recording
@@ -1537,6 +1542,7 @@ recordingmenu.slow_warn Enable slow record warning
recordingmenu.timeshift Timeshift
recordingmenu.tsdir Timeshift directory
recordingmenu.vcr vcr
recordingmenu.vtxt_pid record teletext
recordingmenu.zap_on_announce zap on recording announce
recordtimer.announce Recording starts in a few minutes
repeatblocker.hint_1 Shortest time (in ms) to recognize 2 keystrokes

View File

@@ -1,6 +1,7 @@
/*
Copyright (c) 2004 gmo18t, Germany. All rights reserved.
Copyright (C) 2012 CoolStream International Ltd
Copyright (C) 2013 Jacek Jendrzej
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
@@ -124,8 +125,15 @@ CGenPsi::CGenPsi()
nba = 0;
vpid = 0;
vtype = 0;
vtxtpid = 0;
vtxtlang[0] = 'g';
vtxtlang[1] = 'e';
vtxtlang[2] = 'r';
memset(apid, 0, sizeof(apid));
memset(atypes, 0, sizeof(atypes));
nsub = 0;
memset(dvbsubpid, 0, sizeof(dvbsubpid));
}
uint32_t CGenPsi::calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len)
@@ -147,7 +155,7 @@ uint32_t CGenPsi::calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len)
return crc;
}
void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3)
void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3, const char *data)
{
switch(pidtype)
{
@@ -165,8 +173,22 @@ void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3)
nba++;
break;
case EN_TYPE_TELTEX:
vtxtpid = pid;
if(data != NULL){
vtxtlang[0] = data[0];
vtxtlang[1] = data[1];
vtxtlang[2] = data[2];
}
break;
case EN_TYPE_DVBSUB:
dvbsubpid[nsub] = pid;
if(data != NULL){
dvbsublang[nsub][0] = data[0];
dvbsublang[nsub][1] = data[1];
dvbsublang[nsub][2] = data[2];
}
nsub++;
break;
default:
break;
}
@@ -232,6 +254,8 @@ int CGenPsi::genpsi(int fd)
//-- (II) build PAT --
data_len = COPY_TEMPLATE(pkt, pkt_pat);
// pkt[0xf]= 0xE0 | (pmtpid>>8);
// pkt[0x10] = pmtpid & 0xFF;
//-- calculate CRC --
calc_crc32psi(&pkt[data_len], &pkt[OFS_HDR_2], data_len-OFS_HDR_2 );
//-- write TS packet --
@@ -241,6 +265,12 @@ int CGenPsi::genpsi(int fd)
data_len = COPY_TEMPLATE(pkt, pkt_pmt);
//-- adjust len dependent to count of audio streams --
data_len += (SIZE_STREAM_TAB_ROW * (nba-1));
if(vtxtpid){
data_len += (SIZE_STREAM_TAB_ROW * (1))+10;//add teletext row length
}
if(nsub){
data_len += ((SIZE_STREAM_TAB_ROW+10) * nsub);//add dvbsub row length
}
patch_len = data_len - OFS_HDR_2 + 1;
pkt[OFS_HDR_2+1] |= (patch_len>>8);
pkt[OFS_HDR_2+2] = (patch_len & 0xFF);
@@ -266,13 +296,61 @@ int CGenPsi::genpsi(int fd)
pkt[ofs+3] = 0xF0;
pkt[ofs+4] = 0x00;
}
//teletext
if(vtxtpid){
ofs += SIZE_STREAM_TAB_ROW;
pkt[ofs] = 0x06; //teletext stream type;
pkt[ofs+1] = 0xE0 | vtxtpid>>8;
pkt[ofs+2] = vtxtpid&0xff;
pkt[ofs+3] = 0xf0;
pkt[ofs+4] = 0x0A; // ES_info_length
pkt[ofs+5] = 0x52; //DVB-DescriptorTag: 82 (0x52) [= stream_identifier_descriptor]
pkt[ofs+6] = 0x01; // descriptor_length
pkt[ofs+7] = 0x03; //component_tag
pkt[ofs+8] = 0x56; // DVB teletext tag
pkt[ofs+9] = 0x05; // descriptor length
pkt[ofs+10] = vtxtlang[0]; //language code[0]
pkt[ofs+11] = vtxtlang[1]; //language code[1]
pkt[ofs+12] = vtxtlang[2]; //language code[2]
pkt[ofs+13] = (/*descriptor_magazine_number*/ 0x01 & 0x06) | ((/*descriptor_type*/ 0x01 << 3) & 0xF8);
pkt[ofs+14] = 0x00 ; //Teletext_page_number
}
//dvbsub
for (i=0; i<nsub; i++)
{
ofs += SIZE_STREAM_TAB_ROW;
if(i > 0 || vtxtpid)
ofs += 10;
pkt[ofs] = 0x06;//subtitle stream type;
pkt[ofs+1] = 0xE0 | dvbsubpid[i]>>8;
pkt[ofs+2] = dvbsubpid[i] & 0xFF;
pkt[ofs+3] = 0xF0;
pkt[ofs+4] = 0x0A; // es info length
pkt[ofs+5] = 0x59; // DVB sub tag
pkt[ofs+6] = 0x08; // descriptor length
pkt[ofs+7] = dvbsublang[i][0]; //language code[0]
pkt[ofs+8] = dvbsublang[i][1]; //language code[1]
pkt[ofs+9] = dvbsublang[i][2]; //language code[2]
pkt[ofs+10] = 0x20; //subtitle_stream.subtitling_type
pkt[ofs+11] = 0x01>>8; //composition_page_id
pkt[ofs+12] = 0x01&0xff; //composition_page_id
pkt[ofs+13] = 0x01>>8; //ancillary_page_id
pkt[ofs+14] = 0x01&0xff; //ancillary_page_id
}
//-- calculate CRC --
calc_crc32psi(&pkt[data_len], &pkt[OFS_HDR_2], data_len-OFS_HDR_2 );
//-- write TS packet --
write(fd, pkt, SIZE_TS_PKT);
//-- finish --
vpid=0;
nba=0;
nsub = 0;
vtxtpid = 0;
fdatasync(fd);
return 1;
}

View File

@@ -28,21 +28,26 @@
#define EN_TYPE_TELTEX 0x02
#define EN_TYPE_PCR 0x03
#define EN_TYPE_AVC 0x04
#define EN_TYPE_DVBSUB 0x06
class CGenPsi
{
private:
short nba;
short nba, nsub;
uint16_t vpid;
uint8_t vtype;
uint16_t vtxtpid;
char vtxtlang[3];
uint16_t apid[10];
short atypes[10];
uint16_t dvbsubpid[10];
char dvbsublang[10][3];
static int copy_template(uint8_t *dst, uint8_t *src, int len);
uint32_t calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len);
public:
CGenPsi();
void addPid(uint16_t pid,uint16_t pidtype, short isAC3);
void addPid(uint16_t pid,uint16_t pidtype, short isAC3, const char *data = NULL);
int genpsi(int fd);
};
#endif

View File

@@ -72,7 +72,7 @@ extern "C" {
}
//-------------------------------------------------------------------------
CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift, bool stream_vtxt_pid, bool stream_pmt_pid)
CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift, bool stream_vtxt_pid, bool stream_pmt_pid, bool stream_subtitle_pids )
{
channel_id = eventinfo->channel_id;
epgid = eventinfo->epgID;
@@ -86,6 +86,8 @@ CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo,
StreamVTxtPid = stream_vtxt_pid;
StreamPmtPid = stream_pmt_pid;
StreamSubtitlePids = stream_subtitle_pids;
Directory = dir;
autoshift = timeshift;
numpids = 0;
@@ -166,10 +168,26 @@ record_error_msg_t CRecordInstance::Start(CZapitChannel * channel)
apids[numpids++] = recMovieInfo->audioPids[i].epgAudioPid;
psi.addPid(recMovieInfo->audioPids[i].epgAudioPid, EN_TYPE_AUDIO, recMovieInfo->audioPids[i].atype);
}
if ((StreamVTxtPid) && (allpids.PIDs.vtxtpid != 0)){
apids[numpids++] = allpids.PIDs.vtxtpid;
psi.addPid(allpids.PIDs.vtxtpid, EN_TYPE_TELTEX, 0, channel->getTeletextLang());
}
if (StreamSubtitlePids){
for (int i = 0 ; i < (int)channel->getSubtitleCount() ; ++i) {
CZapitAbsSub* s = channel->getChannelSub(i);
if (s->thisSubType == CZapitAbsSub::DVB) {
if(i>9)//max sub pids
break;
CZapitDVBSub* sd = reinterpret_cast<CZapitDVBSub*>(s);
apids[numpids++] = sd->pId;
psi.addPid( sd->pId, EN_TYPE_DVBSUB, 0, sd->ISO639_language_code.c_str() );
}
}
}
psi.genpsi(fd);
if ((StreamVTxtPid) && (allpids.PIDs.vtxtpid != 0))
apids[numpids++] = allpids.PIDs.vtxtpid;
if ((StreamPmtPid) && (allpids.PIDs.pmtpid != 0))
apids[numpids++] = allpids.PIDs.pmtpid;
@@ -666,6 +684,7 @@ CRecordManager::CRecordManager()
{
StreamVTxtPid = false;
StreamPmtPid = false;
StreamSubtitlePids = false;
StopSectionsd = false;
//recordingstatus = 0;
recmap.clear();
@@ -879,7 +898,7 @@ bool CRecordManager::Record(const CTimerd::RecordingInfo * const eventinfo, cons
else
newdir = Directory;
inst = new CRecordInstance(eventinfo, newdir, timeshift, StreamVTxtPid, StreamPmtPid);
inst = new CRecordInstance(eventinfo, newdir, timeshift, StreamVTxtPid, StreamPmtPid, StreamSubtitlePids);
inst->frontend = frontend;
error_msg = inst->Record();

View File

@@ -83,6 +83,7 @@ class CRecordInstance
time_t epg_time;
time_t start_time;
bool StreamVTxtPid;
bool StreamSubtitlePids;
bool StreamPmtPid;
unsigned short apids[REC_MAX_APIDS];
unsigned int numpids;
@@ -107,7 +108,7 @@ class CRecordInstance
record_error_msg_t Start(CZapitChannel * channel);
void WaitRecMsg(time_t StartTime, time_t WaitTime);
public:
CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift = false, bool stream_vtxt_pid = false, bool stream_pmt_pid = false);
CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift = false, bool stream_vtxt_pid = false, bool stream_pmt_pid = false, bool stream_subtitle_pids = false);
~CRecordInstance();
record_error_msg_t Record();
@@ -146,6 +147,7 @@ class CRecordManager : public CMenuTarget /*, public CChangeObserver*/
std::string Directory;
std::string TimeshiftDirectory;
bool StreamVTxtPid;
bool StreamSubtitlePids;
bool StreamPmtPid;
bool StopSectionsd;
int last_mode;
@@ -201,11 +203,12 @@ class CRecordManager : public CMenuTarget /*, public CChangeObserver*/
bool RunStartScript(void);
bool RunStopScript(void);
void Config(const bool stopsectionsd, const bool stream_vtxt_pid, const bool stream_pmt_pid)
void Config(const bool stopsectionsd, const bool stream_vtxt_pid, const bool stream_pmt_pid, bool stream_subtitle_pids )
{
StopSectionsd = stopsectionsd;
StreamVTxtPid = stream_vtxt_pid;
StreamPmtPid = stream_pmt_pid;
StopSectionsd = stopsectionsd;
StreamVTxtPid = stream_vtxt_pid;
StreamSubtitlePids = stream_subtitle_pids;
StreamPmtPid = stream_pmt_pid;
};
void SetDirectory(const char * const directory) { Directory = directory; };
void SetTimeshiftDirectory(const char * const directory) { TimeshiftDirectory = directory; };

View File

@@ -229,6 +229,13 @@ int CRecordSetup::showRecordSetup()
mf->setHint("", LOCALE_MENU_HINT_RECORD_APIDS);
recordingSettings->addItem(mf);
//datasettings
CMenuWidget recordingaDataSettings(LOCALE_MAINSETTINGS_RECORDING, NEUTRINO_ICON_SETTINGS, width, MN_WIDGET_ID_RECORDSETUP_DATASETTINGS);
showRecordDataSetup(&recordingaDataSettings);
mf = new CMenuForwarder(LOCALE_RECORDINGMENU_DATAPIDS, true, NULL, &recordingaDataSettings, NULL, CRCInput::RC_1);
mf->setHint("", LOCALE_MENU_HINT_RECORD_DATA);
recordingSettings->addItem(mf);
int res = recordingSettings->exec(NULL, "");
delete recordingSettings;
return res;
@@ -291,6 +298,22 @@ void CRecordSetup::showRecordAudioSetup(CMenuWidget *menu_audiosettings)
menu_audiosettings->addItem(aoj3);
}
void CRecordSetup::showRecordDataSetup(CMenuWidget *menu_datasettings)
{
//recording data pids
//teletext pids
CMenuOptionChooser* doj1 = new CMenuOptionChooser(LOCALE_RECORDINGMENU_VTXT_PID, &g_settings.recording_stream_vtxt_pid, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this);
CMenuOptionChooser* doj2 = new CMenuOptionChooser(LOCALE_RECORDINGMENU_DVBSUB_PIDS, &g_settings.recording_stream_subtitle_pids, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this);
doj1->setHint("", LOCALE_MENU_HINT_RECORD_DATA_VTXT);
doj2->setHint("", LOCALE_MENU_HINT_RECORD_DATA_DVBSUB);
menu_datasettings->addIntroItems(LOCALE_RECORDINGMENU_DATAPIDS);
menu_datasettings->addItem(doj1);
menu_datasettings->addItem(doj2);
}
void CRecordSetup::showRecordTimeShiftSetup(CMenuWidget *menu_ts)
{
menu_ts->addIntroItems(LOCALE_RECORDINGMENU_TIMESHIFT);

View File

@@ -44,6 +44,8 @@ class CRecordSetup : public CMenuTarget, public CChangeObserver
int showRecordSetup();
void showRecordTimerSetup(CMenuWidget *menu_timersettings);
void showRecordAudioSetup(CMenuWidget *menu_audiosettings);
void showRecordDataSetup(CMenuWidget *menu_datasettings);
void showRecordTimeShiftSetup(CMenuWidget *menu_ts);
public:

View File

@@ -579,6 +579,7 @@ int CNeutrinoApp::loadSetup(const char * fname)
g_settings.shutdown_timer_record_type = configfile.getBool("shutdown_timer_record_type" , false);
g_settings.recording_stream_vtxt_pid = configfile.getBool("recordingmenu.stream_vtxt_pid" , false);
g_settings.recording_stream_subtitle_pids = configfile.getBool("recordingmenu.stream_subtitle_pids", false);
g_settings.recording_stream_pmt_pid = configfile.getBool("recordingmenu.stream_pmt_pid" , false);
g_settings.recording_choose_direct_rec_dir = configfile.getInt32( "recording_choose_direct_rec_dir", 0 );
g_settings.recording_epg_for_filename = configfile.getBool("recording_epg_for_filename" , true);
@@ -994,17 +995,18 @@ void CNeutrinoApp::saveSetup(const char * fname)
configfile.setInt32 ("recording_type", g_settings.recording_type);
configfile.setBool ("recording_stopsectionsd" , g_settings.recording_stopsectionsd );
configfile.setInt32 ("recording_audio_pids_default" , g_settings.recording_audio_pids_default);
configfile.setInt32 ("recording_audio_pids_default" , g_settings.recording_audio_pids_default );
configfile.setBool ("recording_zap_on_announce" , g_settings.recording_zap_on_announce );
configfile.setBool ("shutdown_timer_record_type" , g_settings.shutdown_timer_record_type );
configfile.setBool ("shutdown_timer_record_type" , g_settings.shutdown_timer_record_type );
configfile.setBool ("recordingmenu.stream_vtxt_pid" , g_settings.recording_stream_vtxt_pid );
configfile.setBool ("recordingmenu.stream_pmt_pid" , g_settings.recording_stream_pmt_pid );
configfile.setBool ("recordingmenu.stream_subtitle_pids" , g_settings.recording_stream_subtitle_pids );
configfile.setBool ("recordingmenu.stream_pmt_pid" , g_settings.recording_stream_pmt_pid );
configfile.setInt32 ("recording_choose_direct_rec_dir" , g_settings.recording_choose_direct_rec_dir);
configfile.setBool ("recording_epg_for_filename" , g_settings.recording_epg_for_filename );
configfile.setBool ("recording_epg_for_end" , g_settings.recording_epg_for_end );
configfile.setBool ("recording_save_in_channeldir" , g_settings.recording_save_in_channeldir );
configfile.setBool ("recording_slow_warning" , g_settings.recording_slow_warning );
configfile.setBool ("recording_save_in_channeldir" , g_settings.recording_save_in_channeldir );
configfile.setBool ("recording_slow_warning" , g_settings.recording_slow_warning );
// default plugin for movieplayer
configfile.setString ( "movieplayer_plugin", g_settings.movieplayer_plugin );
@@ -1630,7 +1632,7 @@ void CNeutrinoApp::InitZapper()
void CNeutrinoApp::setupRecordingDevice(void)
{
CRecordManager::getInstance()->SetDirectory(g_settings.network_nfs_recordingdir);
CRecordManager::getInstance()->Config(g_settings.recording_stopsectionsd, g_settings.recording_stream_vtxt_pid, g_settings.recording_stream_pmt_pid);
CRecordManager::getInstance()->Config(g_settings.recording_stopsectionsd, g_settings.recording_stream_vtxt_pid, g_settings.recording_stream_pmt_pid, g_settings.recording_stream_subtitle_pids);
}
static void CSSendMessage(uint32_t msg, uint32_t data)

View File

@@ -82,6 +82,7 @@ enum MN_WIDGET_ID
MN_WIDGET_ID_RECORDSETUP_TIMESHIFT,
MN_WIDGET_ID_RECORDSETUP_TIMERSETTINGS,
MN_WIDGET_ID_RECORDSETUP_AUDIOSETTINGS,
MN_WIDGET_ID_RECORDSETUP_DATASETTINGS,
//vfd setup
MN_WIDGET_ID_VFDSETUP,

View File

@@ -971,6 +971,9 @@ typedef enum
LOCALE_MENU_HINT_RECORD_APIDS,
LOCALE_MENU_HINT_RECORD_APPLY,
LOCALE_MENU_HINT_RECORD_CHANDIR,
LOCALE_MENU_HINT_RECORD_DATA,
LOCALE_MENU_HINT_RECORD_DATA_DVBSUB,
LOCALE_MENU_HINT_RECORD_DATA_VTXT,
LOCALE_MENU_HINT_RECORD_DIR,
LOCALE_MENU_HINT_RECORD_END,
LOCALE_MENU_HINT_RECORD_SLOW_WARN,
@@ -1542,6 +1545,8 @@ typedef enum
LOCALE_RECORDINGMENU_APIDS_AC3,
LOCALE_RECORDINGMENU_APIDS_ALT,
LOCALE_RECORDINGMENU_APIDS_STD,
LOCALE_RECORDINGMENU_DATAPIDS,
LOCALE_RECORDINGMENU_DVBSUB_PIDS,
LOCALE_RECORDINGMENU_DEFDIR,
LOCALE_RECORDINGMENU_END_OF_RECORDING_EPG,
LOCALE_RECORDINGMENU_END_OF_RECORDING_MAX,
@@ -1564,6 +1569,7 @@ typedef enum
LOCALE_RECORDINGMENU_TIMESHIFT,
LOCALE_RECORDINGMENU_TSDIR,
LOCALE_RECORDINGMENU_VCR,
LOCALE_RECORDINGMENU_VTXT_PID,
LOCALE_RECORDINGMENU_ZAP_ON_ANNOUNCE,
LOCALE_RECORDTIMER_ANNOUNCE,
LOCALE_REPEATBLOCKER_HINT_1,

View File

@@ -971,6 +971,9 @@ const char * locale_real_names[] =
"menu.hint_record_apids",
"menu.hint_record_apply",
"menu.hint_record_chandir",
"menu.hint_record_data",
"menu.hint_record_data_dvbsub",
"menu.hint_record_data_vtxt",
"menu.hint_record_dir",
"menu.hint_record_end",
"menu.hint_record_slow_warn",
@@ -1542,6 +1545,8 @@ const char * locale_real_names[] =
"recordingmenu.apids_ac3",
"recordingmenu.apids_alt",
"recordingmenu.apids_std",
"recordingmenu.datapdis",
"recordingmenu.dvbsub_pids",
"recordingmenu.defdir",
"recordingmenu.end_of_recording_epg",
"recordingmenu.end_of_recording_max",
@@ -1564,6 +1569,7 @@ const char * locale_real_names[] =
"recordingmenu.timeshift",
"recordingmenu.tsdir",
"recordingmenu.vcr",
"recordingmenu.vtxt_pid",
"recordingmenu.zap_on_announce",
"recordtimer.announce",
"repeatblocker.hint_1",

View File

@@ -325,14 +325,15 @@ struct SNeutrinoSettings
int recording_audio_pids_std;
int recording_audio_pids_alt;
int recording_audio_pids_ac3;
int recording_stream_vtxt_pid;
int recording_stream_pmt_pid;
int recording_stream_vtxt_pid;
int recording_stream_subtitle_pids;
int recording_stream_pmt_pid;
int recording_choose_direct_rec_dir;
int recording_epg_for_filename;
int recording_epg_for_end;
int recording_save_in_channeldir;
int recording_zap_on_announce;
int recording_slow_warning;
int recording_zap_on_announce;
int recording_slow_warning;
int shutdown_timer_record_type;
int filesystem_is_utf8;