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