diff options
Diffstat (limited to 'libavformat/rtpenc_chain.c')
-rw-r--r-- | libavformat/rtpenc_chain.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/libavformat/rtpenc_chain.c b/libavformat/rtpenc_chain.c index e4edfc28e1..c0f9530ac8 100644 --- a/libavformat/rtpenc_chain.c +++ b/libavformat/rtpenc_chain.c @@ -25,27 +25,31 @@ #include "avio_internal.h" #include "libavutil/opt.h" -AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st, - URLContext *handle, int packet_size) +int ff_rtp_chain_mux_open(AVFormatContext **out, AVFormatContext *s, + AVStream *st, URLContext *handle, int packet_size) { - AVFormatContext *rtpctx; + AVFormatContext *rtpctx = NULL; int ret; AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL); uint8_t *rtpflags; AVDictionary *opts = NULL; - if (!rtp_format) - return NULL; + if (!rtp_format) { + ret = AVERROR(ENOSYS); + goto fail; + } /* Allocate an AVFormatContext for each output stream */ rtpctx = avformat_alloc_context(); - if (!rtpctx) - return NULL; + if (!rtpctx) { + ret = AVERROR(ENOMEM); + goto fail; + } rtpctx->oformat = rtp_format; if (!avformat_new_stream(rtpctx, NULL)) { - av_free(rtpctx); - return NULL; + ret = AVERROR(ENOMEM); + goto fail; } /* Pass the interrupt callback on */ rtpctx->interrupt_callback = s->interrupt_callback; @@ -79,8 +83,15 @@ AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st, av_free(ptr); } avformat_free_context(rtpctx); - return NULL; + return ret; } - return rtpctx; + *out = rtpctx; + return 0; + +fail: + av_free(rtpctx); + if (handle) + ffurl_close(handle); + return ret; } |