Merge commit '69062d0f9b6aef5d9d9b8c9c9b5cfb23037caddb'
authorMark Thompson <sw@jkqxz.net>
Wed, 21 Feb 2018 22:32:42 +0000 (22:32 +0000)
committerMark Thompson <sw@jkqxz.net>
Wed, 21 Feb 2018 22:37:07 +0000 (22:37 +0000)
* commit '69062d0f9b6aef5d9d9b8c9c9b5cfb23037caddb':
  h264_metadata: Use common SEI addition function

Minor changes because the following patch is already present.

Merged-by: Mark Thompson <sw@jkqxz.net>
1  2 
libavcodec/h264_metadata_bsf.c

@@@ -1,18 -1,18 +1,18 @@@
  /*
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -62,7 -62,6 +62,7 @@@ typedef struct H264MetadataContext 
      int crop_bottom;
  
      const char *sei_user_data;
 +    int sei_first_au;
  } H264MetadataContext;
  
  
@@@ -209,7 -208,6 +209,6 @@@ static int h264_metadata_filter(AVBSFCo
      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)
          }
      }
  
 -    // 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;
  
-         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;
 +        ctx->sei_first_au = 1;
 +
          for (i = j = 0; j < 32 && ctx->sei_user_data[i]; i++) {
              int c, v;
              c = ctx->sei_user_data[i];
              ++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 {
              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);
      err = 0;
  fail:
      ff_cbs_fragment_uninit(ctx->cbc, au);
-     av_freep(&sei_udu_string);
  
      av_packet_free(&in);
  
@@@ -454,7 -416,7 +420,7 @@@ static const AVOption h264_metadata_opt
  
      { "sample_aspect_ratio", "Set sample aspect ratio (table E-1)",
          OFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL,
 -        { .i64 = 0 }, 0, 65535 },
 +        { .dbl = 0.0 }, 0, 65535 },
  
      { "video_format", "Set video format (table E-2)",
          OFFSET(video_format), AV_OPT_TYPE_INT,
  
      { "tick_rate", "Set VUI tick rate (num_units_in_tick / time_scale)",
          OFFSET(tick_rate), AV_OPT_TYPE_RATIONAL,
 -        { .i64 = 0 }, 0, UINT_MAX },
 +        { .dbl = 0.0 }, 0, UINT_MAX },
      { "fixed_frame_rate_flag", "Set VUI fixed frame rate flag",
          OFFSET(fixed_frame_rate_flag), AV_OPT_TYPE_INT,
          { .i64 = -1 }, -1, 1 },
@@@ -506,7 -468,7 +472,7 @@@ static const AVClass h264_metadata_clas
      .class_name = "h264_metadata_bsf",
      .item_name  = av_default_item_name,
      .option     = h264_metadata_options,
 -    .version    = LIBAVCODEC_VERSION_MAJOR,
 +    .version    = LIBAVUTIL_VERSION_INT,
  };
  
  static const enum AVCodecID h264_metadata_codec_ids[] = {