summaryrefslogtreecommitdiff
path: root/libavcodec/vaapi_encode_mjpeg.c
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2016-09-18 14:59:59 +0100
committerMark Thompson <sw@jkqxz.net>2016-09-28 22:54:11 +0100
commit892bbbcdc171ff0d08d69636a240ffb95f54243c (patch)
treed9b1b85f004fe3b5c3b61ae1d41d2944c41af572 /libavcodec/vaapi_encode_mjpeg.c
parent80a5d05108cb218e8cd2e25c6621a3bfef0a832e (diff)
vaapi_encode: Check packed header capabilities
This improves behaviour with drivers which do not support packed headers, such as AMD VCE on mesa/gallium.
Diffstat (limited to 'libavcodec/vaapi_encode_mjpeg.c')
-rw-r--r--libavcodec/vaapi_encode_mjpeg.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/libavcodec/vaapi_encode_mjpeg.c b/libavcodec/vaapi_encode_mjpeg.c
index 8866dfba62..78d5e789f1 100644
--- a/libavcodec/vaapi_encode_mjpeg.c
+++ b/libavcodec/vaapi_encode_mjpeg.c
@@ -345,6 +345,17 @@ static av_cold int vaapi_encode_mjpeg_configure(AVCodecContext *avctx)
return AVERROR(EINVAL);
}
+ // Hack: the implementation calls the JPEG image header (which we
+ // will use in the same way as a slice header) generic "raw data".
+ // Therefore, if after the packed header capability check we have
+ // PACKED_HEADER_RAW_DATA available, rewrite it as
+ // PACKED_HEADER_SLICE so that the header-writing code can do the
+ // right thing.
+ if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA) {
+ ctx->va_packed_headers &= ~VA_ENC_PACKED_HEADER_RAW_DATA;
+ ctx->va_packed_headers |= VA_ENC_PACKED_HEADER_SLICE;
+ }
+
vaapi_encode_mjpeg_init_tables(avctx);
return 0;
@@ -380,6 +391,10 @@ static av_cold int vaapi_encode_mjpeg_init(AVCodecContext *avctx)
ctx->va_rc_mode = VA_RC_CQP;
+ // The JPEG image header - see note above.
+ ctx->va_packed_headers =
+ VA_ENC_PACKED_HEADER_RAW_DATA;
+
ctx->surface_width = FFALIGN(avctx->width, 8);
ctx->surface_height = FFALIGN(avctx->height, 8);