|
|
|
@@ -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; |
|
|
|
} |