[FFmpeg-cvslog] Merge commit '69062d0f9b6aef5d9d9b8c9c9b5cfb23037caddb'

Mark Thompson git at videolan.org
Thu Feb 22 00:37:34 EET 2018


ffmpeg | branch: master | Mark Thompson <sw at jkqxz.net> | Wed Feb 21 22:32:42 2018 +0000| [fd76e7be70c10861567ebefd0bc6864f223fb017] | committer: Mark Thompson

Merge commit '69062d0f9b6aef5d9d9b8c9c9b5cfb23037caddb'

* commit '69062d0f9b6aef5d9d9b8c9c9b5cfb23037caddb':
  h264_metadata: Use common SEI addition function

Minor changes because the following patch is already present.

Merged-by: Mark Thompson <sw at jkqxz.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=fd76e7be70c10861567ebefd0bc6864f223fb017
---

 libavcodec/h264_metadata_bsf.c | 72 +++++++++++-------------------------------
 1 file changed, 19 insertions(+), 53 deletions(-)

diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c
index 62a5547fe0..20ac299bda 100644
--- a/libavcodec/h264_metadata_bsf.c
+++ b/libavcodec/h264_metadata_bsf.c
@@ -209,7 +209,6 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
     AVPacket *in = NULL;
     CodedBitstreamFragment *au = &ctx->access_unit;
     int err, i, j, has_sps;
-    char *sei_udu_string = NULL;
 
     err = ff_bsf_get_packet(bsf, &in);
     if (err < 0)
@@ -292,45 +291,14 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
     // Insert the SEI in access units containing SPSs, and also
     // unconditionally in the first access unit we ever see.
     if (ctx->sei_user_data && (has_sps || !ctx->sei_first_au)) {
-        H264RawSEI *sei;
-        H264RawSEIPayload *payload;
-        H264RawSEIUserDataUnregistered *udu;
-        int sei_pos, sei_new;
+        H264RawSEIPayload payload = {
+            .payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED,
+        };
+        H264RawSEIUserDataUnregistered *udu =
+            &payload.payload.user_data_unregistered;
 
         ctx->sei_first_au = 1;
 
-        for (i = 0; i < au->nb_units; i++) {
-            if (au->units[i].type == H264_NAL_SEI ||
-                au->units[i].type == H264_NAL_SLICE ||
-                au->units[i].type == H264_NAL_IDR_SLICE)
-                break;
-        }
-        sei_pos = i;
-
-        if (sei_pos < au->nb_units &&
-            au->units[sei_pos].type == H264_NAL_SEI) {
-            sei_new = 0;
-            sei = au->units[sei_pos].content;
-        } else {
-            sei_new = 1;
-            sei = &ctx->sei_nal;
-            memset(sei, 0, sizeof(*sei));
-
-            sei->nal_unit_header.nal_unit_type = H264_NAL_SEI;
-
-            err = ff_cbs_insert_unit_content(ctx->cbc, au, sei_pos,
-                                             H264_NAL_SEI, sei, NULL);
-            if (err < 0) {
-                av_log(bsf, AV_LOG_ERROR, "Failed to insert SEI.\n");
-                goto fail;
-            }
-        }
-
-        payload = &sei->payload[sei->payload_count];
-
-        payload->payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED;
-        udu = &payload->payload.user_data_unregistered;
-
         for (i = j = 0; j < 32 && ctx->sei_user_data[i]; i++) {
             int c, v;
             c = ctx->sei_user_data[i];
@@ -349,21 +317,25 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
             ++j;
         }
         if (j == 32 && ctx->sei_user_data[i] == '+') {
-            sei_udu_string = av_strdup(ctx->sei_user_data + i + 1);
-            if (!sei_udu_string) {
+            size_t len = strlen(ctx->sei_user_data + i + 1);
+
+            udu->data_ref = av_buffer_alloc(len + 1);
+            if (!udu->data_ref) {
                 err = AVERROR(ENOMEM);
-                goto sei_fail;
+                goto fail;
             }
 
-            udu->data = sei_udu_string;
-            udu->data_length = strlen(sei_udu_string);
+            udu->data        = udu->data_ref->data;
+            udu->data_length = len + 1;
+            memcpy(udu->data, ctx->sei_user_data + i + 1, len + 1);
 
-            payload->payload_size = 16 + udu->data_length;
+            payload.payload_size = 16 + udu->data_length;
 
-            if (!sei_new) {
-                // This will be freed by the existing internal
-                // reference in fragment_uninit().
-                sei_udu_string = NULL;
+            err = ff_cbs_h264_add_sei_message(ctx->cbc, au, &payload);
+            if (err < 0) {
+                av_log(bsf, AV_LOG_ERROR, "Failed to add user data SEI "
+                       "message to access unit.\n");
+                goto fail;
             }
 
         } else {
@@ -371,12 +343,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
             av_log(bsf, AV_LOG_ERROR, "Invalid user data: "
                    "must be \"UUID+string\".\n");
             err = AVERROR(EINVAL);
-        sei_fail:
-            memset(payload, 0, sizeof(*payload));
-            goto fail;
         }
-
-        ++sei->payload_count;
     }
 
     err = ff_cbs_write_packet(ctx->cbc, out, au);
@@ -392,7 +359,6 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
     err = 0;
 fail:
     ff_cbs_fragment_uninit(ctx->cbc, au);
-    av_freep(&sei_udu_string);
 
     av_packet_free(&in);
 


======================================================================

diff --cc libavcodec/h264_metadata_bsf.c
index 62a5547fe0,356daef3ec..20ac299bda
--- a/libavcodec/h264_metadata_bsf.c
+++ b/libavcodec/h264_metadata_bsf.c
@@@ -289,48 -287,14 +288,17 @@@ static int h264_metadata_filter(AVBSFCo
          }
      }
  
 -    // Only insert the SEI in access units containing SPSs.
 -    if (has_sps && ctx->sei_user_data) {
 +    // Insert the SEI in access units containing SPSs, and also
 +    // unconditionally in the first access unit we ever see.
 +    if (ctx->sei_user_data && (has_sps || !ctx->sei_first_au)) {
-         H264RawSEI *sei;
-         H264RawSEIPayload *payload;
-         H264RawSEIUserDataUnregistered *udu;
-         int sei_pos, sei_new;
+         H264RawSEIPayload payload = {
+             .payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED,
+         };
+         H264RawSEIUserDataUnregistered *udu =
+             &payload.payload.user_data_unregistered;
  
 +        ctx->sei_first_au = 1;
 +
-         for (i = 0; i < au->nb_units; i++) {
-             if (au->units[i].type == H264_NAL_SEI ||
-                 au->units[i].type == H264_NAL_SLICE ||
-                 au->units[i].type == H264_NAL_IDR_SLICE)
-                 break;
-         }
-         sei_pos = i;
- 
-         if (sei_pos < au->nb_units &&
-             au->units[sei_pos].type == H264_NAL_SEI) {
-             sei_new = 0;
-             sei = au->units[sei_pos].content;
-         } else {
-             sei_new = 1;
-             sei = &ctx->sei_nal;
-             memset(sei, 0, sizeof(*sei));
- 
-             sei->nal_unit_header.nal_unit_type = H264_NAL_SEI;
- 
-             err = ff_cbs_insert_unit_content(ctx->cbc, au, sei_pos,
-                                              H264_NAL_SEI, sei, NULL);
-             if (err < 0) {
-                 av_log(bsf, AV_LOG_ERROR, "Failed to insert SEI.\n");
-                 goto fail;
-             }
-         }
- 
-         payload = &sei->payload[sei->payload_count];
- 
-         payload->payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED;
-         udu = &payload->payload.user_data_unregistered;
- 
          for (i = j = 0; j < 32 && ctx->sei_user_data[i]; i++) {
              int c, v;
              c = ctx->sei_user_data[i];



More information about the ffmpeg-cvslog mailing list