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 | return 1; | 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 | int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe) | 1556 | int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe) |
| 1505 | { | 1557 | { |
| 1506 | AVFrame *frame = *rframe; | 1558 | AVFrame *frame = *rframe; |