From 84e9b3bd072e6e37866150420c09d66bb09d0ca4 Mon Sep 17 00:00:00 2001 From: martii Date: Thu, 1 May 2014 12:52:38 +0200 Subject: [PATCH] libeplayer3: fix audio switching on already terminated playback Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/c3ad6b5b23aa23ff81769cd4df15589c4252e986 Author: martii Date: 2014-05-01 (Thu, 01 May 2014) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3/input.cpp | 22 +++++++----------- libeplayer3/output.cpp | 52 +++++++++++++++++++++++++++--------------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/libeplayer3/input.cpp b/libeplayer3/input.cpp index cd5b18d..ceba54f 100644 --- a/libeplayer3/input.cpp +++ b/libeplayer3/input.cpp @@ -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; } diff --git a/libeplayer3/output.cpp b/libeplayer3/output.cpp index 1b58aff..105095f 100644 --- a/libeplayer3/output.cpp +++ b/libeplayer3/output.cpp @@ -129,18 +129,20 @@ bool Output::Play() OpenThreads::ScopedLock v_lock(videoMutex); OpenThreads::ScopedLock 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 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 a_lock(audioMutex); - return audiofd > -1 && audioWriter && audioWriter->Write(audiofd, stream, packet, pts); + return audiofd > -1 && audioWriter && audioWriter->Write(packet, pts); } default: return false;