17ec681f3Smrg/************************************************************************** 27ec681f3Smrg * 37ec681f3Smrg * Copyright 2014 Advanced Micro Devices, Inc. 47ec681f3Smrg * All Rights Reserved. 57ec681f3Smrg * 67ec681f3Smrg * Permission is hereby granted, free of charge, to any person obtaining a 77ec681f3Smrg * copy of this software and associated documentation files (the 87ec681f3Smrg * "Software"), to deal in the Software without restriction, including 97ec681f3Smrg * without limitation the rights to use, copy, modify, merge, publish, 107ec681f3Smrg * distribute, sub license, and/or sell copies of the Software, and to 117ec681f3Smrg * permit persons to whom the Software is furnished to do so, subject to 127ec681f3Smrg * the following conditions: 137ec681f3Smrg * 147ec681f3Smrg * The above copyright notice and this permission notice (including the 157ec681f3Smrg * next paragraph) shall be included in all copies or substantial portions 167ec681f3Smrg * of the Software. 177ec681f3Smrg * 187ec681f3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 197ec681f3Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 207ec681f3Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 217ec681f3Smrg * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR 227ec681f3Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 237ec681f3Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 247ec681f3Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 257ec681f3Smrg * 267ec681f3Smrg **************************************************************************/ 277ec681f3Smrg 287ec681f3Smrg#include "va_private.h" 297ec681f3Smrg 307ec681f3Smrgconst int reverse_inverse_zscan[] = 317ec681f3Smrg{ 327ec681f3Smrg /* Reverse inverse z scan pattern */ 337ec681f3Smrg 0, 2, 3, 9, 10, 20, 21, 35, 347ec681f3Smrg 1, 4, 8, 11, 19, 22, 34, 36, 357ec681f3Smrg 5, 7, 12, 18, 23, 33, 37, 48, 367ec681f3Smrg 6, 13, 17, 24, 32, 38, 47, 49, 377ec681f3Smrg 14, 16, 25, 31, 39, 46, 50, 57, 387ec681f3Smrg 15, 26, 30, 40, 45, 51, 56, 58, 397ec681f3Smrg 27, 29, 41, 44, 52, 55, 59, 62, 407ec681f3Smrg 28, 42, 43, 53, 54, 60, 61, 63, 417ec681f3Smrg}; 427ec681f3Smrg 437ec681f3Smrgvoid vlVaHandlePictureParameterBufferMPEG12(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf) 447ec681f3Smrg{ 457ec681f3Smrg VAPictureParameterBufferMPEG2 *mpeg2 = buf->data; 467ec681f3Smrg 477ec681f3Smrg assert(buf->size >= sizeof(VAPictureParameterBufferMPEG2) && buf->num_elements == 1); 487ec681f3Smrg context->desc.mpeg12.num_slices = 0; 497ec681f3Smrg /*horizontal_size;*/ 507ec681f3Smrg /*vertical_size;*/ 517ec681f3Smrg vlVaGetReferenceFrame(drv, mpeg2->forward_reference_picture, &context->desc.mpeg12.ref[0]); 527ec681f3Smrg vlVaGetReferenceFrame(drv, mpeg2->backward_reference_picture, &context->desc.mpeg12.ref[1]); 537ec681f3Smrg context->desc.mpeg12.picture_coding_type = mpeg2->picture_coding_type; 547ec681f3Smrg context->desc.mpeg12.f_code[0][0] = ((mpeg2->f_code >> 12) & 0xf) - 1; 557ec681f3Smrg context->desc.mpeg12.f_code[0][1] = ((mpeg2->f_code >> 8) & 0xf) - 1; 567ec681f3Smrg context->desc.mpeg12.f_code[1][0] = ((mpeg2->f_code >> 4) & 0xf) - 1; 577ec681f3Smrg context->desc.mpeg12.f_code[1][1] = (mpeg2->f_code & 0xf) - 1; 587ec681f3Smrg context->desc.mpeg12.intra_dc_precision = 597ec681f3Smrg mpeg2->picture_coding_extension.bits.intra_dc_precision; 607ec681f3Smrg context->desc.mpeg12.picture_structure = 617ec681f3Smrg mpeg2->picture_coding_extension.bits.picture_structure; 627ec681f3Smrg context->desc.mpeg12.top_field_first = 637ec681f3Smrg mpeg2->picture_coding_extension.bits.top_field_first; 647ec681f3Smrg context->desc.mpeg12.frame_pred_frame_dct = 657ec681f3Smrg mpeg2->picture_coding_extension.bits.frame_pred_frame_dct; 667ec681f3Smrg context->desc.mpeg12.concealment_motion_vectors = 677ec681f3Smrg mpeg2->picture_coding_extension.bits.concealment_motion_vectors; 687ec681f3Smrg context->desc.mpeg12.q_scale_type = 697ec681f3Smrg mpeg2->picture_coding_extension.bits.q_scale_type; 707ec681f3Smrg context->desc.mpeg12.intra_vlc_format = 717ec681f3Smrg mpeg2->picture_coding_extension.bits.intra_vlc_format; 727ec681f3Smrg context->desc.mpeg12.alternate_scan = 737ec681f3Smrg mpeg2->picture_coding_extension.bits.alternate_scan; 747ec681f3Smrg /*repeat_first_field*/ 757ec681f3Smrg /*progressive_frame*/ 767ec681f3Smrg /*is_first_field*/ 777ec681f3Smrg} 787ec681f3Smrg 797ec681f3Smrgvoid vlVaHandleIQMatrixBufferMPEG12(vlVaContext *context, vlVaBuffer *buf) 807ec681f3Smrg{ 817ec681f3Smrg VAIQMatrixBufferMPEG2 *mpeg2 = buf->data; 827ec681f3Smrg static uint8_t temp_intra_matrix[64]; 837ec681f3Smrg static uint8_t temp_nonintra_matrix[64]; 847ec681f3Smrg 857ec681f3Smrg assert(buf->size >= sizeof(VAIQMatrixBufferMPEG2) && buf->num_elements == 1); 867ec681f3Smrg if (mpeg2->load_intra_quantiser_matrix) { 877ec681f3Smrg /* The quantiser matrix that VAAPI provides has been applied 887ec681f3Smrg with inverse z-scan. However, what we expect in MPEG2 897ec681f3Smrg picture description is the original order. Therefore, 907ec681f3Smrg we need to reverse it back to its original order. 917ec681f3Smrg */ 927ec681f3Smrg for (int i = 0; i < 64; i++) 937ec681f3Smrg temp_intra_matrix[i] = 947ec681f3Smrg mpeg2->intra_quantiser_matrix[reverse_inverse_zscan[i]]; 957ec681f3Smrg context->desc.mpeg12.intra_matrix = temp_intra_matrix; 967ec681f3Smrg } else 977ec681f3Smrg context->desc.mpeg12.intra_matrix = NULL; 987ec681f3Smrg 997ec681f3Smrg if (mpeg2->load_non_intra_quantiser_matrix) { 1007ec681f3Smrg for (int i = 0; i < 64; i++) 1017ec681f3Smrg temp_nonintra_matrix[i] = 1027ec681f3Smrg mpeg2->non_intra_quantiser_matrix[reverse_inverse_zscan[i]]; 1037ec681f3Smrg context->desc.mpeg12.non_intra_matrix = temp_nonintra_matrix; 1047ec681f3Smrg } else 1057ec681f3Smrg context->desc.mpeg12.non_intra_matrix = NULL; 1067ec681f3Smrg} 1077ec681f3Smrg 1087ec681f3Smrgvoid vlVaHandleSliceParameterBufferMPEG12(vlVaContext *context, vlVaBuffer *buf) 1097ec681f3Smrg{ 1107ec681f3Smrg assert(buf->size >= sizeof(VASliceParameterBufferMPEG2)); 1117ec681f3Smrg context->desc.mpeg12.num_slices += buf->num_elements; 1127ec681f3Smrg} 113