mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 23:13:16 +02:00
libeplayer3: fix audio switching on already terminated playback
This commit is contained in:
@@ -150,8 +150,7 @@ bool Input::Play()
|
||||
restart_audio_resampling = true;
|
||||
|
||||
// clear streams
|
||||
unsigned int i;
|
||||
for (i = 0; i < avfc->nb_streams; i++)
|
||||
for (unsigned int i = 0; i < avfc->nb_streams; i++)
|
||||
if (avfc->streams[i]->codec && avfc->streams[i]->codec->codec)
|
||||
avcodec_flush_buffers(avfc->streams[i]->codec);
|
||||
player->output.ClearAudio();
|
||||
@@ -239,17 +238,8 @@ bool Input::Play()
|
||||
|
||||
if (player->abortRequested)
|
||||
player->output.Clear();
|
||||
else {
|
||||
Track *_audioTrack = audioTrack;
|
||||
if (_audioTrack) {
|
||||
// flush audio decoder
|
||||
AVPacket packet;
|
||||
packet.data = NULL;
|
||||
packet.size = 0;
|
||||
player->output.Write(_audioTrack->stream, &packet, 0);
|
||||
}
|
||||
else
|
||||
player->output.Flush();
|
||||
}
|
||||
|
||||
dvbsub_ass_clear();
|
||||
abortPlayback = true;
|
||||
@@ -324,6 +314,7 @@ bool Input::ReadSubtitle(const char *filename, const char *format, int pid)
|
||||
av_free_packet(&packet);
|
||||
}
|
||||
avformat_close_input(&subavfc);
|
||||
avcodec_close(c);
|
||||
avformat_free_context(subavfc);
|
||||
|
||||
Track track;
|
||||
@@ -523,8 +514,11 @@ bool Input::Stop()
|
||||
while (hasPlayThreadStarted != 0)
|
||||
usleep(100000);
|
||||
|
||||
if (avfc)
|
||||
if (avfc) {
|
||||
for (unsigned int i = 0; i < avfc->nb_streams; i++)
|
||||
avcodec_close(avfc->streams[i]->codec);
|
||||
avformat_close_input(&avfc);
|
||||
}
|
||||
|
||||
avformat_network_deinit();
|
||||
|
||||
@@ -554,7 +548,7 @@ bool Input::SwitchAudio(Track *track)
|
||||
{
|
||||
audioTrack = track;
|
||||
player->output.SwitchAudio(track ? track->stream : NULL);
|
||||
player->Seek(-5000, false);
|
||||
// player->Seek(-5000, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -129,18 +129,20 @@ bool Output::Play()
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
||||
|
||||
if (videoStream && videofd > -1) {
|
||||
videoWriter = Writer::GetWriter(videoStream->codec->codec_id, videoStream->codec->codec_type);
|
||||
videoWriter->Init();
|
||||
if (dioctl(videofd, VIDEO_SET_ENCODING, videoWriter->GetVideoEncoding(videoStream->codec->codec_id))
|
||||
AVCodecContext *avcc;
|
||||
|
||||
if (videoStream && videofd > -1 && (avcc = videoStream->codec)) {
|
||||
videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
|
||||
videoWriter->Init(videofd, videoStream);
|
||||
if (dioctl(videofd, VIDEO_SET_ENCODING, videoWriter->GetVideoEncoding(avcc->codec_id))
|
||||
|| dioctl(videofd, VIDEO_PLAY, NULL))
|
||||
ret = false;
|
||||
}
|
||||
|
||||
if (audioStream && audiofd > -1) {
|
||||
audioWriter = Writer::GetWriter(audioStream->codec->codec_id, audioStream->codec->codec_type);
|
||||
audioWriter->Init();
|
||||
if (dioctl(audiofd, AUDIO_SET_ENCODING, audioWriter->GetAudioEncoding(audioStream->codec->codec_id))
|
||||
if (audioStream && audiofd > -1 && (avcc = audioStream->codec)) {
|
||||
audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
|
||||
audioWriter->Init(audiofd, audioStream);
|
||||
if (dioctl(audiofd, AUDIO_SET_ENCODING, audioWriter->GetAudioEncoding(avcc->codec_id))
|
||||
|| dioctl(audiofd, AUDIO_PLAY, NULL))
|
||||
ret = false;
|
||||
}
|
||||
@@ -227,8 +229,16 @@ bool Output::Flush()
|
||||
if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL))
|
||||
ret = false;
|
||||
|
||||
if (audiofd > -1 && ioctl(audiofd, AUDIO_FLUSH, NULL))
|
||||
ret = false;
|
||||
if (audiofd > -1 && audioWriter) {
|
||||
// flush audio decoder
|
||||
AVPacket packet;
|
||||
packet.data = NULL;
|
||||
packet.size = 0;
|
||||
audioWriter->Write(&packet, 0);
|
||||
|
||||
if (ioctl(audiofd, AUDIO_FLUSH, NULL))
|
||||
ret = false;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -300,10 +310,13 @@ bool Output::SwitchAudio(AVStream *stream)
|
||||
}
|
||||
audioStream = stream;
|
||||
if (stream) {
|
||||
audioWriter = Writer::GetWriter(stream->codec->codec_id, stream->codec->codec_type);
|
||||
audioWriter->Init();
|
||||
AVCodecContext *avcc = stream->codec;
|
||||
if (!avcc)
|
||||
return false;
|
||||
audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
|
||||
audioWriter->Init(audiofd, audioStream);
|
||||
if (audiofd > -1) {
|
||||
dioctl (audiofd, AUDIO_SET_ENCODING, Writer::GetAudioEncoding(stream->codec->codec_id));
|
||||
dioctl(audiofd, AUDIO_SET_ENCODING, Writer::GetAudioEncoding(avcc->codec_id));
|
||||
dioctl(audiofd, AUDIO_PLAY, NULL);
|
||||
}
|
||||
}
|
||||
@@ -321,10 +334,13 @@ bool Output::SwitchVideo(AVStream *stream)
|
||||
}
|
||||
videoStream = stream;
|
||||
if (stream) {
|
||||
videoWriter = Writer::GetWriter(stream->codec->codec_id, stream->codec->codec_type);
|
||||
videoWriter->Init();
|
||||
AVCodecContext *avcc = stream->codec;
|
||||
if (!avcc)
|
||||
return false;
|
||||
videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
|
||||
videoWriter->Init(videofd, videoStream);
|
||||
if (videofd > -1) {
|
||||
dioctl(videofd, VIDEO_SET_ENCODING, Writer::GetVideoEncoding(stream->codec->codec_id));
|
||||
dioctl(videofd, VIDEO_SET_ENCODING, Writer::GetVideoEncoding(avcc->codec_id));
|
||||
dioctl(videofd, VIDEO_PLAY, NULL);
|
||||
}
|
||||
}
|
||||
@@ -336,11 +352,11 @@ bool Output::Write(AVStream *stream, AVPacket *packet, int64_t pts)
|
||||
switch (stream->codec->codec_type) {
|
||||
case AVMEDIA_TYPE_VIDEO: {
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
||||
return videofd > -1 && videoWriter && videoWriter->Write(videofd, stream, packet, pts);
|
||||
return videofd > -1 && videoWriter && videoWriter->Write(packet, pts);
|
||||
}
|
||||
case AVMEDIA_TYPE_AUDIO: {
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
||||
return audiofd > -1 && audioWriter && audioWriter->Write(audiofd, stream, packet, pts);
|
||||
return audiofd > -1 && audioWriter && audioWriter->Write(packet, pts);
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
|
Reference in New Issue
Block a user