diff mbox

[FFmpeg-devel,1/9] lavfi/buffersink: add accessors for the stream properties.

Message ID 20161227180210.23100-1-george@nsup.org
State Accepted
Headers show

Commit Message

Nicolas George Dec. 27, 2016, 6:02 p.m. UTC
av_buffersink_get_frame_rate() did already exist; its argument becomes const.

TODO minor version bump and APIChange entry

Signed-off-by: Nicolas George <george@nsup.org>
---
 libavfilter/buffersink.c | 25 +++++++++++++++++++------
 libavfilter/buffersink.h | 22 ++++++++++++++++++++--
 2 files changed, 39 insertions(+), 8 deletions(-)


The proposal of using a single function and a structure to return all fields
did not raise a lot of enthousiasm.

Furthermore, with the prospect of on-the-fly format change, having functions
involved that can compute the returned value instead of just reading it from
a field may prove useful.

If there are no objections, I can push patches 1-5 independently from 6-9

Comments

James Almer Dec. 27, 2016, 6:25 p.m. UTC | #1
On 12/27/2016 3:02 PM, Nicolas George wrote:
> The proposal of using a single function and a structure to return all fields
> did not raise a lot of enthousiasm.

It got my support, making it the same amount of support the other proposal
got.

If you ultimately went with this one it's because you favor it, not because
people didn't favor the other. And that's fine, you're the one writing this
code after all, you have the right to push it in your preferred direction
when there's a tie or no strict opposition.
But please don't pretend one got more support than the other when two people
replied to your question and each gave a different answer.
Nicolas George Dec. 27, 2016, 6:40 p.m. UTC | #2
Le septidi 7 nivôse, an CCXXV, James Almer a écrit :
> It got my support, making it the same amount of support the other proposal
> got.

That makes one.

> But please don't pretend one got more support than the other when two people
> replied to your question and each gave a different answer.

Good, I did not pretend anything like that, and I resent you accusing me
of it.

But you are not "a lot of enthusiasm" all by yourself, and that makes my
initial statement true.

Regards,
diff mbox

Patch

diff --git a/libavfilter/buffersink.c b/libavfilter/buffersink.c
index 7b7b47747d..030ca80315 100644
--- a/libavfilter/buffersink.c
+++ b/libavfilter/buffersink.c
@@ -279,14 +279,27 @@  void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size)
     inlink->partial_buf_size = frame_size;
 }
 
-AVRational av_buffersink_get_frame_rate(AVFilterContext *ctx)
-{
-    av_assert0(   !strcmp(ctx->filter->name, "buffersink")
-               || !strcmp(ctx->filter->name, "ffbuffersink"));
-
-    return ctx->inputs[0]->frame_rate;
+#define MAKE_AVFILTERLINK_ACCESSOR(type, field) \
+type av_buffersink_get_##field(const AVFilterContext *ctx) { \
+    av_assert0(ctx->filter->uninit == uninit); \
+    return ctx->inputs[0]->field; \
 }
 
+MAKE_AVFILTERLINK_ACCESSOR(enum AVMediaType , type               );
+MAKE_AVFILTERLINK_ACCESSOR(AVRational       , time_base          );
+MAKE_AVFILTERLINK_ACCESSOR(int              , format             );
+
+MAKE_AVFILTERLINK_ACCESSOR(AVRational       , frame_rate         );
+MAKE_AVFILTERLINK_ACCESSOR(int              , w                  );
+MAKE_AVFILTERLINK_ACCESSOR(int              , h                  );
+MAKE_AVFILTERLINK_ACCESSOR(AVRational       , sample_aspect_ratio);
+
+MAKE_AVFILTERLINK_ACCESSOR(int              , channels           );
+MAKE_AVFILTERLINK_ACCESSOR(uint64_t         , channel_layout     );
+MAKE_AVFILTERLINK_ACCESSOR(int              , sample_rate        );
+
+MAKE_AVFILTERLINK_ACCESSOR(AVBufferRef *    , hw_frames_ctx      );
+
 static av_cold int vsink_init(AVFilterContext *ctx, void *opaque)
 {
     BufferSinkContext *buf = ctx->priv;
diff --git a/libavfilter/buffersink.h b/libavfilter/buffersink.h
index e399b91175..f51fa7c1dd 100644
--- a/libavfilter/buffersink.h
+++ b/libavfilter/buffersink.h
@@ -101,9 +101,27 @@  AVABufferSinkParams *av_abuffersink_params_alloc(void);
 void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size);
 
 /**
- * Get the frame rate of the input.
+ * @defgroup lavfi_buffersink_accessors Buffer sink accessors
+ * Get the properties of the stream
+ * @{
  */
-AVRational av_buffersink_get_frame_rate(AVFilterContext *ctx);
+
+enum AVMediaType av_buffersink_get_type                (const AVFilterContext *ctx);
+AVRational       av_buffersink_get_time_base           (const AVFilterContext *ctx);
+int              av_buffersink_get_format              (const AVFilterContext *ctx);
+
+AVRational       av_buffersink_get_frame_rate          (const AVFilterContext *ctx);
+int              av_buffersink_get_w                   (const AVFilterContext *ctx);
+int              av_buffersink_get_h                   (const AVFilterContext *ctx);
+AVRational       av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx);
+
+int              av_buffersink_get_channels            (const AVFilterContext *ctx);
+uint64_t         av_buffersink_get_channel_layout      (const AVFilterContext *ctx);
+int              av_buffersink_get_sample_rate         (const AVFilterContext *ctx);
+
+AVBufferRef *    av_buffersink_get_hw_frames_ctx       (const AVFilterContext *ctx);
+
+/** @} */
 
 /**
  * Get a frame with filtered data from sink and put it in frame.