From 0500967a2ac83c0d418a35927912fb2123014e7e Mon Sep 17 00:00:00 2001 From: samsamsam Date: Tue, 22 Jan 2019 04:12:01 +0100 Subject: [PATCH] Improve seeks on playback with multi AV context - when option --- libeplayer3-arm/container/container_ffmpeg.c | 47 ++++++++++++++++---- libeplayer3-arm/main/exteplayer.c | 2 +- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/libeplayer3-arm/container/container_ffmpeg.c b/libeplayer3-arm/container/container_ffmpeg.c index 2e72124..f2d0c2c 100644 --- a/libeplayer3-arm/container/container_ffmpeg.c +++ b/libeplayer3-arm/container/container_ffmpeg.c @@ -547,6 +547,8 @@ static void FFMPEGThread(Context_t *context) int64_t lastVideoDts = -1; int64_t lastAudioDts = -1; + int64_t multiContextLastPts[IPTV_AV_CONTEXT_MAX_NUM] = {INVALID_PTS_VALUE, INVALID_PTS_VALUE}; + int64_t showtime = 0; int64_t bofcount = 0; AudioVideoOut_t avOut; @@ -678,6 +680,7 @@ static void FFMPEGThread(Context_t *context) uint32_t i = 0; for (; i < IPTV_AV_CONTEXT_MAX_NUM; i += 1) { + multiContextLastPts[i] = INVALID_PTS_VALUE; if (NULL != avContextTab[i]) { if (i == 1) @@ -741,12 +744,31 @@ static void FFMPEGThread(Context_t *context) { if (NULL != avContextTab[1]) { - cAVIdx = currentVideoPts <= currentAudioPts ? 0 : 1; - if (1 == cAVIdx && prev_seek_time_sec >= 0) + if (prev_seek_time_sec >= 0) { - avformat_seek_file(avContextTab[1], -1, (currentVideoPts / 90000) * AV_TIME_BASE - AV_TIME_BASE, (currentVideoPts / 90000) * AV_TIME_BASE, (currentVideoPts / 90000) * AV_TIME_BASE + AV_TIME_BASE, 0); - prev_seek_time_sec = -1; - wrapped_avcodec_flush_buffers(1); + if (multiContextLastPts[0] != INVALID_PTS_VALUE) + { + int64_t target = av_rescale(multiContextLastPts[0], AV_TIME_BASE, 90000); + avformat_seek_file(avContextTab[1], -1, INT64_MIN, target, INT64_MAX, 0); + prev_seek_time_sec = -1; + wrapped_avcodec_flush_buffers(1); + cAVIdx = 1; + } + else + { + cAVIdx = 0; + } + } + else + { + if (multiContextLastPts[0] != INVALID_PTS_VALUE && multiContextLastPts[1] != INVALID_PTS_VALUE) + { + cAVIdx = multiContextLastPts[0] < multiContextLastPts[1] ? 0 : 1; + } + else + { + cAVIdx = !cAVIdx; + } } } else @@ -767,6 +789,9 @@ static void FFMPEGThread(Context_t *context) int32_t pid = avContextTab[cAVIdx]->streams[packet.stream_index]->id; + multiContextLastPts[cAVIdx] = calcPts(cAVIdx, avContextTab[cAVIdx]->streams[packet.stream_index], packet.pts); + ffmpeg_printf(200, "Ctx %d PTS: %"PRId64" PTS[1] %"PRId64"\n", cAVIdx, multiContextLastPts[cAVIdx], multiContextLastPts[1]); + reset_finish_timeout(); if (avContextTab[cAVIdx]->streams[packet.stream_index]->discard != AVDISCARD_ALL) @@ -2074,7 +2099,8 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 { case AVMEDIA_TYPE_VIDEO: ffmpeg_printf(10, "CODEC_TYPE_VIDEO %d\n", get_codecpar(stream)->codec_type); - stream->discard = AVDISCARD_ALL; /* by default we discard all video streams */ + // do not discard any stream from second context + stream->discard = 0 == cAVIdx ? AVDISCARD_ALL : AVDISCARD_DEFAULT; /* by default we discard all video streams */ if (encoding != NULL) { @@ -2176,7 +2202,8 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 break; case AVMEDIA_TYPE_AUDIO: ffmpeg_printf(10, "CODEC_TYPE_AUDIO %d\n", get_codecpar(stream)->codec_type); - stream->discard = AVDISCARD_ALL; + // do not discard any stream from second context + stream->discard = 0 == cAVIdx ? AVDISCARD_ALL : AVDISCARD_DEFAULT; if (encoding != NULL) { @@ -3053,7 +3080,11 @@ static int32_t container_ffmpeg_switch_audio(Context_t *context, int32_t *arg __ int32_t i; for (i = 0; i < TrackCount; ++i) { - ((AVStream *)Tracks[i].stream)->discard = Tracks[i].Id == *arg ? AVDISCARD_DEFAULT : AVDISCARD_ALL; + // do not discard any stream from second context + if (Tracks[i].AVIdx == 0) + { + ((AVStream *)Tracks[i].stream)->discard = Tracks[i].Id == *arg ? AVDISCARD_DEFAULT : AVDISCARD_ALL; + } } } } diff --git a/libeplayer3-arm/main/exteplayer.c b/libeplayer3-arm/main/exteplayer.c index aa55253..36eed54 100644 --- a/libeplayer3-arm/main/exteplayer.c +++ b/libeplayer3-arm/main/exteplayer.c @@ -694,7 +694,7 @@ int main(int argc, char *argv[]) memset(argvBuff, '\0', sizeof(argvBuff)); int commandRetVal = -1; /* inform client that we can handle additional commands */ - fprintf(stderr, "{\"EPLAYER3_EXTENDED\":{\"version\":%d}}\n", 50); + fprintf(stderr, "{\"EPLAYER3_EXTENDED\":{\"version\":%d}}\n", 51); PlayFiles_t playbackFiles; memset(&playbackFiles, 0x00, sizeof(playbackFiles));