Soft Works: > This commit actually enables subtitle filtering in ffmpeg by > sending and receiving subtitle frames to and from a filtergraph. > > The heartbeat functionality from the previous sub2video implementation > is retained and applied to all subtitle frames (bitmap, text, ..). > > The other part of sub2video functionality is retained by > auto-insertion of the new graphicsub2video filter. > > Signed-off-by: softworkz <softwo...@hotmail.com> > --- > fftools/ffmpeg.c | 460 ++++++++++------------ > fftools/ffmpeg.h | 14 +- > fftools/ffmpeg_filter.c | 200 +++++++--- > fftools/ffmpeg_hw.c | 2 +- > fftools/ffmpeg_opt.c | 3 +- > tests/ref/fate/filter-overlay-dvdsub-2397 | 181 +++++---- > tests/ref/fate/sub-dvb | 162 ++++---- > tests/ref/fate/sub2video | 44 --- > tests/ref/fate/sub2video_basic | 93 +++-- > tests/ref/fate/sub2video_time_limited | 4 +- > 10 files changed, 575 insertions(+), 588 deletions(-) >
> diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c > index b798459946..a97fca6521 100644 > --- a/fftools/ffmpeg_filter.c > +++ b/fftools/ffmpeg_filter.c > @@ -22,6 +22,9 @@ > > #include "ffmpeg.h" > > +#include <libavcodec/ass_split.h> > +#include <libavfilter/internal.h> > + > #include "libavfilter/avfilter.h" > #include "libavfilter/buffersink.h" > #include "libavfilter/buffersrc.h" > @@ -221,9 +224,8 @@ static void init_input_filter(FilterGraph *fg, > AVFilterInOut *in) > enum AVMediaType type = > avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx); > int i; > > - // TODO: support other filter types > - if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO) { > - av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported " > + if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO && type != > AVMEDIA_TYPE_SUBTITLE) { > + av_log(NULL, AV_LOG_FATAL, "Only video, audio and subtitle filters > supported " > "currently.\n"); > exit_program(1); > } > @@ -244,8 +246,9 @@ static void init_input_filter(FilterGraph *fg, > AVFilterInOut *in) > for (i = 0; i < s->nb_streams; i++) { > enum AVMediaType stream_type = > s->streams[i]->codecpar->codec_type; > if (stream_type != type && > - !(stream_type == AVMEDIA_TYPE_SUBTITLE && > - type == AVMEDIA_TYPE_VIDEO /* sub2video hack */)) > + // in the followng case we auto-insert the graphicsub2video > conversion filter > + // for retaining compatibility with the previous sub2video > hack > + !(stream_type == AVMEDIA_TYPE_SUBTITLE && type == > AVMEDIA_TYPE_VIDEO)) > continue; > if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : > p) == 1) { > st = s->streams[i]; > @@ -416,6 +419,39 @@ static int insert_filter(AVFilterContext **last_filter, > int *pad_idx, > return 0; > } > > +static int configure_output_subtitle_filter(FilterGraph *fg, OutputFilter > *ofilter, AVFilterInOut *out) > +{ > + OutputStream *ost = ofilter->ost; > + AVFilterContext *last_filter = out->filter_ctx; > + int pad_idx = out->pad_idx; > + int ret; > + char name[255]; > + > + snprintf(name, sizeof(name), "out_%d_%d", ost->file_index, ost->index); > + ret = avfilter_graph_create_filter(&ofilter->filter, > + avfilter_get_by_name("sbuffersink"), > + name, NULL, NULL, fg->graph); > + > + if (ret < 0) { > + av_log(NULL, AV_LOG_ERROR, "Unable to create filter sbuffersink\n"); > + return ret; > + } > + > + ////snprintf(name, sizeof(name), "trim_out_%d_%d", > + //// ost->file_index, ost->index); > + ////ret = insert_trim(of->start_time, of->recording_time, > + //// &last_filter, &pad_idx, name); > + ////if (ret < 0) > + //// return ret; > + > + ////ost->st->codecpar->codec_tag = MKTAG('a', 's', 's', 's'); > + > + if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0) > + return ret; > + > + return 0; > +} > + > static int configure_output_video_filter(FilterGraph *fg, OutputFilter > *ofilter, AVFilterInOut *out) > { > char *pix_fmts; > @@ -594,7 +630,8 @@ static int configure_output_audio_filter(FilterGraph *fg, > OutputFilter *ofilter, > int i; > > for (i=0; i<of->ctx->nb_streams; i++) > - if (of->ctx->streams[i]->codecpar->codec_type == > AVMEDIA_TYPE_VIDEO) > + if (of->ctx->streams[i]->codecpar->codec_type == > AVMEDIA_TYPE_VIDEO || > + of->ctx->streams[i]->codecpar->codec_type == > AVMEDIA_TYPE_SUBTITLE) > break; > > if (i<of->ctx->nb_streams) { > @@ -628,6 +665,7 @@ static int configure_output_filter(FilterGraph *fg, > OutputFilter *ofilter, > switch (avfilter_pad_get_type(out->filter_ctx->output_pads, > out->pad_idx)) { > case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, > ofilter, out); > case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, > ofilter, out); > + case AVMEDIA_TYPE_SUBTITLE: return configure_output_subtitle_filter(fg, > ofilter, out); > default: av_assert0(0); return 0; > } > } > @@ -647,51 +685,103 @@ void check_filter_outputs(void) > } > } > > -static int sub2video_prepare(InputStream *ist, InputFilter *ifilter) > +static int configure_input_subtitle_filter(FilterGraph *fg, InputFilter > *ifilter, > + AVFilterInOut *in) > { > - AVFormatContext *avf = input_files[ist->file_index]->ctx; > - int i, w, h; > + AVFilterContext *last_filter; > + const AVFilter *buffer_filt = avfilter_get_by_name("sbuffer"); > + InputStream *ist = ifilter->ist; > + AVBPrint args; > + char name[255]; > + int ret, pad_idx = 0; > + int w, h; > + AVBufferSrcParameters *par = av_buffersrc_parameters_alloc(); > + > + if (!par) > + return AVERROR(ENOMEM); > + memset(par, 0, sizeof(*par)); > + par->format = AV_PIX_FMT_NONE; > + > + if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) { > + av_log(NULL, AV_LOG_ERROR, "Cannot connect subtitle filter to audio > input\n"); > + ret = AVERROR(EINVAL); > + goto fail; > + } > + > + if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) { > + av_log(NULL, AV_LOG_ERROR, "Cannot connect subtitle filter to video > input\n"); > + ret = AVERROR(EINVAL); > + goto fail; > + } > + > + if (!ist->subtitle_heartbeat.header && ist->dec_ctx->subtitle_header) > + ist->subtitle_heartbeat.header = av_strdup((char > *)ist->dec_ctx->subtitle_header); > + > + ist->subtitle_heartbeat.is_active = 1; > > - /* Compute the size of the canvas for the subtitles stream. > - If the subtitles codecpar has set a size, use it. Otherwise use the > - maximum dimensions of the video streams in the same file. */ > w = ifilter->width; > h = ifilter->height; > + > if (!(w && h)) { > - for (i = 0; i < avf->nb_streams; i++) { > - if (avf->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) > { > - w = FFMAX(w, avf->streams[i]->codecpar->width); > - h = FFMAX(h, avf->streams[i]->codecpar->height); > - } > - } > - if (!(w && h)) { > - w = FFMAX(w, 720); > - h = FFMAX(h, 576); > - } > - av_log(avf, AV_LOG_INFO, "sub2video: using %dx%d canvas\n", w, h); > + w = ist->dec_ctx->width; > + h = ist->dec_ctx->height; > } > - ist->sub2video.w = ifilter->width = w; > - ist->sub2video.h = ifilter->height = h; > > - ifilter->width = ist->dec_ctx->width ? ist->dec_ctx->width : > ist->sub2video.w; > - ifilter->height = ist->dec_ctx->height ? ist->dec_ctx->height : > ist->sub2video.h; > + if (!(w && h) && ist->dec_ctx->subtitle_header) { > + ASSSplitContext *ass_ctx = ff_ass_split((char > *)ist->dec_ctx->subtitle_header); > + ASS *ass = (ASS *)ass_ctx; > + w = ass->script_info.play_res_x; > + h = ass->script_info.play_res_y; > + ff_ass_split_free(ass_ctx); This would only work if these functions were made public. > + } > > - /* rectangles are AV_PIX_FMT_PAL8, but we have no guarantee that the > - palettes for all rectangles are identical or compatible */ > - ifilter->format = AV_PIX_FMT_RGB32; > + ist->subtitle_heartbeat.w = w; > + ist->subtitle_heartbeat.h = h; > + av_log(ifilter, AV_LOG_INFO, "subtitle input filter: decoding size > %dx%d\n", ist->subtitle_heartbeat.w, ist->subtitle_heartbeat.h); > > - ist->sub2video.frame = av_frame_alloc(); > - if (!ist->sub2video.frame) > - return AVERROR(ENOMEM); > - ist->sub2video.last_pts = INT64_MIN; > - ist->sub2video.end_pts = INT64_MIN; > + ifilter->width = w; > + ifilter->height = h; > + > + ist->subtitle_heartbeat.last_pts = INT64_MIN; > + > + snprintf(name, sizeof(name), "graph %d subtitle input from stream > %d:%d", fg->index, > + ist->file_index, ist->st->index); > + > + > + av_bprint_init(&args, 0, AV_BPRINT_SIZE_AUTOMATIC); > + av_bprintf(&args, > + "subtitle_type=%d:time_base=%d/%d:", > + ifilter->format, > + ist->st->time_base.num, ist->st->time_base.den); > + if ((ret = avfilter_graph_create_filter(&ifilter->filter, buffer_filt, > name, > + args.str, NULL, fg->graph)) < 0) > + goto fail; > > - /* 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; > + par->hw_frames_ctx = ifilter->hw_frames_ctx; > + par->format = ifilter->format; > + par->width = ifilter->width; > + par->height = ifilter->height; > + > + ret = av_buffersrc_parameters_set(ifilter->filter, par); > + if (ret < 0) > + goto fail; > + av_freep(&par); > + last_filter = ifilter->filter; > + > + if (in->filter_ctx->input_pads[in->pad_idx].type == AVMEDIA_TYPE_VIDEO) { AVFilterPad is a type internal to libavfilter; it must not be used directly outside of libavfilter. Use avfilter_pad_get_type() instead. > + ret = insert_filter(&last_filter, &pad_idx, "graphicsub2video", > NULL); > + if (ret < 0) > + return ret; > + } > + > + if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < > 0) > + return ret; > > return 0; > +fail: > + av_freep(&par); > + > + return ret; > } > > static int configure_input_video_filter(FilterGraph *fg, InputFilter > *ifilter, > @@ -710,8 +800,15 @@ static int configure_input_video_filter(FilterGraph *fg, > InputFilter *ifilter, > char name[255]; > int ret, pad_idx = 0; > int64_t tsoffset = 0; > - AVBufferSrcParameters *par = av_buffersrc_parameters_alloc(); > + AVBufferSrcParameters *par; > > + if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_SUBTITLE) { > + // Automatically insert conversion filter to retain compatibility > + // with sub2video command lines > + return configure_input_subtitle_filter(fg, ifilter, in); > + } > + > + par = av_buffersrc_parameters_alloc(); > if (!par) > return AVERROR(ENOMEM); > memset(par, 0, sizeof(*par)); > @@ -726,12 +823,6 @@ static int configure_input_video_filter(FilterGraph *fg, > InputFilter *ifilter, > if (!fr.num) > fr = av_guess_frame_rate(input_files[ist->file_index]->ctx, ist->st, > NULL); > > - if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_SUBTITLE) { > - ret = sub2video_prepare(ist, ifilter); > - if (ret < 0) > - goto fail; > - } > - > sar = ifilter->sample_aspect_ratio; > if(!sar.den) > sar = (AVRational){0,1}; > @@ -743,7 +834,7 @@ static int configure_input_video_filter(FilterGraph *fg, > InputFilter *ifilter, > tb.num, tb.den, sar.num, sar.den); > if (fr.num && fr.den) > av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den); > - snprintf(name, sizeof(name), "graph %d input from stream %d:%d", > fg->index, > + snprintf(name, sizeof(name), "graph %d video input from stream %d:%d", > fg->index, > ist->file_index, ist->st->index); > > > @@ -966,6 +1057,7 @@ static int configure_input_filter(FilterGraph *fg, > InputFilter *ifilter, > switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) { > case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, > ifilter, in); > case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, > ifilter, in); > + case AVMEDIA_TYPE_SUBTITLE: return configure_input_subtitle_filter(fg, > ifilter, in); > default: av_assert0(0); return 0; > } > } > @@ -1133,19 +1225,6 @@ int configure_filtergraph(FilterGraph *fg) > } > } > > - /* process queued up subtitle packets */ > - for (i = 0; i < fg->nb_inputs; i++) { > - InputStream *ist = fg->inputs[i]->ist; > - if (ist->sub2video.sub_queue && ist->sub2video.frame) { > - while (av_fifo_size(ist->sub2video.sub_queue)) { > - AVSubtitle tmp; > - av_fifo_generic_read(ist->sub2video.sub_queue, &tmp, > sizeof(tmp), NULL); > - sub2video_update(ist, INT64_MIN, &tmp); > - avsubtitle_free(&tmp); > - } > - } > - } > - > return 0; > > fail: > @@ -1168,6 +1247,7 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, > const AVFrame *frame) > ifilter->sample_rate = frame->sample_rate; > ifilter->channels = frame->channels; > ifilter->channel_layout = frame->channel_layout; > + ifilter->type = frame->type; > > av_freep(&ifilter->displaymatrix); > sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX); > diff --git a/fftools/ffmpeg_hw.c b/fftools/ffmpeg_hw.c > index 14e702bd92..be69d54aaf 100644 > --- a/fftools/ffmpeg_hw.c > +++ b/fftools/ffmpeg_hw.c > @@ -449,7 +449,7 @@ int hw_device_setup_for_encode(OutputStream *ost) > AVBufferRef *frames_ref = NULL; > int i; > > - if (ost->filter) { > + if (ost->filter && ost->filter->filter) { > frames_ref = av_buffersink_get_hw_frames_ctx(ost->filter->filter); > if (frames_ref && > ((AVHWFramesContext*)frames_ref->data)->format == > diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c > index 1d6d29cfc9..5a290c946f 100644 > --- a/fftools/ffmpeg_opt.c > +++ b/fftools/ffmpeg_opt.c > @@ -2150,8 +2150,9 @@ static void init_output_filter(OutputFilter *ofilter, > OptionsContext *o, > switch (ofilter->type) { > case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break; > case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break; > + case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc, -1); break; > default: > - av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are > supported " > + av_log(NULL, AV_LOG_FATAL, "Only video, audio and subtitle filters > are supported " > "currently.\n"); > exit_program(1); > } > diff --git a/tests/ref/fate/sub2video b/tests/ref/fate/sub2video > index 80abe9c905..b53c3d95ad 100644 > --- a/tests/ref/fate/sub2video > +++ b/tests/ref/fate/sub2video > @@ -10,7 +10,6 @@ > 0, 0, 0, 1, 518400, 0x83c27b82 > 0, 1, 1, 1, 518400, 0x4051c7f9 > 0, 2, 2, 1, 518400, 0xfb00e17e > -1, 499000, 499000, 4960000, 1015, 0x19e092d2 > 0, 3, 3, 1, 518400, 0x192abb74 > 0, 4, 4, 1, 518400, 0x4669a88b > 0, 5, 5, 1, 518400, 0xaababe00 > @@ -58,129 +57,86 @@ > 0, 47, 47, 1, 518400, 0xde69683f > 0, 48, 48, 1, 518400, 0x7df08fba > 0, 49, 49, 1, 518400, 0xbab197ea > -1, 15355000, 15355000, 4733000, 2094, 0x3c171425 > 0, 77, 77, 1, 518400, 0x902285d9 > 0, 100, 100, 1, 518400, 0xbab197ea > -1, 48797000, 48797000, 2560000, 2480, 0x7c0edf21 > 0, 244, 244, 1, 518400, 0x7a11c812 > 0, 257, 257, 1, 518400, 0xbab197ea > -1, 51433000, 51433000, 2366000, 3059, 0xc95b8a05 > 0, 258, 258, 1, 518400, 0x34cdddee > 0, 269, 269, 1, 518400, 0xbab197ea > -1, 53910000, 53910000, 2696000, 2095, 0x61bb15ed > 0, 270, 270, 1, 518400, 0x4db4ce51 > 0, 283, 283, 1, 518400, 0xbab197ea > -1, 56663000, 56663000, 1262000, 1013, 0xc9ae89b7 > 0, 284, 284, 1, 518400, 0xe6bc0ea9 > 0, 290, 290, 1, 518400, 0xbab197ea > -1, 58014000, 58014000, 1661000, 969, 0xe01878f0 > 0, 291, 291, 1, 518400, 0xa8643af7 > 0, 298, 298, 1, 518400, 0xbab197ea > -1, 67724000, 67724000, 1365000, 844, 0xe7db4fc1 > 0, 339, 339, 1, 518400, 0xb1885c67 > 0, 345, 345, 1, 518400, 0xbab197ea > -1, 69175000, 69175000, 1558000, 802, 0xf48531ba > 0, 346, 346, 1, 518400, 0x378e3fd0 > 0, 354, 354, 1, 518400, 0xbab197ea > -1, 70819000, 70819000, 1865000, 1709, 0xb4d5a1bd > 0, 355, 355, 1, 518400, 0xa3782469 > 0, 363, 363, 1, 518400, 0xbab197ea > -1, 72762000, 72762000, 1968000, 2438, 0x99d7bc82 > 0, 364, 364, 1, 518400, 0xba23a0d5 > 0, 374, 374, 1, 518400, 0xbab197ea > -1, 74806000, 74806000, 1831000, 2116, 0x96514097 > 0, 375, 375, 1, 518400, 0x129de2f8 > 0, 383, 383, 1, 518400, 0xbab197ea > -1, 76716000, 76716000, 1262000, 1822, 0xefccc72e > 0, 384, 384, 1, 518400, 0x19772f0f > 0, 390, 390, 1, 518400, 0xbab197ea > -1, 78051000, 78051000, 1524000, 987, 0x7b927a27 > 0, 391, 391, 1, 518400, 0x56f54e73 > 0, 398, 398, 1, 518400, 0xbab197ea > -1, 79644000, 79644000, 2662000, 2956, 0x190778f7 > 0, 399, 399, 1, 518400, 0x300b5247 > -1, 82380000, 82380000, 2764000, 3094, 0xc021b7d3 > 0, 412, 412, 1, 518400, 0xbab197ea > 0, 413, 413, 1, 518400, 0x6fd028fa > 0, 426, 426, 1, 518400, 0xbab197ea > -1, 85225000, 85225000, 2366000, 2585, 0x74d0048f > 0, 427, 427, 1, 518400, 0x01f80e9d > 0, 438, 438, 1, 518400, 0xbab197ea > -1, 87652000, 87652000, 1831000, 634, 0x8832fda1 > 0, 439, 439, 1, 518400, 0xb48d90c0 > 0, 447, 447, 1, 518400, 0xbab197ea > -1, 91531000, 91531000, 2332000, 2080, 0x97a1146f > 0, 458, 458, 1, 518400, 0xcb5a0173 > 0, 469, 469, 1, 518400, 0xbab197ea > -1, 95510000, 95510000, 3299000, 2964, 0x8b8f6684 > 0, 478, 478, 1, 518400, 0xb8a323e4 > 0, 494, 494, 1, 518400, 0xbab197ea > -1, 98872000, 98872000, 2161000, 1875, 0x9002ef71 > 0, 495, 495, 1, 518400, 0xc43518ba > 0, 505, 505, 1, 518400, 0xbab197ea > -1, 101124000, 101124000, 4096000, 3872, 0x20c6ed9c > 0, 506, 506, 1, 518400, 0x04e38692 > 0, 526, 526, 1, 518400, 0xbab197ea > -1, 105303000, 105303000, 2730000, 3094, 0xf203a663 > 0, 527, 527, 1, 518400, 0x856b0ee5 > 0, 540, 540, 1, 518400, 0xbab197ea > -1, 108106000, 108106000, 2059000, 2404, 0x41a7b429 > 0, 541, 541, 1, 518400, 0x3e5beee2 > 0, 551, 551, 1, 518400, 0xbab197ea > -1, 141556000, 141556000, 1661000, 1088, 0xde20aa20 > 0, 708, 708, 1, 518400, 0xb8bc1365 > 0, 716, 716, 1, 518400, 0xbab197ea > 0, 817, 817, 1, 518400, 0x83efa32d > -1, 163445000, 163445000, 1331000, 339, 0x8bd186ef > 0, 824, 824, 1, 518400, 0xbab197ea > 0, 840, 840, 1, 518400, 0x03ea0e90 > -1, 168049000, 168049000, 1900000, 1312, 0x0bf20e8d > 0, 850, 850, 1, 518400, 0xbab197ea > -1, 170035000, 170035000, 1524000, 1279, 0xb6c2dafe > 0, 851, 851, 1, 518400, 0x8780239e > 0, 858, 858, 1, 518400, 0xbab197ea > 0, 861, 861, 1, 518400, 0x6eb72347 > -1, 172203000, 172203000, 1695000, 1826, 0x9a1ac769 > 0, 869, 869, 1, 518400, 0xbab197ea > -1, 173947000, 173947000, 1934000, 1474, 0xa9b03cdc > 0, 870, 870, 1, 518400, 0x9c4a3a3d > 0, 879, 879, 1, 518400, 0xbab197ea > -1, 175957000, 175957000, 1763000, 1019, 0x20409355 > 0, 880, 880, 1, 518400, 0xc9ebfa89 > 0, 889, 889, 1, 518400, 0xbab197ea > 0, 946, 946, 1, 518400, 0xbaf801ef > -1, 189295000, 189295000, 1968000, 1596, 0x408c726e > 0, 956, 956, 1, 518400, 0xbab197ea > -1, 191356000, 191356000, 1228000, 1517, 0xae8c5c2b > 0, 957, 957, 1, 518400, 0x59f4e72f > 0, 963, 963, 1, 518400, 0xbab197ea > -1, 192640000, 192640000, 1763000, 2506, 0xa458d6d4 > 0, 964, 964, 1, 518400, 0x9d5b9d69 > 0, 972, 972, 1, 518400, 0xbab197ea > -1, 195193000, 195193000, 1092000, 1074, 0x397ba9a8 > 0, 976, 976, 1, 518400, 0x923d1ce7 > 0, 981, 981, 1, 518400, 0xbab197ea > -1, 196361000, 196361000, 1524000, 1715, 0x695ca41e > 0, 982, 982, 1, 518400, 0x6e652cd2 > 0, 989, 989, 1, 518400, 0xbab197ea > -1, 197946000, 197946000, 1160000, 789, 0xc63a189e > 0, 990, 990, 1, 518400, 0x25113966 > 0, 996, 996, 1, 518400, 0xbab197ea > -1, 199230000, 199230000, 1627000, 1846, 0xeea8c599 > 0, 997, 997, 1, 518400, 0x2dc83609 > 0, 1004, 1004, 1, 518400, 0xbab197ea > -1, 200924000, 200924000, 1763000, 922, 0xd4a87222 > 0, 1005, 1005, 1, 518400, 0x90483bc6 > 0, 1013, 1013, 1, 518400, 0xbab197ea > 0, 1053, 1053, 1, 518400, 0x3de86ab7 > -1, 210600000, 210600000, 1831000, 665, 0x55580135 > 0, 1062, 1062, 1, 518400, 0xbab197ea > -1, 214771000, 214771000, 1558000, 1216, 0x50d1f6c5 > 0, 1074, 1074, 1, 518400, 0x8c320e68 > 0, 1082, 1082, 1, 518400, 0xbab197ea > 0, 1128, 1128, 1, 518400, 0x81e977b2 > -1, 225640000, 225640000, 2127000, 2133, 0x670c11a5 > 0, 1139, 1139, 1, 518400, 0xbab197ea > -1, 227834000, 227834000, 1262000, 1264, 0xc1d9fc57 > 0, 1140, 1140, 1, 518400, 0xb046dd30 > -0, 1145, 1145, 1, 518400, 0xbab197ea There is something wrong with this test. All the subtitles are just gone. - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".