[FFmpeg-devel] [PATCH] libavcodec/libx264: add user data unregistered SEI encoding
Brad Hards
bradh at frogmouth.net
Sun Aug 22 12:25:25 EEST 2021
On Saturday, 14 August 2021 9:51:03 AM AEST Brad Hards wrote:
> On Friday, 6 August 2021 7:16:33 PM AEST Brad Hards wrote:
> > MISB ST 0604 and ST 2101 require user data unregistered SEI messages
> > (precision timestamps and sensor identifiers) to be included. That
> > currently isn't supported for libx264. This patch adds support
> > for user data unregistered SEI messages in accordance with ISO/IEC
> > 14496-10:2020(E) section D.1.7 (syntax) and D.2.7 (semantics).
> >
> > This code is based on a similar change for libx265 (commit
> > 1f58503013720700a5adfd72c708e6275aefc165).
> > ---
> >
> > libavcodec/libx264.c | 30 ++++++++++++++++++++++++++++++
> > 1 file changed, 30 insertions(+)
> >
> > diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
> > index 9afaf19547..e9bbe8d494 100644
> > --- a/libavcodec/libx264.c
> > +++ b/libavcodec/libx264.c
> > @@ -32,6 +32,7 @@
> >
> > #include "internal.h"
> > #include "packet_internal.h"
> > #include "atsc_a53.h"
> >
> > +#include "sei.h"
> >
> > #if defined(_MSC_VER)
> > #define X264_API_IMPORTS 1
> >
> > @@ -114,6 +115,9 @@ typedef struct X264Context {
> >
> > * encounter a frame with ROI side data.
> > */
> >
> > int roi_warned;
> >
> > +
> > + void *sei_data;
> > + int sei_data_size;
> >
> > } X264Context;
> >
> > static void X264_log(void *p, int level, const char *fmt, va_list args)
> >
> > @@ -317,6 +321,9 @@ static int X264_frame(AVCodecContext *ctx, AVPacket
> > *pkt, const AVFrame *frame,>
> > x4->pic.img.i_plane = avfmt2_num_planes(ctx->pix_fmt);
> >
> > if (frame) {
> >
> > + x264_sei_t *sei = &x4->pic.extra_sei;
> > + sei->num_payloads = 0;
> > +
> >
> > for (i = 0; i < x4->pic.img.i_plane; i++) {
> >
> > x4->pic.img.plane[i] = frame->data[i];
> > x4->pic.img.i_stride[i] = frame->linesize[i];
> >
> > @@ -439,6 +446,27 @@ static int X264_frame(AVCodecContext *ctx, AVPacket
> > *pkt, const AVFrame *frame,>
> > }
> >
> > }
> >
> > }
> >
> > +
> > + for (int j = 0; j < frame->nb_side_data; j++) {
> > + AVFrameSideData *side_data = frame->side_data[j];
> > + void *tmp;
> > + x264_sei_payload_t *sei_payload;
> > + if (side_data->type != AV_FRAME_DATA_SEI_UNREGISTERED)
> > + continue;
> > + tmp = av_fast_realloc(x4->sei_data, &x4->sei_data_size,
> > (sei->num_payloads + 1) * sizeof(*sei_payload)); + if (!tmp) {
> > + av_freep(&x4->pic.extra_sei.payloads);
> > + av_freep(&x4->pic.prop.quant_offsets);
> > + return AVERROR(ENOMEM);
> > + }
> > + x4->sei_data = tmp;
> > + sei->payloads = x4->sei_data;
> > + sei_payload = &sei->payloads[sei->num_payloads];
> > + sei_payload->payload = side_data->data;
> > + sei_payload->payload_size = side_data->size;
> > + sei_payload->payload_type = SEI_TYPE_USER_DATA_UNREGISTERED;
> > + sei->num_payloads++;
> > + }
> >
> > }
> >
> > do {
> >
> > @@ -505,6 +533,8 @@ static av_cold int X264_close(AVCodecContext *avctx)
> >
> > x264_param_cleanup(&x4->params);
> >
> > #endif
> >
> > + av_freep(&x4->sei_data);
> > +
> >
> > if (x4->enc) {
> >
> > x264_encoder_close(x4->enc);
> > x4->enc = NULL;
>
> Ping on this patch.
Ping on this patch.
Brad
More information about the ffmpeg-devel
mailing list