[FFmpeg-devel] [PATCH 1/2] added sei side data field
Daniel Loman
dloman at toyon.com
Tue Jun 9 21:37:31 EEST 2020
---
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 <dloman at 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 at 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
More information about the ffmpeg-devel
mailing list