[FFmpeg-devel] [PATCH] libavcodec/libx264: add user data unregistered SEI encoding

Brad Hards bradh at frogmouth.net
Sat Aug 14 02:51:03 EEST 2021


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.

Brad





More information about the ffmpeg-devel mailing list