fftools/ffmpeg_dec: move sub2video submission to ffmpeg_filter

This code is a sub2video analogue of ifilter_send_frame(), so it
properly belongs to the filtering code.

Note that using sub2video with more than one target for a given input
subtitle stream is currently broken and this commit does not change
that. It will be addressed in following commits.
This commit is contained in:
Anton Khirnov 2023-05-23 13:00:12 +02:00
parent 3d35b73b2a
commit 5d530e3a72
4 changed files with 41 additions and 16 deletions

View File

@ -755,7 +755,7 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
first_report = 0;
}
static int copy_av_subtitle(AVSubtitle *dst, const AVSubtitle *src)
int copy_av_subtitle(AVSubtitle *dst, const AVSubtitle *src)
{
int ret = AVERROR_BUG;
AVSubtitle tmp = {

View File

@ -744,9 +744,11 @@ int init_complex_filtergraph(FilterGraph *fg);
void sub2video_update(InputStream *ist, int64_t heartbeat_pts,
const AVSubtitle *sub);
int copy_av_subtitle(AVSubtitle *dst, const AVSubtitle *src);
int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame, int keep_reference);
int ifilter_send_eof(InputFilter *ifilter, int64_t pts, AVRational tb);
int ifilter_sub2video(InputFilter *ifilter, const AVSubtitle *sub);
/**
* Set up fallback filtering parameters from a decoder context. They will only

View File

@ -336,7 +336,6 @@ static void sub2video_flush(InputStream *ist)
int process_subtitle(InputStream *ist, AVSubtitle *subtitle, int *got_output)
{
int ret = 0;
int free_sub = 1;
if (ist->fix_sub_duration) {
int end = 1;
@ -361,18 +360,13 @@ int process_subtitle(InputStream *ist, AVSubtitle *subtitle, int *got_output)
if (!*got_output)
return ret;
if (ist->sub2video.frame) {
sub2video_update(ist, INT64_MIN, subtitle);
} else if (ist->nb_filters) {
if (!ist->sub2video.sub_queue)
ist->sub2video.sub_queue = av_fifo_alloc2(8, sizeof(AVSubtitle), AV_FIFO_FLAG_AUTO_GROW);
if (!ist->sub2video.sub_queue)
report_and_exit(AVERROR(ENOMEM));
ret = av_fifo_write(ist->sub2video.sub_queue, subtitle, 1);
if (ret < 0)
exit_program(1);
free_sub = 0;
for (int i = 0; i < ist->nb_filters; i++) {
ret = ifilter_sub2video(ist->filters[i], subtitle);
if (ret < 0) {
av_log(ist, AV_LOG_ERROR, "Error sending a subtitle for filtering: %s\n",
av_err2str(ret));
goto out;
}
}
if (!subtitle->num_rects)
@ -387,8 +381,7 @@ int process_subtitle(InputStream *ist, AVSubtitle *subtitle, int *got_output)
}
out:
if (free_sub)
avsubtitle_free(subtitle);
avsubtitle_free(subtitle);
return ret;
}

View File

@ -1638,6 +1638,36 @@ int reap_filters(int flush)
return 0;
}
int ifilter_sub2video(InputFilter *ifilter, const AVSubtitle *subtitle)
{
InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
InputStream *ist = ifp->ist;
int ret;
if (ist->sub2video.frame) {
sub2video_update(ist, INT64_MIN, subtitle);
} else {
AVSubtitle sub;
if (!ist->sub2video.sub_queue)
ist->sub2video.sub_queue = av_fifo_alloc2(8, sizeof(AVSubtitle), AV_FIFO_FLAG_AUTO_GROW);
if (!ist->sub2video.sub_queue)
return AVERROR(ENOMEM);
ret = copy_av_subtitle(&sub, subtitle);
if (ret < 0)
return ret;
ret = av_fifo_write(ist->sub2video.sub_queue, &sub, 1);
if (ret < 0) {
avsubtitle_free(&sub);
return ret;
}
}
return 0;
}
int ifilter_send_eof(InputFilter *ifilter, int64_t pts, AVRational tb)
{
InputFilterPriv *ifp = ifp_from_ifilter(ifilter);