History

libavfilter: Remove synchronous functions from DNN filters

This commit removes the unused sync mode specific code from the DNN filters since the sync and async mode are now unified from the filters' perspective.

Shubhanshu Saxena committed 5 years ago

Commit 70b4dca1 parent 60b4d072 files · +4 −151Browse files

Unified · Split

2 files
  1. libavfilter/vf_dnn_detect.c +2 −69
  2. libavfilter/vf_dnn_processing.c +2 −82
libavfilter/vf_dnn_detect.c+2−69
@@ -353,63 +353,6 @@ static int dnn_detect_query_formats(AVFilterContext *context) · 352 unmodified lines
353 return ff_set_common_formats_from_list(context, pix_fmts);353 return ff_set_common_formats_from_list(context, pix_fmts);
354}354}
355 355
356static int dnn_detect_filter_frame(AVFilterLink *inlink, AVFrame *in)
357{
358 AVFilterContext *context = inlink->dst;
359 AVFilterLink *outlink = context->outputs[0];
360 DnnDetectContext *ctx = context->priv;
361 DNNReturnType dnn_result;
362
363 dnn_result = ff_dnn_execute_model(&ctx->dnnctx, in, in);
364 if (dnn_result != DNN_SUCCESS){
365 av_log(ctx, AV_LOG_ERROR, "failed to execute model\n");
366 av_frame_free(&in);
367 return AVERROR(EIO);
368 }
369
370 return ff_filter_frame(outlink, in);
371}
372
373static int dnn_detect_activate_sync(AVFilterContext *filter_ctx)
374{
375 AVFilterLink *inlink = filter_ctx->inputs[0];
376 AVFilterLink *outlink = filter_ctx->outputs[0];
377 AVFrame *in = NULL;
378 int64_t pts;
379 int ret, status;
380 int got_frame = 0;
381
382 FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
383
384 do {
385 // drain all input frames
386 ret = ff_inlink_consume_frame(inlink, &in);
387 if (ret < 0)
388 return ret;
389 if (ret > 0) {
390 ret = dnn_detect_filter_frame(inlink, in);
391 if (ret < 0)
392 return ret;
393 got_frame = 1;
394 }
395 } while (ret > 0);
396
397 // if frame got, schedule to next filter
398 if (got_frame)
399 return 0;
400
401 if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
402 if (status == AVERROR_EOF) {
403 ff_outlink_set_status(outlink, status, pts);
404 return ret;
405 }
406 }
407
408 FF_FILTER_FORWARD_WANTED(outlink, inlink);
409
410 return FFERROR_NOT_READY;
411}
412
413static int dnn_detect_flush_frame(AVFilterLink *outlink, int64_t pts, int64_t *out_pts)356static int dnn_detect_flush_frame(AVFilterLink *outlink, int64_t pts, int64_t *out_pts)
414{357{
415 DnnDetectContext *ctx = outlink->src->priv;358 DnnDetectContext *ctx = outlink->src->priv;
@@ -438,7 +381,7 @@ static int dnn_detect_flush_frame(AVFilterLink *outlink, int64_t pts, int64_t *o · 22 unmodified lines
438 return 0;381 return 0;
439}382}
440 383
441static int dnn_detect_activate_async(AVFilterContext *filter_ctx)384static int dnn_detect_activate(AVFilterContext *filter_ctx)
442{385{
443 AVFilterLink *inlink = filter_ctx->inputs[0];386 AVFilterLink *inlink = filter_ctx->inputs[0];
444 AVFilterLink *outlink = filter_ctx->outputs[0];387 AVFilterLink *outlink = filter_ctx->outputs[0];
@@ -494,16 +437,6 @@ static int dnn_detect_activate_async(AVFilterContext *filter_ctx) · 49 unmodified lines
494 return 0;437 return 0;
495}438}
496 439
497static av_unused int dnn_detect_activate(AVFilterContext *filter_ctx)
498{
499 DnnDetectContext *ctx = filter_ctx->priv;
500
501 if (ctx->dnnctx.async)
502 return dnn_detect_activate_async(filter_ctx);
503 else
504 return dnn_detect_activate_sync(filter_ctx);
505}
506
507static av_cold void dnn_detect_uninit(AVFilterContext *context)440static av_cold void dnn_detect_uninit(AVFilterContext *context)
508{441{
509 DnnDetectContext *ctx = context->priv;442 DnnDetectContext *ctx = context->priv;
@@ -535,5 +468,5 @@ const AVFilter ff_vf_dnn_detect = { · 25 unmodified lines
535 FILTER_INPUTS(dnn_detect_inputs),468 FILTER_INPUTS(dnn_detect_inputs),
536 FILTER_OUTPUTS(dnn_detect_outputs),469 FILTER_OUTPUTS(dnn_detect_outputs),
537 .priv_class = &dnn_detect_class,470 .priv_class = &dnn_detect_class,
538 .activate = dnn_detect_activate_async,471 .activate = dnn_detect_activate,
539};472};
libavfilter/vf_dnn_processing.c+2−82
@@ -244,76 +244,6 @@ static int copy_uv_planes(DnnProcessingContext *ctx, AVFrame *out, const AVFrame · 243 unmodified lines
244 return 0;244 return 0;
245}245}
246 246
247static int filter_frame(AVFilterLink *inlink, AVFrame *in)
248{
249 AVFilterContext *context = inlink->dst;
250 AVFilterLink *outlink = context->outputs[0];
251 DnnProcessingContext *ctx = context->priv;
252 DNNReturnType dnn_result;
253 AVFrame *out;
254
255 out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
256 if (!out) {
257 av_frame_free(&in);
258 return AVERROR(ENOMEM);
259 }
260 av_frame_copy_props(out, in);
261
262 dnn_result = ff_dnn_execute_model(&ctx->dnnctx, in, out);
263 if (dnn_result != DNN_SUCCESS){
264 av_log(ctx, AV_LOG_ERROR, "failed to execute model\n");
265 av_frame_free(&in);
266 av_frame_free(&out);
267 return AVERROR(EIO);
268 }
269
270 if (isPlanarYUV(in->format))
271 copy_uv_planes(ctx, out, in);
272
273 av_frame_free(&in);
274 return ff_filter_frame(outlink, out);
275}
276
277static int activate_sync(AVFilterContext *filter_ctx)
278{
279 AVFilterLink *inlink = filter_ctx->inputs[0];
280 AVFilterLink *outlink = filter_ctx->outputs[0];
281 AVFrame *in = NULL;
282 int64_t pts;
283 int ret, status;
284 int got_frame = 0;
285
286 FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
287
288 do {
289 // drain all input frames
290 ret = ff_inlink_consume_frame(inlink, &in);
291 if (ret < 0)
292 return ret;
293 if (ret > 0) {
294 ret = filter_frame(inlink, in);
295 if (ret < 0)
296 return ret;
297 got_frame = 1;
298 }
299 } while (ret > 0);
300
301 // if frame got, schedule to next filter
302 if (got_frame)
303 return 0;
304
305 if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
306 if (status == AVERROR_EOF) {
307 ff_outlink_set_status(outlink, status, pts);
308 return ret;
309 }
310 }
311
312 FF_FILTER_FORWARD_WANTED(outlink, inlink);
313
314 return FFERROR_NOT_READY;
315}
316
317static int flush_frame(AVFilterLink *outlink, int64_t pts, int64_t *out_pts)247static int flush_frame(AVFilterLink *outlink, int64_t pts, int64_t *out_pts)
318{248{
319 DnnProcessingContext *ctx = outlink->src->priv;249 DnnProcessingContext *ctx = outlink->src->priv;
@@ -345,7 +275,7 @@ static int flush_frame(AVFilterLink *outlink, int64_t pts, int64_t *out_pts) · 25 unmodified lines
345 return 0;275 return 0;
346}276}
347 277
348static int activate_async(AVFilterContext *filter_ctx)278static int activate(AVFilterContext *filter_ctx)
349{279{
350 AVFilterLink *inlink = filter_ctx->inputs[0];280 AVFilterLink *inlink = filter_ctx->inputs[0];
351 AVFilterLink *outlink = filter_ctx->outputs[0];281 AVFilterLink *outlink = filter_ctx->outputs[0];
@@ -410,16 +340,6 @@ static int activate_async(AVFilterContext *filter_ctx) · 58 unmodified lines
410 return 0;340 return 0;
411}341}
412 342
413static av_unused int activate(AVFilterContext *filter_ctx)
414{
415 DnnProcessingContext *ctx = filter_ctx->priv;
416
417 if (ctx->dnnctx.async)
418 return activate_async(filter_ctx);
419 else
420 return activate_sync(filter_ctx);
421}
422
423static av_cold void uninit(AVFilterContext *ctx)343static av_cold void uninit(AVFilterContext *ctx)
424{344{
425 DnnProcessingContext *context = ctx->priv;345 DnnProcessingContext *context = ctx->priv;
@@ -454,5 +374,5 @@ const AVFilter ff_vf_dnn_processing = { · 28 unmodified lines
454 FILTER_INPUTS(dnn_processing_inputs),374 FILTER_INPUTS(dnn_processing_inputs),
455 FILTER_OUTPUTS(dnn_processing_outputs),375 FILTER_OUTPUTS(dnn_processing_outputs),
456 .priv_class = &dnn_processing_class,376 .priv_class = &dnn_processing_class,
457 .activate = activate_async,377 .activate = activate,
458};378};

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t