diff mbox series

[FFmpeg-devel,3/5] avdevice/lavfi: Use av_packet_pack_dictionary() to pack dictionary

Message ID 20200830145045.4437-3-andreas.rheinhardt@gmail.com
State Accepted
Commit 26469aebd39e2cfba8c5c1918ac8d19af4d8ee18
Headers show
Series [FFmpeg-devel,1/5] avdevice/lavfi: Use av_packet_move_ref() for packet ownership transfer | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Andreas Rheinhardt Aug. 30, 2020, 2:50 p.m. UTC
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
av_packet_pack_dictionary() returns NULL in case the dictionary's count
is zero; but given that the dict API does not return such dicts at all,
I have not added any check for this.

 libavdevice/lavfi.c | 25 ++++++++-----------------
 1 file changed, 8 insertions(+), 17 deletions(-)

Comments

Andreas Rheinhardt Sept. 4, 2020, 11:23 p.m. UTC | #1
Andreas Rheinhardt:
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
> av_packet_pack_dictionary() returns NULL in case the dictionary's count
> is zero; but given that the dict API does not return such dicts at all,
> I have not added any check for this.
> 
>  libavdevice/lavfi.c | 25 ++++++++-----------------
>  1 file changed, 8 insertions(+), 17 deletions(-)
> 
> diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c
> index 5e814eada8..bafc3275c9 100644
> --- a/libavdevice/lavfi.c
> +++ b/libavdevice/lavfi.c
> @@ -444,25 +444,16 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
>  
>      frame_metadata = frame->metadata;
>      if (frame_metadata) {
> -        uint8_t *metadata;
> -        AVDictionaryEntry *e = NULL;
> -        AVBPrint meta_buf;
> -
> -        av_bprint_init(&meta_buf, 0, AV_BPRINT_SIZE_UNLIMITED);
> -        while ((e = av_dict_get(frame_metadata, "", e, AV_DICT_IGNORE_SUFFIX))) {
> -            av_bprintf(&meta_buf, "%s", e->key);
> -            av_bprint_chars(&meta_buf, '\0', 1);
> -            av_bprintf(&meta_buf, "%s", e->value);
> -            av_bprint_chars(&meta_buf, '\0', 1);
> -        }
> -        if (!av_bprint_is_complete(&meta_buf) ||
> -            !(metadata = av_packet_new_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA,
> -                                                 meta_buf.len))) {
> -            av_bprint_finalize(&meta_buf, NULL);
> +        int size;
> +        uint8_t *metadata = av_packet_pack_dictionary(frame_metadata, &size);
> +
> +        if (!metadata)
>              return AVERROR(ENOMEM);
> +        if ((ret = av_packet_add_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA,
> +                                           metadata, size)) < 0) {
> +            av_freep(&metadata);
> +            return ret;
>          }
> -        memcpy(metadata, meta_buf.str, meta_buf.len);
> -        av_bprint_finalize(&meta_buf, NULL);
>      }
>  
>      if ((ret = create_subcc_packet(avctx, frame, min_pts_sink_idx)) < 0) {
> 
Will apply the two outstanding patches (i.e. this and 4/5 [1]) of this
patchset tomorrow unless there are objections.

- Andreas

[1]: https://ffmpeg.org/pipermail/ffmpeg-devel/2020-August/268930.html
diff mbox series

Patch

diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c
index 5e814eada8..bafc3275c9 100644
--- a/libavdevice/lavfi.c
+++ b/libavdevice/lavfi.c
@@ -444,25 +444,16 @@  static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
 
     frame_metadata = frame->metadata;
     if (frame_metadata) {
-        uint8_t *metadata;
-        AVDictionaryEntry *e = NULL;
-        AVBPrint meta_buf;
-
-        av_bprint_init(&meta_buf, 0, AV_BPRINT_SIZE_UNLIMITED);
-        while ((e = av_dict_get(frame_metadata, "", e, AV_DICT_IGNORE_SUFFIX))) {
-            av_bprintf(&meta_buf, "%s", e->key);
-            av_bprint_chars(&meta_buf, '\0', 1);
-            av_bprintf(&meta_buf, "%s", e->value);
-            av_bprint_chars(&meta_buf, '\0', 1);
-        }
-        if (!av_bprint_is_complete(&meta_buf) ||
-            !(metadata = av_packet_new_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA,
-                                                 meta_buf.len))) {
-            av_bprint_finalize(&meta_buf, NULL);
+        int size;
+        uint8_t *metadata = av_packet_pack_dictionary(frame_metadata, &size);
+
+        if (!metadata)
             return AVERROR(ENOMEM);
+        if ((ret = av_packet_add_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA,
+                                           metadata, size)) < 0) {
+            av_freep(&metadata);
+            return ret;
         }
-        memcpy(metadata, meta_buf.str, meta_buf.len);
-        av_bprint_finalize(&meta_buf, NULL);
     }
 
     if ((ret = create_subcc_packet(avctx, frame, min_pts_sink_idx)) < 0) {