... | ... |
@@ -121,11 +121,11 @@ static void denoise_spatial(HQDN3DContext *s, |
121 | 121 |
} |
122 | 122 |
|
123 | 123 |
av_always_inline |
124 |
-static void denoise_depth(HQDN3DContext *s, |
|
125 |
- uint8_t *src, uint8_t *dst, |
|
126 |
- uint16_t *line_ant, uint16_t **frame_ant_ptr, |
|
127 |
- int w, int h, int sstride, int dstride, |
|
128 |
- int16_t *spatial, int16_t *temporal, int depth) |
|
124 |
+static int denoise_depth(HQDN3DContext *s, |
|
125 |
+ uint8_t *src, uint8_t *dst, |
|
126 |
+ uint16_t *line_ant, uint16_t **frame_ant_ptr, |
|
127 |
+ int w, int h, int sstride, int dstride, |
|
128 |
+ int16_t *spatial, int16_t *temporal, int depth) |
|
129 | 129 |
{ |
130 | 130 |
// FIXME: For 16bit depth, frame_ant could be a pointer to the previous |
131 | 131 |
// filtered frame rather than a separate buffer. |
... | ... |
@@ -134,6 +134,8 @@ static void denoise_depth(HQDN3DContext *s, |
134 | 134 |
if (!frame_ant) { |
135 | 135 |
uint8_t *frame_src = src; |
136 | 136 |
*frame_ant_ptr = frame_ant = av_malloc(w*h*sizeof(uint16_t)); |
137 |
+ if (!frame_ant) |
|
138 |
+ return AVERROR(ENOMEM); |
|
137 | 139 |
for (y = 0; y < h; y++, src += sstride, frame_ant += w) |
138 | 140 |
for (x = 0; x < w; x++) |
139 | 141 |
frame_ant[x] = LOAD(x); |
... | ... |
@@ -148,15 +150,25 @@ static void denoise_depth(HQDN3DContext *s, |
148 | 148 |
denoise_temporal(src, dst, frame_ant, |
149 | 149 |
w, h, sstride, dstride, temporal, depth); |
150 | 150 |
emms_c(); |
151 |
+ return 0; |
|
151 | 152 |
} |
152 | 153 |
|
153 |
-#define denoise(...) \ |
|
154 |
- switch (s->depth) {\ |
|
155 |
- case 8: denoise_depth(__VA_ARGS__, 8); break;\ |
|
156 |
- case 9: denoise_depth(__VA_ARGS__, 9); break;\ |
|
157 |
- case 10: denoise_depth(__VA_ARGS__, 10); break;\ |
|
158 |
- case 16: denoise_depth(__VA_ARGS__, 16); break;\ |
|
159 |
- } |
|
154 |
+#define denoise(...) \ |
|
155 |
+ do { \ |
|
156 |
+ int ret = AVERROR_INVALIDDATA; \ |
|
157 |
+ switch (s->depth) { \ |
|
158 |
+ case 8: ret = denoise_depth(__VA_ARGS__, 8); break; \ |
|
159 |
+ case 9: ret = denoise_depth(__VA_ARGS__, 9); break; \ |
|
160 |
+ case 10: ret = denoise_depth(__VA_ARGS__, 10); break; \ |
|
161 |
+ case 16: ret = denoise_depth(__VA_ARGS__, 16); break; \ |
|
162 |
+ } \ |
|
163 |
+ if (ret < 0) { \ |
|
164 |
+ av_frame_free(&out); \ |
|
165 |
+ if (!direct) \ |
|
166 |
+ av_frame_free(&in); \ |
|
167 |
+ return ret; \ |
|
168 |
+ } \ |
|
169 |
+ } while (0) |
|
160 | 170 |
|
161 | 171 |
static int16_t *precalc_coefs(double dist25, int depth) |
162 | 172 |
{ |
... | ... |
@@ -280,13 +292,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) |
280 | 280 |
HQDN3DContext *s = inlink->dst->priv; |
281 | 281 |
AVFilterLink *outlink = inlink->dst->outputs[0]; |
282 | 282 |
AVFrame *out; |
283 |
- int direct, c; |
|
283 |
+ int c, direct = av_frame_is_writable(in); |
|
284 | 284 |
|
285 |
- if (av_frame_is_writable(in)) { |
|
286 |
- direct = 1; |
|
285 |
+ if (direct) { |
|
287 | 286 |
out = in; |
288 | 287 |
} else { |
289 |
- direct = 0; |
|
290 | 288 |
out = ff_get_video_buffer(outlink, outlink->w, outlink->h); |
291 | 289 |
if (!out) { |
292 | 290 |
av_frame_free(&in); |