diff mbox

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

Message ID 20181125210559.2332-1-andreas.rheinhardt@googlemail.com
State Superseded
Headers show

Commit Message

Andreas Rheinhardt Nov. 25, 2018, 9:05 p.m. UTC
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@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(+)

Comments

Carl Eugen Hoyos Nov. 25, 2018, 9:14 p.m. UTC | #1
2018-11-25 22:05 GMT+01:00, Andreas Rheinhardt
<andreas.rheinhardt@googlemail.com>:

> +    .make_writable     = NULL,

Why do you think these are needed?

Carl Eugen
Andreas Rheinhardt Nov. 25, 2018, 9:44 p.m. UTC | #2
Carl Eugen Hoyos:
> 2018-11-25 22:05 GMT+01:00, Andreas Rheinhardt
> <andreas.rheinhardt@googlemail.com>:
> 
>> +    .make_writable     = NULL,
> 
> Why do you think these are needed?
> 
> Carl Eugen
It's not needed. If left out, .make_writable will be implicitly initialized to a NULL pointer because the various ff_cbs_type_xyz all have static storage duration. But I nevertheless thought that it is nicer to make the initialization explicit, because then you actually see all the members of each CodedBitstreamType.

Andreas
Carl Eugen Hoyos Nov. 25, 2018, 9:54 p.m. UTC | #3
2018-11-25 22:44 GMT+01:00, Andreas Rheinhardt
<andreas.rheinhardt@googlemail.com>:
> Carl Eugen Hoyos:
>> 2018-11-25 22:05 GMT+01:00, Andreas Rheinhardt
>> <andreas.rheinhardt@googlemail.com>:
>>
>>> +    .make_writable     = NULL,
>>
>> Why do you think these are needed?
>>
> It's not needed. If left out, .make_writable will be implicitly initialized
> to a NULL pointer because the various ff_cbs_type_xyz all have static
> storage duration. But I nevertheless thought that it is nicer to make the
> initialization explicit, because then you actually see all the members of
> each CodedBitstreamType.

Please leave it out like in hundreds of existing cases.

Carl Eugen
diff mbox

Patch

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,