H264RawAUD raw_aud;
H264RawSPS raw_sps;
H264RawPPS raw_pps;
- H264RawSEI raw_sei;
H264RawSlice raw_slice;
H264RawSEIBufferingPeriod sei_buffering_period;
H264RawSEIPicTiming sei_pic_timing;
H264RawSEIRecoveryPoint sei_recovery_point;
- H264RawSEIUserDataUnregistered sei_identifier;
+ SEIRawUserDataUnregistered sei_identifier;
char *sei_identifier_string;
int aud_needed;
{
VAAPIEncodeH264Context *priv = avctx->priv_data;
CodedBitstreamFragment *au = &priv->current_access_unit;
- int err, i;
+ int err;
if (priv->sei_needed) {
- H264RawSEI *sei = &priv->raw_sei;
-
if (priv->aud_needed) {
err = vaapi_encode_h264_add_nal(avctx, au, &priv->raw_aud);
if (err < 0)
priv->aud_needed = 0;
}
- *sei = (H264RawSEI) {
- .nal_unit_header = {
- .nal_unit_type = H264_NAL_SEI,
- },
- };
-
- i = 0;
-
if (priv->sei_needed & SEI_IDENTIFIER) {
- sei->payload[i].payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED;
- sei->payload[i].payload.user_data_unregistered = priv->sei_identifier;
- ++i;
+ err = ff_cbs_sei_add_message(priv->cbc, au, 1,
+ SEI_TYPE_USER_DATA_UNREGISTERED,
+ &priv->sei_identifier, NULL);
+ if (err < 0)
+ goto fail;
}
if (priv->sei_needed & SEI_TIMING) {
if (pic->type == PICTURE_TYPE_IDR) {
- sei->payload[i].payload_type = H264_SEI_TYPE_BUFFERING_PERIOD;
- sei->payload[i].payload.buffering_period = priv->sei_buffering_period;
- ++i;
+ err = ff_cbs_sei_add_message(priv->cbc, au, 1,
+ SEI_TYPE_BUFFERING_PERIOD,
+ &priv->sei_buffering_period, NULL);
+ if (err < 0)
+ goto fail;
}
- sei->payload[i].payload_type = H264_SEI_TYPE_PIC_TIMING;
- sei->payload[i].payload.pic_timing = priv->sei_pic_timing;
- ++i;
+ err = ff_cbs_sei_add_message(priv->cbc, au, 1,
+ SEI_TYPE_PIC_TIMING,
+ &priv->sei_pic_timing, NULL);
+ if (err < 0)
+ goto fail;
}
if (priv->sei_needed & SEI_RECOVERY_POINT) {
- sei->payload[i].payload_type = H264_SEI_TYPE_RECOVERY_POINT;
- sei->payload[i].payload.recovery_point = priv->sei_recovery_point;
- ++i;
+ err = ff_cbs_sei_add_message(priv->cbc, au, 1,
+ SEI_TYPE_RECOVERY_POINT,
+ &priv->sei_recovery_point, NULL);
+ if (err < 0)
+ goto fail;
}
- sei->payload_count = i;
- av_assert0(sei->payload_count > 0);
-
- err = vaapi_encode_h264_add_nal(avctx, au, sei);
- if (err < 0)
- goto fail;
priv->sei_needed = 0;
err = vaapi_encode_h264_write_access_unit(avctx, data, data_len, au);
.version = LIBAVUTIL_VERSION_INT,
};
-AVCodec ff_h264_vaapi_encoder = {
+const AVCodec ff_h264_vaapi_encoder = {
.name = "h264_vaapi",
.long_name = NULL_IF_CONFIG_SMALL("H.264/AVC (VAAPI)"),
.type = AVMEDIA_TYPE_VIDEO,
.receive_packet = &ff_vaapi_encode_receive_packet,
.close = &vaapi_encode_h264_close,
.priv_class = &vaapi_encode_h264_class,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
+ AV_CODEC_CAP_DR1,
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
.defaults = vaapi_encode_h264_defaults,
.pix_fmts = (const enum AVPixelFormat[]) {