diff mbox series

[FFmpeg-devel] avformat/subtitles: Deduplicate subtitles' read_(packet|seek|close)

Message ID AM7PR03MB66606F4A0CDA15ED17FD61BA8F199@AM7PR03MB6660.eurprd03.prod.outlook.com
State Accepted
Commit ea5bdc8893e4c1d5c3b417afad78ccedaa831789
Headers show
Series [FFmpeg-devel] avformat/subtitles: Deduplicate subtitles' read_(packet|seek|close) | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Andreas Rheinhardt July 8, 2021, 9:09 p.m. UTC
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavformat/assdec.c        | 27 +++------------------------
 libavformat/jacosubdec.c    | 29 ++++-------------------------
 libavformat/lrcdec.c        | 27 +++------------------------
 libavformat/mccdec.c        | 27 +++------------------------
 libavformat/mpl2dec.c       | 27 +++------------------------
 libavformat/mpsubdec.c      | 27 +++------------------------
 libavformat/pjsdec.c        | 27 +++------------------------
 libavformat/realtextdec.c   | 27 +++------------------------
 libavformat/samidec.c       | 27 +++------------------------
 libavformat/sccdec.c        | 27 +++------------------------
 libavformat/srtdec.c        | 27 +++------------------------
 libavformat/stldec.c        | 26 +++-----------------------
 libavformat/subtitles.c     | 21 +++++++++++++++++++++
 libavformat/subtitles.h     |  7 +++++++
 libavformat/subviewer1dec.c | 27 +++------------------------
 libavformat/subviewerdec.c  | 27 +++------------------------
 libavformat/vplayerdec.c    | 27 +++------------------------
 17 files changed, 74 insertions(+), 360 deletions(-)

Comments

Andreas Rheinhardt July 18, 2021, 3:10 a.m. UTC | #1
Andreas Rheinhardt:
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
> ---
>  libavformat/assdec.c        | 27 +++------------------------
>  libavformat/jacosubdec.c    | 29 ++++-------------------------
>  libavformat/lrcdec.c        | 27 +++------------------------
>  libavformat/mccdec.c        | 27 +++------------------------
>  libavformat/mpl2dec.c       | 27 +++------------------------
>  libavformat/mpsubdec.c      | 27 +++------------------------
>  libavformat/pjsdec.c        | 27 +++------------------------
>  libavformat/realtextdec.c   | 27 +++------------------------
>  libavformat/samidec.c       | 27 +++------------------------
>  libavformat/sccdec.c        | 27 +++------------------------
>  libavformat/srtdec.c        | 27 +++------------------------
>  libavformat/stldec.c        | 26 +++-----------------------
>  libavformat/subtitles.c     | 21 +++++++++++++++++++++
>  libavformat/subtitles.h     |  7 +++++++
>  libavformat/subviewer1dec.c | 27 +++------------------------
>  libavformat/subviewerdec.c  | 27 +++------------------------
>  libavformat/vplayerdec.c    | 27 +++------------------------
>  17 files changed, 74 insertions(+), 360 deletions(-)
> 
Will apply.

- Andreas
Nicolas George July 19, 2021, 10:43 a.m. UTC | #2
Andreas Rheinhardt (12021-07-18):
> Will apply.

I have seen more and more of these "will apply" messages, but I am
doubting their usefulness.

"Applied" messages are useful to close the discussion. People reading
the archives know that the patch is there, the bug is fixed, the feature
is added. The future version does not give the same information.

"Will apply" messages can be useful if you leave some time to people to
react: patch, 7 days, "will apply", 1 day, apply, "applied". But it
needs enough time.

I think the old habits, "will push tomorrow if nobody objects", and
"pushed" then, were better.

Regards,
diff mbox series

Patch

diff --git a/libavformat/assdec.c b/libavformat/assdec.c
index 5f71fcb024..2ab7fb9efb 100644
--- a/libavformat/assdec.c
+++ b/libavformat/assdec.c
@@ -50,13 +50,6 @@  static int ass_probe(const AVProbeData *p)
     return 0;
 }
 
-static int ass_read_close(AVFormatContext *s)
-{
-    ASSContext *ass = s->priv_data;
-    ff_subtitles_queue_clean(&ass->q);
-    return 0;
-}
-
 static int read_dialogue(ASSContext *ass, AVBPrint *dst, const uint8_t *p,
                          int64_t *start, int *duration)
 {
@@ -166,20 +159,6 @@  end:
     return res;
 }
 
-static int ass_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    ASSContext *ass = s->priv_data;
-    return ff_subtitles_queue_read_packet(&ass->q, pkt);
-}
-
-static int ass_read_seek(AVFormatContext *s, int stream_index,
-                         int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    ASSContext *ass = s->priv_data;
-    return ff_subtitles_queue_seek(&ass->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
 const AVInputFormat ff_ass_demuxer = {
     .name           = "ass",
     .long_name      = NULL_IF_CONFIG_SMALL("SSA (SubStation Alpha) subtitle"),
@@ -187,7 +166,7 @@  const AVInputFormat ff_ass_demuxer = {
     .priv_data_size = sizeof(ASSContext),
     .read_probe     = ass_probe,
     .read_header    = ass_read_header,
-    .read_packet    = ass_read_packet,
-    .read_close     = ass_read_close,
-    .read_seek2     = ass_read_seek,
+    .read_packet    = ff_subtitles_read_packet,
+    .read_close     = ff_subtitles_read_close,
+    .read_seek2     = ff_subtitles_read_seek,
 };
diff --git a/libavformat/jacosubdec.c b/libavformat/jacosubdec.c
index 510219224f..8cb918ccee 100644
--- a/libavformat/jacosubdec.c
+++ b/libavformat/jacosubdec.c
@@ -35,9 +35,9 @@ 
 #include "libavutil/intreadwrite.h"
 
 typedef struct {
+    FFDemuxSubtitlesQueue q;
     int shift;
     unsigned timeres;
-    FFDemuxSubtitlesQueue q;
 } JACOsubContext;
 
 static int timed_line(const char *ptr)
@@ -93,13 +93,6 @@  static int get_jss_cmd(char k)
     return -1;
 }
 
-static int jacosub_read_close(AVFormatContext *s)
-{
-    JACOsubContext *jacosub = s->priv_data;
-    ff_subtitles_queue_clean(&jacosub->q);
-    return 0;
-}
-
 static const char *read_ts(JACOsubContext *jacosub, const char *buf,
                            int64_t *start, int64_t *duration)
 {
@@ -258,20 +251,6 @@  static int jacosub_read_header(AVFormatContext *s)
     return 0;
 }
 
-static int jacosub_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    JACOsubContext *jacosub = s->priv_data;
-    return ff_subtitles_queue_read_packet(&jacosub->q, pkt);
-}
-
-static int jacosub_read_seek(AVFormatContext *s, int stream_index,
-                             int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    JACOsubContext *jacosub = s->priv_data;
-    return ff_subtitles_queue_seek(&jacosub->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
 const AVInputFormat ff_jacosub_demuxer = {
     .name           = "jacosub",
     .long_name      = NULL_IF_CONFIG_SMALL("JACOsub subtitle format"),
@@ -279,7 +258,7 @@  const AVInputFormat ff_jacosub_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = jacosub_probe,
     .read_header    = jacosub_read_header,
-    .read_packet    = jacosub_read_packet,
-    .read_seek2     = jacosub_read_seek,
-    .read_close     = jacosub_read_close,
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/lrcdec.c b/libavformat/lrcdec.c
index 309014d630..fff39495f8 100644
--- a/libavformat/lrcdec.c
+++ b/libavformat/lrcdec.c
@@ -218,27 +218,6 @@  static int lrc_read_header(AVFormatContext *s)
     return 0;
 }
 
-static int lrc_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    LRCContext *lrc = s->priv_data;
-    return ff_subtitles_queue_read_packet(&lrc->q, pkt);
-}
-
-static int lrc_read_seek(AVFormatContext *s, int stream_index,
-                         int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    LRCContext *lrc = s->priv_data;
-    return ff_subtitles_queue_seek(&lrc->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int lrc_read_close(AVFormatContext *s)
-{
-    LRCContext *lrc = s->priv_data;
-    ff_subtitles_queue_clean(&lrc->q);
-    return 0;
-}
-
 const AVInputFormat ff_lrc_demuxer = {
     .name           = "lrc",
     .long_name      = NULL_IF_CONFIG_SMALL("LRC lyrics"),
@@ -246,7 +225,7 @@  const AVInputFormat ff_lrc_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = lrc_probe,
     .read_header    = lrc_read_header,
-    .read_packet    = lrc_read_packet,
-    .read_close     = lrc_read_close,
-    .read_seek2     = lrc_read_seek
+    .read_packet    = ff_subtitles_read_packet,
+    .read_close     = ff_subtitles_read_close,
+    .read_seek2     = ff_subtitles_read_seek
 };
diff --git a/libavformat/mccdec.c b/libavformat/mccdec.c
index 0bc13ceaa6..8c36b27f12 100644
--- a/libavformat/mccdec.c
+++ b/libavformat/mccdec.c
@@ -200,27 +200,6 @@  static int mcc_read_header(AVFormatContext *s)
     return ret;
 }
 
-static int mcc_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    MCCContext *mcc = s->priv_data;
-    return ff_subtitles_queue_read_packet(&mcc->q, pkt);
-}
-
-static int mcc_read_seek(AVFormatContext *s, int stream_index,
-                         int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    MCCContext *mcc = s->priv_data;
-    return ff_subtitles_queue_seek(&mcc->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int mcc_read_close(AVFormatContext *s)
-{
-    MCCContext *mcc = s->priv_data;
-    ff_subtitles_queue_clean(&mcc->q);
-    return 0;
-}
-
 const AVInputFormat ff_mcc_demuxer = {
     .name           = "mcc",
     .long_name      = NULL_IF_CONFIG_SMALL("MacCaption"),
@@ -228,8 +207,8 @@  const AVInputFormat ff_mcc_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = mcc_probe,
     .read_header    = mcc_read_header,
-    .read_packet    = mcc_read_packet,
-    .read_seek2     = mcc_read_seek,
-    .read_close     = mcc_read_close,
     .extensions     = "mcc",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/mpl2dec.c b/libavformat/mpl2dec.c
index 0beb9ca388..912a707d1a 100644
--- a/libavformat/mpl2dec.c
+++ b/libavformat/mpl2dec.c
@@ -122,27 +122,6 @@  static int mpl2_read_header(AVFormatContext *s)
     return 0;
 }
 
-static int mpl2_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    MPL2Context *mpl2 = s->priv_data;
-    return ff_subtitles_queue_read_packet(&mpl2->q, pkt);
-}
-
-static int mpl2_read_seek(AVFormatContext *s, int stream_index,
-                          int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    MPL2Context *mpl2 = s->priv_data;
-    return ff_subtitles_queue_seek(&mpl2->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int mpl2_read_close(AVFormatContext *s)
-{
-    MPL2Context *mpl2 = s->priv_data;
-    ff_subtitles_queue_clean(&mpl2->q);
-    return 0;
-}
-
 const AVInputFormat ff_mpl2_demuxer = {
     .name           = "mpl2",
     .long_name      = NULL_IF_CONFIG_SMALL("MPL2 subtitles"),
@@ -150,8 +129,8 @@  const AVInputFormat ff_mpl2_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = mpl2_probe,
     .read_header    = mpl2_read_header,
-    .read_packet    = mpl2_read_packet,
-    .read_seek2     = mpl2_read_seek,
-    .read_close     = mpl2_read_close,
     .extensions     = "txt,mpl2",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/mpsubdec.c b/libavformat/mpsubdec.c
index abf0e7fb9a..d290a41fb9 100644
--- a/libavformat/mpsubdec.c
+++ b/libavformat/mpsubdec.c
@@ -169,27 +169,6 @@  end:
     return res;
 }
 
-static int mpsub_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    MPSubContext *mpsub = s->priv_data;
-    return ff_subtitles_queue_read_packet(&mpsub->q, pkt);
-}
-
-static int mpsub_read_seek(AVFormatContext *s, int stream_index,
-                           int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    MPSubContext *mpsub = s->priv_data;
-    return ff_subtitles_queue_seek(&mpsub->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int mpsub_read_close(AVFormatContext *s)
-{
-    MPSubContext *mpsub = s->priv_data;
-    ff_subtitles_queue_clean(&mpsub->q);
-    return 0;
-}
-
 const AVInputFormat ff_mpsub_demuxer = {
     .name           = "mpsub",
     .long_name      = NULL_IF_CONFIG_SMALL("MPlayer subtitles"),
@@ -197,8 +176,8 @@  const AVInputFormat ff_mpsub_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = mpsub_probe,
     .read_header    = mpsub_read_header,
-    .read_packet    = mpsub_read_packet,
-    .read_seek2     = mpsub_read_seek,
-    .read_close     = mpsub_read_close,
     .extensions     = "sub",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/pjsdec.c b/libavformat/pjsdec.c
index 1fc16831ea..5b2111f726 100644
--- a/libavformat/pjsdec.c
+++ b/libavformat/pjsdec.c
@@ -105,27 +105,6 @@  static int pjs_read_header(AVFormatContext *s)
     return 0;
 }
 
-static int pjs_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    PJSContext *pjs = s->priv_data;
-    return ff_subtitles_queue_read_packet(&pjs->q, pkt);
-}
-
-static int pjs_read_seek(AVFormatContext *s, int stream_index,
-                         int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    PJSContext *pjs = s->priv_data;
-    return ff_subtitles_queue_seek(&pjs->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int pjs_read_close(AVFormatContext *s)
-{
-    PJSContext *pjs = s->priv_data;
-    ff_subtitles_queue_clean(&pjs->q);
-    return 0;
-}
-
 const AVInputFormat ff_pjs_demuxer = {
     .name           = "pjs",
     .long_name      = NULL_IF_CONFIG_SMALL("PJS (Phoenix Japanimation Society) subtitles"),
@@ -133,8 +112,8 @@  const AVInputFormat ff_pjs_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = pjs_probe,
     .read_header    = pjs_read_header,
-    .read_packet    = pjs_read_packet,
-    .read_seek2     = pjs_read_seek,
-    .read_close     = pjs_read_close,
     .extensions     = "pjs",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/realtextdec.c b/libavformat/realtextdec.c
index e0e2cc90e6..c281dec346 100644
--- a/libavformat/realtextdec.c
+++ b/libavformat/realtextdec.c
@@ -127,27 +127,6 @@  end:
     return res;
 }
 
-static int realtext_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    RealTextContext *rt = s->priv_data;
-    return ff_subtitles_queue_read_packet(&rt->q, pkt);
-}
-
-static int realtext_read_seek(AVFormatContext *s, int stream_index,
-                             int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    RealTextContext *rt = s->priv_data;
-    return ff_subtitles_queue_seek(&rt->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int realtext_read_close(AVFormatContext *s)
-{
-    RealTextContext *rt = s->priv_data;
-    ff_subtitles_queue_clean(&rt->q);
-    return 0;
-}
-
 const AVInputFormat ff_realtext_demuxer = {
     .name           = "realtext",
     .long_name      = NULL_IF_CONFIG_SMALL("RealText subtitle format"),
@@ -155,8 +134,8 @@  const AVInputFormat ff_realtext_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = realtext_probe,
     .read_header    = realtext_read_header,
-    .read_packet    = realtext_read_packet,
-    .read_seek2     = realtext_read_seek,
-    .read_close     = realtext_read_close,
     .extensions     = "rt",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/samidec.c b/libavformat/samidec.c
index c23335cf4d..698164b6a2 100644
--- a/libavformat/samidec.c
+++ b/libavformat/samidec.c
@@ -119,27 +119,6 @@  end:
     return res;
 }
 
-static int sami_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    SAMIContext *sami = s->priv_data;
-    return ff_subtitles_queue_read_packet(&sami->q, pkt);
-}
-
-static int sami_read_seek(AVFormatContext *s, int stream_index,
-                          int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    SAMIContext *sami = s->priv_data;
-    return ff_subtitles_queue_seek(&sami->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int sami_read_close(AVFormatContext *s)
-{
-    SAMIContext *sami = s->priv_data;
-    ff_subtitles_queue_clean(&sami->q);
-    return 0;
-}
-
 const AVInputFormat ff_sami_demuxer = {
     .name           = "sami",
     .long_name      = NULL_IF_CONFIG_SMALL("SAMI subtitle format"),
@@ -147,8 +126,8 @@  const AVInputFormat ff_sami_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = sami_probe,
     .read_header    = sami_read_header,
-    .read_packet    = sami_read_packet,
-    .read_seek2     = sami_read_seek,
-    .read_close     = sami_read_close,
     .extensions     = "smi,sami",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/sccdec.c b/libavformat/sccdec.c
index e59e015bbc..e95fd881a3 100644
--- a/libavformat/sccdec.c
+++ b/libavformat/sccdec.c
@@ -177,27 +177,6 @@  static int scc_read_header(AVFormatContext *s)
     return 0;
 }
 
-static int scc_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    SCCContext *scc = s->priv_data;
-    return ff_subtitles_queue_read_packet(&scc->q, pkt);
-}
-
-static int scc_read_seek(AVFormatContext *s, int stream_index,
-                         int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    SCCContext *scc = s->priv_data;
-    return ff_subtitles_queue_seek(&scc->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int scc_read_close(AVFormatContext *s)
-{
-    SCCContext *scc = s->priv_data;
-    ff_subtitles_queue_clean(&scc->q);
-    return 0;
-}
-
 const AVInputFormat ff_scc_demuxer = {
     .name           = "scc",
     .long_name      = NULL_IF_CONFIG_SMALL("Scenarist Closed Captions"),
@@ -205,8 +184,8 @@  const AVInputFormat ff_scc_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = scc_probe,
     .read_header    = scc_read_header,
-    .read_packet    = scc_read_packet,
-    .read_seek2     = scc_read_seek,
-    .read_close     = scc_read_close,
     .extensions     = "scc",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/srtdec.c b/libavformat/srtdec.c
index 2f8a677b9f..bf02450555 100644
--- a/libavformat/srtdec.c
+++ b/libavformat/srtdec.c
@@ -211,27 +211,6 @@  end:
     return res;
 }
 
-static int srt_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    SRTContext *srt = s->priv_data;
-    return ff_subtitles_queue_read_packet(&srt->q, pkt);
-}
-
-static int srt_read_seek(AVFormatContext *s, int stream_index,
-                         int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    SRTContext *srt = s->priv_data;
-    return ff_subtitles_queue_seek(&srt->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int srt_read_close(AVFormatContext *s)
-{
-    SRTContext *srt = s->priv_data;
-    ff_subtitles_queue_clean(&srt->q);
-    return 0;
-}
-
 const AVInputFormat ff_srt_demuxer = {
     .name        = "srt",
     .long_name   = NULL_IF_CONFIG_SMALL("SubRip subtitle"),
@@ -239,7 +218,7 @@  const AVInputFormat ff_srt_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe  = srt_probe,
     .read_header = srt_read_header,
-    .read_packet = srt_read_packet,
-    .read_seek2  = srt_read_seek,
-    .read_close  = srt_read_close,
+    .read_packet = ff_subtitles_read_packet,
+    .read_seek2  = ff_subtitles_read_seek,
+    .read_close  = ff_subtitles_read_close,
 };
diff --git a/libavformat/stldec.c b/libavformat/stldec.c
index 48e18d865e..b5c8439dc2 100644
--- a/libavformat/stldec.c
+++ b/libavformat/stldec.c
@@ -107,26 +107,6 @@  static int stl_read_header(AVFormatContext *s)
     ff_subtitles_queue_finalize(s, &stl->q);
     return 0;
 }
-static int stl_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    STLContext *stl = s->priv_data;
-    return ff_subtitles_queue_read_packet(&stl->q, pkt);
-}
-
-static int stl_read_seek(AVFormatContext *s, int stream_index,
-                             int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    STLContext *stl = s->priv_data;
-    return ff_subtitles_queue_seek(&stl->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int stl_read_close(AVFormatContext *s)
-{
-    STLContext *stl = s->priv_data;
-    ff_subtitles_queue_clean(&stl->q);
-    return 0;
-}
 
 const AVInputFormat ff_stl_demuxer = {
     .name           = "stl",
@@ -135,8 +115,8 @@  const AVInputFormat ff_stl_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = stl_probe,
     .read_header    = stl_read_header,
-    .read_packet    = stl_read_packet,
-    .read_seek2     = stl_read_seek,
-    .read_close     = stl_read_close,
     .extensions     = "stl",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c
index 6368ec74f9..82aaa358c0 100644
--- a/libavformat/subtitles.c
+++ b/libavformat/subtitles.c
@@ -314,6 +314,27 @@  void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
     q->nb_subs = q->allocated_size = q->current_sub_idx = 0;
 }
 
+int ff_subtitles_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    FFDemuxSubtitlesQueue *q = s->priv_data;
+    return ff_subtitles_queue_read_packet(q, pkt);
+}
+
+int ff_subtitles_read_seek(AVFormatContext *s, int stream_index,
+                           int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
+{
+    FFDemuxSubtitlesQueue *q = s->priv_data;
+    return ff_subtitles_queue_seek(q, s, stream_index,
+                                   min_ts, ts, max_ts, flags);
+}
+
+int ff_subtitles_read_close(AVFormatContext *s)
+{
+    FFDemuxSubtitlesQueue *q = s->priv_data;
+    ff_subtitles_queue_clean(q);
+    return 0;
+}
+
 int ff_smil_extract_next_text_chunk(FFTextReader *tr, AVBPrint *buf, char *c)
 {
     int i = 0;
diff --git a/libavformat/subtitles.h b/libavformat/subtitles.h
index ca769639be..37ca7b19b1 100644
--- a/libavformat/subtitles.h
+++ b/libavformat/subtitles.h
@@ -143,6 +143,13 @@  int ff_subtitles_queue_seek(FFDemuxSubtitlesQueue *q, AVFormatContext *s, int st
  */
 void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q);
 
+int ff_subtitles_read_packet(AVFormatContext *s, AVPacket *pkt);
+
+int ff_subtitles_read_seek(AVFormatContext *s, int stream_index,
+                           int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
+
+int ff_subtitles_read_close(AVFormatContext *s);
+
 /**
  * SMIL helper to load next chunk ("<...>" or untagged content) in buf.
  *
diff --git a/libavformat/subviewer1dec.c b/libavformat/subviewer1dec.c
index f1267031f8..bdcbef30ef 100644
--- a/libavformat/subviewer1dec.c
+++ b/libavformat/subviewer1dec.c
@@ -90,27 +90,6 @@  static int subviewer1_read_header(AVFormatContext *s)
     return 0;
 }
 
-static int subviewer1_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    SubViewer1Context *subviewer1 = s->priv_data;
-    return ff_subtitles_queue_read_packet(&subviewer1->q, pkt);
-}
-
-static int subviewer1_read_seek(AVFormatContext *s, int stream_index,
-                               int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    SubViewer1Context *subviewer1 = s->priv_data;
-    return ff_subtitles_queue_seek(&subviewer1->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int subviewer1_read_close(AVFormatContext *s)
-{
-    SubViewer1Context *subviewer1 = s->priv_data;
-    ff_subtitles_queue_clean(&subviewer1->q);
-    return 0;
-}
-
 const AVInputFormat ff_subviewer1_demuxer = {
     .name           = "subviewer1",
     .long_name      = NULL_IF_CONFIG_SMALL("SubViewer v1 subtitle format"),
@@ -118,8 +97,8 @@  const AVInputFormat ff_subviewer1_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = subviewer1_probe,
     .read_header    = subviewer1_read_header,
-    .read_packet    = subviewer1_read_packet,
-    .read_seek2     = subviewer1_read_seek,
-    .read_close     = subviewer1_read_close,
     .extensions     = "sub",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/subviewerdec.c b/libavformat/subviewerdec.c
index 2ef3c088eb..bcd103bd86 100644
--- a/libavformat/subviewerdec.c
+++ b/libavformat/subviewerdec.c
@@ -180,27 +180,6 @@  end:
     return res;
 }
 
-static int subviewer_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    SubViewerContext *subviewer = s->priv_data;
-    return ff_subtitles_queue_read_packet(&subviewer->q, pkt);
-}
-
-static int subviewer_read_seek(AVFormatContext *s, int stream_index,
-                               int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    SubViewerContext *subviewer = s->priv_data;
-    return ff_subtitles_queue_seek(&subviewer->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int subviewer_read_close(AVFormatContext *s)
-{
-    SubViewerContext *subviewer = s->priv_data;
-    ff_subtitles_queue_clean(&subviewer->q);
-    return 0;
-}
-
 const AVInputFormat ff_subviewer_demuxer = {
     .name           = "subviewer",
     .long_name      = NULL_IF_CONFIG_SMALL("SubViewer subtitle format"),
@@ -208,8 +187,8 @@  const AVInputFormat ff_subviewer_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = subviewer_probe,
     .read_header    = subviewer_read_header,
-    .read_packet    = subviewer_read_packet,
-    .read_seek2     = subviewer_read_seek,
-    .read_close     = subviewer_read_close,
     .extensions     = "sub",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };
diff --git a/libavformat/vplayerdec.c b/libavformat/vplayerdec.c
index 8c9ff81163..b37f6c8f64 100644
--- a/libavformat/vplayerdec.c
+++ b/libavformat/vplayerdec.c
@@ -95,27 +95,6 @@  static int vplayer_read_header(AVFormatContext *s)
     return 0;
 }
 
-static int vplayer_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    VPlayerContext *vplayer = s->priv_data;
-    return ff_subtitles_queue_read_packet(&vplayer->q, pkt);
-}
-
-static int vplayer_read_seek(AVFormatContext *s, int stream_index,
-                             int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
-{
-    VPlayerContext *vplayer = s->priv_data;
-    return ff_subtitles_queue_seek(&vplayer->q, s, stream_index,
-                                   min_ts, ts, max_ts, flags);
-}
-
-static int vplayer_read_close(AVFormatContext *s)
-{
-    VPlayerContext *vplayer = s->priv_data;
-    ff_subtitles_queue_clean(&vplayer->q);
-    return 0;
-}
-
 const AVInputFormat ff_vplayer_demuxer = {
     .name           = "vplayer",
     .long_name      = NULL_IF_CONFIG_SMALL("VPlayer subtitles"),
@@ -123,8 +102,8 @@  const AVInputFormat ff_vplayer_demuxer = {
     .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = vplayer_probe,
     .read_header    = vplayer_read_header,
-    .read_packet    = vplayer_read_packet,
-    .read_seek2     = vplayer_read_seek,
-    .read_close     = vplayer_read_close,
     .extensions     = "txt",
+    .read_packet    = ff_subtitles_read_packet,
+    .read_seek2     = ff_subtitles_read_seek,
+    .read_close     = ff_subtitles_read_close,
 };