From patchwork Sat Sep 10 10:47:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 530 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp727327vsd; Sat, 10 Sep 2016 03:47:51 -0700 (PDT) X-Received: by 10.28.170.197 with SMTP id t188mr2311229wme.42.1473504471662; Sat, 10 Sep 2016 03:47:51 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o6si5273154wju.81.2016.09.10.03.47.51; Sat, 10 Sep 2016 03:47:51 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BC21B689E4A; Sat, 10 Sep 2016 13:47:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f173.google.com (mail-qk0-f173.google.com [209.85.220.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9BC13689CD9 for ; Sat, 10 Sep 2016 13:47:30 +0300 (EEST) Received: by mail-qk0-f173.google.com with SMTP id z190so91399795qkc.3 for ; Sat, 10 Sep 2016 03:47:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=2rN8LTuyr4gpAmpnuLccJojh9W5XwUY3bdBQTzdW9NQ=; b=UKodYDVJRAy+fXqP8WtXGV80XRJ0aI36FSy3fwmNG+H0d02APiiCjSqyVYaUm4N66b 5cYJ6DR5E7OAd8yfv2MC3gS8iFejJzKmvCzUDR1ooZtzXB6cPJugLQtX1njDTaXwwPYS Hrvi66KYd7vpq+4XpZCn1uu5EWoKiW8Cb1z+aiO5es0r3bfD1hsEZfbXKrcI63aY34UQ f2VJyrGjQ09+5fAI/PWRUDpg8MPXHiJhO6Zy3ABzvudIZQ4X7ZUaPe69LWHUiMx8Y+dP 5z1b7DmPPf++khhTIk5DKM7fVb+iEpPqtPa6vEvtzMFq/BBb8pU1OvE4BqvLetF/ksww 1u3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=2rN8LTuyr4gpAmpnuLccJojh9W5XwUY3bdBQTzdW9NQ=; b=LT/dfkMCDQMilJNbxu/7bghNXAqaqq9k5C8u1bZ4Iv+Cyrot9fb+93zodVbnmgar0h PQum2Ve8huuqCssbfRGTNI7nbv+GIY1kch0jZ15ljbma9aZHv2kk0f9gDCdPgGQRbaAN F/xUAX1h4wh1mjV/nVQ1NEKLS4mQmom9T43Yy24v6/R1bivqetpq5bHirBzNw3zUB7Tc JWeD0DCrw/XamR1TbQjcrCWbBaCBZs9J92udm76T/ElJKM/ssfwqYJXsXMsLJhCQV6iB Pi7fc+1YAogN2xH24szjv/j5IKUy612jmqsLpnQapGeDxgsh07ECmwrE+EDFQ6sRkEdb EbfQ== X-Gm-Message-State: AE9vXwNRbKjVXJaVgwynaRW7iwWsnIWlew+CmDYSyFAfCc1QxznOIE5c+DjprML7ND+0NIHIBFxIhAZ8WeClEw== X-Received: by 10.55.161.81 with SMTP id k78mr9005110qke.105.1473504459565; Sat, 10 Sep 2016 03:47:39 -0700 (PDT) MIME-Version: 1.0 Received: by 10.237.56.42 with HTTP; Sat, 10 Sep 2016 03:47:38 -0700 (PDT) In-Reply-To: References: From: Steven Liu Date: Sat, 10 Sep 2016 18:47:38 +0800 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: Re: [FFmpeg-devel] [PATCH] avformat/segment: fix the duration error of use output_ts_offset 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 2016-09-10 13:55 GMT+08:00 Aman Gupta : > I confirmed your latest patch fixes the issue and is working as expected > now. > > Thank you! > > Aman > > On Sat, Sep 10, 2016 at 7:00 AM, Steven Liu > wrote: > >> >> Steven Liu 于2016年9月9日 周五下午7:59写道: >> >>> 2016-09-09 16:33 GMT+08:00 Steven Liu : >>> >>>> >>>> >>>> 2016-09-09 16:10 GMT+08:00 Steven Liu : >>>> >>>>> >>>>> >>>>> 2016-09-09 15:33 GMT+08:00 Steven Liu : >>>>> >>>>>> >>>>>> >>>>>> 2016-09-09 15:28 GMT+08:00 Aman Gupta : >>>>>> >>>>>>> I tried your patch and TARGETDURATION is fixed, but it is still >>>>>>> creating some segments which are only 0.2s instead of 2s. >>>>>>> >>>>>>> Aman >>>>>>> >>>>>>> On Thu, Sep 8, 2016 at 8:14 PM, Steven Liu >>>>>>> wrote: >>>>>>> >>>>>>>> This patch can merge with 1da00be009aa74400042bf470b9a5ffbd82a1c5e >>>>>>>> i have checked this modify: >>>>>>>> >>>>>>>> ./ffmpeg -i ~/facebook.mp4 -c copy -f segment -segment_time 2 >>>>>>>> -output_ts_offset 80 -segment_list output-test.m3u8 -v debug >>>>>>>> output-test-%03d.ts >>>>>>>> >>>>>>>> #EXTM3U >>>>>>>> #EXT-X-VERSION:3 >>>>>>>> #EXT-X-MEDIA-SEQUENCE:0 >>>>>>>> #EXT-X-ALLOW-CACHE:YES >>>>>>>> #EXT-X-TARGETDURATION:10 >>>>>>>> #EXTINF:4.120000, >>>>>>>> output-test-000.ts >>>>>>>> #EXTINF:7.840000, >>>>>>>> output-test-001.ts >>>>>>>> #EXTINF:4.200000, >>>>>>>> output-test-002.ts >>>>>>>> #EXTINF:2.920000, >>>>>>>> output-test-003.ts >>>>>>>> #EXTINF:1.840000, >>>>>>>> output-test-004.ts >>>>>>>> #EXTINF:2.240000, >>>>>>>> output-test-005.ts >>>>>>>> #EXTINF:2.000000, >>>>>>>> output-test-006.ts >>>>>>>> #EXTINF:3.560000, >>>>>>>> >>>>>>>> >>>>>>>> [root@localhost linux]# ffmpeg -i output-test.m3u8 >>>>>>>> ffmpeg version N-80917-ga1a240b Copyright (c) 2000-2016 the FFmpeg >>>>>>>> developers >>>>>>>> built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17) >>>>>>>> configuration: --prefix=/usr/ --libdir=/usr/lib64 >>>>>>>> --enable-libx264 --enable-libfaac --enable-gpl --enable-nonfree >>>>>>>> libavutil 55. 28.100 / 55. 28.100 >>>>>>>> libavcodec 57. 48.102 / 57. 48.102 >>>>>>>> libavformat 57. 41.100 / 57. 41.100 >>>>>>>> libavdevice 57. 0.102 / 57. 0.102 >>>>>>>> libavfilter 6. 47.100 / 6. 47.100 >>>>>>>> libswscale 4. 1.100 / 4. 1.100 >>>>>>>> libswresample 2. 1.100 / 2. 1.100 >>>>>>>> libpostproc 54. 0.100 / 54. 0.100 >>>>>>>> Input #0, hls,applehttp, from 'output-test.m3u8': >>>>>>>> Duration: 00:03:21.04, start: 81.400000, bitrate: 0 kb/s >>>>>>>> Program 0 >>>>>>>> Metadata: >>>>>>>> variant_bitrate : 0 >>>>>>>> Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), >>>>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc >>>>>>>> Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, >>>>>>>> 5.1(side), fltp, 384 kb/s >>>>>>>> At least one output file must be specified >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> [root@localhost linux]# ffmpeg -i output-test-000.ts -i >>>>>>>> output-test-001.ts >>>>>>>> ffmpeg version N-80917-ga1a240b Copyright (c) 2000-2016 the FFmpeg >>>>>>>> developers >>>>>>>> built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17) >>>>>>>> configuration: --prefix=/usr/ --libdir=/usr/lib64 >>>>>>>> --enable-libx264 --enable-libfaac --enable-gpl --enable-nonfree >>>>>>>> libavutil 55. 28.100 / 55. 28.100 >>>>>>>> libavcodec 57. 48.102 / 57. 48.102 >>>>>>>> libavformat 57. 41.100 / 57. 41.100 >>>>>>>> libavdevice 57. 0.102 / 57. 0.102 >>>>>>>> libavfilter 6. 47.100 / 6. 47.100 >>>>>>>> libswscale 4. 1.100 / 4. 1.100 >>>>>>>> libswresample 2. 1.100 / 2. 1.100 >>>>>>>> libpostproc 54. 0.100 / 54. 0.100 >>>>>>>> Input #0, mpegts, from 'output-test-000.ts': >>>>>>>> Duration: 00:00:04.12, start: 81.400000, bitrate: 1299 kb/s >>>>>>>> Program 1 >>>>>>>> Metadata: >>>>>>>> service_name : Service01 >>>>>>>> service_provider: FFmpeg >>>>>>>> Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / >>>>>>>> 0x001B), yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 >>>>>>>> tbc >>>>>>>> Stream #0:1[0x101](und): Audio: ac3 ([129][0][0][0] / 0x0081), >>>>>>>> 48000 Hz, 5.1(side), fltp, 384 kb/s >>>>>>>> Input #1, mpegts, from 'output-test-001.ts': >>>>>>>> Duration: 00:00:07.90, start: 85.464000, bitrate: 1679 kb/s >>>>>>>> Program 1 >>>>>>>> Metadata: >>>>>>>> service_name : Service01 >>>>>>>> service_provider: FFmpeg >>>>>>>> Stream #1:0[0x100]: Video: h264 (High) ([27][0][0][0] / >>>>>>>> 0x001B), yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 >>>>>>>> tbc >>>>>>>> Stream #1:1[0x101](und): Audio: ac3 ([129][0][0][0] / 0x0081), >>>>>>>> 48000 Hz, 5.1(side), fltp, 384 kb/s >>>>>>>> At least one output file must be specified >>>>>>>> [root@localhost linux]# >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> this commit is used for fix commit 1da00be009aa74400042bf470b9a5f >>>>>>>> fbd82a1c5e >>>>>>>> because the option initial_offset will deprecated >>>>>>>> >>>>>>>> Signed-off-by: Steven Liu >>>>>>>> --- >>>>>>>> libavformat/segment.c | 5 +++++ >>>>>>>> 1 files changed, 5 insertions(+), 0 deletions(-) >>>>>>>> >>>>>>>> diff --git a/libavformat/segment.c b/libavformat/segment.c >>>>>>>> index 33a5cf0..252f8b1 100644 >>>>>>>> --- a/libavformat/segment.c >>>>>>>> +++ b/libavformat/segment.c >>>>>>>> @@ -885,6 +885,11 @@ calc_times: >>>>>>>> av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet >>>>>>>> stream:%d pts:%s pts_time:%s frame:%d\n", >>>>>>>> seg->avf->filename, pkt->stream_index, >>>>>>>> av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, >>>>>>>> &st->time_base), seg->frame_count); >>>>>>>> + seg->cut_pending = 0; >>>>>>>> + seg->cur_entry.index = seg->segment_idx + >>>>>>>> seg->segment_idx_wrap * seg->segment_idx_wrap_nb; >>>>>>>> + seg->cur_entry.start_time = (double)pkt->pts * >>>>>>>> av_q2d(st->time_base); >>>>>>>> + seg->cur_entry.start_pts = av_rescale_q(pkt->pts, >>>>>>>> st->time_base, AV_TIME_BASE_Q); >>>>>>>> + seg->cur_entry.end_time = seg->cur_entry.start_time; >>>>>>>> } >>>>>>>> >>>>>>>> av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s >>>>>>>> pts_time:%s dts:%s dts_time:%s", >>>>>>>> -- >>>>>>>> 1.7.1 >>>>>>>> >>>>>>> >>>>>>> ok, let me try your command line >>>>>> >>>>>> >>>>> ...... >>>>> it's reproduced when encode by default(video:mpeg2video audio: mp2) >>>>> >>>>> Ha, interesting, >>>> /ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -g 50 -f segment >>>> -segment_time 2 -segment_start_number 10 -output_ts_offset 40 >>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts >>>> >>>> no problem >>>> >>>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c:v mpeg2video -g 50 >>>> -f segment -segment_time 2 -segment_start_number 10 -output_ts_offset 40 >>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts >>>> >>>> no problem >>>> >>>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c:v libx264 -g 50 -f >>>> segment -segment_time 2 -segment_start_number 10 -output_ts_offset 40 >>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts >>>> >>>> no problem >>>> >>>> >>>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c copy -f segment >>>> -segment_time 2 -segment_start_number 10 -output_ts_offset 40 >>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts >>>> >>>> no problem >>>> >>>> >>>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -f segment >>>> -segment_time 2 -segment_start_number 10 -output_ts_offset 40 >>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts >>>> >>>> reproduced >>>> >>>> >>>> >>> patch update, no problem now. >>> >>> ./ffmpeg -ss 40 -i ~/Movies/objectC/facebook.mp4 -f segment >>> -segment_time 2 -output_ts_offset 40 -segment_list output-test.m3u8 >>> -segment_start_number 10 -t 12 output-test-%03d.ts >>> >>> no problem >>> >>> #EXTM3U >>> #EXT-X-VERSION:3 >>> #EXT-X-MEDIA-SEQUENCE:10 >>> #EXT-X-ALLOW-CACHE:YES >>> #EXT-X-TARGETDURATION:3 >>> #EXTINF:2.400000, >>> output-test-010.ts >>> #EXTINF:2.040000, >>> output-test-011.ts >>> #EXTINF:1.920000, >>> output-test-012.ts >>> #EXTINF:1.920000, >>> output-test-013.ts >>> #EXTINF:1.920000, >>> output-test-014.ts >>> #EXTINF:1.800000, >>> output-test-015.ts >>> #EXT-X-ENDLIST >>> >>> >>> >>> this commit is used for fix commit 1da00be009aa74400042bf470b9a5f >>> fbd82a1c5e >>> because the option initial_offset will deprecated >>> >>> Signed-off-by: Steven Liu >>> --- >>> libavformat/segment.c | 12 +++++++++++- >>> 1 file changed, 11 insertions(+), 1 deletion(-) >>> >>> diff --git a/libavformat/segment.c b/libavformat/segment.c >>> index 33a5cf0..74ffe03 100644 >>> --- a/libavformat/segment.c >>> +++ b/libavformat/segment.c >>> @@ -101,6 +101,7 @@ typedef struct SegmentContext { >>> char *times_str; ///< segment times specification string >>> int64_t *times; ///< list of segment interval specification >>> int nb_times; ///< number of elments in the times array >>> + int64_t init_time; ///< first segment start time >>> >>> char *frames_str; ///< segment frame numbers specification >>> string >>> int *frames; ///< list of frame number specification >>> @@ -642,6 +643,7 @@ static int seg_init(AVFormatContext *s) >>> int ret; >>> int i; >>> >>> + seg->init_time = 0; >>> seg->segment_count = 0; >>> if (!seg->write_header_trailer) >>> seg->individual_header_trailer = 0; >>> @@ -837,7 +839,11 @@ calc_times: >>> } >>> seg->last_val = wrapped_val; >>> } else { >>> - end_pts = seg->time * (seg->segment_count + 1); >>> + if (seg->init_time == 0) { >>> + seg->init_time = av_rescale_q(pkt->pts, st->time_base, >>> AV_TIME_BASE_Q); >>> + } else { >>> + end_pts = seg->time * (seg->segment_count + 1) + >>> seg->init_time; >>> + } >>> } >>> } >>> >>> @@ -885,6 +891,10 @@ calc_times: >>> av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet >>> stream:%d pts:%s pts_time:%s frame:%d\n", >>> seg->avf->filename, pkt->stream_index, >>> av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, >>> &st->time_base), seg->frame_count); >>> + seg->cur_entry.index = seg->segment_idx + seg->segment_idx_wrap >>> * seg->segment_idx_wrap_nb; >>> + seg->cur_entry.start_time = (double)pkt->pts * >>> av_q2d(st->time_base); >>> + seg->cur_entry.start_pts = av_rescale_q(pkt->pts, >>> st->time_base, AV_TIME_BASE_Q); >>> + seg->cur_entry.end_time = seg->cur_entry.start_time; >>> } >>> >>> av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s >>> pts_time:%s dts:%s dts_time:%s", >>> -- >>> 2.7.4 (Apple Git-66) >>> >>> maybe have a bug, I'll fix it >> When use all the output_ts_offset and initial_offset it will wrong result. >> > > patch update! Ignore the initial_offset if use all the initial_offset and output_ts_offset. this commit is used for fix commit 1da00be009aa74400042bf470b9a5ffbd82a1c5e because the option initial_offset will deprecated Reviewed-by: Aman Gupta Signed-off-by: Steven Liu --- libavformat/segment.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) } @@ -885,6 +892,10 @@ calc_times: av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet stream:%d pts:%s pts_time:%s frame:%d\n", seg->avf->filename, pkt->stream_index, av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &st->time_base), seg->frame_count); + seg->cur_entry.index = seg->segment_idx + seg->segment_idx_wrap * seg->segment_idx_wrap_nb; + seg->cur_entry.start_time = (double)pkt->pts * av_q2d(st->time_base); + seg->cur_entry.start_pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q); + seg->cur_entry.end_time = seg->cur_entry.start_time; } av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s pts_time:%s dts:%s dts_time:%s", diff --git a/libavformat/segment.c b/libavformat/segment.c index 33a5cf0..73d6574 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -101,6 +101,7 @@ typedef struct SegmentContext { char *times_str; ///< segment times specification string int64_t *times; ///< list of segment interval specification int nb_times; ///< number of elments in the times array + int64_t init_time; ///< first segment start time char *frames_str; ///< segment frame numbers specification string int *frames; ///< list of frame number specification @@ -642,6 +643,7 @@ static int seg_init(AVFormatContext *s) int ret; int i; + seg->init_time = AV_NOPTS_VALUE; seg->segment_count = 0; if (!seg->write_header_trailer) seg->individual_header_trailer = 0; @@ -837,7 +839,12 @@ calc_times: } seg->last_val = wrapped_val; } else { - end_pts = seg->time * (seg->segment_count + 1); + if (seg->init_time == AV_NOPTS_VALUE) { + seg->init_time = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q); + seg->initial_offset = 0; + } else { + end_pts = seg->time * (seg->segment_count + 1) + seg->init_time; + } }