#include "libavformat/avio_internal.h"
#include "libavutil/avstring.h"
#include "libavutil/lfg.h"
+#include "libavutil/dict.h"
#include "libavutil/random_seed.h"
#include "libavutil/parseutils.h"
#include "libavutil/opt.h"
char filename[1024]; /* stream filename */
struct FFStream *feed; /* feed we are using (can be null if
coming from file) */
- AVFormatParameters *ap_in; /* input parameters */
+ AVDictionary *in_opts; /* input parameters */
AVInputFormat *ifmt; /* if non NULL, force input format */
AVOutputFormat *fmt;
IPAddressACL *acl;
ctx = c->rtp_ctx[i];
if (ctx) {
av_write_trailer(ctx);
- av_metadata_free(&ctx->metadata);
+ av_dict_free(&ctx->metadata);
av_free(ctx->streams[0]);
av_free(ctx);
}
}
}
-#ifdef DEBUG_WMP
+#ifdef DEBUG
http_log("\nGot request:\n%s\n", c->buffer);
#endif
return 0;
}
-#ifdef DEBUG_WMP
+#ifdef DEBUG
if (strcmp(stream->filename + strlen(stream->filename) - 4, ".asf") == 0)
http_log("\nGot request:\n%s\n", c->buffer);
#endif
{
char buf[128];
char input_filename[1024];
- AVFormatContext *s;
+ AVFormatContext *s = NULL;
int buf_size, i, ret;
int64_t stream_pos;
return -1;
/* open stream */
- if ((ret = av_open_input_file(&s, input_filename, c->stream->ifmt,
- buf_size, c->stream->ap_in)) < 0) {
+ if ((ret = avformat_open_input(&s, input_filename, c->stream->ifmt, &c->stream->in_opts)) < 0) {
http_log("could not open %s: %d\n", input_filename, ret);
return -1;
}
switch(c->state) {
case HTTPSTATE_SEND_DATA_HEADER:
memset(&c->fmt_ctx, 0, sizeof(c->fmt_ctx));
- av_metadata_set2(&c->fmt_ctx.metadata, "author" , c->stream->author , 0);
- av_metadata_set2(&c->fmt_ctx.metadata, "comment" , c->stream->comment , 0);
- av_metadata_set2(&c->fmt_ctx.metadata, "copyright", c->stream->copyright, 0);
- av_metadata_set2(&c->fmt_ctx.metadata, "title" , c->stream->title , 0);
+ av_dict_set(&c->fmt_ctx.metadata, "author" , c->stream->author , 0);
+ av_dict_set(&c->fmt_ctx.metadata, "comment" , c->stream->comment , 0);
+ av_dict_set(&c->fmt_ctx.metadata, "copyright", c->stream->copyright, 0);
+ av_dict_set(&c->fmt_ctx.metadata, "title" , c->stream->title , 0);
+
+ c->fmt_ctx.streams = av_mallocz(sizeof(AVStream *) * c->stream->nb_streams);
for(i=0;i<c->stream->nb_streams;i++) {
- AVStream *st;
AVStream *src;
- st = av_mallocz(sizeof(AVStream));
- c->fmt_ctx.streams[i] = st;
+ c->fmt_ctx.streams[i] = av_mallocz(sizeof(AVStream));
/* if file or feed, then just take streams from FFStream struct */
if (!c->stream->feed ||
c->stream->feed == c->stream)
else
src = c->stream->feed->streams[c->stream->feed_streams[i]];
- *st = *src;
- st->priv_data = 0;
- st->codec->frame_number = 0; /* XXX: should be done in
+ *(c->fmt_ctx.streams[i]) = *src;
+ c->fmt_ctx.streams[i]->priv_data = 0;
+ c->fmt_ctx.streams[i]->codec->frame_number = 0; /* XXX: should be done in
AVStream, not in codec */
}
/* set output format parameters */
c->fmt_ctx.preload = (int)(0.5*AV_TIME_BASE);
c->fmt_ctx.max_delay = (int)(0.7*AV_TIME_BASE);
- av_set_parameters(&c->fmt_ctx, NULL);
- if (av_write_header(&c->fmt_ctx) < 0) {
+ if (avformat_write_header(&c->fmt_ctx, NULL) < 0) {
http_log("Error writing output header\n");
return -1;
}
- av_metadata_free(&c->fmt_ctx.metadata);
+ av_dict_free(&c->fmt_ctx.metadata);
len = avio_close_dyn_buf(c->fmt_ctx.pb, &c->pb_buffer);
c->buffer_ptr = c->pb_buffer;
}
} else {
/* We have a header in our hands that contains useful data */
- AVFormatContext *s = NULL;
+ AVFormatContext *s = avformat_alloc_context();
AVIOContext *pb;
AVInputFormat *fmt_in;
int i;
+ if (!s)
+ goto fail;
+
/* use feed output format name to find corresponding input format */
fmt_in = av_find_input_format(feed->fmt->name);
if (!fmt_in)
0, NULL, NULL, NULL, NULL);
pb->seekable = 0;
- if (av_open_input_stream(&s, pb, c->stream->feed_filename, fmt_in, NULL) < 0) {
+ s->pb = pb;
+ if (avformat_open_input(&s, c->stream->feed_filename, fmt_in, NULL) < 0) {
av_free(pb);
goto fail;
}
if (avc == NULL) {
return -1;
}
- av_metadata_set2(&avc->metadata, "title",
- stream->title[0] ? stream->title : "No Title", 0);
+ av_dict_set(&avc->metadata, "title",
+ stream->title[0] ? stream->title : "No Title", 0);
avc->nb_streams = stream->nb_streams;
if (stream->is_multicast) {
snprintf(avc->filename, 1024, "rtp://%s:%d?multicast=1?ttl=%d",
sdp_done:
av_free(avc->streams);
- av_metadata_free(&avc->metadata);
+ av_dict_free(&avc->metadata);
av_free(avc);
av_free(avs);
static void rtsp_cmd_teardown(HTTPContext *c, const char *url, RTSPMessageHeader *h)
{
HTTPContext *rtp_c;
- char session_id[32];
rtp_c = find_rtp_session_with_url(url, h->session_id);
if (!rtp_c) {
return;
}
- av_strlcpy(session_id, rtp_c->session_id, sizeof(session_id));
-
- /* abort the session */
- close_connection(rtp_c);
-
/* now everything is OK, so we can send the connection parameters */
rtsp_reply_header(c, RTSP_STATUS_OK);
/* session ID */
- avio_printf(c->pb, "Session: %s\r\n", session_id);
+ avio_printf(c->pb, "Session: %s\r\n", rtp_c->session_id);
avio_printf(c->pb, "\r\n");
+
+ /* abort the session */
+ close_connection(rtp_c);
}
if (!st)
goto fail;
ctx->nb_streams = 1;
+ ctx->streams = av_mallocz(sizeof(AVStream *) * ctx->nb_streams);
+ if (!ctx->streams)
+ goto fail;
ctx->streams[0] = st;
if (!c->stream->feed ||
/* XXX: close stream */
goto fail;
}
- av_set_parameters(ctx, NULL);
- if (av_write_header(ctx) < 0) {
+ if (avformat_write_header(ctx, NULL) < 0) {
fail:
if (h)
url_close(h);
static void build_file_streams(void)
{
FFStream *stream, *stream_next;
- AVFormatContext *infile;
int i, ret;
/* gather all streams */
for(stream = first_stream; stream != NULL; stream = stream_next) {
+ AVFormatContext *infile = NULL;
stream_next = stream->next;
if (stream->stream_type == STREAM_TYPE_LIVE &&
!stream->feed) {
/* the stream comes from a file */
/* try to open the file */
/* open stream */
- stream->ap_in = av_mallocz(sizeof(AVFormatParameters));
if (stream->fmt && !strcmp(stream->fmt->name, "rtp")) {
/* specific case : if transport stream output to RTP,
we use a raw transport stream reader */
- stream->ap_in->mpeg2ts_raw = 1;
- stream->ap_in->mpeg2ts_compute_pcr = 1;
+ av_dict_set(&stream->in_opts, "mpeg2ts_compute_pcr", "1", 0);
}
http_log("Opening file '%s'\n", stream->feed_filename);
- if ((ret = av_open_input_file(&infile, stream->feed_filename,
- stream->ifmt, 0, stream->ap_in)) < 0) {
+ if ((ret = avformat_open_input(&infile, stream->feed_filename, stream->ifmt, &stream->in_opts)) < 0) {
http_log("Could not open '%s': %d\n", stream->feed_filename, ret);
/* remove stream (no need to spend more time on it) */
fail:
if (avio_check(feed->feed_filename, AVIO_FLAG_READ) > 0) {
/* See if it matches */
- AVFormatContext *s;
+ AVFormatContext *s = NULL;
int matches = 0;
- if (av_open_input_file(&s, feed->feed_filename, NULL, FFM_PACKET_SIZE, NULL) >= 0) {
+ if (avformat_open_input(&s, feed->feed_filename, NULL, NULL) >= 0) {
/* Now see if it matches */
if (s->nb_streams == feed->nb_streams) {
matches = 1;
}
s->oformat = feed->fmt;
s->nb_streams = feed->nb_streams;
- for(i=0;i<s->nb_streams;i++) {
- AVStream *st;
- st = feed->streams[i];
- s->streams[i] = st;
- }
- av_set_parameters(s, NULL);
- if (av_write_header(s) < 0) {
+ s->streams = feed->streams;
+ if (avformat_write_header(s, NULL) < 0) {
http_log("Container doesn't supports the required parameters\n");
exit(1);
}
AVCodecContext *avctx, int type)
{
int ret = 0;
- const AVOption *o = av_find_opt(avctx, opt, NULL, type, type);
+ const AVOption *o = av_opt_find(avctx, opt, NULL, type, 0);
if(o)
ret = av_set_string3(avctx, opt, arg, 1, NULL);
return ret;