From patchwork Sat Aug 31 10:10:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fumoboy007 X-Patchwork-Id: 14820 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 40718447848 for ; Sat, 31 Aug 2019 13:11:07 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 29598687FB7; Sat, 31 Aug 2019 13:11:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mr85p00im-zteg06012001.me.com (mr85p00im-zteg06012001.me.com [17.58.23.197]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EA730680879 for ; Sat, 31 Aug 2019 13:11:00 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=me.com; s=1a1hai; t=1567246259; bh=pICvIJXA9CxC3gh71HQHZITLcRVwrGtztIrGP1FPKj0=; h=From:To:Subject:Date:Message-Id; b=Ow2DQ23slukBjd1fqlPLtnjxZdSZYKmlMVrkWJBDAH2T0O7fmga81ur81mcm1qEdz zOKuW2+ad+IKWGEh2v5Iftl3wrnuV0oCa01WDODjiU8nduekE2TiJcnpxIc9E5GZ8P Sr4Z1Lduqc7unLXxR2RsIVvR6pE/yXKQjCpo9bzzIcu5kEv7lJzYTQiAp88uq95a30 VbA1oOvoBDvOKApIkLOIt5veZ0lUhbdsgqiZkXWUDiCrC891zQlUMiaFOOPJ91sK87 Hh9WA7MJz2Swp0e6MEkHWAPFGiEBSNWW0mUeoyaB+M5X57mA5FXkx1Ba+cD8wANqqn dC58nTBf01mxg== Received: from MacBook-Pro.moma (c-24-5-88-65.hsd1.ca.comcast.net [24.5.88.65]) by mr85p00im-zteg06012001.me.com (Postfix) with ESMTPSA id 2D932A008EC; Sat, 31 Aug 2019 10:10:59 +0000 (UTC) From: fumoboy007@me.com To: ffmpeg-devel@ffmpeg.org Date: Sat, 31 Aug 2019 03:10:39 -0700 Message-Id: <20190831101039.2179-2-fumoboy007@me.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190831101039.2179-1-fumoboy007@me.com> References: <20190831101039.2179-1-fumoboy007@me.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2019-08-31_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=1 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 mlxscore=0 mlxlogscore=684 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1812120000 definitions=main-1908310120 Subject: [FFmpeg-devel] [PATCH 2/2] avformat/mpegts: Fixed keyframe seeking by migrating from `read_timestamp` to `read_timestamp2` X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: fumoboy007@me.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: fumoboy007 Signed-off-by: fumoboy007 --- libavformat/mpegts.c | 46 ++++++------ tests/ref/fate/concat-demuxer-simple2-lavf-ts | 70 ++++++++++++++++++- tests/ref/seek/lavf-ts | 6 +- 3 files changed, 96 insertions(+), 26 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 47d8d5f877..e9fb140775 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -3184,7 +3184,7 @@ static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, } static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, - int64_t *ppos, int64_t pos_limit) + int64_t *ppos, int64_t pos_limit, int prefer_keyframe) { MpegTSContext *ts = s->priv_data; int64_t pos; @@ -3200,10 +3200,14 @@ static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, ret = av_read_frame(s, &pkt); if (ret < 0) return AV_NOPTS_VALUE; + if (pkt.dts != AV_NOPTS_VALUE && pkt.pos >= 0) { + int is_keyframe = (pkt.flags & AV_PKT_FLAG_KEY) != 0; + ff_reduce_index(s, pkt.stream_index); av_add_index_entry(s->streams[pkt.stream_index], pkt.pos, pkt.dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */); - if (pkt.stream_index == stream_index && pkt.pos >= *ppos) { + + if (pkt.stream_index == stream_index && pkt.pos >= *ppos && (!prefer_keyframe || is_keyframe)) { int64_t dts = pkt.dts; *ppos = pkt.pos; av_packet_unref(&pkt); @@ -3271,26 +3275,26 @@ void avpriv_mpegts_parse_close(MpegTSContext *ts) } AVInputFormat ff_mpegts_demuxer = { - .name = "mpegts", - .long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"), - .priv_data_size = sizeof(MpegTSContext), - .read_probe = mpegts_probe, - .read_header = mpegts_read_header, - .read_packet = mpegts_read_packet, - .read_close = mpegts_read_close, - .read_timestamp = mpegts_get_dts, - .flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT, - .priv_class = &mpegts_class, + .name = "mpegts", + .long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"), + .priv_data_size = sizeof(MpegTSContext), + .read_probe = mpegts_probe, + .read_header = mpegts_read_header, + .read_packet = mpegts_read_packet, + .read_close = mpegts_read_close, + .read_timestamp2 = mpegts_get_dts, + .flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT, + .priv_class = &mpegts_class, }; AVInputFormat ff_mpegtsraw_demuxer = { - .name = "mpegtsraw", - .long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"), - .priv_data_size = sizeof(MpegTSContext), - .read_header = mpegts_read_header, - .read_packet = mpegts_raw_read_packet, - .read_close = mpegts_read_close, - .read_timestamp = mpegts_get_dts, - .flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT, - .priv_class = &mpegtsraw_class, + .name = "mpegtsraw", + .long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"), + .priv_data_size = sizeof(MpegTSContext), + .read_header = mpegts_read_header, + .read_packet = mpegts_raw_read_packet, + .read_close = mpegts_read_close, + .read_timestamp2 = mpegts_get_dts, + .flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT, + .priv_class = &mpegtsraw_class, }; diff --git a/tests/ref/fate/concat-demuxer-simple2-lavf-ts b/tests/ref/fate/concat-demuxer-simple2-lavf-ts index 0f03d6e06b..86fdbc733e 100644 --- a/tests/ref/fate/concat-demuxer-simple2-lavf-ts +++ b/tests/ref/fate/concat-demuxer-simple2-lavf-ts @@ -180,6 +180,37 @@ audio|0|180321|2.003567|180321|2.003567|2351|0.026122|N/A|N/A|209|N/A|K_ video|1|174764|1.941822|171164|1.901822|3600|0.040000|N/A|N/A|12678|347800|__MPEGTS Stream ID video|1|178364|1.981822|174764|1.941822|3600|0.040000|N/A|N/A|24711|361336|K_ +video|1|110782|1.230911|107182|1.190911|3600|0.040000|N/A|N/A|24786|181420|K_MPEGTS Stream ID + +video|1|114382|1.270911|110782|1.230911|3600|0.040000|N/A|N/A|17440|206988|__MPEGTS Stream ID + +video|1|117982|1.310911|114382|1.270911|3600|0.040000|N/A|N/A|15019|224848|__MPEGTS Stream ID + +video|1|121582|1.350911|117982|1.310911|3600|0.040000|N/A|N/A|13449|240640|__MPEGTS Stream ID + +video|1|125182|1.390911|121582|1.350911|3600|0.040000|N/A|N/A|12398|254552|__MPEGTS Stream ID + +video|1|128782|1.430911|125182|1.390911|3600|0.040000|N/A|N/A|13455|267336|__MPEGTS Stream ID + +audio|0|99515|1.105722|99515|1.105722|2351|0.026122|N/A|N/A|209|308508|K_MPEGTS Stream ID + +audio|0|101866|1.131844|101866|1.131844|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|104217|1.157967|104217|1.157967|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|106568|1.184089|106568|1.184089|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|108919|1.210211|108919|1.210211|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|111270|1.236333|111270|1.236333|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|113621|1.262456|113621|1.262456|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|115972|1.288578|115972|1.288578|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|118323|1.314700|118323|1.314700|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|120674|1.340822|120674|1.340822|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|123025|1.366944|123025|1.366944|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|125376|1.393067|125376|1.393067|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|127727|1.419189|127727|1.419189|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|130078|1.445311|130078|1.445311|2351|0.026122|N/A|N/A|209|N/A|K_ +video|1|132382|1.470911|128782|1.430911|3600|0.040000|N/A|N/A|13836|281624|__MPEGTS Stream ID + +video|1|135982|1.510911|132382|1.470911|3600|0.040000|N/A|N/A|12163|295912|__MPEGTS Stream ID + video|1|139582|1.550911|135982|1.510911|3600|0.040000|N/A|N/A|12692|311516|__MPEGTS Stream ID video|1|143182|1.590911|139582|1.550911|3600|0.040000|N/A|N/A|10824|325052|__MPEGTS Stream ID @@ -201,6 +232,41 @@ audio|0|155939|1.732656|155939|1.732656|2351|0.026122|N/A|N/A|209|N/A|K_ video|1|150382|1.670911|146782|1.630911|3600|0.040000|N/A|N/A|12678|347800|__MPEGTS Stream ID video|1|153982|1.710911|150382|1.670911|3600|0.040000|N/A|N/A|24711|361336|K_ +video|1|125182|1.390911|121582|1.350911|3600|0.040000|N/A|N/A|24801|564|K_MPEGTS Stream ID + +video|1|128782|1.430911|125182|1.390911|3600|0.040000|N/A|N/A|16429|25944|__MPEGTS Stream ID + +video|1|132382|1.470911|128782|1.430911|3600|0.040000|N/A|N/A|14508|42864|__MPEGTS Stream ID + +video|1|135982|1.510911|132382|1.470911|3600|0.040000|N/A|N/A|12622|58092|__MPEGTS Stream ID + +video|1|139582|1.550911|135982|1.510911|3600|0.040000|N/A|N/A|13393|71064|__MPEGTS Stream ID + +video|1|143182|1.590911|139582|1.550911|3600|0.040000|N/A|N/A|13092|84788|__MPEGTS Stream ID + +video|1|146782|1.630911|143182|1.590911|3600|0.040000|N/A|N/A|12755|98700|__MPEGTS Stream ID + +video|1|150382|1.670911|146782|1.630911|3600|0.040000|N/A|N/A|12023|111860|__MPEGTS Stream ID + +audio|0|124200|1.380000|124200|1.380000|2351|0.026122|N/A|N/A|208|152844|K_MPEGTS Stream ID + +audio|0|126551|1.406122|126551|1.406122|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|128902|1.432244|128902|1.432244|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|131253|1.458367|131253|1.458367|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|133604|1.484489|133604|1.484489|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|135955|1.510611|135955|1.510611|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|138306|1.536733|138306|1.536733|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|140657|1.562856|140657|1.562856|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|143008|1.588978|143008|1.588978|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|145359|1.615100|145359|1.615100|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|147710|1.641222|147710|1.641222|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|150061|1.667344|150061|1.667344|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|152412|1.693467|152412|1.693467|2351|0.026122|N/A|N/A|209|N/A|K_ +audio|0|154763|1.719589|154763|1.719589|2351|0.026122|N/A|N/A|209|N/A|K_ +video|1|153982|1.710911|150382|1.670911|3600|0.040000|N/A|N/A|14098|124268|__MPEGTS Stream ID + +video|1|157582|1.750911|153982|1.710911|3600|0.040000|N/A|N/A|13329|139120|__MPEGTS Stream ID + video|1|161182|1.790911|157582|1.750911|3600|0.040000|N/A|N/A|12135|155852|__MPEGTS Stream ID video|1|164782|1.830911|161182|1.790911|3600|0.040000|N/A|N/A|12282|168448|__MPEGTS Stream ID @@ -211,5 +277,5 @@ video|1|171982|1.910911|168382|1.870911|3600|0.040000|N/A|N/A|17440|206988|__MPE video|1|175582|1.950911|171982|1.910911|3600|0.040000|N/A|N/A|15019|224848|__MPEGTS Stream ID -0|mp2|unknown|audio|1/44100|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0 -1|mpeg2video|4|video|1/25|[2][0][0][0]|0x0002|352|288|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|N/A|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|60|0|0|0|0|0|0|0|0|0|0|0|0 +0|mp2|unknown|audio|1/44100|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|117|0|0|0|0|0|0|0|0|0|0|0|0 +1|mpeg2video|4|video|1/25|[2][0][0][0]|0x0002|352|288|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|N/A|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|78|0|0|0|0|0|0|0|0|0|0|0|0 diff --git a/tests/ref/seek/lavf-ts b/tests/ref/seek/lavf-ts index 3347b7ead5..0fddf3aac7 100644 --- a/tests/ref/seek/lavf-ts +++ b/tests/ref/seek/lavf-ts @@ -16,7 +16,7 @@ ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st:-1 flags:1 ts:-0.740831 ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 0 flags:0 ts: 2.153333 -ret: 0 st: 1 flags:1 dts: 1.794811 pts: 1.794811 pos: 308508 size: 209 +ret: 0 st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 386716 size: 209 ret: 0 st: 0 flags:1 ts: 1.047500 ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 1 flags:0 ts:-0.058333 @@ -24,7 +24,7 @@ ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size: 208 ret: 0 st: 1 flags:1 ts: 2.835833 ret: 0 st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 386716 size: 209 ret: 0 st:-1 flags:0 ts: 1.730004 -ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size: 208 +ret: 0 st: 0 flags:1 dts: 1.880000 pts: 1.920000 pos: 181420 size: 24786 ret: 0 st:-1 flags:1 ts: 0.624171 ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 0 flags:0 ts:-0.481667 @@ -38,7 +38,7 @@ ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size: 208 ret: 0 st:-1 flags:0 ts:-0.904994 ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:0 dts: 1.960000 pts: 2.000000 pos: 224848 size: 15019 +ret: 0 st: 0 flags:1 dts: 1.880000 pts: 1.920000 pos: 181420 size: 24786 ret: 0 st: 0 flags:0 ts: 0.883344 ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 0 flags:1 ts:-0.222489