You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +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:
		
							
								
								
									
										2
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -1673,7 +1673,7 @@ avconv_deps="avcodec avformat swscale" | ||||
| ffplay_deps="avcodec avformat swscale sdl" | ||||
| ffplay_select="buffersink_filter rdft" | ||||
| 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' | ||||
| ffmpeg_deps="avcodec avformat swscale swresample" | ||||
| ffmpeg_select="buffersink_filter" | ||||
|   | ||||
							
								
								
									
										22
									
								
								ffserver.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								ffserver.c
									
									
									
									
									
								
							| @@ -30,13 +30,16 @@ | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include "libavformat/avformat.h" | ||||
| // FIXME those are internal headers, avserver _really_ shouldn't use them | ||||
| #include "libavformat/ffm.h" | ||||
| #include "libavformat/network.h" | ||||
| #include "libavformat/os_support.h" | ||||
| #include "libavformat/rtpdec.h" | ||||
| #include "libavformat/rtsp.h" | ||||
| // XXX for ffio_open_dyn_packet_buffer, to be removed | ||||
| #include "libavformat/avio_internal.h" | ||||
| #include "libavformat/internal.h" | ||||
| #include "libavformat/url.h" | ||||
|  | ||||
| #include "libavutil/avstring.h" | ||||
| #include "libavutil/lfg.h" | ||||
| #include "libavutil/dict.h" | ||||
| @@ -874,7 +877,7 @@ static void close_connection(HTTPContext *c) | ||||
|         } | ||||
|         h = c->rtp_handles[i]; | ||||
|         if (h) | ||||
|             url_close(h); | ||||
|             ffurl_close(h); | ||||
|     } | ||||
|  | ||||
|     ctx = &c->fmt_ctx; | ||||
| @@ -2255,7 +2258,6 @@ static int http_prepare_data(HTTPContext *c) | ||||
|          * Default value from FFmpeg | ||||
|          * 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); | ||||
|  | ||||
|         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) | ||||
|                             max_packet_size = RTSP_TCP_MAX_PACKET_SIZE; | ||||
|                         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); | ||||
|                     } else { | ||||
|                         ret = avio_open_dyn_buf(&ctx->pb); | ||||
| @@ -2527,8 +2529,8 @@ static int http_send_data(HTTPContext *c) | ||||
|                 } else { | ||||
|                     /* send RTP packet directly in UDP */ | ||||
|                     c->buffer_ptr += 4; | ||||
|                     url_write(c->rtp_handles[c->packet_stream_index], | ||||
|                               c->buffer_ptr, len); | ||||
|                     ffurl_write(c->rtp_handles[c->packet_stream_index], | ||||
|                                 c->buffer_ptr, len); | ||||
|                     c->buffer_ptr += len; | ||||
|                     /* 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)); | ||||
|         } | ||||
|  | ||||
|         if (url_open(&h, ctx->filename, AVIO_FLAG_WRITE) < 0) | ||||
|         if (ffurl_open(&h, ctx->filename, AVIO_FLAG_WRITE, NULL, NULL) < 0) | ||||
|             goto fail; | ||||
|         c->rtp_handles[stream_index] = h; | ||||
|         max_packet_size = url_get_max_packet_size(h); | ||||
|         max_packet_size = h->max_packet_size; | ||||
|         break; | ||||
|     case RTSP_LOWER_TRANSPORT_TCP: | ||||
|         /* RTP/TCP case */ | ||||
| @@ -3437,7 +3439,7 @@ static int rtp_new_av_stream(HTTPContext *c, | ||||
|     if (avformat_write_header(ctx, NULL) < 0) { | ||||
|     fail: | ||||
|         if (h) | ||||
|             url_close(h); | ||||
|             ffurl_close(h); | ||||
|         av_free(ctx); | ||||
|         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->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; | ||||
|     stream->streams[stream->nb_streams++] = fst; | ||||
|     return fst; | ||||
|   | ||||
| @@ -94,7 +94,7 @@ int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s) | ||||
|                 pnm_get(s, buf1, sizeof(buf1)); | ||||
|                 maxval = strtol(buf1, NULL, 10); | ||||
|             } else if (!strcmp(buf1, "TUPLTYPE") || | ||||
|             // FFmpeg used to write invalid files | ||||
|                        /* libavcodec used to write invalid files */ | ||||
|                        !strcmp(buf1, "TUPLETYPE")) { | ||||
|                 pnm_get(s, tuple_type, sizeof(tuple_type)); | ||||
|             } else if (!strcmp(buf1, "ENDHDR")) { | ||||
|   | ||||
| @@ -80,7 +80,7 @@ typedef struct { | ||||
|     int index_sid; | ||||
|     int body_sid; | ||||
|     int64_t this_partition; | ||||
|     int64_t essence_offset;         /* absolute offset of essence */ | ||||
|     int64_t essence_offset;         ///< absolute offset of essence | ||||
|     int64_t essence_length; | ||||
|     int32_t kag_size; | ||||
|     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) | ||||
| { | ||||
|     MXFContext *mxf = arg; | ||||
|     MXFPartition *partition; | ||||
|     MXFPartition *partition, *tmp_part; | ||||
|     UID op; | ||||
|     uint64_t footer_partition; | ||||
|     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)) | ||||
|         return AVERROR(ENOMEM); | ||||
|  | ||||
|     mxf->partitions = av_realloc(mxf->partitions, (mxf->partitions_count + 1) * sizeof(*mxf->partitions)); | ||||
|     if (!mxf->partitions) | ||||
|     tmp_part = av_realloc(mxf->partitions, (mxf->partitions_count + 1) * sizeof(*mxf->partitions)); | ||||
|     if (!tmp_part) | ||||
|         return AVERROR(ENOMEM); | ||||
|     mxf->partitions = tmp_part; | ||||
|  | ||||
|     if (mxf->parsing_backward) { | ||||
|         /* 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) | ||||
| { | ||||
|     MXFMetadataSet **tmp; | ||||
|     if (mxf->metadata_sets_count+1 >= UINT_MAX / sizeof(*mxf->metadata_sets)) | ||||
|         return AVERROR(ENOMEM); | ||||
|     mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets)); | ||||
|     if (!mxf->metadata_sets) | ||||
|     tmp = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets)); | ||||
|     if (!tmp) | ||||
|         return AVERROR(ENOMEM); | ||||
|     mxf->metadata_sets = tmp; | ||||
|     mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set; | ||||
|     mxf->metadata_sets_count++; | ||||
|     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))) || | ||||
|         !(*sorted_segments  = av_calloc(nb_segments, sizeof(**sorted_segments)))) { | ||||
|         av_freep(sorted_segments); | ||||
|         av_free(unsorted_segments); | ||||
|         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))) { | ||||
|             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; | ||||
|         } | ||||
|  | ||||
| @@ -1971,8 +1975,9 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti | ||||
|     if (sample_time < 0) | ||||
|         sample_time = 0; | ||||
|     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); | ||||
|     } else { | ||||
|         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) | ||||
|             return ret; | ||||
|  | ||||
|         av_update_cur_dts(s, st, sample_time); | ||||
|         ff_update_cur_dts(s, st, sample_time); | ||||
|         mxf->current_edit_unit = sample_time; | ||||
|         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" }, | ||||
|     RTSP_FLAG_OPTS("rtsp_flags", "RTSP flags"), | ||||
|     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 }, | ||||
| }; | ||||
|  | ||||
| @@ -1117,14 +1119,14 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, | ||||
|     /* default timeout: 1 minute */ | ||||
|     rt->timeout = 60; | ||||
|  | ||||
|     /* for each stream, make the setup request */ | ||||
|     /* XXX: we assume the same server is used for the control of each | ||||
|      * RTSP stream */ | ||||
|     port_off = av_get_random_seed() % (RTSP_RTP_PORT_MAX - RTSP_RTP_PORT_MIN); | ||||
|     /* Choose a random starting offset within the first half of the | ||||
|      * port range, to allow for a number of ports to try even if the offset | ||||
|      * happens to be at the end of the random range. */ | ||||
|     port_off = av_get_random_seed() % ((rt->rtp_port_max - rt->rtp_port_min)/2); | ||||
|     /* even random offset */ | ||||
|     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]; | ||||
|  | ||||
|         /* | ||||
| @@ -1161,7 +1163,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, | ||||
|             } | ||||
|  | ||||
|             /* 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, | ||||
|                             "?localport=%d", j); | ||||
|                 /* 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; | ||||
|     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()) | ||||
|         return AVERROR(EIO); | ||||
|  | ||||
|   | ||||
| @@ -359,6 +359,11 @@ typedef struct RTSPState { | ||||
|      * Mask of all requested media types | ||||
|      */ | ||||
|     int media_type_mask; | ||||
|  | ||||
|     /** | ||||
|      * Minimum and maximum local UDP ports. | ||||
|      */ | ||||
|     int rtp_port_min, rtp_port_max; | ||||
| } RTSPState; | ||||
|  | ||||
| #define RTSP_FLAG_FILTER_SRC  0x1    /**< Filter incoming UDP packets - | ||||
|   | ||||
		Reference in New Issue
	
	Block a user