mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
3d35b73b2a
commit
5d530e3a72
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue