Showing the changes to libavfilter/avfilter.c (1 of 2 files). Show all
Unified · Split
| @@ -1501,6 +1501,58 @@ int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts · 1500 unmodified lines | ||
| 1501 | 1501 | return 1; |
| 1502 | 1502 | } |
| 1503 | 1503 | |
| 1504 | +int ff_inlink_check_available_frame(AVFilterLink *link) | |
| 1505 | +{ | |
| 1506 | + return ff_framequeue_queued_frames(&link->fifo) > 0; | |
| 1507 | +} | |
| 1508 | + | |
| 1509 | +int ff_inlink_check_available_samples(AVFilterLink *link, unsigned min) | |
| 1510 | +{ | |
| 1511 | + uint64_t samples = ff_framequeue_queued_samples(&link->fifo); | |
| 1512 | + av_assert1(min); | |
| 1513 | + return samples >= min || (link->status_in && samples); | |
| 1514 | +} | |
| 1515 | + | |
| 1516 | +static void consume_update(AVFilterLink *link, const AVFrame *frame) | |
| 1517 | +{ | |
| 1518 | + ff_inlink_process_commands(link, frame); | |
| 1519 | + link->dst->is_disabled = !ff_inlink_evaluate_timeline_at_frame(link, frame); | |
| 1520 | + link->frame_count_out++; | |
| 1521 | +} | |
| 1522 | + | |
| 1523 | +int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe) | |
| 1524 | +{ | |
| 1525 | + AVFrame *frame; | |
| 1526 | + | |
| 1527 | + *rframe = NULL; | |
| 1528 | + if (!ff_inlink_check_available_frame(link)) | |
| 1529 | + return 0; | |
| 1530 | + frame = ff_framequeue_take(&link->fifo); | |
| 1531 | + consume_update(link, frame); | |
| 1532 | + *rframe = frame; | |
| 1533 | + return 1; | |
| 1534 | +} | |
| 1535 | + | |
| 1536 | +int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, | |
| 1537 | + AVFrame **rframe) | |
| 1538 | +{ | |
| 1539 | + AVFrame *frame; | |
| 1540 | + int ret; | |
| 1541 | + | |
| 1542 | + av_assert1(min); | |
| 1543 | + *rframe = NULL; | |
| 1544 | + if (!ff_inlink_check_available_samples(link, min)) | |
| 1545 | + return 0; | |
| 1546 | + if (link->status_in) | |
| 1547 | + min = FFMIN(min, ff_framequeue_queued_samples(&link->fifo)); | |
| 1548 | + ret = take_samples(link, min, link->max_samples, &frame); | |
| 1549 | + if (ret < 0) | |
| 1550 | + return ret; | |
| 1551 | + consume_update(link, frame); | |
| 1552 | + *rframe = frame; | |
| 1553 | + return 1; | |
| 1554 | +} | |
| 1555 | + | |
| 1504 | 1556 | int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe) |
| 1505 | 1557 | { |
| 1506 | 1558 | AVFrame *frame = *rframe; |