... | ... |
@@ -281,13 +281,19 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) |
281 | 281 |
HueContext *hue = inlink->dst->priv; |
282 | 282 |
AVFilterLink *outlink = inlink->dst->outputs[0]; |
283 | 283 |
AVFrame *outpic; |
284 |
+ int direct = 0; |
|
284 | 285 |
|
286 |
+ if (av_frame_is_writable(inpic)) { |
|
287 |
+ direct = 1; |
|
288 |
+ outpic = inpic; |
|
289 |
+ } else { |
|
285 | 290 |
outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h); |
286 | 291 |
if (!outpic) { |
287 | 292 |
av_frame_free(&inpic); |
288 | 293 |
return AVERROR(ENOMEM); |
289 | 294 |
} |
290 | 295 |
av_frame_copy_props(outpic, inpic); |
296 |
+ } |
|
291 | 297 |
|
292 | 298 |
if (!hue->flat_syntax) { |
293 | 299 |
hue->var_values[VAR_T] = TS2T(inpic->pts, inlink->time_base); |
... | ... |
@@ -321,6 +327,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) |
321 | 321 |
|
322 | 322 |
hue->var_values[VAR_N] += 1; |
323 | 323 |
|
324 |
+ if (!direct) |
|
324 | 325 |
av_image_copy_plane(outpic->data[0], outpic->linesize[0], |
325 | 326 |
inpic->data[0], inpic->linesize[0], |
326 | 327 |
inlink->w, inlink->h); |
... | ... |
@@ -330,6 +337,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) |
330 | 330 |
inlink->w >> hue->hsub, inlink->h >> hue->vsub, |
331 | 331 |
hue->hue_cos, hue->hue_sin); |
332 | 332 |
|
333 |
+ if (!direct) |
|
333 | 334 |
av_frame_free(&inpic); |
334 | 335 |
return ff_filter_frame(outlink, outpic); |
335 | 336 |
} |