Re: [FFmpeg-devel] [PATCH] ffmpeg: explicitly handle sub2video subpicture initialization

2019-03-03 Thread Jan Ekström
On Sun, Mar 3, 2019 at 6:03 PM Paul B Mahol  wrote:
>
> On 3/3/19, Jan Ekström  wrote:
> > On Tue, Feb 26, 2019 at 2:12 AM Jan Ekström  wrote:
> >>
> >> Each time the sub2video structure is initialized, the sub2video
> >> subpicture is initialized together with the first received heartbeat.
> >> The heartbeat's PTS is utilized as the subpicture start time.
> >>
> >> Additionally, add some documentation on the stages.
> >> ---
> >
> > Ping.
>
> Should be OK if it does not break something.
>

It fixes an untested use case that broke when fixing an unlimited
buffering bug the other week, reported by Michael
(https://ffmpeg.org/pipermail/ffmpeg-devel/2019-February/240398.html)
. It additionally doesn't resort to hard-coding the initial PTS value
to zero. I will try to make a test sample for this as well, so we can
catch this thing breaking through FATE.

So far in my testing it hasn't broken, but that said I mostly use
sub2video to overlay things on top of video.

Jan
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] ffmpeg: explicitly handle sub2video subpicture initialization

2019-03-03 Thread Paul B Mahol
On 3/3/19, Jan Ekström  wrote:
> On Tue, Feb 26, 2019 at 2:12 AM Jan Ekström  wrote:
>>
>> Each time the sub2video structure is initialized, the sub2video
>> subpicture is initialized together with the first received heartbeat.
>> The heartbeat's PTS is utilized as the subpicture start time.
>>
>> Additionally, add some documentation on the stages.
>> ---
>
> Ping.

Should be OK if it does not break something.

> Jan
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] ffmpeg: explicitly handle sub2video subpicture initialization

2019-03-03 Thread Jan Ekström
On Tue, Feb 26, 2019 at 2:12 AM Jan Ekström  wrote:
>
> Each time the sub2video structure is initialized, the sub2video
> subpicture is initialized together with the first received heartbeat.
> The heartbeat's PTS is utilized as the subpicture start time.
>
> Additionally, add some documentation on the stages.
> ---

Ping.

Jan
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] ffmpeg: explicitly handle sub2video subpicture initialization

2019-02-25 Thread Jan Ekström
Each time the sub2video structure is initialized, the sub2video
subpicture is initialized together with the first received heartbeat.
The heartbeat's PTS is utilized as the subpicture start time.

Additionally, add some documentation on the stages.
---
 fftools/ffmpeg.c| 22 +++---
 fftools/ffmpeg.h|  3 ++-
 fftools/ffmpeg_filter.c |  8 +++-
 3 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 544f1a1cef..efe903cc41 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -237,7 +237,7 @@ static void sub2video_push_ref(InputStream *ist, int64_t 
pts)
 }
 }
 
-void sub2video_update(InputStream *ist, AVSubtitle *sub)
+void sub2video_update(InputStream *ist, int64_t heartbeat_pts, AVSubtitle *sub)
 {
 AVFrame *frame = ist->sub2video.frame;
 int8_t *dst;
@@ -254,7 +254,12 @@ void sub2video_update(InputStream *ist, AVSubtitle *sub)
  AV_TIME_BASE_Q, ist->st->time_base);
 num_rects = sub->num_rects;
 } else {
-pts   = ist->sub2video.end_pts;
+/* If we are initializing the system, utilize current heartbeat
+   PTS as the start time, and show until the following subpicture
+   is received. Otherwise, utilize the previous subpicture's end time
+   as the fall-back value. */
+pts   = ist->sub2video.initialize ?
+heartbeat_pts : ist->sub2video.end_pts;
 end_pts   = INT64_MAX;
 num_rects = 0;
 }
@@ -269,6 +274,7 @@ void sub2video_update(InputStream *ist, AVSubtitle *sub)
 sub2video_copy_rect(dst, dst_linesize, frame->width, frame->height, 
sub->rects[i]);
 sub2video_push_ref(ist, pts);
 ist->sub2video.end_pts = end_pts;
+ist->sub2video.initialize = 0;
 }
 
 static void sub2video_heartbeat(InputStream *ist, int64_t pts)
@@ -291,9 +297,11 @@ static void sub2video_heartbeat(InputStream *ist, int64_t 
pts)
 /* do not send the heartbeat frame if the subtitle is already ahead */
 if (pts2 <= ist2->sub2video.last_pts)
 continue;
-if (pts2 >= ist2->sub2video.end_pts ||
-(!ist2->sub2video.frame->data[0] && ist2->sub2video.end_pts < 
INT64_MAX))
-sub2video_update(ist2, NULL);
+if (pts2 >= ist2->sub2video.end_pts || ist2->sub2video.initialize)
+/* if we have hit the end of the current displayed subpicture,
+   or if we need to initialize the system, update the
+   overlayed subpicture and its start/end times */
+sub2video_update(ist2, pts2 + 1, NULL);
 for (j = 0, nb_reqs = 0; j < ist2->nb_filters; j++)
 nb_reqs += 
av_buffersrc_get_nb_failed_requests(ist2->filters[j]->filter);
 if (nb_reqs)
@@ -307,7 +315,7 @@ static void sub2video_flush(InputStream *ist)
 int ret;
 
 if (ist->sub2video.end_pts < INT64_MAX)
-sub2video_update(ist, NULL);
+sub2video_update(ist, INT64_MAX, NULL);
 for (i = 0; i < ist->nb_filters; i++) {
 ret = av_buffersrc_add_frame(ist->filters[i]->filter, NULL);
 if (ret != AVERROR_EOF && ret < 0)
@@ -2514,7 +2522,7 @@ static int transcode_subtitles(InputStream *ist, AVPacket 
*pkt, int *got_output,
 return ret;
 
 if (ist->sub2video.frame) {
-sub2video_update(ist, );
+sub2video_update(ist, INT64_MIN, );
 } else if (ist->nb_filters) {
 if (!ist->sub2video.sub_queue)
 ist->sub2video.sub_queue = av_fifo_alloc(8 * sizeof(AVSubtitle));
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index eb1eaf6363..b2129a3f28 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -349,6 +349,7 @@ typedef struct InputStream {
 AVFifoBuffer *sub_queue;///< queue of AVSubtitle* before filter 
init
 AVFrame *frame;
 int w, h;
+unsigned int initialize; ///< marks if sub2video_update should force 
an initialization
 } sub2video;
 
 int dr1;
@@ -646,7 +647,7 @@ int filtergraph_is_simple(FilterGraph *fg);
 int init_simple_filtergraph(InputStream *ist, OutputStream *ost);
 int init_complex_filtergraph(FilterGraph *fg);
 
-void sub2video_update(InputStream *ist, AVSubtitle *sub);
+void sub2video_update(InputStream *ist, int64_t heartbeat_pts, AVSubtitle 
*sub);
 
 int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame);
 
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 72838de1e2..d81bb9742f 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -740,6 +740,12 @@ static int sub2video_prepare(InputStream *ist, InputFilter 
*ifilter)
 return AVERROR(ENOMEM);
 ist->sub2video.last_pts = INT64_MIN;
 ist->sub2video.end_pts  = INT64_MIN;
+
+/* sub2video structure has been (re-)initialized.
+   Mark it as such so that the system will be
+   initialized with the first received heartbeat. */
+ist->sub2video.initialize = 1;
+