Message ID | 20220823190326.249-2-lukas.fellechner@gmx.net |
---|---|
State | New |
Headers | show |
Series | lavf/dashdec: Multithreaded DASH initialization | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
Lukas Fellechner <lukas.fellechner@gmx.net> 于2022年8月24日周三 03:04写道: > > For adding multithreading to the DASH decoder initialization, > the open_demux_for_component() method must be split up into two parts: > > begin_open_demux_for_component(): Opens the stream and does probing > and format detection. This can be run in parallel. > > end_open_demux_for_component(): Creates the AVStreams and adds > them to the common parent AVFormatContext. This method must always be > run synchronously, after all threads are finished. > --- > libavformat/dashdec.c | 42 ++++++++++++++++++++++++++++++------------ > 1 file changed, 30 insertions(+), 12 deletions(-) > > diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c > index 63bf7e96a5..e82da45e43 100644 > --- a/libavformat/dashdec.c > +++ b/libavformat/dashdec.c > @@ -1918,10 +1918,9 @@ fail: > return ret; > } > > -static int open_demux_for_component(AVFormatContext *s, struct representation *pls) > +static int begin_open_demux_for_component(AVFormatContext *s, struct representation *pls) > { > int ret = 0; > - int i; > > pls->parent = s; > pls->cur_seq_no = calc_cur_seg_no(s, pls); > @@ -1931,9 +1930,15 @@ static int open_demux_for_component(AVFormatContext *s, struct representation *p > } > > ret = reopen_demux_for_component(s, pls); > - if (ret < 0) { > - goto fail; > - } > + > + return ret; > +} > + > +static int end_open_demux_for_component(AVFormatContext *s, struct representation *pls) > +{ > + int ret = 0; > + int i; > + > for (i = 0; i < pls->ctx->nb_streams; i++) { > AVStream *st = avformat_new_stream(s, NULL); > AVStream *ist = pls->ctx->streams[i]; > @@ -1965,6 +1970,19 @@ fail: > return ret; > } > > +static int open_demux_for_component(AVFormatContext* s, struct representation* pls) > +{ > + int ret = 0; > + > + ret = begin_open_demux_for_component(s, pls); > + if (ret < 0) > + return ret; > + > + ret = end_open_demux_for_component(s, pls); > + > + return ret; > +} > + > static int is_common_init_section_exist(struct representation **pls, int n_pls) > { > struct fragment *first_init_section = pls[0]->init_section; > @@ -2040,9 +2058,15 @@ static int dash_read_header(AVFormatContext *s) > av_dict_set(&c->avio_opts, "seekable", "0", 0); > } > > - if(c->n_videos) > + if (c->n_videos) > c->is_init_section_common_video = is_common_init_section_exist(c->videos, c->n_videos); > > + if (c->n_audios) > + c->is_init_section_common_audio = is_common_init_section_exist(c->audios, c->n_audios); > + > + if (c->n_subtitles) > + c->is_init_section_common_subtitle = is_common_init_section_exist(c->subtitles, c->n_subtitles); > + > /* Open the demuxer for video and audio components if available */ > for (i = 0; i < c->n_videos; i++) { > rep = c->videos[i]; > @@ -2059,9 +2083,6 @@ static int dash_read_header(AVFormatContext *s) > ++stream_index; > } > > - if(c->n_audios) > - c->is_init_section_common_audio = is_common_init_section_exist(c->audios, c->n_audios); > - > for (i = 0; i < c->n_audios; i++) { > rep = c->audios[i]; > if (i > 0 && c->is_init_section_common_audio) { > @@ -2077,9 +2098,6 @@ static int dash_read_header(AVFormatContext *s) > ++stream_index; > } > > - if (c->n_subtitles) > - c->is_init_section_common_subtitle = is_common_init_section_exist(c->subtitles, c->n_subtitles); > - > for (i = 0; i < c->n_subtitles; i++) { > rep = c->subtitles[i]; > if (i > 0 && c->is_init_section_common_subtitle) { > -- > 2.31.1.windows.1 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". Patchset looks ok and test passed here. Any comments? Thanks Steven
diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c index 63bf7e96a5..e82da45e43 100644 --- a/libavformat/dashdec.c +++ b/libavformat/dashdec.c @@ -1918,10 +1918,9 @@ fail: return ret; } -static int open_demux_for_component(AVFormatContext *s, struct representation *pls) +static int begin_open_demux_for_component(AVFormatContext *s, struct representation *pls) { int ret = 0; - int i; pls->parent = s; pls->cur_seq_no = calc_cur_seg_no(s, pls); @@ -1931,9 +1930,15 @@ static int open_demux_for_component(AVFormatContext *s, struct representation *p } ret = reopen_demux_for_component(s, pls); - if (ret < 0) { - goto fail; - } + + return ret; +} + +static int end_open_demux_for_component(AVFormatContext *s, struct representation *pls) +{ + int ret = 0; + int i; + for (i = 0; i < pls->ctx->nb_streams; i++) { AVStream *st = avformat_new_stream(s, NULL); AVStream *ist = pls->ctx->streams[i]; @@ -1965,6 +1970,19 @@ fail: return ret; } +static int open_demux_for_component(AVFormatContext* s, struct representation* pls) +{ + int ret = 0; + + ret = begin_open_demux_for_component(s, pls); + if (ret < 0) + return ret; + + ret = end_open_demux_for_component(s, pls); + + return ret; +} + static int is_common_init_section_exist(struct representation **pls, int n_pls) { struct fragment *first_init_section = pls[0]->init_section; @@ -2040,9 +2058,15 @@ static int dash_read_header(AVFormatContext *s) av_dict_set(&c->avio_opts, "seekable", "0", 0); } - if(c->n_videos) + if (c->n_videos) c->is_init_section_common_video = is_common_init_section_exist(c->videos, c->n_videos); + if (c->n_audios) + c->is_init_section_common_audio = is_common_init_section_exist(c->audios, c->n_audios); + + if (c->n_subtitles) + c->is_init_section_common_subtitle = is_common_init_section_exist(c->subtitles, c->n_subtitles); + /* Open the demuxer for video and audio components if available */ for (i = 0; i < c->n_videos; i++) { rep = c->videos[i]; @@ -2059,9 +2083,6 @@ static int dash_read_header(AVFormatContext *s) ++stream_index; } - if(c->n_audios) - c->is_init_section_common_audio = is_common_init_section_exist(c->audios, c->n_audios); - for (i = 0; i < c->n_audios; i++) { rep = c->audios[i]; if (i > 0 && c->is_init_section_common_audio) { @@ -2077,9 +2098,6 @@ static int dash_read_header(AVFormatContext *s) ++stream_index; } - if (c->n_subtitles) - c->is_init_section_common_subtitle = is_common_init_section_exist(c->subtitles, c->n_subtitles); - for (i = 0; i < c->n_subtitles; i++) { rep = c->subtitles[i]; if (i > 0 && c->is_init_section_common_subtitle) {