[FFmpeg-devel] [PATCH] libavcodec/libx264: add user data unregistered SEI encoding
Brad Hards
bradh at frogmouth.net
Mon Sep 6 03:17:14 EEST 2021
On Sunday, 22 August 2021 7:25:25 PM AEST Brad Hards wrote:
> 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.
Ping on this patch.
Brad
More information about the ffmpeg-devel
mailing list