[FFmpeg-cvslog] avfilter/vf_waveform: optimize lowpass 8bit filter
ffmpeg | branch: master | Paul B Mahol | Sun Mar 27 23:29:38 2016 +0200| [48be92e5b6847f622fa356349d6fdf9d86aaf28b] | committer: Paul B Mahol avfilter/vf_waveform: optimize lowpass 8bit filter Signed-off-by: Paul B Mahol > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=48be92e5b6847f622fa356349d6fdf9d86aaf28b --- libavfilter/vf_waveform.c | 95 + 1 file changed, 71 insertions(+), 24 deletions(-) diff --git a/libavfilter/vf_waveform.c b/libavfilter/vf_waveform.c index 3715bcb..5041f95 100644 --- a/libavfilter/vf_waveform.c +++ b/libavfilter/vf_waveform.c @@ -708,6 +708,22 @@ static av_always_inline void lowpass(WaveformContext *s, envelope(s, out, plane, plane, column ? offset_x : offset_y); } +#define LOWPASS_FUNC(name, column, mirror) \ +static void lowpass_##name(WaveformContext *s, \ + AVFrame *in, AVFrame *out,\ + int component, int intensity, \ + int offset_y, int offset_x, \ + int unused1, int unused2) \ +{\ +lowpass(s, in, out, component, intensity,\ +offset_y, offset_x, column, mirror); \ +} + +LOWPASS_FUNC(column_mirror, 1, 1) +LOWPASS_FUNC(column,1, 0) +LOWPASS_FUNC(row_mirror,0, 1) +LOWPASS_FUNC(row, 0, 0) + static av_always_inline void flat16(WaveformContext *s, AVFrame *in, AVFrame *out, int component, int intensity, @@ -2397,30 +2413,61 @@ static int config_input(AVFilterLink *inlink) s->graticulef = graticule_none; switch (s->filter) { -case LOWPASS: -s->size = 256; -s->waveform = s->bits > 8 ? lowpass16 : lowpass; -break; -case FLAT: -s->size = 256 * 3; -s->waveform = s->bits > 8 ? flat16 : flat; -break; -case AFLAT: -s->size = 256 * 2; -s->waveform = s->bits > 8 ? aflat16 : aflat; -break; -case CHROMA: -s->size = 256; -s->waveform = s->bits > 8 ? chroma16 : chroma; -break; -case COLOR: -s->size = 256; -s->waveform = s->bits > 8 ? color16 : color; -break; -case ACOLOR: -s->size = 256; -s->waveform = s->bits > 8 ? acolor16 : acolor; -break; +case AFLAT: s->size = 256 * 2; break; +case FLAT: s->size = 256 * 3; break; +default:s->size = 256; break; +} + +switch (s->filter | ((s->bits > 8) << 4) | +(s->mode << 8) | (s->mirror << 12)) { +case 0x1100: s->waveform = lowpass_column_mirror; break; +case 0x1000: s->waveform = lowpass_row_mirror;break; +case 0x0100: s->waveform = lowpass_column;break; +case 0x: s->waveform = lowpass_row; break; +case 0x1110: +case 0x1010: +case 0x0110: +case 0x0010: s->waveform = lowpass16; break; +case 0x1101: +case 0x1001: +case 0x0101: +case 0x0001: s->waveform = flat; break; +case 0x: +case 0x1011: +case 0x0111: +case 0x0011: s->waveform = flat16;break; +case 0x1102: +case 0x1002: +case 0x0102: +case 0x0002: s->waveform = aflat; break; +case 0x1112: +case 0x1012: +case 0x0112: +case 0x0012: s->waveform = aflat16; break; +case 0x1103: +case 0x1003: +case 0x0103: +case 0x0003: s->waveform = chroma;break; +case 0x1113: +case 0x1013: +case 0x0113: +case 0x0013: s->waveform = chroma16; break; +case 0x1104: +case 0x1004: +case 0x0104: +case 0x0004: s->waveform = color; break; +case 0x1114: +case 0x1014: +case 0x0114: +case 0x0014: s->waveform = color16; break; +case 0x1105: +case 0x1005: +case 0x0105: +case 0x0005: s->waveform = acolor;break; +case 0x1115: +case 0x1015: +case 0x0115: +case 0x0015: s->waveform = acolor16; break; } switch (s->filter) { ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avfilter/vf_waveform: move mirror variable into function argument
ffmpeg | branch: master | Paul B Mahol | Sun Mar 27 22:50:04 2016 +0200| [0b9957c3019a6b4a61ca5d1aff64378e5dc46d98] | committer: Paul B Mahol avfilter/vf_waveform: move mirror variable into function argument Signed-off-by: Paul B Mahol > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0b9957c3019a6b4a61ca5d1aff64378e5dc46d98 --- libavfilter/vf_waveform.c | 107 - 1 file changed, 67 insertions(+), 40 deletions(-) diff --git a/libavfilter/vf_waveform.c b/libavfilter/vf_waveform.c index 1ec7577..3715bcb 100644 --- a/libavfilter/vf_waveform.c +++ b/libavfilter/vf_waveform.c @@ -90,8 +90,11 @@ typedef struct WaveformContext { intshift_w[4], shift_h[4]; GraticuleLines *glines; intnb_glines; -void (*waveform)(struct WaveformContext *s, AVFrame *in, AVFrame *out, - int component, int intensity, int offset_y, int offset_x, int column); +void (*waveform)(struct WaveformContext *s, + AVFrame *in, AVFrame *out, + int component, int intensity, + int offset_y, int offset_x, + int column, int mirror); void (*graticulef)(struct WaveformContext *s, AVFrame *out); const AVPixFmtDescriptor *desc; } WaveformContext; @@ -589,11 +592,13 @@ static void update(uint8_t *target, int max, int intensity) *target = 255; } -static void lowpass16(WaveformContext *s, AVFrame *in, AVFrame *out, - int component, int intensity, int offset_y, int offset_x, int column) +static av_always_inline void lowpass16(WaveformContext *s, + AVFrame *in, AVFrame *out, + int component, int intensity, + int offset_y, int offset_x, + int column, int mirror) { const int plane = s->desc->comp[component].plane; -const int mirror = s->mirror; const int shift_w = s->shift_w[component]; const int shift_h = s->shift_h[component]; const int src_linesize = in->linesize[plane] / 2; @@ -646,11 +651,13 @@ static void lowpass16(WaveformContext *s, AVFrame *in, AVFrame *out, envelope16(s, out, plane, plane, column ? offset_x : offset_y); } -static void lowpass(WaveformContext *s, AVFrame *in, AVFrame *out, -int component, int intensity, int offset_y, int offset_x, int column) +static av_always_inline void lowpass(WaveformContext *s, + AVFrame *in, AVFrame *out, + int component, int intensity, + int offset_y, int offset_x, + int column, int mirror) { const int plane = s->desc->comp[component].plane; -const int mirror = s->mirror; const int shift_w = s->shift_w[component]; const int shift_h = s->shift_h[component]; const int src_linesize = in->linesize[plane]; @@ -701,11 +708,13 @@ static void lowpass(WaveformContext *s, AVFrame *in, AVFrame *out, envelope(s, out, plane, plane, column ? offset_x : offset_y); } -static void flat16(WaveformContext *s, AVFrame *in, AVFrame *out, - int component, int intensity, int offset_y, int offset_x, int column) +static av_always_inline void flat16(WaveformContext *s, +AVFrame *in, AVFrame *out, +int component, int intensity, +int offset_y, int offset_x, +int column, int mirror) { const int plane = s->desc->comp[component].plane; -const int mirror = s->mirror; const int c0_linesize = in->linesize[ plane + 0 ] / 2; const int c1_linesize = in->linesize[(plane + 1) % s->ncomp] / 2; const int c2_linesize = in->linesize[(plane + 2) % s->ncomp] / 2; @@ -811,11 +820,13 @@ static void flat16(WaveformContext *s, AVFrame *in, AVFrame *out, envelope16(s, out, plane, (plane + 1) % s->ncomp, column ? offset_x : offset_y); } -static void flat(WaveformContext *s, AVFrame *in, AVFrame *out, - int component, int intensity, int offset_y, int offset_x, int column) +static av_always_inline void flat(WaveformContext *s, + AVFrame *in, AVFrame *out, + int component, int intensity, + int offset_y, int offset_x, + int column, int mirror) { const int plane = s->desc->comp[component].plane; -const int mirror = s->mirror; const int c0_linesize = in->linesize[ plane + 0 ]; const int c1_linesize = in->linesize[(plane + 1) % s->ncomp]; const int c2_linesize = in->linesize[(plane + 2) % s->ncomp]; @@ -919,11 +930,13 @@ static void flat(WaveformContext *s, AVFrame *in, AVFra
[FFmpeg-cvslog] configure: Fail if CUDA enabled but not found
ffmpeg | branch: master | Timo Rothenpieler | Sat Mar 26 00:13:39 2016 +0100| [665c05f7cb703fba5965b36346344d0a8372965f] | committer: Timo Rothenpieler configure: Fail if CUDA enabled but not found Without this patch, configure still passes and enables CUDA, no matter if it was actually found, breaking the build in case it was not. > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=665c05f7cb703fba5965b36346344d0a8372965f --- configure |3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 5aa8c1f..e550547 100755 --- a/configure +++ b/configure @@ -5513,7 +5513,8 @@ enabled avfoundation_indev && { check_lib2 CoreGraphics/CoreGraphics.h CGGetActi enabled avisynth && { { check_lib2 "windows.h" LoadLibrary; } || { check_lib2 "dlfcn.h" dlopen -ldl; } || die "ERROR: LoadLibrary/dlopen not found for avisynth"; } -enabled cuda && check_lib cuda.h cuInit -lcuda +enabled cuda && { check_lib cuda.h cuInit -lcuda || + die "ERROR: CUDA not found"; } enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint enabled coreimage_filter && { check_header_objcc QuartzCore/CoreImage.h || disable coreimage_filter; } enabled coreimagesrc_filter && { check_header_objcc QuartzCore/CoreImage.h || disable coreimagesrc_filter; } ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/diracdec: check bitstream size related fields for overflows
ffmpeg | branch: master | Michael Niedermayer | Mon Mar 28 04:01:08 2016 +0200| [8f2a1990c06df73cf58401c8ba193711eb8947e7] | committer: Michael Niedermayer avcodec/diracdec: check bitstream size related fields for overflows Fixes segfault Fixes Ticket5333 Regression since bfc8a4dabe5a0154b31128b59dca575010176441 Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8f2a1990c06df73cf58401c8ba193711eb8947e7 --- libavcodec/diracdec.c | 26 +- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c index e530a05..05c7900 100644 --- a/libavcodec/diracdec.c +++ b/libavcodec/diracdec.c @@ -173,7 +173,7 @@ typedef struct DiracContext { struct { unsigned prefix_bytes; -unsigned size_scaler; +uint64_t size_scaler; } highquality; struct { @@ -826,9 +826,15 @@ static int decode_hq_slice(AVCodecContext *avctx, void *arg) /* Luma + 2 Chroma planes */ for (i = 0; i < 3; i++) { -int length = s->highquality.size_scaler * get_bits(gb, 8); -int bits_left = 8 * length; -int bits_end = get_bits_count(gb) + bits_left; +int64_t length = s->highquality.size_scaler * get_bits(gb, 8); +int64_t bits_left = 8 * length; +int64_t bits_end = get_bits_count(gb) + bits_left; + +if (bits_end >= INT_MAX) { +av_log(s->avctx, AV_LOG_ERROR, "end too far away\n"); +return AVERROR_INVALIDDATA; +} + for (level = 0; level < s->wavelet_depth; level++) { for (orientation = !!level; orientation < 4; orientation++) { decode_subband(s, gb, quants[level][orientation], slice->slice_x, slice->slice_y, bits_end, @@ -848,7 +854,8 @@ static int decode_hq_slice(AVCodecContext *avctx, void *arg) static int decode_lowdelay(DiracContext *s) { AVCodecContext *avctx = s->avctx; -int slice_x, slice_y, bytes = 0, bufsize; +int slice_x, slice_y, bufsize; +int64_t bytes = 0; const uint8_t *buf; DiracSlice *slices; int slice_num = 0; @@ -872,6 +879,11 @@ static int decode_lowdelay(DiracContext *s) if (bytes <= bufsize/8) bytes += buf[bytes] * s->highquality.size_scaler + 1; } +if (bytes >= INT_MAX) { +av_log(s->avctx, AV_LOG_ERROR, "too many bytes\n"); +av_free(slices); +return AVERROR_INVALIDDATA; +} slices[slice_num].bytes = bytes; slices[slice_num].slice_x = slice_x; @@ -1151,6 +1163,10 @@ static int dirac_unpack_idwt_params(DiracContext *s) } else if (s->hq_picture) { s->highquality.prefix_bytes = svq3_get_ue_golomb(gb); s->highquality.size_scaler = svq3_get_ue_golomb(gb); +if (s->highquality.prefix_bytes >= INT_MAX / 8) { +av_log(s->avctx,AV_LOG_ERROR,"too many prefix bytes\n"); +return AVERROR_INVALIDDATA; +} } /* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */ ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog