summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2017-05-07 23:02:09 +0100
committerMark Thompson <sw@jkqxz.net>2017-08-13 17:55:02 +0100
commita49ee60d5fdbdae1706a44cfbb814abb9793815f (patch)
tree6e647f3aadac41a8d76aba025ad87d072e530720 /libavcodec
parent820a4483af13cf6fd51f13638e57bcd1c3f629d4 (diff)
vaapi_h264: Add support for SEI recovery points
Included by default with non-IDR intra frames.
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/vaapi_encode_h264.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 4f0e879e9b..271644ebbe 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -37,6 +37,7 @@
enum {
SEI_TIMING = 0x01,
SEI_IDENTIFIER = 0x02,
+ SEI_RECOVERY_POINT = 0x04,
};
// Random (version 4) ISO 11578 UUID.
@@ -61,6 +62,7 @@ typedef struct VAAPIEncodeH264Context {
H264RawSEIBufferingPeriod buffering_period;
H264RawSEIPicTiming pic_timing;
+ H264RawSEIRecoveryPoint recovery_point;
H264RawSEIUserDataUnregistered identifier;
char *identifier_string;
@@ -230,6 +232,11 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
priv->sei.payload[i].payload.pic_timing = priv->pic_timing;
++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;
av_assert0(priv->sei.payload_count > 0);
@@ -613,6 +620,14 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
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) {
.picture_id = pic->recon_surface,
.frame_idx = priv->frame_num,
@@ -950,7 +965,7 @@ static const AVOption vaapi_encode_h264_options[] = {
{ "sei", "Set SEI to include",
OFFSET(sei), AV_OPT_TYPE_FLAGS,
- { .i64 = SEI_IDENTIFIER | SEI_TIMING },
+ { .i64 = SEI_IDENTIFIER | SEI_TIMING | SEI_RECOVERY_POINT },
0, INT_MAX, FLAGS, "sei" },
{ "identifier", "Include encoder version identifier",
0, AV_OPT_TYPE_CONST, { .i64 = SEI_IDENTIFIER },
@@ -958,6 +973,9 @@ static const AVOption vaapi_encode_h264_options[] = {
{ "timing", "Include timing parameters (buffering_period and pic_timing)",
0, AV_OPT_TYPE_CONST, { .i64 = SEI_TIMING },
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 },
};