[FFmpeg-devel] [PATCH 3/3 v2] avcodec/bsf: add av_bsf_close()

James Almer jamrial at gmail.com
Mon Aug 10 21:55:30 EEST 2020


This function lets the API user reuse an AVBSFContext in case of stream
parameter changes.

Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavcodec/bsf.c | 26 ++++++++++++++++++++++++++
 libavcodec/bsf.h | 14 ++++++++++++++
 2 files changed, 40 insertions(+)

diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
index d71bc32584..c8acd40ec0 100644
--- a/libavcodec/bsf.c
+++ b/libavcodec/bsf.c
@@ -29,6 +29,7 @@
 #include "bsf_internal.h"
 #include "codec_desc.h"
 #include "codec_par.h"
+#include "internal.h"
 
 #define IS_EMPTY(pkt) (!(pkt)->data && !(pkt)->side_data_elems)
 
@@ -197,6 +198,31 @@ void av_bsf_flush(AVBSFContext *ctx)
         ctx->filter->flush(ctx);
 }
 
+void av_bsf_close(AVBSFContext *ctx)
+{
+    AVBSFInternal *bsfi = ctx->internal;
+
+    if (ctx->filter->close)
+        ctx->filter->close(ctx);
+    if (ctx->priv_data) {
+        if (ctx->filter->priv_class)
+            av_opt_free(ctx->priv_data);
+        memset(ctx->priv_data, 0, ctx->filter->priv_data_size);
+        if (ctx->filter->priv_class) {
+            *(const AVClass **)ctx->priv_data = ctx->filter->priv_class;
+            av_opt_set_defaults(ctx->priv_data);
+        }
+    }
+
+    bsfi->eof = 0;
+    av_packet_unref(bsfi->buffer_pkt);
+
+    ctx->time_base_out = ctx->time_base_in = (AVRational){ 0, 0 };
+
+    ff_codec_parameters_reset(ctx->par_in);
+    ff_codec_parameters_reset(ctx->par_out);
+}
+
 int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
 {
     AVBSFInternal *bsfi = ctx->internal;
diff --git a/libavcodec/bsf.h b/libavcodec/bsf.h
index 3b5faa85cb..f72c45f7e5 100644
--- a/libavcodec/bsf.h
+++ b/libavcodec/bsf.h
@@ -216,12 +216,26 @@ int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt);
 
 /**
  * Reset the internal bitstream filter state. Should be called e.g. when seeking.
+ *
+ * @see av_bsf_close().
  */
 void av_bsf_flush(AVBSFContext *ctx);
 
+/**
+ * Close a bitstream filter context, leaving it in the same state as when it was
+ * freshly allocated. May be called e.g. to reuse the context in case of stream
+ * parameter changes.
+ *
+ * @see av_bsf_flush().
+ * @see av_bsf_free().
+ */
+void av_bsf_close(AVBSFContext *ctx);
+
 /**
  * Free a bitstream filter context and everything associated with it; write NULL
  * into the supplied pointer.
+ *
+ * @see av_bsf_close().
  */
 void av_bsf_free(AVBSFContext **ctx);
 
-- 
2.27.0



More information about the ffmpeg-devel mailing list