* qatar/master: opt: Add av_opt_set_bin() avconv: Display the error returned by avformat_write_header rtpenc_chain: Return an error code instead of just a plain pointer rtpenc_chain: Free the URLContext on failure rtpenc: Expose the ssrc as an avoption avprobe: display the codec profile in show_stream() avprobe: fix function prototype cosmetics: Fix indentation avprobe: changelog entry avprobe: update documentation avprobe: provide JSON output avprobe: output proper INI format avprobe: improve formatting rtmp: fix url parsing fate: document TARGET_EXEC and its usage Conflicts: doc/APIchanges doc/fate.texi doc/ffprobe.texi ffprobe.c libavformat/version.h libavutil/avutil.h
Unified · Split
| @@ -44,7 +44,7 @@ Fixes:CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777, · 43 unmodified lines | ||
| 44 | 44 | - vorbis parser |
| 45 | 45 | - png parser |
| 46 | 46 | - audio mix filter |
| 47 | − | |
| 47 | +- avprobe output is now standard INI or JSON. | |
| 48 | 48 | |
| 49 | 49 | version 0.10: |
| 50 | 50 | - Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936, |
| @@ -31,6 +31,9 @@ API changes, most recent first: · 30 unmodified lines | ||
| 31 | 31 | 2012-03-26 - a67d9cf - lavfi 2.66.100 |
| 32 | 32 | Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. |
| 33 | 33 | |
| 34 | +2012-05-25 - e0e0793 - lavu 51.31.0 - opt.h | |
| 35 | + Add av_opt_set_bin() | |
| 36 | + | |
| 34 | 37 | 2012-05-15 - lavfi 2.17.0 |
| 35 | 38 | Add support for audio filters |
| 36 | 39 | ac71230/a2cd9be - add video/audio buffer sink in a new installed |
| @@ -78,6 +78,9 @@ Do not put a '~' character in the samples path to indicate a home · 77 unmodified lines | ||
| 78 | 78 | directory. Because of shell nuances, this will cause FATE to fail. |
| 79 | 79 | @end float |
| 80 | 80 | |
| 81 | +To use a custom wrapper to run the test, pass @option{--target-exec} to | |
| 82 | +@command{configure} or set the @var{TARGET_EXEC} Make variable. | |
| 83 | + | |
| 81 | 84 | |
| 82 | 85 | @chapter Submitting the results to the FFmpeg result aggregation server |
| 83 | 86 | |
| @@ -168,6 +171,11 @@ the synchronisation of the samples directory. · 84 unmodified lines | ||
| 168 | 171 | quite useful to detect thread-related regressions. |
| 169 | 172 | @item CPUFLAGS |
| 170 | 173 | Specify CPU flags. |
| 174 | +@item TARGET_EXEC | |
| 175 | + Specify or override the wrapper used to run the tests. | |
| 176 | + The @var{TARGET_EXEC} option provides a way to run FATE wrapped in | |
| 177 | + @command{valgrind}, @command{qemu-user} or @command{wine} or on remote targets | |
| 178 | + through @command{ssh}. | |
| 171 | 179 | @end table |
| 172 | 180 | |
| 173 | 181 | Example: |
| @@ -194,7 +194,7 @@ content across a TCP/IP network. · 193 unmodified lines | ||
| 194 | 194 | |
| 195 | 195 | The required syntax is: |
| 196 | 196 | @example |
| 197 | −rtmp://@var{server}[:@var{port}][/@var{app}][/@var{playpath}] | |
| 197 | +rtmp://@var{server}[:@var{port}][/@var{app}][/@var{instance}][/@var{playpath}] | |
| 198 | 198 | @end example |
| 199 | 199 | |
| 200 | 200 | The accepted parameters are: |
| @@ -3294,8 +3294,12 @@ static int transcode_init(void) · 3293 unmodified lines | ||
| 3294 | 3294 | for (i = 0; i < nb_output_files; i++) { |
| 3295 | 3295 | oc = output_files[i]->ctx; |
| 3296 | 3296 | oc->interrupt_callback = int_cb; |
| 3297 | − if (avformat_write_header(oc, &output_files[i]->opts) < 0) { | |
| 3298 | − snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i); | |
| 3297 | + if ((ret = avformat_write_header(oc, &output_files[i]->opts)) < 0) { | |
| 3298 | + char errbuf[128]; | |
| 3299 | + const char *errbuf_ptr = errbuf; | |
| 3300 | + if (av_strerror(ret, errbuf, sizeof(errbuf)) < 0) | |
| 3301 | + errbuf_ptr = strerror(AVUNERROR(ret)); | |
| 3302 | + snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?): %s", i, errbuf_ptr); | |
| 3299 | 3303 | ret = AVERROR(EINVAL); |
| 3300 | 3304 | goto dump_format; |
| 3301 | 3305 | } |
| @@ -43,9 +43,9 @@ int ff_mov_init_hinting(AVFormatContext *s, int index, int src_index) · 42 unmodified lines | ||
| 43 | 43 | track->enc->codec_type = AVMEDIA_TYPE_DATA; |
| 44 | 44 | track->enc->codec_tag = track->tag; |
| 45 | 45 | |
| 46 | − track->rtp_ctx = ff_rtp_chain_mux_open(s, src_st, NULL, | |
| 47 | − RTP_MAX_PACKET_SIZE); | |
| 48 | − if (!track->rtp_ctx) | |
| 46 | + ret = ff_rtp_chain_mux_open(&track->rtp_ctx, s, src_st, NULL, | |
| 47 | + RTP_MAX_PACKET_SIZE); | |
| 48 | + if (ret < 0) | |
| 49 | 49 | goto fail; |
| 50 | 50 | |
| 51 | 51 | /* Copy the RTP AVStream timebase back to the hint AVStream */ |
| @@ -1037,9 +1037,10 @@ static int rtmp_open(URLContext *s, const char *uri, int flags) · 1036 unmodified lines | ||
| 1037 | 1037 | fname = next; |
| 1038 | 1038 | rt->app[0] = '\0'; |
| 1039 | 1039 | } else { |
| 1040 | + // make sure we do not mismatch a playpath for an application instance | |
| 1040 | 1041 | char *c = strchr(p + 1, ':'); |
| 1041 | 1042 | fname = strchr(p + 1, '/'); |
| 1042 | − if (!fname || c < fname) { | |
| 1043 | + if (!fname || (c && c < fname)) { | |
| 1043 | 1044 | fname = p + 1; |
| 1044 | 1045 | av_strlcpy(rt->app, path + 1, p - path); |
| 1045 | 1046 | } else { |
| @@ -33,6 +33,7 @@ · 32 unmodified lines | ||
| 33 | 33 | static const AVOption options[] = { |
| 34 | 34 | FF_RTP_FLAG_OPTS(RTPMuxContext, flags) |
| 35 | 35 | { "payload_type", "Specify RTP payload type", offsetof(RTPMuxContext, payload_type), AV_OPT_TYPE_INT, {.dbl = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM }, |
| 36 | + { "ssrc", "Stream identifier", offsetof(RTPMuxContext, ssrc), AV_OPT_TYPE_INT, { 0 }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, | |
| 36 | 37 | { NULL }, |
| 37 | 38 | }; |
| 38 | 39 | |
| @@ -101,7 +102,8 @@ static int rtp_write_header(AVFormatContext *s1) · 62 unmodified lines | ||
| 101 | 102 | s->base_timestamp = av_get_random_seed(); |
| 102 | 103 | s->timestamp = s->base_timestamp; |
| 103 | 104 | s->cur_timestamp = 0; |
| 104 | − s->ssrc = av_get_random_seed(); | |
| 105 | + if (!s->ssrc) | |
| 106 | + s->ssrc = av_get_random_seed(); | |
| 105 | 107 | s->first_packet = 1; |
| 106 | 108 | s->first_rtcp_ntp_time = ff_ntp_time(); |
| 107 | 109 | if (s1->start_time_realtime) |
| @@ -25,27 +25,31 @@ · 24 unmodified lines | ||
| 25 | 25 | #include "avio_internal.h" |
| 26 | 26 | #include "libavutil/opt.h" |
| 27 | 27 | |
| 28 | −AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st, | |
| 29 | − URLContext *handle, int packet_size) | |
| 28 | +int ff_rtp_chain_mux_open(AVFormatContext **out, AVFormatContext *s, | |
| 29 | + AVStream *st, URLContext *handle, int packet_size) | |
| 30 | 30 | { |
| 31 | − AVFormatContext *rtpctx; | |
| 31 | + AVFormatContext *rtpctx = NULL; | |
| 32 | 32 | int ret; |
| 33 | 33 | AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL); |
| 34 | 34 | uint8_t *rtpflags; |
| 35 | 35 | AVDictionary *opts = NULL; |
| 36 | 36 | |
| 37 | − if (!rtp_format) | |
| 38 | − return NULL; | |
| 37 | + if (!rtp_format) { | |
| 38 | + ret = AVERROR(ENOSYS); | |
| 39 | + goto fail; | |
| 40 | + } | |
| 39 | 41 | |
| 40 | 42 | /* Allocate an AVFormatContext for each output stream */ |
| 41 | 43 | rtpctx = avformat_alloc_context(); |
| 42 | − if (!rtpctx) | |
| 43 | − return NULL; | |
| 44 | + if (!rtpctx) { | |
| 45 | + ret = AVERROR(ENOMEM); | |
| 46 | + goto fail; | |
| 47 | + } | |
| 44 | 48 | |
| 45 | 49 | rtpctx->oformat = rtp_format; |
| 46 | 50 | if (!avformat_new_stream(rtpctx, NULL)) { |
| 47 | − av_free(rtpctx); | |
| 48 | − return NULL; | |
| 51 | + ret = AVERROR(ENOMEM); | |
| 52 | + goto fail; | |
| 49 | 53 | } |
| 50 | 54 | /* Pass the interrupt callback on */ |
| 51 | 55 | rtpctx->interrupt_callback = s->interrupt_callback; |
| @@ -79,8 +83,15 @@ AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st, · 27 unmodified lines | ||
| 79 | 83 | av_free(ptr); |
| 80 | 84 | } |
| 81 | 85 | avformat_free_context(rtpctx); |
| 82 | − return NULL; | |
| 86 | + return ret; | |
| 83 | 87 | } |
| 84 | 88 | |
| 85 | − return rtpctx; | |
| 89 | + *out = rtpctx; | |
| 90 | + return 0; | |
| 91 | + | |
| 92 | +fail: | |
| 93 | + av_free(rtpctx); | |
| 94 | + if (handle) | |
| 95 | + ffurl_close(handle); | |
| 96 | + return ret; | |
| 86 | 97 | } |
| @@ -25,7 +25,7 @@ · 24 unmodified lines | ||
| 25 | 25 | #include "avformat.h" |
| 26 | 26 | #include "url.h" |
| 27 | 27 | |
| 28 | −AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st, | |
| 29 | − URLContext *handle, int packet_size); | |
| 28 | +int ff_rtp_chain_mux_open(AVFormatContext **out, AVFormatContext *s, | |
| 29 | + AVStream *st, URLContext *handle, int packet_size); | |
| 30 | 30 | |
| 31 | 31 | #endif /* AVFORMAT_RTPENC_CHAIN_H */ |
| @@ -606,11 +606,13 @@ static int rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st) · 605 unmodified lines | ||
| 606 | 606 | s->ctx_flags |= AVFMTCTX_NOHEADER; |
| 607 | 607 | |
| 608 | 608 | if (s->oformat && CONFIG_RTSP_MUXER) { |
| 609 | − rtsp_st->transport_priv = ff_rtp_chain_mux_open(s, st, | |
| 610 | − rtsp_st->rtp_handle, | |
| 611 | − RTSP_TCP_MAX_PACKET_SIZE); | |
| 609 | + int ret = ff_rtp_chain_mux_open(&rtsp_st->transport_priv, s, st, | |
| 610 | + rtsp_st->rtp_handle, | |
| 611 | + RTSP_TCP_MAX_PACKET_SIZE); | |
| 612 | 612 | /* Ownership of rtp_handle is passed to the rtp mux context */ |
| 613 | 613 | rtsp_st->rtp_handle = NULL; |
| 614 | + if (ret < 0) | |
| 615 | + return ret; | |
| 614 | 616 | } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC) |
| 615 | 617 | rtsp_st->transport_priv = ff_rdt_parse_open(s, st->index, |
| 616 | 618 | rtsp_st->dynamic_protocol_context, |
| @@ -150,8 +150,10 @@ static int sap_write_header(AVFormatContext *s) · 149 unmodified lines | ||
| 150 | 150 | ret = AVERROR(EIO); |
| 151 | 151 | goto fail; |
| 152 | 152 | } |
| 153 | − s->streams[i]->priv_data = contexts[i] = | |
| 154 | − ff_rtp_chain_mux_open(s, s->streams[i], fd, 0); | |
| 153 | + ret = ff_rtp_chain_mux_open(&contexts[i], s, s->streams[i], fd, 0); | |
| 154 | + if (ret < 0) | |
| 155 | + goto fail; | |
| 156 | + s->streams[i]->priv_data = contexts[i]; | |
| 155 | 157 | av_strlcpy(contexts[i]->filename, url, sizeof(contexts[i]->filename)); |
| 156 | 158 | } |
| 157 | 159 | |
| @@ -209,7 +211,7 @@ static int sap_write_header(AVFormatContext *s) · 51 unmodified lines | ||
| 209 | 211 | pos += strlen(&sap->ann[pos]) + 1; |
| 210 | 212 | |
| 211 | 213 | if (av_sdp_create(contexts, s->nb_streams, &sap->ann[pos], |
| 212 | − sap->ann_size - pos)) { | |
| 214 | + sap->ann_size - pos)) { | |
| 213 | 215 | ret = AVERROR_INVALIDDATA; |
| 214 | 216 | goto fail; |
| 215 | 217 | } |
| @@ -31,7 +31,7 @@ · 30 unmodified lines | ||
| 31 | 31 | |
| 32 | 32 | #define LIBAVFORMAT_VERSION_MAJOR 54 |
| 33 | 33 | #define LIBAVFORMAT_VERSION_MINOR 6 |
| 34 | −#define LIBAVFORMAT_VERSION_MICRO 100 | |
| 34 | +#define LIBAVFORMAT_VERSION_MICRO 101 | |
| 35 | 35 | |
| 36 | 36 | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ |
| 37 | 37 | LIBAVFORMAT_VERSION_MINOR, \ |
| @@ -153,7 +153,7 @@ · 152 unmodified lines | ||
| 153 | 153 | */ |
| 154 | 154 | |
| 155 | 155 | #define LIBAVUTIL_VERSION_MAJOR 51 |
| 156 | −#define LIBAVUTIL_VERSION_MINOR 54 | |
| 156 | +#define LIBAVUTIL_VERSION_MINOR 55 | |
| 157 | 157 | #define LIBAVUTIL_VERSION_MICRO 100 |
| 158 | 158 | |
| 159 | 159 | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ |
| @@ -323,6 +323,35 @@ int av_opt_set_q(void *obj, const char *name, AVRational val, int search_flags) · 322 unmodified lines | ||
| 323 | 323 | return set_number(obj, name, val.num, val.den, 1, search_flags); |
| 324 | 324 | } |
| 325 | 325 | |
| 326 | +int av_opt_set_bin(void *obj, const char *name, const uint8_t *val, int len, int search_flags) | |
| 327 | +{ | |
| 328 | + void *target_obj; | |
| 329 | + const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); | |
| 330 | + uint8_t *ptr; | |
| 331 | + uint8_t **dst; | |
| 332 | + int *lendst; | |
| 333 | + | |
| 334 | + if (!o || !target_obj) | |
| 335 | + return AVERROR_OPTION_NOT_FOUND; | |
| 336 | + | |
| 337 | + if (o->type != AV_OPT_TYPE_BINARY) | |
| 338 | + return AVERROR(EINVAL); | |
| 339 | + | |
| 340 | + ptr = av_malloc(len); | |
| 341 | + if (!ptr) | |
| 342 | + return AVERROR(ENOMEM); | |
| 343 | + | |
| 344 | + dst = (uint8_t **)(((uint8_t *)target_obj) + o->offset); | |
| 345 | + lendst = (int *)(dst + 1); | |
| 346 | + | |
| 347 | + av_free(*dst); | |
| 348 | + *dst = ptr; | |
| 349 | + *lendst = len; | |
| 350 | + memcpy(ptr, val, len); | |
| 351 | + | |
| 352 | + return 0; | |
| 353 | +} | |
| 354 | + | |
| 326 | 355 | #if FF_API_OLD_AVOPTIONS |
| 327 | 356 | /** |
| 328 | 357 | * |
| @@ -562,6 +562,7 @@ int av_opt_set (void *obj, const char *name, const char *val, int search_f · 561 unmodified lines | ||
| 562 | 562 | int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); |
| 563 | 563 | int av_opt_set_double(void *obj, const char *name, double val, int search_flags); |
| 564 | 564 | int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); |
| 565 | +int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); | |
| 565 | 566 | /** |
| 566 | 567 | * @} |
| 567 | 568 | */ |