summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>2018-07-25 14:19:34 +0200
committerPaul Kocialkowski <paul.kocialkowski@bootlin.com>2018-07-25 14:36:36 +0200
commit7d1ac10517ccfa6acf129a64952d23e518f9c4a0 (patch)
treedf72be82be4cc1e07c66a964c26ed7bf90623084
parent815f38a6a71fd8bea906839d908db53633600aa9 (diff)
downloadlibva-v4l2-request-7d1ac10517ccfa6acf129a64952d23e518f9c4a0.tar.gz
libva-v4l2-request-7d1ac10517ccfa6acf129a64952d23e518f9c4a0.tar.bz2
libva-v4l2-request-7d1ac10517ccfa6acf129a64952d23e518f9c4a0.zip
Add support for MPEG2 quantization matrices
This adds support for MPEG2 quantization matrices, which are optional given that fallback default matrices are used (on the kernel side) when no such matrix is provided. Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
-rw-r--r--src/mpeg2.c32
-rw-r--r--src/picture.c8
-rw-r--r--src/surface.h2
3 files changed, 42 insertions, 0 deletions
diff --git a/src/mpeg2.c b/src/mpeg2.c
index cfeae35..fc251fa 100644
--- a/src/mpeg2.c
+++ b/src/mpeg2.c
@@ -44,9 +44,14 @@ int mpeg2_set_controls(struct request_data *driver_data,
{
VAPictureParameterBufferMPEG2 *parameters =
&surface_object->params.mpeg2.picture;
+ VAIQMatrixBufferMPEG2 *iqmatrix =
+ &surface_object->params.mpeg2.iqmatrix;
+ bool iqmatrix_set = surface_object->params.mpeg2.iqmatrix_set;
struct v4l2_ctrl_mpeg2_slice_params slice_params;
+ struct v4l2_ctrl_mpeg2_quantization quantization;
struct object_surface *forward_reference_surface;
struct object_surface *backward_reference_surface;
+ unsigned int i;
int rc;
memset(&slice_params, 0, sizeof(slice_params));
@@ -105,5 +110,32 @@ int mpeg2_set_controls(struct request_data *driver_data,
if (rc < 0)
return VA_STATUS_ERROR_OPERATION_FAILED;
+ if (iqmatrix_set) {
+ quantization.load_intra_quantiser_matrix =
+ iqmatrix->load_intra_quantiser_matrix;
+ quantization.load_non_intra_quantiser_matrix =
+ iqmatrix->load_non_intra_quantiser_matrix;
+ quantization.load_chroma_intra_quantiser_matrix =
+ iqmatrix->load_chroma_intra_quantiser_matrix;
+ quantization.load_chroma_non_intra_quantiser_matrix =
+ iqmatrix->load_chroma_non_intra_quantiser_matrix;
+
+ for (i = 0; i < 64; i++) {
+ quantization.intra_quantiser_matrix[i] =
+ iqmatrix->intra_quantiser_matrix[i];
+ quantization.non_intra_quantiser_matrix[i] =
+ iqmatrix->non_intra_quantiser_matrix[i];
+ quantization.chroma_intra_quantiser_matrix[i] =
+ iqmatrix->chroma_intra_quantiser_matrix[i];
+ quantization.chroma_non_intra_quantiser_matrix[i] =
+ iqmatrix->chroma_non_intra_quantiser_matrix[i];
+ }
+
+ rc = v4l2_set_control(driver_data->video_fd,
+ surface_object->request_fd,
+ V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION,
+ &quantization, sizeof(quantization));
+ }
+
return 0;
}
diff --git a/src/picture.c b/src/picture.c
index f724366..696b326 100644
--- a/src/picture.c
+++ b/src/picture.c
@@ -109,6 +109,14 @@ static VAStatus codec_store_buffer(struct request_data *driver_data,
case VAIQMatrixBufferType:
switch (profile) {
+ case VAProfileMPEG2Simple:
+ case VAProfileMPEG2Main:
+ memcpy(&surface_object->params.mpeg2.iqmatrix,
+ buffer_object->data,
+ sizeof(surface_object->params.mpeg2.iqmatrix));
+ surface_object->params.mpeg2.iqmatrix_set = true;
+ break;
+
case VAProfileH264Main:
case VAProfileH264High:
case VAProfileH264ConstrainedBaseline:
diff --git a/src/surface.h b/src/surface.h
index c5ae2f5..5f401a1 100644
--- a/src/surface.h
+++ b/src/surface.h
@@ -64,6 +64,8 @@ struct object_surface {
union {
struct {
VAPictureParameterBufferMPEG2 picture;
+ VAIQMatrixBufferMPEG2 iqmatrix;
+ bool iqmatrix_set;
} mpeg2;
struct {
VAIQMatrixBufferH264 matrix;