|
|
@ -26,13 +26,16 @@ |
|
|
|
#include <string.h> |
|
|
|
#include <string.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include "libavformat/avformat.h" |
|
|
|
#include "libavformat/avformat.h" |
|
|
|
|
|
|
|
// FIXME those are internal headers, avserver _really_ shouldn't use them
|
|
|
|
#include "libavformat/ffm.h" |
|
|
|
#include "libavformat/ffm.h" |
|
|
|
#include "libavformat/network.h" |
|
|
|
#include "libavformat/network.h" |
|
|
|
#include "libavformat/os_support.h" |
|
|
|
#include "libavformat/os_support.h" |
|
|
|
#include "libavformat/rtpdec.h" |
|
|
|
#include "libavformat/rtpdec.h" |
|
|
|
#include "libavformat/rtsp.h" |
|
|
|
#include "libavformat/rtsp.h" |
|
|
|
// XXX for ffio_open_dyn_packet_buffer, to be removed
|
|
|
|
|
|
|
|
#include "libavformat/avio_internal.h" |
|
|
|
#include "libavformat/avio_internal.h" |
|
|
|
|
|
|
|
#include "libavformat/internal.h" |
|
|
|
|
|
|
|
#include "libavformat/url.h" |
|
|
|
|
|
|
|
|
|
|
|
#include "libavutil/avstring.h" |
|
|
|
#include "libavutil/avstring.h" |
|
|
|
#include "libavutil/lfg.h" |
|
|
|
#include "libavutil/lfg.h" |
|
|
|
#include "libavutil/dict.h" |
|
|
|
#include "libavutil/dict.h" |
|
|
@ -867,7 +870,7 @@ static void close_connection(HTTPContext *c) |
|
|
|
} |
|
|
|
} |
|
|
|
h = c->rtp_handles[i]; |
|
|
|
h = c->rtp_handles[i]; |
|
|
|
if (h) |
|
|
|
if (h) |
|
|
|
url_close(h); |
|
|
|
ffurl_close(h); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ctx = &c->fmt_ctx; |
|
|
|
ctx = &c->fmt_ctx; |
|
|
@ -2248,7 +2251,6 @@ static int http_prepare_data(HTTPContext *c) |
|
|
|
* Default value from Libav |
|
|
|
* Default value from Libav |
|
|
|
* Try to set it use configuration option |
|
|
|
* Try to set it use configuration option |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
c->fmt_ctx.preload = (int)(0.5*AV_TIME_BASE); |
|
|
|
|
|
|
|
c->fmt_ctx.max_delay = (int)(0.7*AV_TIME_BASE); |
|
|
|
c->fmt_ctx.max_delay = (int)(0.7*AV_TIME_BASE); |
|
|
|
|
|
|
|
|
|
|
|
if (avformat_write_header(&c->fmt_ctx, NULL) < 0) { |
|
|
|
if (avformat_write_header(&c->fmt_ctx, NULL) < 0) { |
|
|
@ -2367,7 +2369,7 @@ static int http_prepare_data(HTTPContext *c) |
|
|
|
if (c->rtp_protocol == RTSP_LOWER_TRANSPORT_TCP) |
|
|
|
if (c->rtp_protocol == RTSP_LOWER_TRANSPORT_TCP) |
|
|
|
max_packet_size = RTSP_TCP_MAX_PACKET_SIZE; |
|
|
|
max_packet_size = RTSP_TCP_MAX_PACKET_SIZE; |
|
|
|
else |
|
|
|
else |
|
|
|
max_packet_size = url_get_max_packet_size(c->rtp_handles[c->packet_stream_index]); |
|
|
|
max_packet_size = c->rtp_handles[c->packet_stream_index]->max_packet_size; |
|
|
|
ret = ffio_open_dyn_packet_buf(&ctx->pb, max_packet_size); |
|
|
|
ret = ffio_open_dyn_packet_buf(&ctx->pb, max_packet_size); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
ret = avio_open_dyn_buf(&ctx->pb); |
|
|
|
ret = avio_open_dyn_buf(&ctx->pb); |
|
|
@ -2520,8 +2522,8 @@ static int http_send_data(HTTPContext *c) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
/* send RTP packet directly in UDP */ |
|
|
|
/* send RTP packet directly in UDP */ |
|
|
|
c->buffer_ptr += 4; |
|
|
|
c->buffer_ptr += 4; |
|
|
|
url_write(c->rtp_handles[c->packet_stream_index], |
|
|
|
ffurl_write(c->rtp_handles[c->packet_stream_index], |
|
|
|
c->buffer_ptr, len); |
|
|
|
c->buffer_ptr, len); |
|
|
|
c->buffer_ptr += len; |
|
|
|
c->buffer_ptr += len; |
|
|
|
/* here we continue as we can send several packets per 10 ms slot */ |
|
|
|
/* here we continue as we can send several packets per 10 ms slot */ |
|
|
|
} |
|
|
|
} |
|
|
@ -3404,10 +3406,10 @@ static int rtp_new_av_stream(HTTPContext *c, |
|
|
|
"rtp://%s:%d", ipaddr, ntohs(dest_addr->sin_port)); |
|
|
|
"rtp://%s:%d", ipaddr, ntohs(dest_addr->sin_port)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (url_open(&h, ctx->filename, AVIO_FLAG_WRITE) < 0) |
|
|
|
if (ffurl_open(&h, ctx->filename, AVIO_FLAG_WRITE, NULL, NULL) < 0) |
|
|
|
goto fail; |
|
|
|
goto fail; |
|
|
|
c->rtp_handles[stream_index] = h; |
|
|
|
c->rtp_handles[stream_index] = h; |
|
|
|
max_packet_size = url_get_max_packet_size(h); |
|
|
|
max_packet_size = h->max_packet_size; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case RTSP_LOWER_TRANSPORT_TCP: |
|
|
|
case RTSP_LOWER_TRANSPORT_TCP: |
|
|
|
/* RTP/TCP case */ |
|
|
|
/* RTP/TCP case */ |
|
|
@ -3430,7 +3432,7 @@ static int rtp_new_av_stream(HTTPContext *c, |
|
|
|
if (avformat_write_header(ctx, NULL) < 0) { |
|
|
|
if (avformat_write_header(ctx, NULL) < 0) { |
|
|
|
fail: |
|
|
|
fail: |
|
|
|
if (h) |
|
|
|
if (h) |
|
|
|
url_close(h); |
|
|
|
ffurl_close(h); |
|
|
|
av_free(ctx); |
|
|
|
av_free(ctx); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
@ -3467,7 +3469,7 @@ static AVStream *add_av_stream1(FFStream *stream, AVCodecContext *codec, int cop |
|
|
|
} |
|
|
|
} |
|
|
|
fst->priv_data = av_mallocz(sizeof(FeedData)); |
|
|
|
fst->priv_data = av_mallocz(sizeof(FeedData)); |
|
|
|
fst->index = stream->nb_streams; |
|
|
|
fst->index = stream->nb_streams; |
|
|
|
av_set_pts_info(fst, 33, 1, 90000); |
|
|
|
avpriv_set_pts_info(fst, 33, 1, 90000); |
|
|
|
fst->sample_aspect_ratio = codec->sample_aspect_ratio; |
|
|
|
fst->sample_aspect_ratio = codec->sample_aspect_ratio; |
|
|
|
stream->streams[stream->nb_streams++] = fst; |
|
|
|
stream->streams[stream->nb_streams++] = fst; |
|
|
|
return fst; |
|
|
|
return fst; |
|
|
|