Browse Source

Merge commit 'ff007e30d8d45ba1ff2b2a4615f1cd5bafb50626'

* commit 'ff007e30d8d45ba1ff2b2a4615f1cd5bafb50626':
  vaapi_h264: Add workaround for bad SEI in old Intel drivers

Merged-by: Mark Thompson <sw@jkqxz.net>
tags/n4.0
Mark Thompson 8 years ago
parent
commit
4251e25272
1 changed files with 18 additions and 0 deletions
  1. +18
    -0
      libavcodec/vaapi_encode_h264.c

+ 18
- 0
libavcodec/vaapi_encode_h264.c View File

@@ -82,6 +82,7 @@ typedef struct VAAPIEncodeH264Context {
CodedBitstreamFragment current_access_unit;
int aud_needed;
int sei_needed;
int sei_cbr_workaround_needed;
} VAAPIEncodeH264Context;

typedef struct VAAPIEncodeH264Options {
@@ -258,6 +259,19 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,

*type = VAEncPackedHeaderRawData;
return 0;

#if !CONFIG_VAAPI_1
} else if (priv->sei_cbr_workaround_needed) {
// Insert a zero-length header using the old SEI type. This is
// required to avoid triggering broken behaviour on Intel platforms
// in CBR mode where an invalid SEI message is generated by the
// driver and inserted into the stream.
*data_len = 0;
*type = VAEncPackedHeaderH264_SEI;
priv->sei_cbr_workaround_needed = 0;
return 0;
#endif

} else {
return AVERROR_EOF;
}
@@ -614,6 +628,10 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,

if (opt->sei & SEI_IDENTIFIER && pic->encode_order == 0)
priv->sei_needed = 1;
#if !CONFIG_VAAPI_1
if (ctx->va_rc_mode == VA_RC_CBR)
priv->sei_cbr_workaround_needed = 1;
#endif

if (opt->sei & SEI_TIMING) {
memset(&priv->pic_timing, 0, sizeof(priv->pic_timing));


Loading…
Cancel
Save