vaapi_h264: Add support for SEI recovery points
Included by default with non-IDR intra frames.
(cherry picked from commit a49ee60d5f
)
This commit is contained in:
parent
281b68b026
commit
0bc7575ced
1 changed files with 19 additions and 1 deletions
|
@ -37,6 +37,7 @@
|
||||||
enum {
|
enum {
|
||||||
SEI_TIMING = 0x01,
|
SEI_TIMING = 0x01,
|
||||||
SEI_IDENTIFIER = 0x02,
|
SEI_IDENTIFIER = 0x02,
|
||||||
|
SEI_RECOVERY_POINT = 0x04,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Random (version 4) ISO 11578 UUID.
|
// Random (version 4) ISO 11578 UUID.
|
||||||
|
@ -61,6 +62,7 @@ typedef struct VAAPIEncodeH264Context {
|
||||||
|
|
||||||
H264RawSEIBufferingPeriod buffering_period;
|
H264RawSEIBufferingPeriod buffering_period;
|
||||||
H264RawSEIPicTiming pic_timing;
|
H264RawSEIPicTiming pic_timing;
|
||||||
|
H264RawSEIRecoveryPoint recovery_point;
|
||||||
H264RawSEIUserDataUnregistered identifier;
|
H264RawSEIUserDataUnregistered identifier;
|
||||||
char *identifier_string;
|
char *identifier_string;
|
||||||
|
|
||||||
|
@ -232,6 +234,11 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
|
||||||
priv->sei.payload[i].payload.pic_timing = priv->pic_timing;
|
priv->sei.payload[i].payload.pic_timing = priv->pic_timing;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
if (opt->sei & SEI_RECOVERY_POINT && pic->type == PICTURE_TYPE_I) {
|
||||||
|
priv->sei.payload[i].payload_type = H264_SEI_TYPE_RECOVERY_POINT;
|
||||||
|
priv->sei.payload[i].payload.recovery_point = priv->recovery_point;
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
priv->sei.payload_count = i;
|
priv->sei.payload_count = i;
|
||||||
av_assert0(priv->sei.payload_count > 0);
|
av_assert0(priv->sei.payload_count > 0);
|
||||||
|
@ -617,6 +624,14 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
|
||||||
priv->sei_needed = 1;
|
priv->sei_needed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opt->sei & SEI_RECOVERY_POINT && pic->type == PICTURE_TYPE_I) {
|
||||||
|
priv->recovery_point.recovery_frame_cnt = 0;
|
||||||
|
priv->recovery_point.exact_match_flag = 1;
|
||||||
|
priv->recovery_point.broken_link_flag = ctx->b_per_p > 0;
|
||||||
|
|
||||||
|
priv->sei_needed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
vpic->CurrPic = (VAPictureH264) {
|
vpic->CurrPic = (VAPictureH264) {
|
||||||
.picture_id = pic->recon_surface,
|
.picture_id = pic->recon_surface,
|
||||||
.frame_idx = priv->frame_num,
|
.frame_idx = priv->frame_num,
|
||||||
|
@ -966,7 +981,7 @@ static const AVOption vaapi_encode_h264_options[] = {
|
||||||
|
|
||||||
{ "sei", "Set SEI to include",
|
{ "sei", "Set SEI to include",
|
||||||
OFFSET(sei), AV_OPT_TYPE_FLAGS,
|
OFFSET(sei), AV_OPT_TYPE_FLAGS,
|
||||||
{ .i64 = SEI_IDENTIFIER | SEI_TIMING },
|
{ .i64 = SEI_IDENTIFIER | SEI_TIMING | SEI_RECOVERY_POINT },
|
||||||
0, INT_MAX, FLAGS, "sei" },
|
0, INT_MAX, FLAGS, "sei" },
|
||||||
{ "identifier", "Include encoder version identifier",
|
{ "identifier", "Include encoder version identifier",
|
||||||
0, AV_OPT_TYPE_CONST, { .i64 = SEI_IDENTIFIER },
|
0, AV_OPT_TYPE_CONST, { .i64 = SEI_IDENTIFIER },
|
||||||
|
@ -974,6 +989,9 @@ static const AVOption vaapi_encode_h264_options[] = {
|
||||||
{ "timing", "Include timing parameters (buffering_period and pic_timing)",
|
{ "timing", "Include timing parameters (buffering_period and pic_timing)",
|
||||||
0, AV_OPT_TYPE_CONST, { .i64 = SEI_TIMING },
|
0, AV_OPT_TYPE_CONST, { .i64 = SEI_TIMING },
|
||||||
INT_MIN, INT_MAX, FLAGS, "sei" },
|
INT_MIN, INT_MAX, FLAGS, "sei" },
|
||||||
|
{ "recovery_point", "Include recovery points where appropriate",
|
||||||
|
0, AV_OPT_TYPE_CONST, { .i64 = SEI_RECOVERY_POINT },
|
||||||
|
INT_MIN, INT_MAX, FLAGS, "sei" },
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue