[FFmpeg-devel] [PATCH] cbs: Add function to make content of a unit writable

Andreas Rheinhardt andreas.rheinhardt at googlemail.com
Sun Nov 25 23:05:59 EET 2018


This will enable us to change e.g. the parameter sets of H.2645 in ways
that would change the parsing process of future units. An example of
this is the h264_redundant_pps bsf.
The actual implementation of the underlying codec-dependent
make_writable functions is not contained in this commit.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at googlemail.com>
---
This is a slight extension to my previous patch. In lots of cases where
this function will be applied, the user will already have a pointer to
the unit's content and this addition updates the pointer automatically.
 libavcodec/cbs.c          | 21 +++++++++++++++++++++
 libavcodec/cbs.h          |  9 +++++++++
 libavcodec/cbs_av1.c      |  1 +
 libavcodec/cbs_h2645.c    |  2 ++
 libavcodec/cbs_internal.h |  4 ++++
 libavcodec/cbs_jpeg.c     |  1 +
 libavcodec/cbs_mpeg2.c    |  1 +
 libavcodec/cbs_vp9.c      |  1 +
 8 files changed, 40 insertions(+)

diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c
index ecbf57c293..cb2ee3a769 100644
--- a/libavcodec/cbs.c
+++ b/libavcodec/cbs.c
@@ -665,3 +665,24 @@ int ff_cbs_delete_unit(CodedBitstreamContext *ctx,
 
     return 0;
 }
+
+int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx,
+                              CodedBitstreamUnit *unit,
+                              void** content)
+{
+    if (unit->content && (!unit->content_ref ||
+                          !av_buffer_is_writable(unit->content_ref))) {
+        int err;
+        if (!ctx->codec->make_writable)
+            return AVERROR_PATCHWELCOME;
+
+        err = ctx->codec->make_writable(ctx, unit);
+        if (err < 0)
+            return err;
+
+        if (content)
+            *content = unit->content;
+    }
+
+    return 0;
+}
diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h
index 53ac360bb1..9bdc6aa5fd 100644
--- a/libavcodec/cbs.h
+++ b/libavcodec/cbs.h
@@ -352,5 +352,14 @@ int ff_cbs_delete_unit(CodedBitstreamContext *ctx,
                        CodedBitstreamFragment *frag,
                        int position);
 
+/**
+ * Make the content of a unit writable.
+ *
+ * If content is supplied, *content will point to the unit's content on success.
+ */
+int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx,
+                              CodedBitstreamUnit *unit,
+                              void **content);
+
 
 #endif /* AVCODEC_CBS_H */
diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
index e02bc7027a..ce8ee3faaa 100644
--- a/libavcodec/cbs_av1.c
+++ b/libavcodec/cbs_av1.c
@@ -1305,6 +1305,7 @@ const CodedBitstreamType ff_cbs_type_av1 = {
 
     .split_fragment    = &cbs_av1_split_fragment,
     .read_unit         = &cbs_av1_read_unit,
+    .make_writable     = NULL,
     .write_unit        = &cbs_av1_write_unit,
     .assemble_fragment = &cbs_av1_assemble_fragment,
 
diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index 666970ed03..7296c4cf29 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -1545,6 +1545,7 @@ const CodedBitstreamType ff_cbs_type_h264 = {
 
     .split_fragment    = &cbs_h2645_split_fragment,
     .read_unit         = &cbs_h264_read_nal_unit,
+    .make_writable     = NULL,
     .write_unit        = &cbs_h2645_write_nal_unit,
     .assemble_fragment = &cbs_h2645_assemble_fragment,
 
@@ -1558,6 +1559,7 @@ const CodedBitstreamType ff_cbs_type_h265 = {
 
     .split_fragment    = &cbs_h2645_split_fragment,
     .read_unit         = &cbs_h265_read_nal_unit,
+    .make_writable     = NULL,
     .write_unit        = &cbs_h2645_write_nal_unit,
     .assemble_fragment = &cbs_h2645_assemble_fragment,
 
diff --git a/libavcodec/cbs_internal.h b/libavcodec/cbs_internal.h
index 53f2e5d187..62a836af90 100644
--- a/libavcodec/cbs_internal.h
+++ b/libavcodec/cbs_internal.h
@@ -44,6 +44,10 @@ typedef struct CodedBitstreamType {
     int (*read_unit)(CodedBitstreamContext *ctx,
                      CodedBitstreamUnit *unit);
 
+    // Make a unit's content writable.
+    int (*make_writable)(CodedBitstreamContext *ctx,
+                         CodedBitstreamUnit *unit);
+
     // Write the unit->data bitstream from unit->content.
     int (*write_unit)(CodedBitstreamContext *ctx,
                       CodedBitstreamUnit *unit);
diff --git a/libavcodec/cbs_jpeg.c b/libavcodec/cbs_jpeg.c
index 5a72f0e2e7..f3706e7575 100644
--- a/libavcodec/cbs_jpeg.c
+++ b/libavcodec/cbs_jpeg.c
@@ -513,6 +513,7 @@ const CodedBitstreamType ff_cbs_type_jpeg = {
 
     .split_fragment    = &cbs_jpeg_split_fragment,
     .read_unit         = &cbs_jpeg_read_unit,
+    .make_writable     = NULL,
     .write_unit        = &cbs_jpeg_write_unit,
     .assemble_fragment = &cbs_jpeg_assemble_fragment,
 
diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c
index 8b8b266563..3e6a109550 100644
--- a/libavcodec/cbs_mpeg2.c
+++ b/libavcodec/cbs_mpeg2.c
@@ -414,6 +414,7 @@ const CodedBitstreamType ff_cbs_type_mpeg2 = {
 
     .split_fragment    = &cbs_mpeg2_split_fragment,
     .read_unit         = &cbs_mpeg2_read_unit,
+    .make_writable     = NULL,
     .write_unit        = &cbs_mpeg2_write_unit,
     .assemble_fragment = &cbs_mpeg2_assemble_fragment,
 
diff --git a/libavcodec/cbs_vp9.c b/libavcodec/cbs_vp9.c
index c03ce986c0..e939ec10ba 100644
--- a/libavcodec/cbs_vp9.c
+++ b/libavcodec/cbs_vp9.c
@@ -685,6 +685,7 @@ const CodedBitstreamType ff_cbs_type_vp9 = {
 
     .split_fragment    = &cbs_vp9_split_fragment,
     .read_unit         = &cbs_vp9_read_unit,
+    .make_writable     = NULL,
     .write_unit        = &cbs_vp9_write_unit,
     .assemble_fragment = &cbs_vp9_assemble_fragment,
 
-- 
2.19.1



More information about the ffmpeg-devel mailing list