Fortsetzung der hier begonnen Diskussion sowie des hier beschriebenen logs
was bisher geschah:
wenn man beim mp3-Plugin (DVB-Ausgabe) unter softhddevice während der Wiedergabe mit der Links-Taste ein paar Sekunden zurückgehen will ('skippen'), bewirkt dies stattdessen, dass man ein kleines Stück vorwärts springt. Entgegen erster Vermutungen hat dies wohl nichts mit dem Rückspulproblem bei Video zu tun (was wohl an ffmpeg liegt). Auch inplausible GetSTC-Werte (wie beim Rückspulen in Radioaufzeichnungen) scheiden hier als Fehlerursache aus, weil die Skip-Funktion des mp3-Plugins in dessem eigenen player stattfindet, wo GetSTC gar nicht aufgerufen wird.
Ich habe dann mal das mp3-Plugin etwas aufgebohrt (ALSA -Ausgabe vom music-Plugin reintransplantiert) und es mit der Ausgabeart alsa probiert. Dann gibt es keine Probleme - abgesehen davon, dass man nicht das gleiche alsa-Device benutzen kann, das softhddevice belegt.
Das mp3-Plugin verwendet beim Skippen Funktionen der libmad. Ich dachte erst, dass da irgendwo ein Bug drin ist, aber dann müsste der Fehler bei alsa-Ausgabe ja genauso auftreten. Mein Verdacht ist, dass es irgendwo im Bereich des buffer/ringbuffer clearen im softhddevice-Plugin liegt. Das mp3-Plugin ruft beim Skippen DeviceClear auf. Dies löst beim softhddevice-Plugin Clear() aus. Aber werden dort auch die Audio-Buffer und der audio ringbuffer geleert? Ich werde da nicht ganz schlau draus. In Clear heisst es
AudioFlushBuffers();
//NewAudioStream = 1;
// FIXME: audio avcodec_flush_buffers, video is done by VideoClearBuffers
audio avcodec_flush_buffers ist in der Funktion CodecAudioFlushBuffers() enthalten. Aber diese wird anscheinend nie irgendwo ausgeführt
Das Clearen des audio ring buffers gibt es über einen Umweg z.B. in PlayAudio():
if (NewAudioStream) {
// this clears the audio ringbuffer indirect, open and setup does it
CodecAudioClose(MyAudioDecoder);
AudioFlushBuffers();
AudioSetBufferTime(ConfigAudioBufferTime);
AudioCodecID = AV_CODEC_ID_NONE;
AudioChannelID = -1;
NewAudioStream = 0;
}
Muss der audio ringbuffer evtl. auch in Clear() gecleart werden? Ist das überhaupt ein Ansatz, oder bin ich komplett auf dem Holzweg?