summaryrefslogtreecommitdiff
path: root/libavfilter/vf_hqdn3d.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-01-29 22:43:36 +0100
committerMichael Niedermayer <michaelni@gmx.at>2015-01-29 22:43:36 +0100
commitccccfb59b14ffbc2a6c1d402c8cae3cdf30f1a6e (patch)
tree102d556250573f0fe8f32c725b679c31d7f827a5 /libavfilter/vf_hqdn3d.c
parent89c35b113060a00bc57ee67c5ebc29ea500d5160 (diff)
parent22b985d59c007c4422aefe3ef3fca0aa0daafa9f (diff)
downloadffmpeg-ccccfb59b14ffbc2a6c1d402c8cae3cdf30f1a6e.tar.gz
Merge commit '22b985d59c007c4422aefe3ef3fca0aa0daafa9f'
* commit '22b985d59c007c4422aefe3ef3fca0aa0daafa9f': hqdn3d: check memory allocations and propagate errors Conflicts: libavfilter/vf_hqdn3d.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter/vf_hqdn3d.c')
-rw-r--r--libavfilter/vf_hqdn3d.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/libavfilter/vf_hqdn3d.c b/libavfilter/vf_hqdn3d.c
index 0448c0d1e8..4b1f2f997f 100644
--- a/libavfilter/vf_hqdn3d.c
+++ b/libavfilter/vf_hqdn3d.c
@@ -121,11 +121,11 @@ static void denoise_spatial(HQDN3DContext *s,
}
av_always_inline
-static void denoise_depth(HQDN3DContext *s,
- uint8_t *src, uint8_t *dst,
- uint16_t *line_ant, uint16_t **frame_ant_ptr,
- int w, int h, int sstride, int dstride,
- int16_t *spatial, int16_t *temporal, int depth)
+static int denoise_depth(HQDN3DContext *s,
+ uint8_t *src, uint8_t *dst,
+ uint16_t *line_ant, uint16_t **frame_ant_ptr,
+ int w, int h, int sstride, int dstride,
+ int16_t *spatial, int16_t *temporal, int depth)
{
// FIXME: For 16bit depth, frame_ant could be a pointer to the previous
// filtered frame rather than a separate buffer.
@@ -134,6 +134,8 @@ static void denoise_depth(HQDN3DContext *s,
if (!frame_ant) {
uint8_t *frame_src = src;
*frame_ant_ptr = frame_ant = av_malloc_array(w, h*sizeof(uint16_t));
+ if (!frame_ant)
+ return AVERROR(ENOMEM);
for (y = 0; y < h; y++, src += sstride, frame_ant += w)
for (x = 0; x < w; x++)
frame_ant[x] = LOAD(x);
@@ -148,15 +150,25 @@ static void denoise_depth(HQDN3DContext *s,
denoise_temporal(src, dst, frame_ant,
w, h, sstride, dstride, temporal, depth);
emms_c();
+ return 0;
}
-#define denoise(...) \
- switch (s->depth) {\
- case 8: denoise_depth(__VA_ARGS__, 8); break;\
- case 9: denoise_depth(__VA_ARGS__, 9); break;\
- case 10: denoise_depth(__VA_ARGS__, 10); break;\
- case 16: denoise_depth(__VA_ARGS__, 16); break;\
- }
+#define denoise(...) \
+ do { \
+ int ret = AVERROR_INVALIDDATA; \
+ switch (s->depth) { \
+ case 8: ret = denoise_depth(__VA_ARGS__, 8); break; \
+ case 9: ret = denoise_depth(__VA_ARGS__, 9); break; \
+ case 10: ret = denoise_depth(__VA_ARGS__, 10); break; \
+ case 16: ret = denoise_depth(__VA_ARGS__, 16); break; \
+ } \
+ if (ret < 0) { \
+ av_frame_free(&out); \
+ if (!direct) \
+ av_frame_free(&in); \
+ return ret; \
+ } \
+ } while (0)
static int16_t *precalc_coefs(double dist25, int depth)
{
@@ -282,13 +294,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
AVFilterLink *outlink = ctx->outputs[0];
AVFrame *out;
- int direct, c;
+ int c, direct = av_frame_is_writable(in) && !ctx->is_disabled;
- if (av_frame_is_writable(in) && !ctx->is_disabled) {
- direct = 1;
+ if (direct) {
out = in;
} else {
- direct = 0;
out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
if (!out) {
av_frame_free(&in);