diff mbox

[FFmpeg-devel,1/2] avfilter/filters: add ff_inlink_peek_frame and ff_inlink_queued_frames to access frames in the inlink fifo

Message ID 20180930214105.32068-1-cus@passwd.hu
State Accepted
Headers show

Commit Message

Marton Balint Sept. 30, 2018, 9:41 p.m. UTC
Signed-off-by: Marton Balint <cus@passwd.hu>
---
 libavfilter/avfilter.c | 13 +++++++++++++
 libavfilter/filters.h  | 14 ++++++++++++++
 2 files changed, 27 insertions(+)

Comments

Nicolas George Oct. 1, 2018, 12:18 p.m. UTC | #1
Marton Balint (2018-09-30):
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
>  libavfilter/avfilter.c | 13 +++++++++++++
>  libavfilter/filters.h  | 14 ++++++++++++++
>  2 files changed, 27 insertions(+)
> 
> diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
> index 85eff0aa1d..9e4b8e5ca3 100644
> --- a/libavfilter/avfilter.c
> +++ b/libavfilter/avfilter.c
> @@ -1448,6 +1448,11 @@ int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts
>      return 1;
>  }
>  
> +size_t ff_inlink_queued_frames(AVFilterLink *link)
> +{
> +    return ff_framequeue_queued_frames(&link->fifo);
> +}
> +
>  int ff_inlink_check_available_frame(AVFilterLink *link)
>  {
>      return ff_framequeue_queued_frames(&link->fifo) > 0;
> @@ -1507,6 +1512,14 @@ int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
>      return 1;
>  }
>  
> +AVFrame *ff_inlink_peek_frame(AVFilterLink *link, size_t idx)
> +{
> +   if (ff_framequeue_queued_frames(&link->fifo) > idx)
> +       return ff_framequeue_peek(&link->fifo, idx);
> +   else
> +       return NULL;
> +}
> +
>  int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
>  {
>      AVFrame *frame = *rframe;
> diff --git a/libavfilter/filters.h b/libavfilter/filters.h
> index 4e2652ebe5..b310f1c5a8 100644
> --- a/libavfilter/filters.h
> +++ b/libavfilter/filters.h
> @@ -60,6 +60,12 @@ int ff_inlink_process_commands(AVFilterLink *link, const AVFrame *frame);
>   */
>  int ff_inlink_evaluate_timeline_at_frame(AVFilterLink *link, const AVFrame *frame);
>  
> +/**
> + * Get the number of frames available on the link.
> + * @return the number of frames available in the link fifo.
> + */
> +size_t ff_inlink_queued_frames(AVFilterLink *link);
> +
>  /**
>   * Test if a frame is available on the link.
>   * @return  >0 if a frame is available
> @@ -102,6 +108,14 @@ int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe);
>  int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
>                              AVFrame **rframe);
>  
> +/**

> + * Access a frame in the link fifo without consuming it.
> + * The first frame is numbered 0.
> + * @return the frame at idx position in the link fifo, NULL if idx is greater
> + *         or equal to the fifo size.

I would like it better if the behaviour would match the wrapped
behaviour more closely:

 * The first frame is numbered 0; the designated frame must exist.

But we can discuss it.

> + */
> +AVFrame *ff_inlink_peek_frame(AVFilterLink *link, size_t idx);
> +
>  /**
>   * Make sure a frame is writable.
>   * This is similar to av_frame_make_writable() except it uses the link's

Apart from that, LGTM.

Regards,
Paul B Mahol Oct. 3, 2018, 4:22 p.m. UTC | #2
On 10/1/18, Marton Balint <cus@passwd.hu> wrote:
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
>  libavfilter/avfilter.c | 10 ++++++++++
>  libavfilter/filters.h  | 13 +++++++++++++
>  2 files changed, 23 insertions(+)
>

Probably ok.
Marton Balint Oct. 3, 2018, 8:16 p.m. UTC | #3
On Wed, 3 Oct 2018, Nicolas George wrote:

> Marton Balint (2018-10-01):
>> Signed-off-by: Marton Balint <cus@passwd.hu>
>> ---
>>  libavfilter/avfilter.c | 10 ++++++++++
>>  libavfilter/filters.h  | 13 +++++++++++++
>>  2 files changed, 23 insertions(+)
>
> LGTM, thanks.

Thanks, pushed the series.

Regards,
Marton
diff mbox

Patch

diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 85eff0aa1d..9e4b8e5ca3 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -1448,6 +1448,11 @@  int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts
     return 1;
 }
 
+size_t ff_inlink_queued_frames(AVFilterLink *link)
+{
+    return ff_framequeue_queued_frames(&link->fifo);
+}
+
 int ff_inlink_check_available_frame(AVFilterLink *link)
 {
     return ff_framequeue_queued_frames(&link->fifo) > 0;
@@ -1507,6 +1512,14 @@  int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
     return 1;
 }
 
+AVFrame *ff_inlink_peek_frame(AVFilterLink *link, size_t idx)
+{
+   if (ff_framequeue_queued_frames(&link->fifo) > idx)
+       return ff_framequeue_peek(&link->fifo, idx);
+   else
+       return NULL;
+}
+
 int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
 {
     AVFrame *frame = *rframe;
diff --git a/libavfilter/filters.h b/libavfilter/filters.h
index 4e2652ebe5..b310f1c5a8 100644
--- a/libavfilter/filters.h
+++ b/libavfilter/filters.h
@@ -60,6 +60,12 @@  int ff_inlink_process_commands(AVFilterLink *link, const AVFrame *frame);
  */
 int ff_inlink_evaluate_timeline_at_frame(AVFilterLink *link, const AVFrame *frame);
 
+/**
+ * Get the number of frames available on the link.
+ * @return the number of frames available in the link fifo.
+ */
+size_t ff_inlink_queued_frames(AVFilterLink *link);
+
 /**
  * Test if a frame is available on the link.
  * @return  >0 if a frame is available
@@ -102,6 +108,14 @@  int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe);
 int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
                             AVFrame **rframe);
 
+/**
+ * Access a frame in the link fifo without consuming it.
+ * The first frame is numbered 0.
+ * @return the frame at idx position in the link fifo, NULL if idx is greater
+ *         or equal to the fifo size.
+ */
+AVFrame *ff_inlink_peek_frame(AVFilterLink *link, size_t idx);
+
 /**
  * Make sure a frame is writable.
  * This is similar to av_frame_make_writable() except it uses the link's