KK>>Are you aware that this is not going to be frame accurate for the non-SPS KK>>frame because of reordering?
reordering of the frame in terms of pts versus dts? these are attached to the AVPackets not AVFrame. They data should correspond with the pts of the packet. unless i am confused with what youre saying ________________________________________ From: ffmpeg-devel <ffmpeg-devel-boun...@ffmpeg.org> on behalf of Daniel Loman <dlo...@toyon.com> Sent: Tuesday, June 9, 2020 1:52 PM To: 'FFmpeg development discussions and patches' Subject: Re: [FFmpeg-devel] [PATCH] added sei side data From 35034aee293cfd644ce628d3fd932ab7a0efbc10 Mon Sep 17 00:00:00 2001 From: Daniel Loman <dlo...@toyon.com> Date: Tue, 9 Jun 2020 11:10:12 -0700 Subject: [PATCH 1/2] added sei side data field To: ffmpeg-devel@ffmpeg.org --- Changelog | 1 + libavcodec/avpacket.c | 1 + libavcodec/packet.h | 6 ++++++ libavcodec/version.h | 2 +- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 711c843b99..631958015a 100644 --- a/Changelog +++ b/Changelog @@ -75,6 +75,7 @@ version <next>: - PFM decoder - dblur video filter - Real War KVAG muxer +- added sei side data field to AVPacket version 4.2: 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/packet.h b/libavcodec/packet.h index 41485f4527..8c62c467dc 100644 --- a/libavcodec/packet.h +++ b/libavcodec/packet.h @@ -282,6 +282,12 @@ enum AVPacketSideDataType { */ AV_PKT_DATA_DOVI_CONF, + /** + * This side data contains SEI unregistered Data. + * first 17 bytes are UID and + the rest are non zero terminated fixed length bytes + */ + AV_PKT_DATA_SEI_USER, + /** * The number of side data types. * This is not part of the public API/ABI in the sense that it may diff --git a/libavcodec/version.h b/libavcodec/version.h index 524fbc3b11..4e2cc5db92 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #define LIBAVCODEC_VERSION_MAJOR 58 #define LIBAVCODEC_VERSION_MINOR 90 -#define LIBAVCODEC_VERSION_MICRO 100 +#define LIBAVCODEC_VERSION_MICRO 101 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ -- 2.17.1 From 136f7ef45be4b76b49038b5914f12d0ba0005cfd Mon Sep 17 00:00:00 2001 From: Daniel Loman <dlo...@toyon.com> Date: Tue, 9 Jun 2020 11:28:18 -0700 Subject: [PATCH 2/2] moved sei side data writing code into seperate function for reuse To: ffmpeg-devel@ffmpeg.org --- libavcodec/h264_metadata_bsf.c | 114 ++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 50 deletions(-) diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c index 99017653d0..24404832e8 100644 --- a/libavcodec/h264_metadata_bsf.c +++ b/libavcodec/h264_metadata_bsf.c @@ -276,6 +276,63 @@ 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) { + return AVERROR(ENOMEM); + } + + 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"); + return AVERROR(EINVAL); + } + return 0; +} + static int h264_metadata_update_side_data(AVBSFContext *bsf, AVPacket *pkt) { H264MetadataContext *ctx = bsf->priv_data; @@ -412,56 +469,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)); } if (ctx->delete_filler) { @@ -604,6 +612,12 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *pkt) } } + uint8_t const *data; + int size; + 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"); -- 2.17.1 ________________________________________ From: ffmpeg-devel <ffmpeg-devel-boun...@ffmpeg.org> on behalf of Brad Hards <br...@frogmouth.net> Sent: Monday, June 8, 2020 9:39 PM To: 'FFmpeg development discussions and patches' Cc: lance.lmw...@gmail.com Subject: Re: [FFmpeg-devel] [PATCH] added sei side data (CAUTION)This email originated outside Toyon. Do not click links or open attachments unless you recognize the sender and know the content is safe. >> --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 I don't understand this comment. What are you expecting as the change here? Brad _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".