vor kurzem hatte zwen ja das Handling für die "APID selection" bei der Aufnahme verbessert.
Nun kann es trotz dieser neuen Auswahlmöglichkeit immer noch dazu kommen, daß ein "ungewünschter" audio-stream aufgenommen wird:
Und zwar enthält ja der aufzunehmende TS-stream im 'SPTS'-mode bekannterweise immer den Audiostream des aktuellen Playbacks.
Wird nun mit den neuen Optionen von zwen festgelegt, daß z.B. nur AC3 aufgezeichnet werden soll, aber für den Playback die MP2-Tonspur gewählt ist, so enthält mein resultierendes Aufnahmefile neben dem AC3- leider zwangsweise auch den MP2-Ton
Ich habe mir nun den 'streamts'-service so angepasst, daß er die "zwangseingeschleusten" audio-Pakete bei Bedarf rausfiltern kann bevor er an den PC sendet und wäre damit in der Lage das Problem zu lösen, wenn ich im 'streamts'-service überprüfen könnte, welche audio pid gerade beim laufenden Playback benutzt wird. Allein durch den Wert der audio-pid, die via request 'GET /<vpid>,<apid>' übergeben wird, kann ich dies aber nicht feststellen.
Das könnte ich zwar dadurch lösen, daß ich in 'streamts' noch den 'zapitclient' einbaue und die enstprechende Funktionalität (getAllPids) davon nutzen würde.
Nun leuchtet es mir aber nicht ein, warum ich in 'streamts' nun zum x-ten Male die Pids überprüfen soll, wenn dies im Zuge des Aufnahmestarts innerhalb von neutrino schon mehrfach gemacht wurde. Dabei wird halt einzig versäumt, das "record-xml" so aufzubauen, daß die apid des aktuellen Playbacks genau spezifiziert ist !
Deshalb habe ich zwens coding nochmal überarbeitet, so daß die Liste der Audiopids im xml-Tag
Code: Alles auswählen
<audiopids selected="apid1 apid2 ...">
...
</audiopids>
Auf diese Weise kann (könnte) nun der recording-server auf dem PC (ohne großen Aufwand) eindeutig feststellen, welches die Playback audio pid ist und dies auch dem 'streamts'-service der dbox mitteilen (ich mache das, indem ich die enstprechende "apid" durch ein "& 0xF000" maskiere bevor ich 'GET /<vpid>,<apid>' an mein modifiziertes 'streamts' absende (und dort wieder "demaskiere").
Hier nun der Link zum "diff" für vcrcontrol.cpp
http://lvempeg.sf.net/test/vcrcontrol.cpp.diff
Die Änderungen spielen sich alle in der Funktion 'getAPIDs()' ab.
und zur besseren Übersichtlichkeit hier nochmal der Code, wie er nach dem diff aussehen würde:
Code: Alles auswählen
...
void CVCRControl::CDevice::getAPIDs(const unsigned char ap, APIDList & apid_list)
{
unsigned char apids=ap;
if (apids == TIMERD_APIDS_CONF)
apids = g_settings.recording_audio_pids_default;
apid_list.clear();
CZapitClient::responseGetPIDs allpids;
g_Zapit->getPIDS(allpids);
// sorry, no audio pids available -> leave now :-(
if (allpids.APIDs.empty()) return;
// search for smallest none AC3-apid (one time is enough :-)
int apid_min_idx = -1;
uint apid_min = UINT_MAX;
for (uint i=0; i<allpids.APIDs.size(); i++)
{
if (allpids.APIDs[i].pid < apid_min && !allpids.APIDs[i].is_ac3)
{
apid_min = allpids.APIDs[i].pid;
apid_min_idx = i;
}
}
// if spts, 1st. entry should be apid from current playback !
int apid_curr_idx = -1;
uint apid_curr = 0;
if (g_settings.misc_spts || g_settings.recording_in_spts_mode)
{
apid_curr_idx = allpids.PIDs.selected_apid;
uint apid_curr = allpids.APIDs[apid_curr_idx].pid;
if (apid_min_idx != apid_curr_idx)
{
APIDDesc a = {apid_curr, apid_curr_idx, allpids.APIDs[apid_curr_idx].is_ac3};
apid_list.push_back(a);
}
}
// assumed smallest apid as standard
if (apids & TIMERD_APIDS_STD)
{
if (apid_min != UINT_MAX)
{
APIDDesc a = {apid_min, apid_min_idx, false};
apid_list.push_back(a);
}
}
// select all none-standard/current and none-AC3 apids
if (apids & TIMERD_APIDS_ALT)
{
for(int i = 0; i < (int)allpids.APIDs.size(); i++)
{
if ( (i == apid_curr_idx) || (i == apid_min_idx) ) continue;
if (!allpids.APIDs[i].is_ac3)
{
APIDDesc a = {allpids.APIDs[i].pid, i, false};
apid_list.push_back(a);
}
}
}
//-- select all AC3 apids
if (apids & TIMERD_APIDS_AC3)
{
for(int i = 0; i < (int)allpids.APIDs.size(); i++)
{
if (i == apid_curr_idx) continue;
if (allpids.APIDs[i].is_ac3)
{
APIDDesc a = {allpids.APIDs[i].pid, i, true};
apid_list.push_back(a);
}
}
}
// no apid selected yet, use standard aka 'apid_min' :-)
if (apid_list.empty())
{
if (apid_min != UINT_MAX)
{
APIDDesc a = {apid_min, apid_min_idx, false};
apid_list.push_back(a);
}
}
// show result
for(APIDList::iterator it = apid_list.begin(); it != apid_list.end(); it++)
printf("Record APID 0x%X %d\n",it->apid, it->ac3);
}
...
was haltet ihr davon, wenn's jemand ins CVS stellt ?
- GMo -