From 6c643e070584ba7af251d3907e277d2170537b1f Mon Sep 17 00:00:00 2001 From: John Brooks Date: Wed, 9 Nov 2011 20:14:19 -0700 Subject: [PATCH 01/29] avc: fix memory errors when encoding invalid h264 codecdata Signed-off-by: Ronald S. Bultje --- libavformat/avc.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index 70a05ec5bc..b0c511e7b5 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -75,8 +75,11 @@ int ff_avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size) size = 0; nal_start = ff_avc_find_startcode(p, end); - while (nal_start < end) { - while(!*(nal_start++)); + for (;;) { + while (nal_start < end && !*(nal_start++)); + if (nal_start == end) + break; + nal_end = ff_avc_find_startcode(nal_start, end); avio_wb32(pb, nal_end - nal_start); avio_write(pb, nal_start, nal_end - nal_start); @@ -117,22 +120,26 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) end = buf + len; /* look for sps and pps */ - while (buf < end) { - unsigned int size; + while (end - buf > 4) { + uint32_t size; uint8_t nal_type; - size = AV_RB32(buf); - nal_type = buf[4] & 0x1f; + size = FFMIN(AV_RB32(buf), end - buf - 4); + buf += 4; + nal_type = buf[0] & 0x1f; + if (nal_type == 7) { /* SPS */ - sps = buf + 4; + sps = buf; sps_size = size; } else if (nal_type == 8) { /* PPS */ - pps = buf + 4; + pps = buf; pps_size = size; } - buf += size + 4; + + buf += size; } - assert(sps); - assert(pps); + + if (!sps || !pps || sps_size < 4 || sps_size > UINT16_MAX || pps_size > UINT16_MAX) + return AVERROR_INVALIDDATA; avio_w8(pb, 1); /* version */ avio_w8(pb, sps[1]); /* profile */ From d10361b65856982fe17032590f490d494f1a01e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 9 Nov 2011 00:48:40 +0200 Subject: [PATCH 02/29] avio: Free URLContext private data allocated via AVOptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/avio.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavformat/avio.c b/libavformat/avio.c index a954aa8170..8e1854976e 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -335,8 +335,11 @@ int ffurl_close(URLContext *h) #if CONFIG_NETWORK ff_network_close(); #endif - if (h->prot->priv_data_size) + if (h->prot->priv_data_size) { + if (h->prot->priv_data_class) + av_opt_free(h->priv_data); av_free(h->priv_data); + } av_free(h); return ret; } From eaa8c1f9fe254ea0e370e57fec1f5439a50894e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 9 Nov 2011 00:50:37 +0200 Subject: [PATCH 03/29] crypto: Don't manually free memory allocated via AVOptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/crypto.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/libavformat/crypto.c b/libavformat/crypto.c index b9d3e0326f..2f0e2bd1ee 100644 --- a/libavformat/crypto.c +++ b/libavformat/crypto.c @@ -61,7 +61,7 @@ static const AVClass crypto_class = { static int crypto_open(URLContext *h, const char *uri, int flags) { const char *nested_url; - int ret; + int ret = 0; CryptoContext *c = h->priv_data; if (!av_strstart(uri, "crypto+", &nested_url) && @@ -95,10 +95,7 @@ static int crypto_open(URLContext *h, const char *uri, int flags) h->is_streamed = 1; - return 0; err: - av_freep(&c->key); - av_freep(&c->iv); return ret; } @@ -157,8 +154,6 @@ static int crypto_close(URLContext *h) if (c->hd) ffurl_close(c->hd); av_freep(&c->aes); - av_freep(&c->key); - av_freep(&c->iv); return 0; } From 10da1e913b46eb424b1f89fe8c60e6536713be11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 7 Nov 2011 11:43:13 +0200 Subject: [PATCH 04/29] http: Make custom headers settable via an AVOption MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/http.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index 52e1886bef..71ada6ce30 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -47,13 +47,14 @@ typedef struct { int64_t off, filesize; char location[MAX_URL_SIZE]; HTTPAuthState auth_state; - unsigned char headers[BUFFER_SIZE]; + char *headers; int willclose; /**< Set if the server correctly handles Connection: close and will close the connection after feeding us the content. */ } HTTPContext; #define OFFSET(x) offsetof(HTTPContext, x) static const AVOption options[] = { {"chunksize", "use chunked transfer-encoding for posts, -1 disables it, 0 enables it", OFFSET(chunksize), AV_OPT_TYPE_INT64, {.dbl = 0}, -1, 0 }, /* Default to 0, for chunked POSTs */ +{"headers", "custom HTTP headers, can override built in default headers", OFFSET(headers), AV_OPT_TYPE_STRING }, {NULL} }; static const AVClass httpcontext_class = { @@ -69,12 +70,9 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr, void ff_http_set_headers(URLContext *h, const char *headers) { HTTPContext *s = h->priv_data; - int len = strlen(headers); - if (len && strcmp("\r\n", headers + len - 2)) - av_log(h, AV_LOG_ERROR, "No trailing CRLF found in HTTP header.\n"); - - av_strlcpy(s->headers, headers, sizeof(s->headers)); + av_freep(&s->headers); + s->headers = av_strdup(headers); } void ff_http_init_auth_state(URLContext *dest, const URLContext *src) @@ -168,6 +166,12 @@ static int http_open(URLContext *h, const char *uri, int flags) s->filesize = -1; av_strlcpy(s->location, uri, sizeof(s->location)); + if (s->headers) { + int len = strlen(s->headers); + if (len < 2 || strcmp("\r\n", s->headers + len - 2)) + av_log(h, AV_LOG_ERROR, "No trailing CRLF found in HTTP header.\n"); + } + return http_open_cnx(h); } static int http_getc(HTTPContext *s) @@ -285,6 +289,8 @@ static int process_line(URLContext *h, char *line, int line_count, static inline int has_header(const char *str, const char *header) { /* header + 2 to skip over CRLF prefix. (make sure you have one!) */ + if (!str) + return 0; return av_stristart(str, header + 2, NULL) || av_stristr(str, header); } @@ -323,7 +329,8 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr, "Host: %s\r\n", hoststr); /* now add in custom headers */ - av_strlcpy(headers+len, s->headers, sizeof(headers)-len); + if (s->headers) + av_strlcpy(headers + len, s->headers, sizeof(headers) - len); snprintf(s->buffer, sizeof(s->buffer), "%s %s HTTP/1.1\r\n" From 196bf28c5d858e1594f9677fcab8677aca17ad33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 7 Nov 2011 11:45:57 +0200 Subject: [PATCH 05/29] rtsp: Set http custom headers via the AVOption MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/rtsp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 84cf922c26..862582aaa8 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1462,7 +1462,7 @@ redirect: "Pragma: no-cache\r\n" "Cache-Control: no-cache\r\n", sessioncookie); - ff_http_set_headers(rt->rtsp_hd, headers); + av_opt_set(rt->rtsp_hd->priv_data, "headers", headers, 0); /* complete the connection */ if (ffurl_connect(rt->rtsp_hd)) { @@ -1485,7 +1485,7 @@ redirect: "Content-Length: 32767\r\n" "Expires: Sun, 9 Jan 1972 00:00:00 GMT\r\n", sessioncookie); - ff_http_set_headers(rt->rtsp_hd_out, headers); + av_opt_set(rt->rtsp_hd_out->priv_data, "headers", headers, 0); av_opt_set(rt->rtsp_hd_out->priv_data, "chunksize", "-1", 0); /* Initialize the authentication state for the POST session. The HTTP From 27fad11b5b0d2ae48f3ffe0a88d012bc8cdf90df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 7 Nov 2011 11:48:51 +0200 Subject: [PATCH 06/29] mms: Set http custom headers via the AVOption MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/mmsh.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libavformat/mmsh.c b/libavformat/mmsh.c index 0ce282c906..cbce2f5284 100644 --- a/libavformat/mmsh.c +++ b/libavformat/mmsh.c @@ -28,6 +28,7 @@ #include #include "libavutil/intreadwrite.h" #include "libavutil/avstring.h" +#include "libavutil/opt.h" #include "internal.h" #include "mms.h" #include "asf.h" @@ -245,7 +246,7 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) CLIENTGUID "Connection: Close\r\n\r\n", host, port, mmsh->request_seq++); - ff_http_set_headers(mms->mms_hd, headers); + av_opt_set(mms->mms_hd->priv_data, "headers", headers, 0); err = ffurl_connect(mms->mms_hd); if (err) { @@ -291,7 +292,7 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) goto fail; } av_dlog(NULL, "out_buffer is %s", headers); - ff_http_set_headers(mms->mms_hd, headers); + av_opt_set(mms->mms_hd->priv_data, "headers", headers, 0); err = ffurl_connect(mms->mms_hd); if (err) { From 7590061eb728f437a968989edf69fb7bf3fa67c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 7 Nov 2011 11:46:29 +0200 Subject: [PATCH 07/29] http: Remove the now unused ff_http_set_headers custom function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/http.c | 8 -------- libavformat/http.h | 18 ------------------ 2 files changed, 26 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index 71ada6ce30..326ed0f796 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -67,14 +67,6 @@ static const AVClass httpcontext_class = { static int http_connect(URLContext *h, const char *path, const char *hoststr, const char *auth, int *new_location); -void ff_http_set_headers(URLContext *h, const char *headers) -{ - HTTPContext *s = h->priv_data; - - av_freep(&s->headers); - s->headers = av_strdup(headers); -} - void ff_http_init_auth_state(URLContext *dest, const URLContext *src) { memcpy(&((HTTPContext*)dest->priv_data)->auth_state, diff --git a/libavformat/http.h b/libavformat/http.h index bd63a190dc..8dfb192364 100644 --- a/libavformat/http.h +++ b/libavformat/http.h @@ -24,24 +24,6 @@ #include "url.h" -/** - * Set custom HTTP headers. - * A trailing CRLF ("\r\n") is required for custom headers. - * Passing in an empty header string ("\0") will reset to defaults. - * - * The following headers can be overriden by custom values, - * otherwise they will be set to their defaults. - * -User-Agent - * -Accept - * -Range - * -Host - * -Connection - * - * @param h URL context for this HTTP connection - * @param headers the custom headers to set - */ -void ff_http_set_headers(URLContext *h, const char *headers); - /** * Initialize the authentication state based on another HTTP URLContext. * This can be used to pre-initialize the authentication parameters if From 8ef79f42cadb0f6eefb033c62422d4c87f260cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 9 Nov 2011 01:14:05 +0200 Subject: [PATCH 08/29] http: Change an error log message to a warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/http.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/http.c b/libavformat/http.c index 326ed0f796..783ac6ab78 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -161,7 +161,7 @@ static int http_open(URLContext *h, const char *uri, int flags) if (s->headers) { int len = strlen(s->headers); if (len < 2 || strcmp("\r\n", s->headers + len - 2)) - av_log(h, AV_LOG_ERROR, "No trailing CRLF found in HTTP header.\n"); + av_log(h, AV_LOG_WARNING, "No trailing CRLF found in HTTP header.\n"); } return http_open_cnx(h); From 3b384502f2950dd8f172060bfa74447a665af6d9 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 5 Nov 2011 12:54:01 +0100 Subject: [PATCH 09/29] http: use different classes for http and https. --- libavformat/http.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index 783ac6ab78..5c47f1dd60 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -57,13 +57,17 @@ static const AVOption options[] = { {"headers", "custom HTTP headers, can override built in default headers", OFFSET(headers), AV_OPT_TYPE_STRING }, {NULL} }; -static const AVClass httpcontext_class = { - .class_name = "HTTP", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, +#define HTTP_CLASS(flavor)\ +static const AVClass flavor ## _context_class = {\ + .class_name = #flavor,\ + .item_name = av_default_item_name,\ + .option = options,\ + .version = LIBAVUTIL_VERSION_INT,\ }; +HTTP_CLASS(http); +HTTP_CLASS(https); + static int http_connect(URLContext *h, const char *path, const char *hoststr, const char *auth, int *new_location); @@ -518,7 +522,7 @@ URLProtocol ff_http_protocol = { .url_close = http_close, .url_get_file_handle = http_get_file_handle, .priv_data_size = sizeof(HTTPContext), - .priv_data_class = &httpcontext_class, + .priv_data_class = &http_context_class, }; #endif #if CONFIG_HTTPS_PROTOCOL @@ -531,6 +535,6 @@ URLProtocol ff_https_protocol = { .url_close = http_close, .url_get_file_handle = http_get_file_handle, .priv_data_size = sizeof(HTTPContext), - .priv_data_class = &httpcontext_class, + .priv_data_class = &https_context_class, }; #endif From 34ff0e2915005964bf9465a3ff3a405c6e45791b Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 5 Nov 2011 12:48:02 +0100 Subject: [PATCH 10/29] tls: use AVIO_FLAG_NONBLOCK instead of deprecated URL_FLAG_NONBLOCK --- libavformat/tls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/tls.c b/libavformat/tls.c index bd73febd4d..f89a717b7a 100644 --- a/libavformat/tls.c +++ b/libavformat/tls.c @@ -91,7 +91,7 @@ static int do_tls_poll(URLContext *h, int ret) return AVERROR(EIO); } #endif - if (h->flags & URL_FLAG_NONBLOCK) + if (h->flags & AVIO_FLAG_NONBLOCK) return AVERROR(EAGAIN); while (1) { int n = poll(&p, 1, 100); From dc86ca1ab54c04f15214e6fc023d6dfc627aee34 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 5 Nov 2011 14:07:13 +0100 Subject: [PATCH 11/29] crypto: add decoding flag to options. --- libavformat/crypto.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libavformat/crypto.c b/libavformat/crypto.c index 2f0e2bd1ee..ea417470b6 100644 --- a/libavformat/crypto.c +++ b/libavformat/crypto.c @@ -45,9 +45,10 @@ typedef struct { } CryptoContext; #define OFFSET(x) offsetof(CryptoContext, x) +#define D AV_OPT_FLAG_DECODING_PARAM static const AVOption options[] = { - {"key", "AES decryption key", OFFSET(key), AV_OPT_TYPE_BINARY }, - {"iv", "AES decryption initialization vector", OFFSET(iv), AV_OPT_TYPE_BINARY }, + {"key", "AES decryption key", OFFSET(key), AV_OPT_TYPE_BINARY, .flags = D }, + {"iv", "AES decryption initialization vector", OFFSET(iv), AV_OPT_TYPE_BINARY, .flags = D }, { NULL } }; From 492cc1bef3d1b47b576cae8686b196368290ffe6 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 9 Nov 2011 21:16:27 +0100 Subject: [PATCH 12/29] avconv: remove some codec-specific hacks The problem they are supposed to fix is handled in riff.c, so those hacks are pointless. --- avconv.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/avconv.c b/avconv.c index a381fdb20a..eb7df9afac 100644 --- a/avconv.c +++ b/avconv.c @@ -2046,10 +2046,6 @@ static int transcode_init(OutputFile *output_files, codec->frame_size = icodec->frame_size; codec->audio_service_type = icodec->audio_service_type; codec->block_align= icodec->block_align; - if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3) - codec->block_align= 0; - if(codec->codec_id == CODEC_ID_AC3) - codec->block_align= 0; break; case AVMEDIA_TYPE_VIDEO: codec->pix_fmt = icodec->pix_fmt; From a2519280601209cc7f492e8e010efbaf1e0d7429 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 10 Nov 2011 09:34:58 +0100 Subject: [PATCH 13/29] http: Add encoding/decoding flags to the AVOptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/http.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index 5c47f1dd60..7cb65338ce 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -52,9 +52,11 @@ typedef struct { } HTTPContext; #define OFFSET(x) offsetof(HTTPContext, x) +#define D AV_OPT_FLAG_DECODING_PARAM +#define E AV_OPT_FLAG_ENCODING_PARAM static const AVOption options[] = { -{"chunksize", "use chunked transfer-encoding for posts, -1 disables it, 0 enables it", OFFSET(chunksize), AV_OPT_TYPE_INT64, {.dbl = 0}, -1, 0 }, /* Default to 0, for chunked POSTs */ -{"headers", "custom HTTP headers, can override built in default headers", OFFSET(headers), AV_OPT_TYPE_STRING }, +{"chunksize", "use chunked transfer-encoding for posts, -1 disables it, 0 enables it", OFFSET(chunksize), AV_OPT_TYPE_INT64, {.dbl = 0}, -1, 0, E }, /* Default to 0, for chunked POSTs */ +{"headers", "custom HTTP headers, can override built in default headers", OFFSET(headers), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E }, {NULL} }; #define HTTP_CLASS(flavor)\ From 6149485f6c6c2e600987a2759d97c546d4cf5da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 10 Nov 2011 11:03:35 +0200 Subject: [PATCH 14/29] http: Change the chunksize AVOption into chunked_post MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The chunksize internal variable has two different uses - for reading, it's the amount of data left of the current chunk (or -1 if the server doesn't send data in chunked mode), where it's only an internal state variable. For writing, it's used to decide whether to enable chunked encoding (by default), by using the value 0, or disable chunked encoding (value -1). This, while consistent, doesn't make much sense to expose as an AVOption. This splits the usage of the internal variable into two variables, chunksize which is used for reading (as before), and chunked_post which is the user-settable option, with the values 0 and 1, where 1 is default. Signed-off-by: Martin Storsjö --- libavformat/http.c | 9 +++++---- libavformat/rtsp.c | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index 7cb65338ce..d5c02ddce0 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -49,13 +49,14 @@ typedef struct { HTTPAuthState auth_state; char *headers; int willclose; /**< Set if the server correctly handles Connection: close and will close the connection after feeding us the content. */ + int chunked_post; } HTTPContext; #define OFFSET(x) offsetof(HTTPContext, x) #define D AV_OPT_FLAG_DECODING_PARAM #define E AV_OPT_FLAG_ENCODING_PARAM static const AVOption options[] = { -{"chunksize", "use chunked transfer-encoding for posts, -1 disables it, 0 enables it", OFFSET(chunksize), AV_OPT_TYPE_INT64, {.dbl = 0}, -1, 0, E }, /* Default to 0, for chunked POSTs */ +{"chunked_post", "use chunked transfer-encoding for posts", OFFSET(chunked_post), AV_OPT_TYPE_INT, {.dbl = 1}, 0, 1, E }, {"headers", "custom HTTP headers, can override built in default headers", OFFSET(headers), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E }, {NULL} }; @@ -338,7 +339,7 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr, "\r\n", post ? "POST" : "GET", path, - post && s->chunksize >= 0 ? "Transfer-Encoding: chunked\r\n" : "", + post && s->chunked_post ? "Transfer-Encoding: chunked\r\n" : "", headers, authstr ? authstr : ""); @@ -435,7 +436,7 @@ static int http_write(URLContext *h, const uint8_t *buf, int size) char crlf[] = "\r\n"; HTTPContext *s = h->priv_data; - if (s->chunksize == -1) { + if (!s->chunked_post) { /* non-chunked data is sent without any special encoding */ return ffurl_write(s->hd, buf, size); } @@ -461,7 +462,7 @@ static int http_close(URLContext *h) HTTPContext *s = h->priv_data; /* signal end of chunked encoding if used */ - if ((h->flags & AVIO_FLAG_WRITE) && s->chunksize != -1) { + if ((h->flags & AVIO_FLAG_WRITE) && s->chunked_post) { ret = ffurl_write(s->hd, footer, sizeof(footer) - 1); ret = ret > 0 ? 0 : ret; } diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 862582aaa8..8f7bd3718f 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1486,7 +1486,7 @@ redirect: "Expires: Sun, 9 Jan 1972 00:00:00 GMT\r\n", sessioncookie); av_opt_set(rt->rtsp_hd_out->priv_data, "headers", headers, 0); - av_opt_set(rt->rtsp_hd_out->priv_data, "chunksize", "-1", 0); + av_opt_set(rt->rtsp_hd_out->priv_data, "chunked_post", "0", 0); /* Initialize the authentication state for the POST session. The HTTP * protocol implementation doesn't properly handle multi-pass From 2305742b2a0fd64cccbdfe12c9e90555c8bb798e Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Tue, 27 Sep 2011 22:15:32 +0000 Subject: [PATCH 15/29] sunrast: Check for invalid/corrupted bitstream Signed-off-by: Janne Grunau --- libavcodec/sunrast.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libavcodec/sunrast.c b/libavcodec/sunrast.c index 9ec1df8ae1..455619e39e 100644 --- a/libavcodec/sunrast.c +++ b/libavcodec/sunrast.c @@ -68,21 +68,25 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, type = AV_RB32(buf+20); maptype = AV_RB32(buf+24); maplength = AV_RB32(buf+28); + buf += 32; if (type == RT_FORMAT_TIFF || type == RT_FORMAT_IFF) { av_log(avctx, AV_LOG_ERROR, "unsupported (compression) type\n"); return -1; } - if (type > RT_FORMAT_IFF) { + if (type < RT_OLD || type > RT_FORMAT_IFF) { av_log(avctx, AV_LOG_ERROR, "invalid (compression) type\n"); return -1; } + if (av_image_check_size(w, h, 0, avctx)) { + av_log(avctx, AV_LOG_ERROR, "invalid image size\n"); + return -1; + } if (maptype & ~1) { av_log(avctx, AV_LOG_ERROR, "invalid colormap type\n"); return -1; } - buf += 32; switch (depth) { case 1: @@ -102,8 +106,6 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, if (p->data[0]) avctx->release_buffer(avctx, p); - if (av_image_check_size(w, h, 0, avctx)) - return -1; if (w != avctx->width || h != avctx->height) avcodec_set_dimensions(avctx, w, h); if (avctx->get_buffer(avctx, p) < 0) { From f2d0015531a05587de87575ff73c95b1f95b6df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 10 Nov 2011 11:09:26 +0200 Subject: [PATCH 16/29] http: Don't add a Range: bytes=0- header for POST MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit That header simply doesn't make sense in that context. Signed-off-by: Martin Storsjö --- libavformat/http.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/http.c b/libavformat/http.c index d5c02ddce0..83ffc0b60e 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -317,7 +317,7 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr, if (!has_header(s->headers, "\r\nAccept: ")) len += av_strlcpy(headers + len, "Accept: */*\r\n", sizeof(headers) - len); - if (!has_header(s->headers, "\r\nRange: ")) + if (!has_header(s->headers, "\r\nRange: ") && !post) len += av_strlcatf(headers + len, sizeof(headers) - len, "Range: bytes=%"PRId64"-\r\n", s->off); if (!has_header(s->headers, "\r\nConnection: ")) From f666276fa61623f4d6fa97b99d6b336ec0eba8c3 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 30 Oct 2011 18:38:19 -0400 Subject: [PATCH 17/29] vorbisdec: return proper error codes instead of made-up ones --- libavcodec/vorbisdec.c | 113 ++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 52 deletions(-) diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c index 52c26520e8..8c6f91e70e 100644 --- a/libavcodec/vorbisdec.c +++ b/libavcodec/vorbisdec.c @@ -164,7 +164,7 @@ static const char idx_err_str[] = "Index value %d out of range (0 - %d) for %s a av_log(vc->avccontext, AV_LOG_ERROR,\ idx_err_str,\ (int)(idx), (int)(limit - 1), #idx, __FILE__, __LINE__);\ - return -1;\ + return AVERROR_INVALIDDATA;\ } #define GET_VALIDATED_INDEX(idx, bits, limit) \ {\ @@ -237,6 +237,7 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) uint32_t *tmp_vlc_codes; GetBitContext *gb = &vc->gb; uint16_t *codebook_multiplicands; + int ret = 0; vc->codebook_count = get_bits(gb, 8) + 1; @@ -256,6 +257,7 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) if (get_bits(gb, 24) != 0x564342) { av_log(vc->avccontext, AV_LOG_ERROR, " %u. Codebook setup data corrupt.\n", cb); + ret = AVERROR_INVALIDDATA; goto error; } @@ -264,6 +266,7 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) av_log(vc->avccontext, AV_LOG_ERROR, " %u. Codebook's dimension is invalid (%d).\n", cb, codebook_setup->dimensions); + ret = AVERROR_INVALIDDATA; goto error; } entries = get_bits(gb, 24); @@ -271,6 +274,7 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) av_log(vc->avccontext, AV_LOG_ERROR, " %u. Codebook has too many entries (%u).\n", cb, entries); + ret = AVERROR_INVALIDDATA; goto error; } @@ -328,6 +332,7 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) } if (current_entry>used_entries) { av_log(vc->avccontext, AV_LOG_ERROR, " More codelengths than codes in codebook. \n"); + ret = AVERROR_INVALIDDATA; goto error; } } @@ -395,17 +400,20 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) } if (j != used_entries) { av_log(vc->avccontext, AV_LOG_ERROR, "Bug in codevector vector building code. \n"); + ret = AVERROR_INVALIDDATA; goto error; } entries = used_entries; } else if (codebook_setup->lookup_type >= 2) { av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n"); + ret = AVERROR_INVALIDDATA; goto error; } // Initialize VLC table if (ff_vorbis_len2vlc(tmp_vlc_bits, tmp_vlc_codes, entries)) { av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n"); + ret = AVERROR_INVALIDDATA; goto error; } codebook_setup->maxdepth = 0; @@ -420,7 +428,11 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) codebook_setup->maxdepth = (codebook_setup->maxdepth+codebook_setup->nb_bits - 1) / codebook_setup->nb_bits; - if (init_vlc(&codebook_setup->vlc, codebook_setup->nb_bits, entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits), sizeof(*tmp_vlc_bits), tmp_vlc_codes, sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes), INIT_VLC_LE)) { + if ((ret = init_vlc(&codebook_setup->vlc, codebook_setup->nb_bits, + entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits), + sizeof(*tmp_vlc_bits), tmp_vlc_codes, + sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes), + INIT_VLC_LE))) { av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n"); goto error; } @@ -436,7 +448,7 @@ error: av_free(tmp_vlc_bits); av_free(tmp_vlc_codes); av_free(codebook_multiplicands); - return -1; + return ret; } // Process time domain transforms part (unused in Vorbis I) @@ -454,7 +466,7 @@ static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc) if (vorbis_tdtransform) { av_log(vc->avccontext, AV_LOG_ERROR, "Vorbis time domain transform data nonzero. \n"); - return -1; + return AVERROR_INVALIDDATA; } } return 0; @@ -546,7 +558,7 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) av_log(vc->avccontext, AV_LOG_ERROR, "Floor value is too large for blocksize: %u (%"PRIu32")\n", rangemax, vc->blocksize[1] / 2); - return -1; + return AVERROR_INVALIDDATA; } floor_setup->data.t1.list[0].x = 0; floor_setup->data.t1.list[1].x = rangemax; @@ -576,7 +588,7 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) if (floor_setup->data.t0.amplitude_bits == 0) { av_log(vc->avccontext, AV_LOG_ERROR, "Floor 0 amplitude bits is 0.\n"); - return -1; + return AVERROR_INVALIDDATA; } floor_setup->data.t0.amplitude_offset = get_bits(gb, 8); floor_setup->data.t0.num_books = get_bits(gb, 4) + 1; @@ -585,7 +597,7 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) floor_setup->data.t0.book_list = av_malloc(floor_setup->data.t0.num_books); if (!floor_setup->data.t0.book_list) - return -1; + return AVERROR(ENOMEM); /* read book indexes */ { int idx; @@ -606,7 +618,7 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) av_malloc((floor_setup->data.t0.order + 1 + max_codebook_dim) * sizeof(*floor_setup->data.t0.lsp)); if (!floor_setup->data.t0.lsp) - return -1; + return AVERROR(ENOMEM); /* debug output parsed headers */ av_dlog(NULL, "floor0 order: %u\n", floor_setup->data.t0.order); @@ -630,7 +642,7 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) } } else { av_log(vc->avccontext, AV_LOG_ERROR, "Invalid floor type!\n"); - return -1; + return AVERROR_INVALIDDATA; } } return 0; @@ -668,7 +680,7 @@ static int vorbis_parse_setup_hdr_residues(vorbis_context *vc) "partition out of bounds: type, begin, end, size, blocksize: %"PRIu16", %"PRIu32", %"PRIu32", %u, %"PRIu32"\n", res_setup->type, res_setup->begin, res_setup->end, res_setup->partition_size, vc->blocksize[1] / 2); - return -1; + return AVERROR_INVALIDDATA; } res_setup->classifications = get_bits(gb, 6) + 1; @@ -733,7 +745,7 @@ static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) if (get_bits(gb, 16)) { av_log(vc->avccontext, AV_LOG_ERROR, "Other mappings than type 0 are not compliant with the Vorbis I specification. \n"); - return -1; + return AVERROR_INVALIDDATA; } if (get_bits1(gb)) { mapping_setup->submaps = get_bits(gb, 4) + 1; @@ -760,7 +772,7 @@ static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) if (get_bits(gb, 2)) { av_log(vc->avccontext, AV_LOG_ERROR, "%u. mapping setup data invalid.\n", i); - return -1; // following spec. + return AVERROR_INVALIDDATA; // following spec. } if (mapping_setup->submaps>1) { @@ -847,41 +859,42 @@ static int vorbis_parse_setup_hdr_modes(vorbis_context *vc) static int vorbis_parse_setup_hdr(vorbis_context *vc) { GetBitContext *gb = &vc->gb; + int ret; if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') || (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') || (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (no vorbis signature). \n"); - return -1; + return AVERROR_INVALIDDATA; } - if (vorbis_parse_setup_hdr_codebooks(vc)) { + if ((ret = vorbis_parse_setup_hdr_codebooks(vc))) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (codebooks). \n"); - return -2; + return ret; } - if (vorbis_parse_setup_hdr_tdtransforms(vc)) { + if ((ret = vorbis_parse_setup_hdr_tdtransforms(vc))) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (time domain transforms). \n"); - return -3; + return ret; } - if (vorbis_parse_setup_hdr_floors(vc)) { + if ((ret = vorbis_parse_setup_hdr_floors(vc))) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (floors). \n"); - return -4; + return ret; } - if (vorbis_parse_setup_hdr_residues(vc)) { + if ((ret = vorbis_parse_setup_hdr_residues(vc))) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (residues). \n"); - return -5; + return ret; } - if (vorbis_parse_setup_hdr_mappings(vc)) { + if ((ret = vorbis_parse_setup_hdr_mappings(vc))) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (mappings). \n"); - return -6; + return ret; } - if (vorbis_parse_setup_hdr_modes(vc)) { + if ((ret = vorbis_parse_setup_hdr_modes(vc))) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (modes). \n"); - return -7; + return ret; } if (!get_bits1(gb)) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis setup header packet corrupt (framing flag). \n"); - return -8; // framing flag bit unset error + return AVERROR_INVALIDDATA; // framing flag bit unset error } return 0; @@ -898,19 +911,19 @@ static int vorbis_parse_id_hdr(vorbis_context *vc) (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') || (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (no vorbis signature). \n"); - return -1; + return AVERROR_INVALIDDATA; } vc->version = get_bits_long(gb, 32); //FIXME check 0 vc->audio_channels = get_bits(gb, 8); if (vc->audio_channels <= 0) { av_log(vc->avccontext, AV_LOG_ERROR, "Invalid number of channels\n"); - return -1; + return AVERROR_INVALIDDATA; } vc->audio_samplerate = get_bits_long(gb, 32); if (vc->audio_samplerate <= 0) { av_log(vc->avccontext, AV_LOG_ERROR, "Invalid samplerate\n"); - return -1; + return AVERROR_INVALIDDATA; } vc->bitrate_maximum = get_bits_long(gb, 32); vc->bitrate_nominal = get_bits_long(gb, 32); @@ -921,20 +934,20 @@ static int vorbis_parse_id_hdr(vorbis_context *vc) vc->blocksize[1] = (1 << bl1); if (bl0 > 13 || bl0 < 6 || bl1 > 13 || bl1 < 6 || bl1 < bl0) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n"); - return -3; + return AVERROR_INVALIDDATA; } // output format int16 if (vc->blocksize[1] / 2 * vc->audio_channels * 2 > AVCODEC_MAX_AUDIO_FRAME_SIZE) { av_log(vc->avccontext, AV_LOG_ERROR, "Vorbis channel count makes " "output packets too large.\n"); - return -4; + return AVERROR_PATCHWELCOME; } vc->win[0] = ff_vorbis_vwin[bl0 - 6]; vc->win[1] = ff_vorbis_vwin[bl1 - 6]; if ((get_bits1(gb)) == 0) { av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n"); - return -2; + return AVERROR_INVALIDDATA; } vc->channel_residues = av_malloc((vc->blocksize[1] / 2) * vc->audio_channels * sizeof(*vc->channel_residues)); @@ -968,7 +981,7 @@ static av_cold int vorbis_decode_init(AVCodecContext *avccontext) uint8_t *header_start[3]; int header_len[3]; GetBitContext *gb = &(vc->gb); - int hdr_type; + int hdr_type, ret; vc->avccontext = avccontext; dsputil_init(&vc->dsp, avccontext); @@ -984,24 +997,24 @@ static av_cold int vorbis_decode_init(AVCodecContext *avccontext) if (!headers_len) { av_log(avccontext, AV_LOG_ERROR, "Extradata missing.\n"); - return -1; + return AVERROR_INVALIDDATA; } - if (avpriv_split_xiph_headers(headers, headers_len, 30, header_start, header_len) < 0) { + if ((ret = avpriv_split_xiph_headers(headers, headers_len, 30, header_start, header_len)) < 0) { av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); - return -1; + return ret; } init_get_bits(gb, header_start[0], header_len[0]*8); hdr_type = get_bits(gb, 8); if (hdr_type != 1) { av_log(avccontext, AV_LOG_ERROR, "First header is not the id header.\n"); - return -1; + return AVERROR_INVALIDDATA; } - if (vorbis_parse_id_hdr(vc)) { + if ((ret = vorbis_parse_id_hdr(vc))) { av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n"); vorbis_free(vc); - return -1; + return ret; } init_get_bits(gb, header_start[2], header_len[2]*8); @@ -1009,12 +1022,12 @@ static av_cold int vorbis_decode_init(AVCodecContext *avccontext) if (hdr_type != 5) { av_log(avccontext, AV_LOG_ERROR, "Third header is not the setup header.\n"); vorbis_free(vc); - return -1; + return AVERROR_INVALIDDATA; } - if (vorbis_parse_setup_hdr(vc)) { + if ((ret = vorbis_parse_setup_hdr(vc))) { av_log(avccontext, AV_LOG_ERROR, "Setup header corrupt.\n"); vorbis_free(vc); - return -1; + return ret; } if (vc->audio_channels > 8) @@ -1057,7 +1070,7 @@ static int vorbis_floor0_decode(vorbis_context *vc, codebook = vc->codebooks[vf->book_list[book_idx]]; /* Invalid codebook! */ if (!codebook.codevectors) - return -1; + return AVERROR_INVALIDDATA; while (lsp_lenorder) { int vec_off; @@ -1423,7 +1436,7 @@ static inline int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 0); else { av_log(vc->avccontext, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n"); - return -1; + return AVERROR_INVALIDDATA; } } @@ -1471,7 +1484,7 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) if (get_bits1(gb)) { av_log(vc->avccontext, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n"); - return -1; // packet type not audio + return AVERROR_INVALIDDATA; // packet type not audio } if (vc->mode_count == 1) { @@ -1508,7 +1521,7 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) if (ret < 0) { av_log(vc->avccontext, AV_LOG_ERROR, "Invalid codebook in vorbis_floor_decode.\n"); - return -1; + return AVERROR_INVALIDDATA; } no_residue[i] = ret; ch_floor_ptr += blocksize / 2; @@ -1616,12 +1629,8 @@ static int vorbis_decode_frame(AVCodecContext *avccontext, init_get_bits(gb, buf, buf_size*8); - len = vorbis_parse_audio_packet(vc); - - if (len <= 0) { - *data_size = 0; - return buf_size; - } + if ((len = vorbis_parse_audio_packet(vc)) <= 0) + return len; if (!vc->first_frame) { vc->first_frame = 1; From e551a6f49a13f2e992c42bc00a8b45ad636e52ad Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 30 Oct 2011 18:40:21 -0400 Subject: [PATCH 18/29] vorbisdec: remove unneeded buf_size==0 check --- libavcodec/vorbisdec.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c index 8c6f91e70e..e79feb90c6 100644 --- a/libavcodec/vorbisdec.c +++ b/libavcodec/vorbisdec.c @@ -1622,9 +1622,6 @@ static int vorbis_decode_frame(AVCodecContext *avccontext, const float *channel_ptrs[255]; int i, len, out_size; - if (!buf_size) - return 0; - av_dlog(NULL, "packet length %d \n", buf_size); init_get_bits(gb, buf, buf_size*8); From 41899b9acb92dd59a0eca0f86cac4c49afbc1b79 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 30 Oct 2011 18:41:00 -0400 Subject: [PATCH 19/29] vorbisdec: remove AVCODEC_MAX_AUDIO_FRAME_SIZE check The user could provide a larger buffer, which is already checked separately before writing output. --- libavcodec/vorbisdec.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c index e79feb90c6..b202249e9b 100644 --- a/libavcodec/vorbisdec.c +++ b/libavcodec/vorbisdec.c @@ -936,12 +936,6 @@ static int vorbis_parse_id_hdr(vorbis_context *vc) av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n"); return AVERROR_INVALIDDATA; } - // output format int16 - if (vc->blocksize[1] / 2 * vc->audio_channels * 2 > AVCODEC_MAX_AUDIO_FRAME_SIZE) { - av_log(vc->avccontext, AV_LOG_ERROR, "Vorbis channel count makes " - "output packets too large.\n"); - return AVERROR_PATCHWELCOME; - } vc->win[0] = ff_vorbis_vwin[bl0 - 6]; vc->win[1] = ff_vorbis_vwin[bl1 - 6]; From 59f4d1b8bb4eacfb5b678eda93c1fa30b7823cb4 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sat, 29 Oct 2011 18:25:40 -0400 Subject: [PATCH 20/29] truespeech: use memmove() in truespeech_update_filters() --- libavcodec/truespeech.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libavcodec/truespeech.c b/libavcodec/truespeech.c index 7747fca6b2..b7a2aa6fba 100644 --- a/libavcodec/truespeech.c +++ b/libavcodec/truespeech.c @@ -233,8 +233,7 @@ static void truespeech_update_filters(TSContext *dec, int16_t *out, int quart) { int i; - for(i = 0; i < 86; i++) - dec->filtbuf[i] = dec->filtbuf[i + 60]; + memmove(dec->filtbuf, &dec->filtbuf[60], 86 * sizeof(*dec->filtbuf)); for(i = 0; i < 60; i++){ dec->filtbuf[i + 86] = out[i] + dec->newvec[i] - (dec->newvec[i] >> 3); out[i] += dec->newvec[i]; From ad17207b517508c95aa9bd1f67e7beb6d09af52f Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 31 Oct 2011 14:57:04 -0400 Subject: [PATCH 21/29] apedec: remove unneeded entropy decoder normalization. The decoder already skips data at the end of the packet without this. Also remove 2 APEContext fields that were only used for the end-of-frame normalization. --- libavcodec/apedec.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index e9069031ad..0619358dad 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -140,8 +140,6 @@ typedef struct APEContext { uint32_t CRC; ///< frame CRC int frameflags; ///< frame flags - int currentframeblocks; ///< samples (per channel) in current frame - int blocksdecoded; ///< count of decoded samples in current frame APEPredictor predictor; ///< predictor used for final reconstruction int32_t decoded0[BLOCKS_PER_LOOP]; ///< decoded data for the first channel @@ -457,8 +455,6 @@ static void entropy_decode(APEContext *ctx, int blockstodecode, int stereo) int32_t *decoded0 = ctx->decoded0; int32_t *decoded1 = ctx->decoded1; - ctx->blocksdecoded = blockstodecode; - if (ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) { /* We are pure silence, just memset the output buffer. */ memset(decoded0, 0, blockstodecode * sizeof(int32_t)); @@ -470,9 +466,6 @@ static void entropy_decode(APEContext *ctx, int blockstodecode, int stereo) *decoded1++ = ape_decode_value(ctx, &ctx->riceX); } } - - if (ctx->blocksdecoded == ctx->currentframeblocks) - range_dec_normalize(ctx); /* normalize to use up all bytes */ } static int init_entropy_decoder(APEContext *ctx) @@ -492,9 +485,6 @@ static int init_entropy_decoder(APEContext *ctx) ctx->frameflags = bytestream_get_be32(&ctx->ptr); } - /* Keep a count of the blocks decoded in this frame */ - ctx->blocksdecoded = 0; - /* Initialize the rice structs */ ctx->riceX.k = 10; ctx->riceX.ksum = (1 << ctx->riceX.k) * 16; @@ -873,7 +863,7 @@ static int ape_decode_frame(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "Invalid sample count: %u.\n", nblocks); return AVERROR_INVALIDDATA; } - s->currentframeblocks = s->samples = nblocks; + s->samples = nblocks; memset(s->decoded0, 0, sizeof(s->decoded0)); memset(s->decoded1, 0, sizeof(s->decoded1)); From 4315c7d35aa946fb3a0da9a30f08fb4e0ca8edfb Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 31 Oct 2011 15:03:14 -0400 Subject: [PATCH 22/29] apedec: check output buffer size after calculating actual output size --- libavcodec/apedec.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 0619358dad..1567025183 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -816,15 +816,9 @@ static int ape_decode_frame(AVCodecContext *avctx, int16_t *samples = data; uint32_t nblocks; int i; - int blockstodecode; + int blockstodecode, out_size; int bytes_used; - /* should not happen but who knows */ - if (BLOCKS_PER_LOOP * 2 * avctx->channels > *data_size) { - av_log (avctx, AV_LOG_ERROR, "Output buffer is too small.\n"); - return AVERROR(EINVAL); - } - /* this should never be negative, but bad things will happen if it is, so check it just to make sure. */ av_assert0(s->samples >= 0); @@ -883,6 +877,13 @@ static int ape_decode_frame(AVCodecContext *avctx, nblocks = s->samples; blockstodecode = FFMIN(BLOCKS_PER_LOOP, nblocks); + out_size = blockstodecode * avctx->channels * + av_get_bytes_per_sample(avctx->sample_fmt); + if (*data_size < out_size) { + av_log(avctx, AV_LOG_ERROR, "Output buffer is too small.\n"); + return AVERROR(EINVAL); + } + s->error=0; if ((s->channels == 1) || (s->frameflags & APE_FRAMECODE_PSEUDO_STEREO)) @@ -905,9 +906,10 @@ static int ape_decode_frame(AVCodecContext *avctx, s->samples -= blockstodecode; - *data_size = blockstodecode * 2 * s->channels; bytes_used = s->samples ? s->ptr - s->last_ptr : buf_size; s->last_ptr = s->ptr; + + *data_size = out_size; return bytes_used; } From de157f2118eeebedd28f4fd1ed448787abd837f8 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 31 Oct 2011 15:10:19 -0400 Subject: [PATCH 23/29] apedec: do not needlessly copy s->samples to nblocks. also move nblocks to the local scope where it is used. --- libavcodec/apedec.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 1567025183..72b4112ad6 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -814,7 +814,6 @@ static int ape_decode_frame(AVCodecContext *avctx, int buf_size = avpkt->size; APEContext *s = avctx->priv_data; int16_t *samples = data; - uint32_t nblocks; int i; int blockstodecode, out_size; int bytes_used; @@ -824,7 +823,7 @@ static int ape_decode_frame(AVCodecContext *avctx, av_assert0(s->samples >= 0); if(!s->samples){ - uint32_t offset; + uint32_t nblocks, offset; void *tmp_data; if (buf_size < 8) { @@ -874,8 +873,7 @@ static int ape_decode_frame(AVCodecContext *avctx, return buf_size; } - nblocks = s->samples; - blockstodecode = FFMIN(BLOCKS_PER_LOOP, nblocks); + blockstodecode = FFMIN(BLOCKS_PER_LOOP, s->samples); out_size = blockstodecode * avctx->channels * av_get_bytes_per_sample(avctx->sample_fmt); From c298b2b8db2e387afb5de94ed43deac1deb607a9 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 31 Oct 2011 14:49:34 -0400 Subject: [PATCH 24/29] apedec: consume the whole packet when copying to the decoder buffer. This avoids artifically consuming a partial packet but ignoring remaining data in subsequent calls. --- libavcodec/apedec.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 72b4112ad6..6c3d29e3bb 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -155,7 +155,6 @@ typedef struct APEContext { uint8_t *data; ///< current frame data uint8_t *data_end; ///< frame data end const uint8_t *ptr; ///< current position in frame data - const uint8_t *last_ptr; ///< position where last 4608-sample block ended int error; } APEContext; @@ -816,7 +815,7 @@ static int ape_decode_frame(AVCodecContext *avctx, int16_t *samples = data; int i; int blockstodecode, out_size; - int bytes_used; + int bytes_used = 0; /* this should never be negative, but bad things will happen if it is, so check it just to make sure. */ @@ -826,6 +825,10 @@ static int ape_decode_frame(AVCodecContext *avctx, uint32_t nblocks, offset; void *tmp_data; + if (!buf_size) { + *data_size = 0; + return 0; + } if (buf_size < 8) { av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); return AVERROR_INVALIDDATA; @@ -836,7 +839,7 @@ static int ape_decode_frame(AVCodecContext *avctx, return AVERROR(ENOMEM); s->data = tmp_data; s->dsp.bswap_buf((uint32_t*)s->data, (const uint32_t*)buf, buf_size >> 2); - s->ptr = s->last_ptr = s->data; + s->ptr = s->data; s->data_end = s->data + buf_size; nblocks = bytestream_get_be32(&s->ptr); @@ -866,6 +869,8 @@ static int ape_decode_frame(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "Error reading frame header\n"); return AVERROR_INVALIDDATA; } + + bytes_used = buf_size; } if (!s->data) { @@ -904,9 +909,6 @@ static int ape_decode_frame(AVCodecContext *avctx, s->samples -= blockstodecode; - bytes_used = s->samples ? s->ptr - s->last_ptr : buf_size; - s->last_ptr = s->ptr; - *data_size = out_size; return bytes_used; } @@ -925,7 +927,7 @@ AVCodec ff_ape_decoder = { .init = ape_decode_init, .close = ape_decode_close, .decode = ape_decode_frame, - .capabilities = CODEC_CAP_SUBFRAMES, + .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DELAY, .flush = ape_flush, .long_name = NULL_IF_CONFIG_SMALL("Monkey's Audio"), }; From 164fca39bdd59896b43ea4a4df31195ac0988fa5 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 2 Nov 2011 12:06:04 -0400 Subject: [PATCH 25/29] atrac1: use correct context for av_log() --- libavcodec/atrac1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/atrac1.c b/libavcodec/atrac1.c index ef5156c650..770b1bf90e 100644 --- a/libavcodec/atrac1.c +++ b/libavcodec/atrac1.c @@ -284,7 +284,7 @@ static int atrac1_decode_frame(AVCodecContext *avctx, void *data, if (buf_size < 212 * q->channels) { - av_log(q,AV_LOG_ERROR,"Not enough data to decode!\n"); + av_log(avctx, AV_LOG_ERROR, "Not enough data to decode!\n"); return AVERROR_INVALIDDATA; } From 88b2436911ea9d629d0bc380afc6570eecef84bd Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Wed, 9 Nov 2011 13:40:44 -0800 Subject: [PATCH 26/29] mpc7: Fix memset call in mpc7_decode_frame function --- libavcodec/mpc7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c index 6f79c7b51e..60b9f525c2 100644 --- a/libavcodec/mpc7.c +++ b/libavcodec/mpc7.c @@ -200,7 +200,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, int off, out_size; int bits_used, bits_avail; - memset(bands, 0, sizeof(bands)); + memset(bands, 0, sizeof(*bands) * (c->maxbands + 1)); if(buf_size <= 4){ av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size); return AVERROR(EINVAL); From c9e5ac3380c8a8cebea222dbb3c3d95a9a93ee17 Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Thu, 3 Nov 2011 18:13:57 -0700 Subject: [PATCH 27/29] aes: Avoid illegal read and don't generate more key than we use. --- libavutil/aes.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavutil/aes.c b/libavutil/aes.c index ace317f38a..0301e0395c 100644 --- a/libavutil/aes.c +++ b/libavutil/aes.c @@ -222,11 +222,9 @@ int av_aes_init(AVAES *a, const uint8_t *key, int key_bits, int decrypt) a->rounds = rounds; memcpy(tk, key, KC * 4); + memcpy(a->round_key[0].u8, key, KC * 4); - for (t = 0; t < (rounds + 1) * 16;) { - memcpy(a->round_key[0].u8 + t, tk, KC * 4); - t += KC * 4; - + for (t = KC * 4; t < (rounds + 1) * 16; t += KC * 4) { for (i = 0; i < 4; i++) tk[0][i] ^= sbox[tk[KC - 1][(i + 1) & 3]]; tk[0][0] ^= rcon[rconpointer++]; @@ -239,6 +237,8 @@ int av_aes_init(AVAES *a, const uint8_t *key, int key_bits, int decrypt) for (i = 0; i < 4; i++) tk[j][i] ^= sbox[tk[j - 1][i]]; } + + memcpy(a->round_key[0].u8 + t, tk, KC * 4); } if (decrypt) { From 371d15ec361168d7f0d43b6f717da231c3b9e433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 10 Nov 2011 17:52:38 +0200 Subject: [PATCH 28/29] tls: Use the URLContext as logging context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/tls.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavformat/tls.c b/libavformat/tls.c index f89a717b7a..8211e88846 100644 --- a/libavformat/tls.c +++ b/libavformat/tls.c @@ -73,7 +73,7 @@ static int do_tls_poll(URLContext *h, int ret) struct pollfd p = { c->fd, 0, 0 }; #if CONFIG_GNUTLS if (ret != GNUTLS_E_AGAIN && ret != GNUTLS_E_INTERRUPTED) { - av_log(NULL, AV_LOG_ERROR, "%s\n", gnutls_strerror(ret)); + av_log(h, AV_LOG_ERROR, "%s\n", gnutls_strerror(ret)); return AVERROR(EIO); } if (gnutls_record_get_direction(c->session)) @@ -87,7 +87,7 @@ static int do_tls_poll(URLContext *h, int ret) } else if (ret == SSL_ERROR_WANT_WRITE) { p.events = POLLOUT; } else { - av_log(NULL, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL)); + av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL)); return AVERROR(EIO); } #endif @@ -148,13 +148,13 @@ static int tls_open(URLContext *h, const char *uri, int flags) #elif CONFIG_OPENSSL c->ctx = SSL_CTX_new(SSLv3_client_method()); if (!c->ctx) { - av_log(NULL, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL)); + av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL)); ret = AVERROR(EIO); goto fail; } c->ssl = SSL_new(c->ctx); if (!c->ssl) { - av_log(NULL, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL)); + av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL)); ret = AVERROR(EIO); goto fail; } @@ -166,7 +166,7 @@ static int tls_open(URLContext *h, const char *uri, int flags) if (ret > 0) break; if (ret == 0) { - av_log(NULL, AV_LOG_ERROR, "Unable to negotiate TLS/SSL session\n"); + av_log(h, AV_LOG_ERROR, "Unable to negotiate TLS/SSL session\n"); ret = AVERROR(EIO); goto fail; } From 299809defb05eae093cb72da97dfbbb7e17e08fe Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Tue, 8 Nov 2011 11:37:58 -0800 Subject: [PATCH 29/29] doc: update libavfilter documentation Update the reference to the conversion tool to use avconv and make sure the example line works as supposed. Remove the paragraph pointing to the svn repo --- doc/libavfilter.texi | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/doc/libavfilter.texi b/doc/libavfilter.texi index 172b7fc4d0..b452294a5f 100644 --- a/doc/libavfilter.texi +++ b/doc/libavfilter.texi @@ -14,18 +14,6 @@ Libavfilter is the filtering API of Libav. It is the substitute of the now deprecated 'vhooks' and started as a Google Summer of Code project. -Integrating libavfilter into the main Libav repository is a work in -progress. If you wish to try the unfinished development code of -libavfilter then check it out from the libavfilter repository into -some directory of your choice by: - -@example - svn checkout svn://svn.libav.org/soc/libavfilter -@end example - -And then read the README file in the top directory to learn how to -integrate it into ffmpeg and avplay. - But note that there may still be serious bugs in the code and its API and ABI should not be considered stable yet! @@ -48,15 +36,14 @@ and the vflip filter before merging it back with the other stream by overlaying it on top. You can use the following command to achieve this: @example -./ffmpeg -i in.avi -s 240x320 -vf "[in] split [T1], fifo, [T2] overlay= 0:240 [out]; [T1] fifo, crop=0:0:-1:240, vflip [T2] +./avconv -i input -vf "[in] split [T1], fifo, [T2] overlay=0:H/2 [out]; [T1] fifo, crop=iw:ih/2:0:ih/2, vflip [T2]" output @end example -where input_video.avi has a vertical resolution of 480 pixels. The -result will be that in output the top half of the video is mirrored +The result will be that in output the top half of the video is mirrored onto the bottom half. Video filters are loaded using the @var{-vf} option passed to -ffmpeg or to avplay. Filters in the same linear chain are separated by +avconv or to avplay. Filters in the same linear chain are separated by commas. In our example, @var{split, fifo, overlay} are in one linear chain, and @var{fifo, crop, vflip} are in another. The points where the linear chains join are labeled by names enclosed in square