[FFmpeg-devel] [PATCH] added sei side data
lance.lmwang at gmail.com
lance.lmwang at gmail.com
Tue Jun 9 04:03:10 EEST 2020
On Mon, Jun 01, 2020 at 02:23:23PM -0700, Daniel Loman wrote:
> Added seperate side data field to allow adding per packet side data
> message to support MISB 604 encoding
> ---
> libavcodec/avpacket.c | 1 +
> libavcodec/h264_metadata_bsf.c | 116 +++++++++++++++++++--------------
> libavcodec/packet.h | 5 ++
> 3 files changed, 72 insertions(+), 50 deletions(-)
>
> diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
> index 033f2d8f26..a530dc6779 100644
> --- a/libavcodec/avpacket.c
> +++ b/libavcodec/avpacket.c
> @@ -395,6 +395,7 @@ const char *av_packet_side_data_name(enum AVPacketSideDataType type)
> case AV_PKT_DATA_A53_CC: return "A53 Closed Captions";
> case AV_PKT_DATA_ENCRYPTION_INIT_INFO: return "Encryption initialization data";
> case AV_PKT_DATA_ENCRYPTION_INFO: return "Encryption info";
> + case AV_PKT_DATA_SEI_USER: return "SEI unregistered data";
> case AV_PKT_DATA_AFD: return "Active Format Description data";
> case AV_PKT_DATA_PRFT: return "Producer Reference Time";
> case AV_PKT_DATA_ICC_PROFILE: return "ICC Profile";
> diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c
> index 99017653d0..e90b82793b 100644
> --- a/libavcodec/h264_metadata_bsf.c
> +++ b/libavcodec/h264_metadata_bsf.c
> @@ -276,6 +276,65 @@ static int h264_metadata_update_sps(AVBSFContext *bsf,
> return 0;
> }
>
> +static int write_sei_user_data(AVBSFContext *bsf, const uint8_t *data, int size)
> +{
> + H264MetadataContext *ctx = bsf->priv_data;
> + CodedBitstreamFragment *au = &ctx->access_unit;
> + int err = 0, i, j;
> +
> + H264RawSEIPayload payload = {
> + .payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED,
> + };
> + H264RawSEIUserDataUnregistered *udu =
> + &payload.payload.user_data_unregistered;
> +
> + for (i = j = 0; j < 32 && data[i]; i++) {
> + int c, v;
> + c = data[i];
> + if (c == '-') {
> + continue;
> + } else if (av_isxdigit(c)) {
> + c = av_tolower(c);
> + v = (c <= '9' ? c - '0' : c - 'a' + 10);
> + } else {
> + goto invalid_user_data;
> + }
> + if (i & 1)
> + udu->uuid_iso_iec_11578[j / 2] |= v;
> + else
> + udu->uuid_iso_iec_11578[j / 2] = v << 4;
> + ++j;
> + }
> + if (j == 32 && data[i] == '+') {
> + size_t len = size - i - 1;
> +
> + udu->data_ref = av_buffer_alloc(len + 1);
> + if (!udu->data_ref) {
> + err = AVERROR(ENOMEM);
> + return err;
> + }
> +
> + udu->data = udu->data_ref->data;
> + udu->data_length = len + 1;
> + memcpy(udu->data, data + i + 1, len + 1);
> +
> + 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");
> + return err;
> + }
> +
> + } else {
> + invalid_user_data:
> + av_log(bsf, AV_LOG_ERROR, "Invalid user data: "
> + "must be \"UUID+string\".\n");
> + err = AVERROR(EINVAL);
> + return err;
> + }
> + return err;
> +}
> +
> static int h264_metadata_update_side_data(AVBSFContext *bsf, AVPacket *pkt)
> {
> H264MetadataContext *ctx = bsf->priv_data;
> @@ -412,56 +471,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
> // Only 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->done_first_au)) {
> - H264RawSEIPayload payload = {
> - .payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED,
> - };
> - H264RawSEIUserDataUnregistered *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];
> - if (c == '-') {
> - continue;
> - } else if (av_isxdigit(c)) {
> - c = av_tolower(c);
> - v = (c <= '9' ? c - '0' : c - 'a' + 10);
> - } else {
> - goto invalid_user_data;
> - }
> - if (j & 1)
> - udu->uuid_iso_iec_11578[j / 2] |= v;
> - else
> - udu->uuid_iso_iec_11578[j / 2] = v << 4;
> - ++j;
> - }
> - if (j == 32 && ctx->sei_user_data[i] == '+') {
> - 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 fail;
> - }
> -
> - udu->data = udu->data_ref->data;
> - udu->data_length = len + 1;
> - memcpy(udu->data, ctx->sei_user_data + i + 1, len + 1);
> -
> - 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 {
> - invalid_user_data:
> - av_log(bsf, AV_LOG_ERROR, "Invalid user data: "
> - "must be \"UUID+string\".\n");
> - err = AVERROR(EINVAL);
> - goto fail;
> - }
> + write_sei_user_data(bsf, ctx->sei_user_data, strlen(ctx->sei_user_data));
1, it's bad indention.
2, you didn't process the return of write_sei_user_data.
3, it's better to split into another patch for this change.
> }
>
> if (ctx->delete_filler) {
> @@ -604,6 +614,12 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
> }
> }
>
> + uint8_t *data;
> + int size;
mixed declaration
> + if (data = av_packet_get_side_data(pkt, AV_PKT_DATA_SEI_USER, &size)) {
> + write_sei_user_data(bsf, data, size);
> + }
> +
> err = ff_cbs_write_packet(ctx->cbc, pkt, au);
> if (err < 0) {
> av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
> diff --git a/libavcodec/packet.h b/libavcodec/packet.h
> index 41485f4527..48e0ccbaf0 100644
> --- a/libavcodec/packet.h
> +++ b/libavcodec/packet.h
> @@ -282,6 +282,11 @@ enum AVPacketSideDataType {
> */
> AV_PKT_DATA_DOVI_CONF,
>
> + /**
> + * This side data contains SEI unregistered Data.
> + */
> + AV_PKT_DATA_SEI_USER,
> +
it's public header
> /**
> * The number of side data types.
> * This is not part of the public API/ABI in the sense that it may
> --
> 2.17.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
--
Thanks,
Limin Wang
More information about the ffmpeg-devel
mailing list