Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 55a9533952 | |||
| 7d4c2d90b3 | |||
| 3a04214c60 | |||
| c6fdee5274 | |||
| 6f579cf963 | |||
| a43a89a089 | |||
| 156af49b09 | |||
| e103a2cb9c | |||
| 724b8fa1e2 | |||
| 7eb02a1f83 | |||
| ff1c55c913 | |||
| 72bc9bd8ef | |||
| 25b2341f9a | |||
| b116c7a6b0 | |||
| 77b61358aa | |||
| 43d68a0738 |
@@ -1,6 +1,23 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version 4.2.7
|
||||
avfilter/vf_colorspace: fix memmory leaks
|
||||
avformat/nutenc: don't allocate a dynamic AVIOContext if no index is going to be written
|
||||
avfilter/vf_random: fix memory leaks
|
||||
avfilter/vf_bwdif: fix heap-buffer overflow
|
||||
fftools/ffmpeg_opt: Fix leak of options when parsing options fails
|
||||
avfilter/vf_edgedetect: fix heap-buffer overflow
|
||||
avfilter/vf_w3fdif: deny processing small videos
|
||||
avfilter/vf_avgblur: fix heap-buffer overflow
|
||||
avfilter/af_tremolo: fix heap-buffer overflow
|
||||
avfilter/vf_edgedetect: check if height is big enough
|
||||
avfilter/vf_bitplanenoise: fix overreads
|
||||
avfilter/vf_fieldorder: fix heap-buffer overflow
|
||||
avfilter/vf_fieldmatch: fix heap-buffer overflow
|
||||
avcodec/pngenc: remove monowhite from apng formats
|
||||
lavf/tls_mbedtls: add support for mbedtls version 3
|
||||
|
||||
version 4.2.6
|
||||
configure: bump year
|
||||
avfilter/vf_lenscorrection: make width/height int
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ PROJECT_NAME = FFmpeg
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER = 4.2.6
|
||||
PROJECT_NUMBER = 4.2.7
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
|
||||
@@ -3272,6 +3272,7 @@ static int open_files(OptionGroupList *l, const char *inout,
|
||||
if (ret < 0) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
|
||||
"%s.\n", inout, g->arg);
|
||||
uninit_options(&o);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1174,7 +1174,7 @@ AVCodec ff_apng_encoder = {
|
||||
AV_PIX_FMT_PAL8,
|
||||
AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY8A,
|
||||
AV_PIX_FMT_GRAY16BE, AV_PIX_FMT_YA16BE,
|
||||
AV_PIX_FMT_MONOBLACK, AV_PIX_FMT_NONE
|
||||
AV_PIX_FMT_NONE
|
||||
},
|
||||
.priv_class = &apngenc_class,
|
||||
};
|
||||
|
||||
@@ -28,6 +28,7 @@ typedef struct TremoloContext {
|
||||
double freq;
|
||||
double depth;
|
||||
double *table;
|
||||
int table_size;
|
||||
int index;
|
||||
} TremoloContext;
|
||||
|
||||
@@ -72,7 +73,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
|
||||
dst += channels;
|
||||
src += channels;
|
||||
s->index++;
|
||||
if (s->index >= inlink->sample_rate / s->freq)
|
||||
if (s->index >= s->table_size)
|
||||
s->index = 0;
|
||||
}
|
||||
|
||||
@@ -125,11 +126,12 @@ static int config_input(AVFilterLink *inlink)
|
||||
const double offset = 1. - s->depth / 2.;
|
||||
int i;
|
||||
|
||||
s->table = av_malloc_array(inlink->sample_rate / s->freq, sizeof(*s->table));
|
||||
s->table_size = inlink->sample_rate / s->freq;
|
||||
s->table = av_malloc_array(s->table_size, sizeof(*s->table));
|
||||
if (!s->table)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
for (i = 0; i < inlink->sample_rate / s->freq; i++) {
|
||||
for (i = 0; i < s->table_size; i++) {
|
||||
double env = s->freq * i / inlink->sample_rate;
|
||||
env = sin(2 * M_PI * fmod(env + 0.25, 1.0));
|
||||
s->table[i] = env * (1 - fabs(offset)) + offset;
|
||||
|
||||
@@ -149,7 +149,7 @@ static int filter_vertically_##name(AVFilterContext *ctx, void *arg, int jobnr,
|
||||
\
|
||||
src = s->buffer + x; \
|
||||
ptr = buffer + x; \
|
||||
for (i = 0; i <= radius; i++) { \
|
||||
for (i = 0; i + radius < height && i <= radius; i++) { \
|
||||
acc += src[(i + radius) * width]; \
|
||||
count++; \
|
||||
ptr[i * linesize] = acc / count; \
|
||||
|
||||
@@ -122,7 +122,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
|
||||
|
||||
if (s->depth <= 8) {
|
||||
for (plane = 0; plane < s->nb_planes; plane++) {
|
||||
const int linesize = in->linesize[plane];
|
||||
const int linesize = s->planeheight[plane] > 1 ? in->linesize[plane] : 0;
|
||||
const int dlinesize = out->linesize[plane];
|
||||
uint8_t *val = in->data[plane];
|
||||
uint8_t *dst = s->filter ? out->data[plane]: NULL;
|
||||
@@ -151,7 +151,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
|
||||
}
|
||||
} else {
|
||||
for (plane = 0; plane < s->nb_planes; plane++) {
|
||||
const int linesize = in->linesize[plane] / 2;
|
||||
const int linesize = s->planeheight[plane] > 1 ? in->linesize[plane] / 2 : 0;
|
||||
const int dlinesize = out->linesize[plane] / 2;
|
||||
uint16_t *val = (uint16_t *)in->data[plane];
|
||||
uint16_t *dst = s->filter ? (uint16_t *)out->data[plane] : NULL;
|
||||
|
||||
@@ -343,8 +343,8 @@ static int config_props(AVFilterLink *link)
|
||||
if(yadif->mode&1)
|
||||
link->frame_rate = av_mul_q(link->src->inputs[0]->frame_rate, (AVRational){2,1});
|
||||
|
||||
if (link->w < 3 || link->h < 3) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or lines is not supported\n");
|
||||
if (link->w < 3 || link->h < 4) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or 4 lines is not supported\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
||||
@@ -780,6 +780,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
|
||||
res = av_frame_copy_props(out, in);
|
||||
if (res < 0) {
|
||||
av_frame_free(&in);
|
||||
av_frame_free(&out);
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -839,13 +840,18 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
|
||||
!s->dither_scratch_base[1][0] || !s->dither_scratch_base[1][1] ||
|
||||
!s->dither_scratch_base[2][0] || !s->dither_scratch_base[2][1]) {
|
||||
uninit(ctx);
|
||||
av_frame_free(&in);
|
||||
av_frame_free(&out);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
s->rgb_sz = rgb_sz;
|
||||
}
|
||||
res = create_filtergraph(ctx, in, out);
|
||||
if (res < 0)
|
||||
if (res < 0) {
|
||||
av_frame_free(&in);
|
||||
av_frame_free(&out);
|
||||
return res;
|
||||
}
|
||||
s->rgb_stride = rgb_stride / sizeof(int16_t);
|
||||
td.in = in;
|
||||
td.out = out;
|
||||
@@ -859,8 +865,11 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
|
||||
td.out_ss_h = av_pix_fmt_desc_get(out->format)->log2_chroma_h;
|
||||
if (s->yuv2yuv_passthrough) {
|
||||
res = av_frame_copy(out, in);
|
||||
if (res < 0)
|
||||
if (res < 0) {
|
||||
av_frame_free(&in);
|
||||
av_frame_free(&out);
|
||||
return res;
|
||||
}
|
||||
} else {
|
||||
ctx->internal->execute(ctx, convert, &td, NULL,
|
||||
FFMIN((in->height + 1) >> 1, ff_filter_get_nb_threads(ctx)));
|
||||
|
||||
@@ -150,10 +150,12 @@ static void gaussian_blur(AVFilterContext *ctx, int w, int h,
|
||||
int i, j;
|
||||
|
||||
memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
|
||||
memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
|
||||
if (h > 1)
|
||||
memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
|
||||
for (j = 2; j < h - 2; j++) {
|
||||
dst[0] = src[0];
|
||||
dst[1] = src[1];
|
||||
if (w > 1)
|
||||
dst[1] = src[1];
|
||||
for (i = 2; i < w - 2; i++) {
|
||||
/* Gaussian mask of size 5x5 with sigma = 1.4 */
|
||||
dst[i] = ((src[-2*src_linesize + i-2] + src[2*src_linesize + i-2]) * 2
|
||||
@@ -174,14 +176,18 @@ static void gaussian_blur(AVFilterContext *ctx, int w, int h,
|
||||
+ src[i+1] * 12
|
||||
+ src[i+2] * 5) / 159;
|
||||
}
|
||||
dst[i ] = src[i ];
|
||||
dst[i + 1] = src[i + 1];
|
||||
if (w > 2)
|
||||
dst[i ] = src[i ];
|
||||
if (w > 3)
|
||||
dst[i + 1] = src[i + 1];
|
||||
|
||||
dst += dst_linesize;
|
||||
src += src_linesize;
|
||||
}
|
||||
memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
|
||||
memcpy(dst, src, w);
|
||||
if (h > 2)
|
||||
memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
|
||||
if (h > 3)
|
||||
memcpy(dst, src, w);
|
||||
}
|
||||
|
||||
enum {
|
||||
|
||||
@@ -938,7 +938,7 @@ static int config_input(AVFilterLink *inlink)
|
||||
fm->tpitchy = FFALIGN(w, 16);
|
||||
fm->tpitchuv = FFALIGN(w >> 1, 16);
|
||||
|
||||
fm->tbuffer = av_malloc(h/2 * fm->tpitchy);
|
||||
fm->tbuffer = av_calloc((h/2 + 4) * fm->tpitchy, sizeof(*fm->tbuffer));
|
||||
fm->c_array = av_malloc((((w + fm->blockx/2)/fm->blockx)+1) *
|
||||
(((h + fm->blocky/2)/fm->blocky)+1) *
|
||||
4 * sizeof(*fm->c_array));
|
||||
|
||||
@@ -108,8 +108,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
|
||||
s->dst_tff ? "up" : "down");
|
||||
h = frame->height;
|
||||
for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++) {
|
||||
dst_line_step = out->linesize[plane];
|
||||
src_line_step = frame->linesize[plane];
|
||||
dst_line_step = out->linesize[plane] * (h > 2);
|
||||
src_line_step = frame->linesize[plane] * (h > 2);
|
||||
line_size = s->line_size[plane];
|
||||
dst = out->data[plane];
|
||||
src = frame->data[plane];
|
||||
|
||||
@@ -108,6 +108,14 @@ static int request_frame(AVFilterLink *outlink)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static av_cold void uninit(AVFilterContext *ctx)
|
||||
{
|
||||
RandomContext *s = ctx->priv;
|
||||
|
||||
for (int i = 0; i < s->nb_frames; i++)
|
||||
av_frame_free(&s->frames[i]);
|
||||
}
|
||||
|
||||
static const AVFilterPad random_inputs[] = {
|
||||
{
|
||||
.name = "default",
|
||||
@@ -132,6 +140,7 @@ AVFilter ff_vf_random = {
|
||||
.priv_size = sizeof(RandomContext),
|
||||
.priv_class = &random_class,
|
||||
.init = init,
|
||||
.uninit = uninit,
|
||||
.inputs = random_inputs,
|
||||
.outputs = random_outputs,
|
||||
};
|
||||
|
||||
@@ -274,6 +274,11 @@ static int config_input(AVFilterLink *inlink)
|
||||
s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
|
||||
s->planeheight[0] = s->planeheight[3] = inlink->h;
|
||||
|
||||
if (inlink->h < 3) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Video of less than 3 lines is not supported\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
s->nb_planes = av_pix_fmt_count_planes(inlink->format);
|
||||
s->nb_threads = ff_filter_get_nb_threads(ctx);
|
||||
s->work_line = av_calloc(s->nb_threads, sizeof(*s->work_line));
|
||||
|
||||
@@ -1171,8 +1171,11 @@ static int nut_write_trailer(AVFormatContext *s)
|
||||
while (nut->header_count < 3)
|
||||
write_headers(s, bc);
|
||||
|
||||
if (!nut->sp_count)
|
||||
return 0;
|
||||
|
||||
ret = avio_open_dyn_buf(&dyn_bc);
|
||||
if (ret >= 0 && nut->sp_count) {
|
||||
if (ret >= 0) {
|
||||
av_assert1(nut->write_index); // sp_count should be 0 if no index is going to be written
|
||||
write_index(nut, dyn_bc);
|
||||
put_packet(nut, bc, dyn_bc, 1, INDEX_STARTCODE);
|
||||
|
||||
+22
-12
@@ -19,8 +19,7 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <mbedtls/certs.h>
|
||||
#include <mbedtls/config.h>
|
||||
#include <mbedtls/version.h>
|
||||
#include <mbedtls/ctr_drbg.h>
|
||||
#include <mbedtls/entropy.h>
|
||||
#include <mbedtls/net_sockets.h>
|
||||
@@ -129,9 +128,15 @@ static void handle_pk_parse_error(URLContext *h, int ret)
|
||||
static void handle_handshake_error(URLContext *h, int ret)
|
||||
{
|
||||
switch (ret) {
|
||||
#if MBEDTLS_VERSION_MAJOR < 3
|
||||
case MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE:
|
||||
av_log(h, AV_LOG_ERROR, "None of the common ciphersuites is usable. Was the local certificate correctly set?\n");
|
||||
break;
|
||||
#else
|
||||
case MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE:
|
||||
av_log(h, AV_LOG_ERROR, "TLS handshake failed.\n");
|
||||
break;
|
||||
#endif
|
||||
case MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE:
|
||||
av_log(h, AV_LOG_ERROR, "A fatal alert message was received from the peer, has the peer a correct certificate?\n");
|
||||
break;
|
||||
@@ -194,16 +199,6 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op
|
||||
}
|
||||
}
|
||||
|
||||
// load key file
|
||||
if (shr->key_file) {
|
||||
if ((ret = mbedtls_pk_parse_keyfile(&tls_ctx->priv_key,
|
||||
shr->key_file,
|
||||
tls_ctx->priv_key_pw)) != 0) {
|
||||
handle_pk_parse_error(h, ret);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
// seed the random number generator
|
||||
if ((ret = mbedtls_ctr_drbg_seed(&tls_ctx->ctr_drbg_context,
|
||||
mbedtls_entropy_func,
|
||||
@@ -213,6 +208,21 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op
|
||||
goto fail;
|
||||
}
|
||||
|
||||
// load key file
|
||||
if (shr->key_file) {
|
||||
if ((ret = mbedtls_pk_parse_keyfile(&tls_ctx->priv_key,
|
||||
shr->key_file,
|
||||
tls_ctx->priv_key_pw
|
||||
#if MBEDTLS_VERSION_MAJOR >= 3
|
||||
, mbedtls_ctr_drbg_random,
|
||||
&tls_ctx->ctr_drbg_context
|
||||
#endif
|
||||
)) != 0) {
|
||||
handle_pk_parse_error(h, ret);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
if ((ret = mbedtls_ssl_config_defaults(&tls_ctx->ssl_config,
|
||||
shr->listen ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT,
|
||||
MBEDTLS_SSL_TRANSPORT_STREAM,
|
||||
|
||||
Reference in New Issue
Block a user