mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: (25 commits) riff: fix invalid av_freep() calls on EOF in ff_read_riff_info pam: Fix a typo that broke writing and reading PAM files. mxfdec: fix memleak on av_realloc failures mxfdec: Do not parse slices or DeltaEntryArrays. mxfdec: hybrid demuxing/seeking solution mxfdec: Add Avid's essence element key. mfxdec: Separate mxf_essence_container_uls for audio and video. mxfdec: Compute packet offsets properly. mxfdec: Use MaterialPackage - Track - TrackID instead of the system_item hack. mxfdec: use av_dlog() for 'no corresponding source package found' mxfdec: Make mxf->partitions sorted by offset. mxfdec: parse ThisPartition mxfdec: Speed up metadata and index parsing. mxfdec: Make sure DataDefinition is consistent between material track and source track. mxfdec: add EssenceContainer UL found in 0001GL00.MXF.A1.mxf_opatom.mxf mxfdec: Add hack that adjusts the n_delta calculation when system items are present. mxfdec: Parse IndexTableSegments and convert them into AVIndexEntry arrays. mxfdec: Move FooterPartition to MXFContext and make sure it is never zero. mxfdec: check return value of avio_seek mxfdec: skip to end of structural sets ... Conflicts: configure libavcodec/pnm.c libavformat/mxfdec.c libavformat/riff.c libavformat/rtsp.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
feb997577b
2
configure
vendored
2
configure
vendored
@ -1673,7 +1673,7 @@ avconv_deps="avcodec avformat swscale"
|
|||||||
ffplay_deps="avcodec avformat swscale sdl"
|
ffplay_deps="avcodec avformat swscale sdl"
|
||||||
ffplay_select="buffersink_filter rdft"
|
ffplay_select="buffersink_filter rdft"
|
||||||
ffprobe_deps="avcodec avformat"
|
ffprobe_deps="avcodec avformat"
|
||||||
ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
|
ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer !shared"
|
||||||
ffserver_extralibs='$ldl'
|
ffserver_extralibs='$ldl'
|
||||||
ffmpeg_deps="avcodec avformat swscale swresample"
|
ffmpeg_deps="avcodec avformat swscale swresample"
|
||||||
ffmpeg_select="buffersink_filter"
|
ffmpeg_select="buffersink_filter"
|
||||||
|
20
ffserver.c
20
ffserver.c
@ -30,13 +30,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"
|
||||||
@ -874,7 +877,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;
|
||||||
@ -2255,7 +2258,6 @@ static int http_prepare_data(HTTPContext *c)
|
|||||||
* Default value from FFmpeg
|
* Default value from FFmpeg
|
||||||
* 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) {
|
||||||
@ -2374,7 +2376,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);
|
||||||
@ -2527,7 +2529,7 @@ 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 */
|
||||||
@ -3411,10 +3413,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 */
|
||||||
@ -3437,7 +3439,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;
|
||||||
}
|
}
|
||||||
@ -3474,7 +3476,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;
|
||||||
|
@ -94,7 +94,7 @@ int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s)
|
|||||||
pnm_get(s, buf1, sizeof(buf1));
|
pnm_get(s, buf1, sizeof(buf1));
|
||||||
maxval = strtol(buf1, NULL, 10);
|
maxval = strtol(buf1, NULL, 10);
|
||||||
} else if (!strcmp(buf1, "TUPLTYPE") ||
|
} else if (!strcmp(buf1, "TUPLTYPE") ||
|
||||||
// FFmpeg used to write invalid files
|
/* libavcodec used to write invalid files */
|
||||||
!strcmp(buf1, "TUPLETYPE")) {
|
!strcmp(buf1, "TUPLETYPE")) {
|
||||||
pnm_get(s, tuple_type, sizeof(tuple_type));
|
pnm_get(s, tuple_type, sizeof(tuple_type));
|
||||||
} else if (!strcmp(buf1, "ENDHDR")) {
|
} else if (!strcmp(buf1, "ENDHDR")) {
|
||||||
|
@ -80,7 +80,7 @@ typedef struct {
|
|||||||
int index_sid;
|
int index_sid;
|
||||||
int body_sid;
|
int body_sid;
|
||||||
int64_t this_partition;
|
int64_t this_partition;
|
||||||
int64_t essence_offset; /* absolute offset of essence */
|
int64_t essence_offset; ///< absolute offset of essence
|
||||||
int64_t essence_length;
|
int64_t essence_length;
|
||||||
int32_t kag_size;
|
int32_t kag_size;
|
||||||
int64_t header_byte_count;
|
int64_t header_byte_count;
|
||||||
@ -407,7 +407,7 @@ static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, U
|
|||||||
static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
|
static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
|
||||||
{
|
{
|
||||||
MXFContext *mxf = arg;
|
MXFContext *mxf = arg;
|
||||||
MXFPartition *partition;
|
MXFPartition *partition, *tmp_part;
|
||||||
UID op;
|
UID op;
|
||||||
uint64_t footer_partition;
|
uint64_t footer_partition;
|
||||||
uint32_t nb_essence_containers;
|
uint32_t nb_essence_containers;
|
||||||
@ -415,9 +415,10 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size
|
|||||||
if (mxf->partitions_count+1 >= UINT_MAX / sizeof(*mxf->partitions))
|
if (mxf->partitions_count+1 >= UINT_MAX / sizeof(*mxf->partitions))
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
mxf->partitions = av_realloc(mxf->partitions, (mxf->partitions_count + 1) * sizeof(*mxf->partitions));
|
tmp_part = av_realloc(mxf->partitions, (mxf->partitions_count + 1) * sizeof(*mxf->partitions));
|
||||||
if (!mxf->partitions)
|
if (!tmp_part)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
mxf->partitions = tmp_part;
|
||||||
|
|
||||||
if (mxf->parsing_backward) {
|
if (mxf->parsing_backward) {
|
||||||
/* insert the new partition pack in the middle
|
/* insert the new partition pack in the middle
|
||||||
@ -531,11 +532,13 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size
|
|||||||
|
|
||||||
static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
|
static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
|
||||||
{
|
{
|
||||||
|
MXFMetadataSet **tmp;
|
||||||
if (mxf->metadata_sets_count+1 >= UINT_MAX / sizeof(*mxf->metadata_sets))
|
if (mxf->metadata_sets_count+1 >= UINT_MAX / sizeof(*mxf->metadata_sets))
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets));
|
tmp = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets));
|
||||||
if (!mxf->metadata_sets)
|
if (!tmp)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
mxf->metadata_sets = tmp;
|
||||||
mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
|
mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
|
||||||
mxf->metadata_sets_count++;
|
mxf->metadata_sets_count++;
|
||||||
return 0;
|
return 0;
|
||||||
@ -888,6 +891,7 @@ static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segment
|
|||||||
|
|
||||||
if (!(unsorted_segments = av_calloc(nb_segments, sizeof(*unsorted_segments))) ||
|
if (!(unsorted_segments = av_calloc(nb_segments, sizeof(*unsorted_segments))) ||
|
||||||
!(*sorted_segments = av_calloc(nb_segments, sizeof(**sorted_segments)))) {
|
!(*sorted_segments = av_calloc(nb_segments, sizeof(**sorted_segments)))) {
|
||||||
|
av_freep(sorted_segments);
|
||||||
av_free(unsorted_segments);
|
av_free(unsorted_segments);
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
@ -1303,7 +1307,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
|
|||||||
|
|
||||||
if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) {
|
if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) {
|
||||||
av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
|
av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
|
||||||
ret = -1;
|
ret = AVERROR_INVALIDDATA;
|
||||||
goto fail_and_free;
|
goto fail_and_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1971,8 +1975,9 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
|
|||||||
if (sample_time < 0)
|
if (sample_time < 0)
|
||||||
sample_time = 0;
|
sample_time = 0;
|
||||||
seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
|
seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
|
||||||
if (avio_seek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET) < 0)
|
|
||||||
return -1;
|
if ((ret = avio_seek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET)) < 0)
|
||||||
|
return ret;
|
||||||
ff_update_cur_dts(s, st, sample_time);
|
ff_update_cur_dts(s, st, sample_time);
|
||||||
} else {
|
} else {
|
||||||
t = &mxf->index_tables[0];
|
t = &mxf->index_tables[0];
|
||||||
@ -1994,7 +1999,7 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
|
|||||||
if ((ret = mxf_edit_unit_absolute_offset(mxf, t, sample_time, &sample_time, &seekpos, 1)) << 0)
|
if ((ret = mxf_edit_unit_absolute_offset(mxf, t, sample_time, &sample_time, &seekpos, 1)) << 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
av_update_cur_dts(s, st, sample_time);
|
ff_update_cur_dts(s, st, sample_time);
|
||||||
mxf->current_edit_unit = sample_time;
|
mxf->current_edit_unit = sample_time;
|
||||||
avio_seek(s->pb, seekpos, SEEK_SET);
|
avio_seek(s->pb, seekpos, SEEK_SET);
|
||||||
}
|
}
|
||||||
|
@ -81,6 +81,8 @@ const AVOption ff_rtsp_options[] = {
|
|||||||
{ "http", "HTTP tunneling", 0, AV_OPT_TYPE_CONST, {(1 << RTSP_LOWER_TRANSPORT_HTTP)}, 0, 0, DEC, "rtsp_transport" },
|
{ "http", "HTTP tunneling", 0, AV_OPT_TYPE_CONST, {(1 << RTSP_LOWER_TRANSPORT_HTTP)}, 0, 0, DEC, "rtsp_transport" },
|
||||||
RTSP_FLAG_OPTS("rtsp_flags", "RTSP flags"),
|
RTSP_FLAG_OPTS("rtsp_flags", "RTSP flags"),
|
||||||
RTSP_MEDIATYPE_OPTS("allowed_media_types", "Media types to accept from the server"),
|
RTSP_MEDIATYPE_OPTS("allowed_media_types", "Media types to accept from the server"),
|
||||||
|
{ "min_port", "Minimum local UDP port", OFFSET(rtp_port_min), AV_OPT_TYPE_INT, {RTSP_RTP_PORT_MIN}, 0, 65535, DEC|ENC },
|
||||||
|
{ "max_port", "Maximum local UDP port", OFFSET(rtp_port_max), AV_OPT_TYPE_INT, {RTSP_RTP_PORT_MAX}, 0, 65535, DEC|ENC },
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1117,14 +1119,14 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
|
|||||||
/* default timeout: 1 minute */
|
/* default timeout: 1 minute */
|
||||||
rt->timeout = 60;
|
rt->timeout = 60;
|
||||||
|
|
||||||
/* for each stream, make the setup request */
|
/* Choose a random starting offset within the first half of the
|
||||||
/* XXX: we assume the same server is used for the control of each
|
* port range, to allow for a number of ports to try even if the offset
|
||||||
* RTSP stream */
|
* happens to be at the end of the random range. */
|
||||||
port_off = av_get_random_seed() % (RTSP_RTP_PORT_MAX - RTSP_RTP_PORT_MIN);
|
port_off = av_get_random_seed() % ((rt->rtp_port_max - rt->rtp_port_min)/2);
|
||||||
/* even random offset */
|
/* even random offset */
|
||||||
port_off -= port_off & 0x01;
|
port_off -= port_off & 0x01;
|
||||||
|
|
||||||
for (j = RTSP_RTP_PORT_MIN + port_off, i = 0; i < rt->nb_rtsp_streams; ++i) {
|
for (j = rt->rtp_port_min + port_off, i = 0; i < rt->nb_rtsp_streams; ++i) {
|
||||||
char transport[2048];
|
char transport[2048];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1161,7 +1163,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* first try in specified port range */
|
/* first try in specified port range */
|
||||||
while (j <= RTSP_RTP_PORT_MAX) {
|
while (j <= rt->rtp_port_max) {
|
||||||
ff_url_join(buf, sizeof(buf), "rtp", NULL, host, -1,
|
ff_url_join(buf, sizeof(buf), "rtp", NULL, host, -1,
|
||||||
"?localport=%d", j);
|
"?localport=%d", j);
|
||||||
/* we will use two ports per rtp stream (rtp and rtcp) */
|
/* we will use two ports per rtp stream (rtp and rtcp) */
|
||||||
@ -1358,6 +1360,13 @@ int ff_rtsp_connect(AVFormatContext *s)
|
|||||||
struct sockaddr_storage peer;
|
struct sockaddr_storage peer;
|
||||||
socklen_t peer_len = sizeof(peer);
|
socklen_t peer_len = sizeof(peer);
|
||||||
|
|
||||||
|
if (rt->rtp_port_max < rt->rtp_port_min) {
|
||||||
|
av_log(s, AV_LOG_ERROR, "Invalid UDP port range, max port %d less "
|
||||||
|
"than min port %d\n", rt->rtp_port_max,
|
||||||
|
rt->rtp_port_min);
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
if (!ff_network_init())
|
if (!ff_network_init())
|
||||||
return AVERROR(EIO);
|
return AVERROR(EIO);
|
||||||
|
|
||||||
|
@ -359,6 +359,11 @@ typedef struct RTSPState {
|
|||||||
* Mask of all requested media types
|
* Mask of all requested media types
|
||||||
*/
|
*/
|
||||||
int media_type_mask;
|
int media_type_mask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum and maximum local UDP ports.
|
||||||
|
*/
|
||||||
|
int rtp_port_min, rtp_port_max;
|
||||||
} RTSPState;
|
} RTSPState;
|
||||||
|
|
||||||
#define RTSP_FLAG_FILTER_SRC 0x1 /**< Filter incoming UDP packets -
|
#define RTSP_FLAG_FILTER_SRC 0x1 /**< Filter incoming UDP packets -
|
||||||
|
Loading…
Reference in New Issue
Block a user