X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fsapenc.c;h=ed3a0245afc5b7eb89b43b5faf00d15bacf900a9;hb=dce2929efa8e82b0832a828f7e8cb81ff8c20a4e;hp=06cac938f34049d1ea14a692fe22ab8b403fbe1c;hpb=dfc2c4d900e48fa788ad9364ac408c01cfb62b94;p=ffmpeg diff --git a/libavformat/sapenc.c b/libavformat/sapenc.c index 06cac938f34..ed3a0245afc 100644 --- a/libavformat/sapenc.c +++ b/libavformat/sapenc.c @@ -23,7 +23,9 @@ #include "libavutil/parseutils.h" #include "libavutil/random_seed.h" #include "libavutil/avstring.h" +#include "libavutil/dict.h" #include "libavutil/intreadwrite.h" +#include "libavutil/time.h" #include "internal.h" #include "network.h" #include "os_support.h" @@ -35,6 +37,8 @@ struct SAPState { int ann_size; URLContext *ann_fd; int64_t last_time; + + const URLProtocol **protocols; }; static int sap_write_close(AVFormatContext *s) @@ -57,6 +61,8 @@ static int sap_write_close(AVFormatContext *s) ffurl_write(sap->ann_fd, sap->ann, sap->ann_size); } + av_freep(&sap->protocols); + av_freep(&sap->ann); if (sap->ann_fd) ffurl_close(sap->ann_fd); @@ -75,6 +81,7 @@ static int sap_write_header(AVFormatContext *s) struct sockaddr_storage localaddr; socklen_t addrlen = sizeof(localaddr); int udp_fd; + AVDictionaryEntry* title = av_dict_get(s->metadata, "title", NULL, 0); if (!ff_network_init()) return AVERROR(EIO); @@ -104,8 +111,7 @@ static int sap_write_header(AVFormatContext *s) } if (!announce_addr[0]) { - struct addrinfo hints, *ai = NULL; - memset(&hints, 0, sizeof(hints)); + struct addrinfo hints = { 0 }, *ai = NULL; hints.ai_family = AF_UNSPEC; if (getaddrinfo(host, NULL, &hints, &ai)) { av_log(s, AV_LOG_ERROR, "Unable to resolve %s\n", host); @@ -132,6 +138,13 @@ static int sap_write_header(AVFormatContext *s) freeaddrinfo(ai); } + sap->protocols = ffurl_get_protocols(s->protocol_whitelist, + s->protocol_blacklist); + if (!sap->protocols) { + ret = AVERROR(ENOMEM); + goto fail; + } + contexts = av_mallocz(sizeof(AVFormatContext*) * s->nb_streams); if (!contexts) { ret = AVERROR(ENOMEM); @@ -146,19 +159,27 @@ static int sap_write_header(AVFormatContext *s) "?ttl=%d", ttl); if (!same_port) base_port += 2; - ret = ffurl_open(&fd, url, AVIO_FLAG_WRITE); + ret = ffurl_open(&fd, url, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL, + sap->protocols, NULL); if (ret) { ret = AVERROR(EIO); goto fail; } - s->streams[i]->priv_data = contexts[i] = - ff_rtp_chain_mux_open(s, s->streams[i], fd, 0); + ret = ff_rtp_chain_mux_open(&contexts[i], s, s->streams[i], fd, 0, i); + if (ret < 0) + goto fail; + s->streams[i]->priv_data = contexts[i]; + s->streams[i]->time_base = contexts[i]->streams[0]->time_base; av_strlcpy(contexts[i]->filename, url, sizeof(contexts[i]->filename)); } + if (s->nb_streams > 0 && title) + av_dict_set(&contexts[0]->metadata, "title", title->value, 0); + ff_url_join(url, sizeof(url), "udp", NULL, announce_addr, port, "?ttl=%d&connect=1", ttl); - ret = ffurl_open(&sap->ann_fd, url, AVIO_FLAG_WRITE); + ret = ffurl_open(&sap->ann_fd, url, AVIO_FLAG_WRITE, + &s->interrupt_callback, NULL, sap->protocols, NULL); if (ret) { ret = AVERROR(EIO); goto fail; @@ -209,7 +230,7 @@ static int sap_write_header(AVFormatContext *s) pos += strlen(&sap->ann[pos]) + 1; if (av_sdp_create(contexts, s->nb_streams, &sap->ann[pos], - sap->ann_size - pos)) { + sap->ann_size - pos)) { ret = AVERROR_INVALIDDATA; goto fail; } @@ -236,7 +257,7 @@ static int sap_write_packet(AVFormatContext *s, AVPacket *pkt) { AVFormatContext *rtpctx; struct SAPState *sap = s->priv_data; - int64_t now = av_gettime(); + int64_t now = av_gettime_relative(); if (!sap->last_time || now - sap->last_time > 5000000) { int ret = ffurl_write(sap->ann_fd, sap->ann, sap->ann_size); @@ -251,13 +272,12 @@ static int sap_write_packet(AVFormatContext *s, AVPacket *pkt) AVOutputFormat ff_sap_muxer = { .name = "sap", - .long_name = NULL_IF_CONFIG_SMALL("SAP output format"), + .long_name = NULL_IF_CONFIG_SMALL("SAP output"), .priv_data_size = sizeof(struct SAPState), - .audio_codec = CODEC_ID_AAC, - .video_codec = CODEC_ID_MPEG4, + .audio_codec = AV_CODEC_ID_AAC, + .video_codec = AV_CODEC_ID_MPEG4, .write_header = sap_write_header, .write_packet = sap_write_packet, .write_trailer = sap_write_close, - .flags = AVFMT_NOFILE | AVFMT_GLOBALHEADER, + .flags = AVFMT_NOFILE | AVFMT_GLOBALHEADER, }; -