[FFmpeg-devel] [PATCH v2 04/11] avformat/muxers: Add non-blocking mode support for av_write_trailer

Michael Niedermayer michael at niedermayer.cc
Fri Sep 2 01:19:09 EEST 2016


On Thu, Sep 01, 2016 at 09:45:49PM +0200, Jan Sebechlebsky wrote:
> 
> 
> On 08/26/2016 12:59 AM, Jan Sebechlebsky wrote:
> >On 08/22/2016 04:49 PM, Michael Niedermayer wrote:
> >
> >>On Mon, Aug 22, 2016 at 04:27:16PM +0200, Jan Sebechlebsky wrote:
> >>>
> >>>On 08/22/2016 09:51 AM, Michael Niedermayer wrote:
> >>>>On Thu, Aug 11, 2016 at 02:38:29PM +0200,
> >>>>sebechlebskyjan at gmail.com wrote:
> >>>>>From: Jan Sebechlebsky <sebechlebskyjan at gmail.com>
> >>>>>
> >>>>>This makes av_write_trailer not to free the resources if
> >>>>>write_trailer
> >>>>>call returns AVERROR(EAGAIN) allowing repeated calls of
> >>>>>write_trailer of
> >>>>>non-blocking muxer.
> >>>>>
> >>>>>Signed-off-by: Jan Sebechlebsky <sebechlebskyjan at gmail.com>
> >>>>>---
> >>>>>  Changes since the last version of the patch:
> >>>>>  - Added assert to the part of the code dealing with flushing
> >>>>>    interleaved packets which should not be entered if
> >>>>>    muxer in non-blocking mode is used.
> >>>>>    (also there is assert for the same condition added into
> >>>>>     av_interleaved_write_packet in one of the following
> >>>>>     patches).
> >>>>>
> >>>>>  libavformat/avformat.h |  6 +++++-
> >>>>>  libavformat/mux.c      | 10 ++++++++--
> >>>>>  2 files changed, 13 insertions(+), 3 deletions(-)
> >>>>>
> >>>>>diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> >>>>>index d8a6cf3..2cc3156 100644
> >>>>>--- a/libavformat/avformat.h
> >>>>>+++ b/libavformat/avformat.h
> >>>>>@@ -2510,8 +2510,12 @@ int
> >>>>>av_write_uncoded_frame_query(AVFormatContext *s, int
> >>>>>stream_index);
> >>>>>   *
> >>>>>   * May only be called after a successful call to
> >>>>>avformat_write_header.
> >>>>>   *
> >>>>>+ * If AVFMT_FLAG_NONBLOCK is set, this call may return
> >>>>>AVERROR(EAGAIN)
> >>>>>+ * meaning the operation is pending and the call should be repeated.
> >>>>>+ *
> >>>>>   * @param s media file handle
> >>>>>- * @return 0 if OK, AVERROR_xxx on error
> >>>>>+ * @return 0 if OK, AVERROR(EAGAIN) in case call should be repeated,
> >>>>>+ *         other AVERROR on error
> >>>>>   */
> >>>>>  int av_write_trailer(AVFormatContext *s);
> >>>>>diff --git a/libavformat/mux.c b/libavformat/mux.c
> >>>>>index e9973ed..3ae924c 100644
> >>>>>--- a/libavformat/mux.c
> >>>>>+++ b/libavformat/mux.c
> >>>>>@@ -1204,11 +1204,14 @@ int av_write_trailer(AVFormatContext *s)
> >>>>>      for (;; ) {
> >>>>>          AVPacket pkt;
> >>>>>          ret = interleave_packet(s, &pkt, NULL, 1);
> >>>>>-        if (ret < 0)
> >>>>>-            goto fail;
> >>>>>          if (!ret)
> >>>>>              break;
> >>>>>+        av_assert0(!(s->flags & AVFMT_FLAG_NONBLOCK));
> >>>>this would abort on any error not just EAGAIN
> >>>I think it will abort in case interleave_packets does not return 0
> >>>from the first call in loop, which means that interleaving was used
> >>>(because there are some packets to be flushed) and that situation
> >>>cannot happen with AVFMT_FLAG_NONBLOCK set when interleaving is
> >>>forbidded. The next patch also adds assert to
> >>>av_interleaved_write_packet. But I think the assert here is on the
> >>>right place, or have I misunderstood the problem you're pointing
> >>>out?
> >>I thought interleave_packet can return AVERROR(ENOMEM)
> >>maybe this is not possible, still it seems non-robust to assert if
> >>it errors out
> >>
> >I think it cannot return AVERROR(ENOMEM) in case interleaving was
> >not used. But maybe I can remove assert from this function since
> >there will be assert in av_interleaved_write_frame?
> >
> >Regards,
> >Jan
> Should I remove the assert from the patch (since it will be in
> av_interleaved_write_frame)?

feel free to apply it with or without the assert

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

No human being will ever know the Truth, for even if they happen to say it
by chance, they would not even known they had done so. -- Xenophanes
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160902/31492fbf/attachment.sig>


More information about the ffmpeg-devel mailing list