blob: 401a87643b2be442706076c7090e8b18bfcfe3a6 [file] [log] [blame]
/*
* Copyright (c) 2017-2018, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file codechal_encode_vp8.cpp
//! \brief Defines base class for VP8 dual-pipe encoder.
//!
#include "codechal_encode_vp8.h"
#include "codechal_mmc_encode_vp8.h"
#if USE_CODECHAL_DEBUG_TOOL
#include "codechal_debug.h"
#endif
#define ENCODE_VP8_BRC_HISTORY_BUFFER_SIZE 704
static uint16_t PakQPInputTable[160 * 18] =
{
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x4000, 0x0004, 0x0010, 0x4000, 0x0004, 0x0010,
0x3333, 0x0005, 0x0010, 0x3333, 0x0005, 0x0010, 0x2000, 0x0008, 0x0010, 0x1999, 0x000a, 0x0010, 0x3333, 0x0005, 0x0010, 0x3333, 0x0005, 0x0010,
0x2aaa, 0x0006, 0x0010, 0x2aaa, 0x0006, 0x0010, 0x1c71, 0x0009, 0x0010, 0x1555, 0x000c, 0x0010, 0x2aaa, 0x0006, 0x0010, 0x2aaa, 0x0006, 0x0010,
0x2492, 0x0007, 0x0010, 0x2492, 0x0007, 0x0010, 0x1999, 0x000a, 0x0010, 0x1249, 0x000e, 0x0010, 0x2492, 0x0007, 0x0010, 0x2492, 0x0007, 0x0010,
0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010, 0x1555, 0x000c, 0x0010, 0x1000, 0x0010, 0x0010, 0x2000, 0x0008, 0x0010, 0x2000, 0x0008, 0x0010,
0x1c71, 0x0009, 0x0010, 0x1c71, 0x0009, 0x0010, 0x13b1, 0x000d, 0x0010, 0x0e38, 0x0012, 0x0010, 0x1c71, 0x0009, 0x0010, 0x1c71, 0x0009, 0x0010,
0x1999, 0x000a, 0x0010, 0x1999, 0x000a, 0x0010, 0x1111, 0x000f, 0x0010, 0x0ccc, 0x0014, 0x0010, 0x1999, 0x000a, 0x0010, 0x1999, 0x000a, 0x0010,
0x1745, 0x000b, 0x0010, 0x1999, 0x000a, 0x0010, 0x0f0f, 0x0011, 0x0010, 0x0ccc, 0x0014, 0x0010, 0x1745, 0x000b, 0x0010, 0x1999, 0x000a, 0x0010,
0x1555, 0x000c, 0x0010, 0x1745, 0x000b, 0x0010, 0x0e38, 0x0012, 0x0010, 0x0ba2, 0x0016, 0x0010, 0x1555, 0x000c, 0x0010, 0x1745, 0x000b, 0x0010,
0x13b1, 0x000d, 0x0010, 0x1555, 0x000c, 0x0010, 0x0ccc, 0x0014, 0x0010, 0x0aaa, 0x0018, 0x0010, 0x13b1, 0x000d, 0x0010, 0x1555, 0x000c, 0x0010,
0x1249, 0x000e, 0x0010, 0x13b1, 0x000d, 0x0010, 0x0c30, 0x0015, 0x0010, 0x09d8, 0x001a, 0x0010, 0x1249, 0x000e, 0x0010, 0x13b1, 0x000d, 0x0010,
0x1111, 0x000f, 0x0010, 0x1249, 0x000e, 0x0010, 0x0b21, 0x0017, 0x0010, 0x0924, 0x001c, 0x0010, 0x1111, 0x000f, 0x0010, 0x1249, 0x000e, 0x0010,
0x1000, 0x0010, 0x0010, 0x1111, 0x000f, 0x0010, 0x0aaa, 0x0018, 0x0010, 0x0888, 0x001e, 0x0010, 0x1000, 0x0010, 0x0010, 0x1111, 0x000f, 0x0010,
0x0f0f, 0x0011, 0x0010, 0x1000, 0x0010, 0x0010, 0x09d8, 0x001a, 0x0010, 0x0800, 0x0020, 0x0010, 0x0f0f, 0x0011, 0x0010, 0x1000, 0x0010, 0x0010,
0x0e38, 0x0012, 0x0010, 0x0f0f, 0x0011, 0x0010, 0x097b, 0x001b, 0x0010, 0x0787, 0x0022, 0x0010, 0x0e38, 0x0012, 0x0010, 0x0f0f, 0x0011, 0x0010,
0x0d79, 0x0013, 0x0010, 0x0f0f, 0x0011, 0x0010, 0x08d3, 0x001d, 0x0010, 0x0787, 0x0022, 0x0010, 0x0d79, 0x0013, 0x0010, 0x0f0f, 0x0011, 0x0010,
0x0ccc, 0x0014, 0x0010, 0x0e38, 0x0012, 0x0010, 0x0842, 0x001f, 0x0010, 0x071c, 0x0024, 0x0010, 0x0ccc, 0x0014, 0x0010, 0x0e38, 0x0012, 0x0010,
0x0c30, 0x0015, 0x0010, 0x0d79, 0x0013, 0x0010, 0x0800, 0x0020, 0x0010, 0x06bc, 0x0026, 0x0010, 0x0c30, 0x0015, 0x0010, 0x0d79, 0x0013, 0x0010,
0x0ba2, 0x0016, 0x0010, 0x0ccc, 0x0014, 0x0010, 0x0787, 0x0022, 0x0010, 0x0666, 0x0028, 0x0010, 0x0ba2, 0x0016, 0x0010, 0x0ccc, 0x0014, 0x0010,
0x0b21, 0x0017, 0x0010, 0x0ccc, 0x0014, 0x0010, 0x0750, 0x0023, 0x0010, 0x0666, 0x0028, 0x0010, 0x0b21, 0x0017, 0x0010, 0x0ccc, 0x0014, 0x0010,
0x0aaa, 0x0018, 0x0010, 0x0c30, 0x0015, 0x0010, 0x06eb, 0x0025, 0x0010, 0x0618, 0x002a, 0x0010, 0x0aaa, 0x0018, 0x0010, 0x0c30, 0x0015, 0x0010,
0x0a3d, 0x0019, 0x0010, 0x0c30, 0x0015, 0x0010, 0x06bc, 0x0026, 0x0010, 0x0618, 0x002a, 0x0010, 0x0a3d, 0x0019, 0x0010, 0x0c30, 0x0015, 0x0010,
0x09d8, 0x001a, 0x0010, 0x0ba2, 0x0016, 0x0010, 0x0666, 0x0028, 0x0010, 0x05d1, 0x002c, 0x0010, 0x09d8, 0x001a, 0x0010, 0x0ba2, 0x0016, 0x0010,
0x097b, 0x001b, 0x0010, 0x0ba2, 0x0016, 0x0010, 0x063e, 0x0029, 0x0010, 0x05d1, 0x002c, 0x0010, 0x097b, 0x001b, 0x0010, 0x0ba2, 0x0016, 0x0010,
0x0924, 0x001c, 0x0010, 0x0b21, 0x0017, 0x0010, 0x05f4, 0x002b, 0x0010, 0x0590, 0x002e, 0x0010, 0x0924, 0x001c, 0x0010, 0x0b21, 0x0017, 0x0010,
0x08d3, 0x001d, 0x0010, 0x0b21, 0x0017, 0x0010, 0x05d1, 0x002c, 0x0010, 0x0590, 0x002e, 0x0010, 0x08d3, 0x001d, 0x0010, 0x0b21, 0x0017, 0x0010,
0x0888, 0x001e, 0x0010, 0x0aaa, 0x0018, 0x0010, 0x0590, 0x002e, 0x0010, 0x0555, 0x0030, 0x0010, 0x0888, 0x001e, 0x0010, 0x0aaa, 0x0018, 0x0010,
0x0842, 0x001f, 0x0010, 0x0a3d, 0x0019, 0x0010, 0x0555, 0x0030, 0x0010, 0x051e, 0x0032, 0x0010, 0x0842, 0x001f, 0x0010, 0x0a3d, 0x0019, 0x0010,
0x0800, 0x0020, 0x0010, 0x0a3d, 0x0019, 0x0010, 0x0539, 0x0031, 0x0010, 0x051e, 0x0032, 0x0010, 0x0800, 0x0020, 0x0010, 0x0a3d, 0x0019, 0x0010,
0x07c1, 0x0021, 0x0010, 0x09d8, 0x001a, 0x0010, 0x0505, 0x0033, 0x0010, 0x04ec, 0x0034, 0x0010, 0x07c1, 0x0021, 0x0010, 0x09d8, 0x001a, 0x0010,
0x0787, 0x0022, 0x0010, 0x097b, 0x001b, 0x0010, 0x04ec, 0x0034, 0x0010, 0x04bd, 0x0036, 0x0010, 0x0787, 0x0022, 0x0010, 0x097b, 0x001b, 0x0010,
0x0750, 0x0023, 0x0010, 0x0924, 0x001c, 0x0010, 0x04bd, 0x0036, 0x0010, 0x0492, 0x0038, 0x0010, 0x0750, 0x0023, 0x0010, 0x0924, 0x001c, 0x0010,
0x071c, 0x0024, 0x0010, 0x08d3, 0x001d, 0x0010, 0x04a7, 0x0037, 0x0010, 0x0469, 0x003a, 0x0010, 0x071c, 0x0024, 0x0010, 0x08d3, 0x001d, 0x0010,
0x06eb, 0x0025, 0x0010, 0x0888, 0x001e, 0x0010, 0x047d, 0x0039, 0x0010, 0x0444, 0x003c, 0x0010, 0x06eb, 0x0025, 0x0010, 0x0888, 0x001e, 0x0010,
0x06bc, 0x0026, 0x0010, 0x0842, 0x001f, 0x0010, 0x0469, 0x003a, 0x0010, 0x0421, 0x003e, 0x0010, 0x06bc, 0x0026, 0x0010, 0x0842, 0x001f, 0x0010,
0x0690, 0x0027, 0x0010, 0x0800, 0x0020, 0x0010, 0x0444, 0x003c, 0x0010, 0x0400, 0x0040, 0x0010, 0x0690, 0x0027, 0x0010, 0x0800, 0x0020, 0x0010,
0x0666, 0x0028, 0x0010, 0x07c1, 0x0021, 0x0010, 0x0421, 0x003e, 0x0010, 0x03e0, 0x0042, 0x0010, 0x0666, 0x0028, 0x0010, 0x07c1, 0x0021, 0x0010,
0x063e, 0x0029, 0x0010, 0x0787, 0x0022, 0x0010, 0x0410, 0x003f, 0x0010, 0x03c3, 0x0044, 0x0010, 0x063e, 0x0029, 0x0010, 0x0787, 0x0022, 0x0010,
0x0618, 0x002a, 0x0010, 0x0750, 0x0023, 0x0010, 0x03f0, 0x0041, 0x0010, 0x03a8, 0x0046, 0x0010, 0x0618, 0x002a, 0x0010, 0x0750, 0x0023, 0x0010,
0x05f4, 0x002b, 0x0010, 0x071c, 0x0024, 0x0010, 0x03e0, 0x0042, 0x0010, 0x038e, 0x0048, 0x0010, 0x05f4, 0x002b, 0x0010, 0x071c, 0x0024, 0x0010,
0x05d1, 0x002c, 0x0010, 0x06eb, 0x0025, 0x0010, 0x03c3, 0x0044, 0x0010, 0x0375, 0x004a, 0x0010, 0x05d1, 0x002c, 0x0010, 0x06eb, 0x0025, 0x0010,
0x05b0, 0x002d, 0x0010, 0x06eb, 0x0025, 0x0010, 0x03b5, 0x0045, 0x0010, 0x0375, 0x004a, 0x0010, 0x05b0, 0x002d, 0x0010, 0x06eb, 0x0025, 0x0010,
0x0590, 0x002e, 0x0010, 0x06bc, 0x0026, 0x0010, 0x039b, 0x0047, 0x0010, 0x035e, 0x004c, 0x0010, 0x0590, 0x002e, 0x0010, 0x06bc, 0x0026, 0x0010,
0x0572, 0x002f, 0x0010, 0x0690, 0x0027, 0x0010, 0x038e, 0x0048, 0x0010, 0x0348, 0x004e, 0x0010, 0x0572, 0x002f, 0x0010, 0x0690, 0x0027, 0x0010,
0x0555, 0x0030, 0x0010, 0x0666, 0x0028, 0x0010, 0x0375, 0x004a, 0x0010, 0x0333, 0x0050, 0x0010, 0x0555, 0x0030, 0x0010, 0x0666, 0x0028, 0x0010,
0x0539, 0x0031, 0x0010, 0x063e, 0x0029, 0x0010, 0x0369, 0x004b, 0x0010, 0x031f, 0x0052, 0x0010, 0x0539, 0x0031, 0x0010, 0x063e, 0x0029, 0x0010,
0x051e, 0x0032, 0x0010, 0x0618, 0x002a, 0x0010, 0x0353, 0x004d, 0x0010, 0x030c, 0x0054, 0x0010, 0x051e, 0x0032, 0x0010, 0x0618, 0x002a, 0x0010,
0x0505, 0x0033, 0x0010, 0x05f4, 0x002b, 0x0010, 0x033d, 0x004f, 0x0010, 0x02fa, 0x0056, 0x0010, 0x0505, 0x0033, 0x0010, 0x05f4, 0x002b, 0x0010,
0x04ec, 0x0034, 0x0010, 0x05d1, 0x002c, 0x0010, 0x0333, 0x0050, 0x0010, 0x02e8, 0x0058, 0x0010, 0x04ec, 0x0034, 0x0010, 0x05d1, 0x002c, 0x0010,
0x04d4, 0x0035, 0x0010, 0x05b0, 0x002d, 0x0010, 0x031f, 0x0052, 0x0010, 0x02d8, 0x005a, 0x0010, 0x04d4, 0x0035, 0x0010, 0x05b0, 0x002d, 0x0010,
0x04bd, 0x0036, 0x0010, 0x0590, 0x002e, 0x0010, 0x0315, 0x0053, 0x0010, 0x02c8, 0x005c, 0x0010, 0x04bd, 0x0036, 0x0010, 0x0590, 0x002e, 0x0010,
0x04a7, 0x0037, 0x0010, 0x0590, 0x002e, 0x0010, 0x0303, 0x0055, 0x0010, 0x02c8, 0x005c, 0x0010, 0x04a7, 0x0037, 0x0010, 0x0590, 0x002e, 0x0010,
0x0492, 0x0038, 0x0010, 0x0572, 0x002f, 0x0010, 0x02fa, 0x0056, 0x0010, 0x02b9, 0x005e, 0x0010, 0x0492, 0x0038, 0x0010, 0x0572, 0x002f, 0x0010,
0x047d, 0x0039, 0x0010, 0x0555, 0x0030, 0x0010, 0x02e8, 0x0058, 0x0010, 0x02aa, 0x0060, 0x0010, 0x047d, 0x0039, 0x0010, 0x0555, 0x0030, 0x0010,
0x0469, 0x003a, 0x0010, 0x0539, 0x0031, 0x0010, 0x02e0, 0x0059, 0x0010, 0x029c, 0x0062, 0x0010, 0x0469, 0x003a, 0x0010, 0x0539, 0x0031, 0x0010,
0x0444, 0x003c, 0x0010, 0x051e, 0x0032, 0x0010, 0x02c0, 0x005d, 0x0010, 0x028f, 0x0064, 0x0010, 0x0444, 0x003c, 0x0010, 0x051e, 0x0032, 0x0010,
0x0421, 0x003e, 0x0010, 0x0505, 0x0033, 0x0010, 0x02aa, 0x0060, 0x0010, 0x0282, 0x0066, 0x0010, 0x0421, 0x003e, 0x0010, 0x0505, 0x0033, 0x0010,
0x0400, 0x0040, 0x0010, 0x04ec, 0x0034, 0x0010, 0x0295, 0x0063, 0x0010, 0x0276, 0x0068, 0x0010, 0x0400, 0x0040, 0x0010, 0x04ec, 0x0034, 0x0010,
0x03e0, 0x0042, 0x0010, 0x04d4, 0x0035, 0x0010, 0x0282, 0x0066, 0x0010, 0x026a, 0x006a, 0x0010, 0x03e0, 0x0042, 0x0010, 0x04d4, 0x0035, 0x0010,
0x03c3, 0x0044, 0x0010, 0x04bd, 0x0036, 0x0010, 0x0270, 0x0069, 0x0010, 0x025e, 0x006c, 0x0010, 0x03c3, 0x0044, 0x0010, 0x04bd, 0x0036, 0x0010,
0x03a8, 0x0046, 0x0010, 0x04a7, 0x0037, 0x0010, 0x025e, 0x006c, 0x0010, 0x0253, 0x006e, 0x0010, 0x03a8, 0x0046, 0x0010, 0x04a7, 0x0037, 0x0010,
0x038e, 0x0048, 0x0010, 0x0492, 0x0038, 0x0010, 0x024e, 0x006f, 0x0010, 0x0249, 0x0070, 0x0010, 0x038e, 0x0048, 0x0010, 0x0492, 0x0038, 0x0010,
0x0375, 0x004a, 0x0010, 0x047d, 0x0039, 0x0010, 0x023e, 0x0072, 0x0010, 0x023e, 0x0072, 0x0010, 0x0375, 0x004a, 0x0010, 0x047d, 0x0039, 0x0010,
0x035e, 0x004c, 0x0010, 0x0469, 0x003a, 0x0010, 0x0230, 0x0075, 0x0010, 0x0234, 0x0074, 0x0010, 0x035e, 0x004c, 0x0010, 0x0469, 0x003a, 0x0010,
0x0348, 0x004e, 0x0010, 0x0456, 0x003b, 0x0010, 0x0222, 0x0078, 0x0010, 0x022b, 0x0076, 0x0010, 0x0348, 0x004e, 0x0010, 0x0456, 0x003b, 0x0010,
0x0333, 0x0050, 0x0010, 0x0444, 0x003c, 0x0010, 0x0210, 0x007c, 0x0010, 0x0222, 0x0078, 0x0010, 0x0333, 0x0050, 0x0010, 0x0444, 0x003c, 0x0010,
0x031f, 0x0052, 0x0010, 0x0432, 0x003d, 0x0010, 0x0204, 0x007f, 0x0010, 0x0219, 0x007a, 0x0010, 0x031f, 0x0052, 0x0010, 0x0432, 0x003d, 0x0010,
0x030c, 0x0054, 0x0010, 0x0421, 0x003e, 0x0010, 0x01f8, 0x0082, 0x0010, 0x0210, 0x007c, 0x0010, 0x030c, 0x0054, 0x0010, 0x0421, 0x003e, 0x0010,
0x02fa, 0x0056, 0x0010, 0x0410, 0x003f, 0x0010, 0x01ec, 0x0085, 0x0010, 0x0208, 0x007e, 0x0010, 0x02fa, 0x0056, 0x0010, 0x0410, 0x003f, 0x0010,
0x02e8, 0x0058, 0x0010, 0x0400, 0x0040, 0x0010, 0x01e1, 0x0088, 0x0010, 0x0200, 0x0080, 0x0010, 0x02e8, 0x0058, 0x0010, 0x0400, 0x0040, 0x0010,
0x02d8, 0x005a, 0x0010, 0x03f0, 0x0041, 0x0010, 0x01d7, 0x008b, 0x0010, 0x01f8, 0x0082, 0x0010, 0x02d8, 0x005a, 0x0010, 0x03f0, 0x0041, 0x0010,
0x02c8, 0x005c, 0x0010, 0x03e0, 0x0042, 0x0010, 0x01cd, 0x008e, 0x0010, 0x01f0, 0x0084, 0x0010, 0x02c8, 0x005c, 0x0010, 0x03e0, 0x0042, 0x0010,
0x02b9, 0x005e, 0x0010, 0x03d2, 0x0043, 0x0010, 0x01c3, 0x0091, 0x0010, 0x01e9, 0x0086, 0x0010, 0x02b9, 0x005e, 0x0010, 0x03d2, 0x0043, 0x0010,
0x02aa, 0x0060, 0x0010, 0x03c3, 0x0044, 0x0010, 0x01ba, 0x0094, 0x0010, 0x01e1, 0x0088, 0x0010, 0x02aa, 0x0060, 0x0010, 0x03c3, 0x0044, 0x0010,
0x029c, 0x0062, 0x0010, 0x03b5, 0x0045, 0x0010, 0x01b2, 0x0097, 0x0010, 0x01da, 0x008a, 0x0010, 0x029c, 0x0062, 0x0010, 0x03b5, 0x0045, 0x0010,
0x028f, 0x0064, 0x0010, 0x03a8, 0x0046, 0x0010, 0x01a6, 0x009b, 0x0010, 0x01d4, 0x008c, 0x0010, 0x028f, 0x0064, 0x0010, 0x03a8, 0x0046, 0x0010,
0x0282, 0x0066, 0x0010, 0x039b, 0x0047, 0x0010, 0x019e, 0x009e, 0x0010, 0x01cd, 0x008e, 0x0010, 0x0282, 0x0066, 0x0010, 0x039b, 0x0047, 0x0010,
0x0276, 0x0068, 0x0010, 0x038e, 0x0048, 0x0010, 0x0197, 0x00a1, 0x0010, 0x01c7, 0x0090, 0x0010, 0x0276, 0x0068, 0x0010, 0x038e, 0x0048, 0x0010,
0x026a, 0x006a, 0x0010, 0x0381, 0x0049, 0x0010, 0x018f, 0x00a4, 0x0010, 0x01c0, 0x0092, 0x0010, 0x026a, 0x006a, 0x0010, 0x0381, 0x0049, 0x0010,
0x025e, 0x006c, 0x0010, 0x0375, 0x004a, 0x0010, 0x0188, 0x00a7, 0x0010, 0x01ba, 0x0094, 0x0010, 0x025e, 0x006c, 0x0010, 0x0375, 0x004a, 0x0010,
0x0253, 0x006e, 0x0010, 0x0369, 0x004b, 0x0010, 0x0181, 0x00aa, 0x0010, 0x01b4, 0x0096, 0x0010, 0x0253, 0x006e, 0x0010, 0x0369, 0x004b, 0x0010,
0x0249, 0x0070, 0x0010, 0x035e, 0x004c, 0x0010, 0x017a, 0x00ad, 0x0010, 0x01af, 0x0098, 0x0010, 0x0249, 0x0070, 0x0010, 0x035e, 0x004c, 0x0010,
0x023e, 0x0072, 0x0010, 0x035e, 0x004c, 0x0010, 0x0174, 0x00b0, 0x0010, 0x01af, 0x0098, 0x0010, 0x023e, 0x0072, 0x0010, 0x035e, 0x004c, 0x0010,
0x0234, 0x0074, 0x0010, 0x0353, 0x004d, 0x0010, 0x016e, 0x00b3, 0x0010, 0x01a9, 0x009a, 0x0010, 0x0234, 0x0074, 0x0010, 0x0353, 0x004d, 0x0010,
0x0226, 0x0077, 0x0010, 0x0348, 0x004e, 0x0010, 0x0164, 0x00b8, 0x0010, 0x01a4, 0x009c, 0x0010, 0x0226, 0x0077, 0x0010, 0x0348, 0x004e, 0x0010,
0x0219, 0x007a, 0x0010, 0x033d, 0x004f, 0x0010, 0x015a, 0x00bd, 0x0010, 0x019e, 0x009e, 0x0010, 0x0219, 0x007a, 0x0010, 0x033d, 0x004f, 0x0010,
0x020c, 0x007d, 0x0010, 0x0333, 0x0050, 0x0010, 0x0153, 0x00c1, 0x0010, 0x0199, 0x00a0, 0x0010, 0x020c, 0x007d, 0x0010, 0x0333, 0x0050, 0x0010,
0x0200, 0x0080, 0x0010, 0x0329, 0x0051, 0x0010, 0x014a, 0x00c6, 0x0010, 0x0194, 0x00a2, 0x0010, 0x0200, 0x0080, 0x0010, 0x0329, 0x0051, 0x0010,
0x01f4, 0x0083, 0x0010, 0x031f, 0x0052, 0x0010, 0x0142, 0x00cb, 0x0010, 0x018f, 0x00a4, 0x0010, 0x01f4, 0x0083, 0x0010, 0x031f, 0x0052, 0x0010,
0x01e9, 0x0086, 0x0010, 0x0315, 0x0053, 0x0010, 0x013c, 0x00cf, 0x0010, 0x018a, 0x00a6, 0x0010, 0x01e9, 0x0086, 0x0010, 0x0315, 0x0053, 0x0010,
0x01de, 0x0089, 0x0010, 0x030c, 0x0054, 0x0010, 0x0135, 0x00d4, 0x0010, 0x0186, 0x00a8, 0x0010, 0x01de, 0x0089, 0x0010, 0x030c, 0x0054, 0x0010,
0x01d4, 0x008c, 0x0010, 0x0303, 0x0055, 0x0010, 0x012e, 0x00d9, 0x0010, 0x0181, 0x00aa, 0x0010, 0x01d4, 0x008c, 0x0010, 0x0303, 0x0055, 0x0010,
0x01ca, 0x008f, 0x0010, 0x02fa, 0x0056, 0x0010, 0x0128, 0x00dd, 0x0010, 0x017d, 0x00ac, 0x0010, 0x01ca, 0x008f, 0x0010, 0x02fa, 0x0056, 0x0010,
0x01c0, 0x0092, 0x0010, 0x02f1, 0x0057, 0x0010, 0x0121, 0x00e2, 0x0010, 0x0178, 0x00ae, 0x0010, 0x01c0, 0x0092, 0x0010, 0x02f1, 0x0057, 0x0010,
0x01b7, 0x0095, 0x0010, 0x02e8, 0x0058, 0x0010, 0x011c, 0x00e6, 0x0010, 0x0174, 0x00b0, 0x0010, 0x01b7, 0x0095, 0x0010, 0x02e8, 0x0058, 0x0010,
0x01af, 0x0098, 0x0010, 0x02e0, 0x0059, 0x0010, 0x0116, 0x00eb, 0x0010, 0x0170, 0x00b2, 0x0010, 0x01af, 0x0098, 0x0010, 0x02e0, 0x0059, 0x0010,
0x01a6, 0x009b, 0x0010, 0x02d0, 0x005b, 0x0010, 0x0111, 0x00f0, 0x0010, 0x0168, 0x00b6, 0x0010, 0x01a6, 0x009b, 0x0010, 0x02d0, 0x005b, 0x0010,
0x019e, 0x009e, 0x0010, 0x02c0, 0x005d, 0x0010, 0x010c, 0x00f4, 0x0010, 0x0160, 0x00ba, 0x0010, 0x019e, 0x009e, 0x0010, 0x02c0, 0x005d, 0x0010,
0x0197, 0x00a1, 0x0010, 0x02b1, 0x005f, 0x0010, 0x0107, 0x00f9, 0x0010, 0x0158, 0x00be, 0x0010, 0x0197, 0x00a1, 0x0010, 0x02b1, 0x005f, 0x0010,
0x018f, 0x00a4, 0x0010, 0x02aa, 0x0060, 0x0010, 0x0102, 0x00fe, 0x0010, 0x0155, 0x00c0, 0x0010, 0x018f, 0x00a4, 0x0010, 0x02aa, 0x0060, 0x0010,
0x0188, 0x00a7, 0x0010, 0x029c, 0x0062, 0x0010, 0x00fe, 0x0102, 0x0010, 0x014e, 0x00c4, 0x0010, 0x0188, 0x00a7, 0x0010, 0x029c, 0x0062, 0x0010,
0x0181, 0x00aa, 0x0010, 0x028f, 0x0064, 0x0010, 0x00f9, 0x0107, 0x0010, 0x0147, 0x00c8, 0x0010, 0x0181, 0x00aa, 0x0010, 0x028f, 0x0064, 0x0010,
0x017a, 0x00ad, 0x0010, 0x0288, 0x0065, 0x0010, 0x00f4, 0x010c, 0x0010, 0x0144, 0x00ca, 0x0010, 0x017a, 0x00ad, 0x0010, 0x0288, 0x0065, 0x0010,
0x0172, 0x00b1, 0x0010, 0x0282, 0x0066, 0x0010, 0x00ef, 0x0112, 0x0010, 0x0141, 0x00cc, 0x0010, 0x0172, 0x00b1, 0x0010, 0x0282, 0x0066, 0x0010,
0x016a, 0x00b5, 0x0010, 0x0276, 0x0068, 0x0010, 0x00ea, 0x0118, 0x0010, 0x013b, 0x00d0, 0x0010, 0x016a, 0x00b5, 0x0010, 0x0276, 0x0068, 0x0010,
0x0162, 0x00b9, 0x0010, 0x026a, 0x006a, 0x0010, 0x00e5, 0x011e, 0x0010, 0x0135, 0x00d4, 0x0010, 0x0162, 0x00b9, 0x0010, 0x026a, 0x006a, 0x0010,
0x015a, 0x00bd, 0x0010, 0x025e, 0x006c, 0x0010, 0x00e0, 0x0124, 0x0010, 0x012f, 0x00d8, 0x0010, 0x015a, 0x00bd, 0x0010, 0x025e, 0x006c, 0x0010,
0x0153, 0x00c1, 0x0010, 0x0253, 0x006e, 0x0010, 0x00db, 0x012b, 0x0010, 0x0129, 0x00dc, 0x0010, 0x0153, 0x00c1, 0x0010, 0x0253, 0x006e, 0x0010,
0x014c, 0x00c5, 0x0010, 0x0249, 0x0070, 0x0010, 0x00d6, 0x0131, 0x0010, 0x0124, 0x00e0, 0x0010, 0x014c, 0x00c5, 0x0010, 0x0249, 0x0070, 0x0010,
0x0146, 0x00c9, 0x0010, 0x023e, 0x0072, 0x0010, 0x00d2, 0x0137, 0x0010, 0x011f, 0x00e4, 0x0010, 0x0146, 0x00c9, 0x0010, 0x023e, 0x0072, 0x0010,
0x013f, 0x00cd, 0x0010, 0x0234, 0x0074, 0x0010, 0x00ce, 0x013d, 0x0010, 0x011a, 0x00e8, 0x0010, 0x013f, 0x00cd, 0x0010, 0x0234, 0x0074, 0x0010,
0x0139, 0x00d1, 0x0010, 0x022b, 0x0076, 0x0010, 0x00ca, 0x0143, 0x0010, 0x0115, 0x00ec, 0x0010, 0x0139, 0x00d1, 0x0010, 0x022b, 0x0076, 0x0010,
0x0133, 0x00d5, 0x0010, 0x0219, 0x007a, 0x0010, 0x00c6, 0x014a, 0x0010, 0x010c, 0x00f4, 0x0010, 0x0133, 0x00d5, 0x0010, 0x0219, 0x007a, 0x0010,
0x012e, 0x00d9, 0x0010, 0x0210, 0x007c, 0x0010, 0x00c3, 0x0150, 0x0010, 0x0108, 0x00f8, 0x0010, 0x012e, 0x00d9, 0x0010, 0x0210, 0x007c, 0x0010,
0x0128, 0x00dd, 0x0010, 0x0208, 0x007e, 0x0010, 0x00bf, 0x0156, 0x0010, 0x0104, 0x00fc, 0x0010, 0x0128, 0x00dd, 0x0010, 0x0208, 0x007e, 0x0010,
0x0123, 0x00e1, 0x0010, 0x0200, 0x0080, 0x0010, 0x00bc, 0x015c, 0x0010, 0x0100, 0x0100, 0x0010, 0x0123, 0x00e1, 0x0010, 0x0200, 0x0080, 0x0010,
0x011e, 0x00e5, 0x0010, 0x01f8, 0x0082, 0x0010, 0x00b9, 0x0162, 0x0010, 0x00fc, 0x0104, 0x0010, 0x011e, 0x00e5, 0x0010, 0x01f8, 0x0082, 0x0010,
0x0118, 0x00ea, 0x0010, 0x01f0, 0x0084, 0x0010, 0x00b5, 0x016a, 0x0010, 0x00f8, 0x0108, 0x0010, 0x0118, 0x00ea, 0x0010, 0x01f0, 0x0084, 0x0010,
0x0112, 0x00ef, 0x0010, 0x01e9, 0x0086, 0x0010, 0x00b1, 0x0172, 0x0010, 0x00f4, 0x010c, 0x0010, 0x0112, 0x00ef, 0x0010, 0x01f0, 0x0084, 0x0010,
0x010b, 0x00f5, 0x0010, 0x01e1, 0x0088, 0x0010, 0x00ac, 0x017b, 0x0010, 0x00f0, 0x0110, 0x0010, 0x010b, 0x00f5, 0x0010, 0x01f0, 0x0084, 0x0010,
0x0107, 0x00f9, 0x0010, 0x01da, 0x008a, 0x0010, 0x00aa, 0x0181, 0x0010, 0x00ed, 0x0114, 0x0010, 0x0107, 0x00f9, 0x0010, 0x01f0, 0x0084, 0x0010,
0x0102, 0x00fe, 0x0010, 0x01d4, 0x008c, 0x0010, 0x00a6, 0x0189, 0x0010, 0x00ea, 0x0118, 0x0010, 0x0102, 0x00fe, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00fd, 0x0103, 0x0010, 0x01ca, 0x008f, 0x0010, 0x00a3, 0x0191, 0x0010, 0x00e5, 0x011e, 0x0010, 0x00fd, 0x0103, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00f8, 0x0108, 0x0010, 0x01c3, 0x0091, 0x0010, 0x00a0, 0x0199, 0x0010, 0x00e1, 0x0122, 0x0010, 0x00f8, 0x0108, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00f3, 0x010d, 0x0010, 0x01ba, 0x0094, 0x0010, 0x009d, 0x01a0, 0x0010, 0x00dd, 0x0128, 0x0010, 0x00f3, 0x010d, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00ef, 0x0112, 0x0010, 0x01b2, 0x0097, 0x0010, 0x009a, 0x01a8, 0x0010, 0x00d9, 0x012e, 0x0010, 0x00ef, 0x0112, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00ea, 0x0117, 0x0010, 0x01a9, 0x009a, 0x0010, 0x0097, 0x01b0, 0x0010, 0x00d4, 0x0134, 0x0010, 0x00ea, 0x0117, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010,
0x00e6, 0x011c, 0x0010, 0x01a1, 0x009d, 0x0010, 0x0094, 0x01b8, 0x0010, 0x00d0, 0x013a, 0x0010, 0x00e6, 0x011c, 0x0010, 0x01f0, 0x0084, 0x0010
};
MOS_STATUS CodechalEncodeVp8::InitMmcState()
{
CODECHAL_ENCODE_FUNCTION_ENTER;
#ifdef _MMC_SUPPORTED
m_mmcState = MOS_New(CodechalMmcEncodeVp8, m_hwInterface, this);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_mmcState);
#endif
return MOS_STATUS_SUCCESS;
}
CodechalEncodeVp8::CodechalEncodeVp8(
CodechalHwInterface* hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo) :
CodechalEncoderState(hwInterface, debugInterface, standardInfo)
{
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_ASSERT(hwInterface);
m_hwInterface = hwInterface;
CODECHAL_ENCODE_ASSERT(m_hwInterface->GetOsInterface());
m_osInterface = m_hwInterface->GetOsInterface();
CODECHAL_ENCODE_ASSERT(m_hwInterface->GetMfxInterface());
m_mfxInterface = m_hwInterface->GetMfxInterface();
CODECHAL_ENCODE_ASSERT(m_hwInterface->GetHcpInterface());
m_hcpInterface = m_hwInterface->GetHcpInterface();
CODECHAL_ENCODE_ASSERT(m_hwInterface->GetHucInterface());
m_hucInterface = m_hwInterface->GetHucInterface();
CODECHAL_ENCODE_ASSERT(m_hwInterface->GetVdencInterface());
m_vdencInterface = m_hwInterface->GetVdencInterface();
CODECHAL_ENCODE_ASSERT(m_hwInterface->GetMiInterface());
m_miInterface = m_hwInterface->GetMiInterface();
CODECHAL_ENCODE_ASSERT(m_hwInterface->GetRenderInterface());
CODECHAL_ENCODE_ASSERT(m_hwInterface->GetRenderInterface()->m_stateHeapInterface);
m_stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
m_vmeKernelDump = 1;
m_tpuKernelState = MHW_KERNEL_STATE();
m_mpuKernelState = MHW_KERNEL_STATE();
m_meKernelState = MHW_KERNEL_STATE();
for (uint8_t i = 0; i < CODECHAL_ENCODE_VP8_MBENC_IDX_NUM; i++)
{
m_mbEncKernelStates[i] = MHW_KERNEL_STATE();
}
for (uint8_t i = 0; i < CODECHAL_ENCODE_VP8_BRC_IDX_NUM; i++)
{
m_brcKernelStates[i] = MHW_KERNEL_STATE();
}
MOS_ZeroMemory(&m_picIdx, sizeof(m_picIdx));
MOS_ZeroMemory(&m_refList, sizeof(m_refList));
MOS_ZeroMemory(&m_s4XMemvDataBuffer, sizeof(m_s4XMemvDataBuffer));
MOS_ZeroMemory(&m_mbEncBindingTable, sizeof(m_mbEncBindingTable));
MOS_ZeroMemory(&m_s4XMeDistortionBuffer, sizeof(m_s4XMeDistortionBuffer));
MOS_ZeroMemory(&m_brcBuffers, sizeof(m_brcBuffers));
/* VP8 uses a CM based down scale kernel */
m_useCmScalingKernel = true;
m_interlacedFieldDisabled = true;
m_firstField = true;
/* No field pictures in VP8 */
m_verticalLineStride = CODECHAL_VLINESTRIDE_FRAME;
m_verticalLineStrideOffset = CODECHAL_VLINESTRIDEOFFSET_TOP_FIELD;
m_codecGetStatusReportDefined = true;
m_mbEncCurbeSetInBrcUpdate = false;
m_mpuCurbeSetInBrcUpdate = false;
m_tpuCurbeSetInBrcUpdate = false;
}
CodechalEncodeVp8::~CodechalEncodeVp8()
{
FreeResources();
}
MOS_STATUS CodechalEncodeVp8::Initialize(CodechalSetting * codecHalSettings)
{
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncoderState::Initialize(codecHalSettings));
CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_miInterface);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_stateHeapInterface);
uint32_t numMBs = 0;
// MVOffset should be 4KB aligned
numMBs = m_picWidthInMb * m_picHeightInMb;
m_mvOffset = MOS_ALIGN_CEIL((((uint16_t)numMBs) * 16 * 4), CODECHAL_PAGE_SIZE); //for MB code
m_mbCodeSize = m_mvOffset + (numMBs * 16 * sizeof(uint32_t));
// for VP8: the Ds+Copy kernel is by default used to do CSC and copy non-aligned surface
m_cscDsState->EnableCopy();
m_cscDsState->EnableColor();
MOS_USER_FEATURE_VALUE_DATA UserFeatureData;
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
if (m_codecFunction != CODECHAL_FUNCTION_PAK)
{
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP8_HW_SCOREBOARD_ENABLE_ID,
&UserFeatureData,
m_osInterface->pOsContext);
m_useHwScoreboard = (UserFeatureData.i32Data) ? true : false;
// HME enabled by default for VP8
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP8_ENCODE_ME_ENABLE_ID,
&UserFeatureData,
m_osInterface->pOsContext);
m_hmeSupported = (UserFeatureData.i32Data) ? true : false;
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP8_ENCODE_16xME_ENABLE_ID,
&UserFeatureData,
m_osInterface->pOsContext);
m_16xMeSupported = (UserFeatureData.i32Data) ? true : false;
// disable superHME when HME is disabled
if (m_hmeSupported == false)
{
m_16xMeSupported = false;
}
// Repak enabled by default for VP8
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP8_ENCODE_REPAK_ENABLE_ID,
&UserFeatureData,
m_osInterface->pOsContext);
m_repakSupported = (UserFeatureData.i32Data) ? true : false;
// Adaptive RePAK enabled by default
m_adaptiveRepakSupported = true;
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP8_ENCODE_ADAPTIVE_REPAK_ENABLE_ID,
&UserFeatureData,
m_osInterface->pOsContext);
m_adaptiveRepakSupported = (UserFeatureData.i32Data) ? true : false;
#endif // _DEBUG || _RELEASE_INTERNAL
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_VP8_ENCODE_MULTIPASS_BRC_ENABLE_ID,
&UserFeatureData,
m_osInterface->pOsContext);
m_multipassBrcSupported = (UserFeatureData.i32Data) ? true : false;
}
m_brcInit = true;
MotionEstimationDisableCheck();
if (CodecHalUsesRenderEngine(m_codecFunction, m_standard))
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelState());
}
if (m_singleTaskPhaseSupported)
{
m_maxBtCount = GetMaxBtCount();
}
// Picture Level Commands
m_hwInterface->GetMfxStateCommandsDataSize(
CODECHAL_ENCODE_MODE_MPEG2,
&m_pictureStatesSize,
&m_picturePatchListSize,
0);
// Slice Level Commands (cannot be placed in 2nd level batch)
m_hwInterface->GetMfxPrimitiveCommandsDataSize(
CODECHAL_ENCODE_MODE_MPEG2,
&m_sliceStatesSize,
&m_slicePatchListSize,
0);
CODECHAL_ENCODE_CHK_STATUS_RETURN(InitMmcState());
return status;
}
uint32_t CodechalEncodeVp8::GetMaxBtCount()
{
auto btIdxAlignment = m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment();
uint32_t scalingBtCount = MOS_ALIGN_CEIL(
m_scaling4xKernelStates[0].KernelParams.iBTCount,
btIdxAlignment);
uint32_t meBtCount = MOS_ALIGN_CEIL(
m_meKernelStates[0].KernelParams.iBTCount,
btIdxAlignment);
uint32_t mbEncBtCount = MOS_ALIGN_CEIL(
m_mbEncKernelStates[0].KernelParams.iBTCount,
btIdxAlignment);
uint32_t brcBtCount = 0;
for (uint32_t i = 0; i < CODECHAL_ENCODE_VP8_BRC_IDX_NUM; i++)
{
brcBtCount += MOS_ALIGN_CEIL(
m_brcKernelStates[i].KernelParams.iBTCount,
btIdxAlignment);
}
return MOS_MAX(scalingBtCount + meBtCount, mbEncBtCount + brcBtCount);
}
MOS_STATUS CodechalEncodeVp8::AllocateBuffer(
PMOS_RESOURCE buffer,
uint32_t bufSize,
const char * name)
{
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_CHK_NULL_RETURN(buffer);
MOS_ALLOC_GFXRES_PARAMS allocParams;
MOS_ZeroMemory(&allocParams, sizeof(MOS_ALLOC_GFXRES_PARAMS));
allocParams.Type = MOS_GFXRES_BUFFER;
allocParams.TileType = MOS_TILE_LINEAR;
allocParams.Format = Format_Buffer;
allocParams.dwBytes = bufSize;
allocParams.pBufName = name;
status = (MOS_STATUS)m_osInterface->pfnAllocateResource(
m_osInterface,
&allocParams,
buffer);
if (status != MOS_STATUS_SUCCESS)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate %s.", name);
return status;
}
CodechalResLock bufLock(m_osInterface, buffer);
auto data = bufLock.Lock(CodechalResLock::writeOnly);
CODECHAL_ENCODE_CHK_NULL_RETURN(data);
MOS_ZeroMemory(data, bufSize);
return status;
}
MOS_STATUS CodechalEncodeVp8::AllocateBuffer2D(
PMOS_SURFACE surface,
uint32_t surfWidth,
uint32_t surfHeight,
const char * name)
{
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_CHK_NULL_RETURN(surface);
MOS_ZeroMemory(surface, sizeof(*surface));
surface->TileType = MOS_TILE_LINEAR;
surface->bArraySpacing = true;
surface->Format = Format_Buffer_2D;
surface->dwWidth = surfWidth;
surface->dwHeight = surfHeight;
surface->dwPitch = MOS_ALIGN_CEIL(surface->dwWidth, 64);
MOS_ALLOC_GFXRES_PARAMS AllocParamsForBuffer2D;
MOS_ZeroMemory(&AllocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS));
AllocParamsForBuffer2D.Type = MOS_GFXRES_2D;
AllocParamsForBuffer2D.TileType = surface->TileType;
AllocParamsForBuffer2D.Format = surface->Format;
AllocParamsForBuffer2D.dwWidth = surface->dwWidth;
AllocParamsForBuffer2D.dwHeight = surface->dwHeight;
AllocParamsForBuffer2D.pBufName = name;
status = (MOS_STATUS)m_osInterface->pfnAllocateResource(
m_osInterface,
&AllocParamsForBuffer2D,
&surface->OsResource);
if (status != MOS_STATUS_SUCCESS)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate %s.", name);
return status;
}
CodechalResLock bufLock(m_osInterface, &surface->OsResource);
auto data = bufLock.Lock(CodechalResLock::writeOnly);
CODECHAL_ENCODE_CHK_NULL_RETURN(data);
MOS_ZeroMemory(data, surface->dwWidth * surface->dwHeight);
return status;
}
MOS_STATUS CodechalEncodeVp8::AllocateBatchBuffer(
PMHW_BATCH_BUFFER batchBuffer,
uint32_t bufSize,
const char * name)
{
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_CHK_NULL_RETURN(batchBuffer);
MOS_ZeroMemory(
batchBuffer,
sizeof(MHW_BATCH_BUFFER));
batchBuffer->bSecondLevel = true;
status = Mhw_AllocateBb(
m_osInterface,
batchBuffer,
nullptr,
bufSize);
if (status != MOS_STATUS_SUCCESS)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate %s.", name);
return status;
}
status = Mhw_LockBb(m_osInterface, batchBuffer);
if (status != MOS_STATUS_SUCCESS)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to lock %s.", name);
return status;
}
MOS_ZeroMemory(batchBuffer->pData, bufSize);
status = Mhw_UnlockBb(
m_osInterface,
batchBuffer,
false);
if (status != MOS_STATUS_SUCCESS)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to unlock %s.", name);
return status;
}
return status;
}
MOS_STATUS CodechalEncodeVp8::AllocateResources()
{
MOS_STATUS status = MOS_STATUS_SUCCESS;
struct CodechalResourcesBrcParams allocateResBrcParams;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncoderState::AllocateResources());
// Allocate Ref Lists
CodecHalAllocateDataList(
m_refList,
CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP8);
//Reference Frame MB count surface 32 bytes,
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_resRefMbCountSurface,
32,
"Reference Frame MB count surface"));
// MB Mode Cost Luma Buffer, 10 words
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_mbModeCostLumaBuffer,
MOS_ALIGN_CEIL((sizeof(uint16_t) * 10), 64),
1,
"MBMode Cost Luma Buffer"));
// Block Mode Cost Luma Buffer, 10*10*10 words
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_blockModeCostBuffer,
MOS_ALIGN_CEIL((sizeof(uint16_t)) * 10 * 10 * 10, 64),
1,
"BlockMode Cost Buffer"));
// Chroma Recon Buffer, 64 bytes per MB
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_chromaReconBuffer,
64 * m_picWidthInMb * m_picHeightInMb,
"Chroma Recon Buffer"));
// Per-MB Quant data, 1 Dword per MB
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_perMbQuantDataBuffer,
MOS_ALIGN_CEIL((m_picWidthInMb * 4), 64),
m_picHeightInMb,
"Per MB Quant Data Buffer"));
///pred mv data surface
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_resPredMvDataSurface,
4 * m_picWidthInMb * m_picHeightInMb * sizeof(uint32_t),
"Per MV data surface"));
//ModeCostUpdate Surface used by P-kernel and MPU kernel
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_resModeCostUpdateSurface,
16 * sizeof(uint32_t),
"Mode Cost Update Surface"));
if (m_encEnabled)
{
MOS_ZeroMemory(&allocateResBrcParams, sizeof(struct CodechalResourcesBrcParams));
allocateResBrcParams.bHWWalker = m_hwWalker;
allocateResBrcParams.dwDownscaledWidthInMB4x = m_downscaledWidthInMb4x;
allocateResBrcParams.dwDownscaledHeightInMB4x = m_downscaledHeightInMb4x;
allocateResBrcParams.dwFrameWidthInMB = m_picWidthInMb;
allocateResBrcParams.dwFrameHeightInMB = m_picHeightInMb;
CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateBrcResources(&allocateResBrcParams));
// allocate VME Kernel Dump buffer
if (m_vmeKernelDump)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_resVmeKernelDumpBuffer,
VP8_KERNEL_DUMP_SIZE,
"VME Kernel Dump Buffer"));
}
if (m_hmeSupported)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_s4XMemvDataBuffer,
m_downscaledWidthInMb4x * 32,
m_downscaledHeightInMb4x * 4 * 4,
"4xME MV Data Buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_s4XMeDistortionBuffer,
m_downscaledWidthInMb4x * 8,
m_downscaledHeightInMb4x * 4 * 4,
"4xME Distortion Buffer"));
}
if (m_16xMeSupported)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_s16XMemvDataBuffer,
MOS_ALIGN_CEIL(m_downscaledWidthInMb16x * 32, 64),
m_downscaledHeightInMb16x * 4 * CODECHAL_VP8_ME_ME_DATA_SIZE_MULTIPLIER,
"16xME MV Data Buffer"));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_resHistogram,
HISTOGRAM_SIZE,
"Histogram"));
}
if (m_pakEnabled)
{
// Intra Row Store Scratch buffer
// 1 cacheline per MB
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_resIntraRowStoreScratchBuffer,
m_picWidthInMb * CODECHAL_CACHELINE_SIZE,
"Intra Row Store Scratch Buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_resFrameHeader,
CODECHAL_VP8_FRAME_HEADER_SIZE,
"Frame Header buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resModeProbs,
MODE_PROPABILITIES_SIZE,
"Mode Probs buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resRefModeProbs,
MODE_PROPABILITIES_SIZE,
"Ref Mode Probs buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resCoeffProbs,
COEFFS_PROPABILITIES_SIZE,
"Coeff Probs buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resRefCoeffProbs,
COEFFS_PROPABILITIES_SIZE,
"Ref Coeff Probs buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resTokenBitsData,
TOKEN_BITS_DATA_SIZE,
"Token bits data"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resPictureState,
PICTURE_STATE_SIZE,
"Picture state buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resMpuBitstream,
MPU_BITSTREAM_SIZE,
"Mpu bitstream buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resTpuBitstream,
TPU_BITSTREAM_SIZE,
"Tpu bitstream buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resEntropyCostTable,
ENTROPY_COST_TABLE_SIZE,
"Entropy cost table"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resPakTokenStatistics,
TOKEN_STATISTICS_SIZE,
"Pak Token statistics"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resPakTokenUpdateFlags,
COEFFS_PROPABILITIES_SIZE,
"Pak Token update flags"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resDefaultTokenProbability,
COEFFS_PROPABILITIES_SIZE,
"Default Token Probability"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resKeyFrameTokenProbability,
COEFFS_PROPABILITIES_SIZE,
"Key frame token probability"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resUpdatedTokenProbability,
COEFFS_PROPABILITIES_SIZE,
"Updated token probability"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resHwTokenProbabilityPass2,
COEFFS_PROPABILITIES_SIZE,
"Hw token probability pak Pass 2"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_resPakIntermediateBuffer,
(m_frameWidth * m_frameHeight * 2) + ((m_frameWidth * m_frameHeight) / 4) + INTERMEDIATE_PARTITION0_SIZE,
"Intermediate buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_mpuTpuBuffers.resRepakDecisionSurface,
REPAK_DECISION_BUF_SIZE,
"Tpu Repak Decision buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(InitMpuTpuBuffer());
}
return status;
}
MOS_STATUS CodechalEncodeVp8::AllocateBrcResources(struct CodechalResourcesBrcParams* params)
{
uint32_t size, width, height, i;
MOS_ALLOC_GFXRES_PARAMS allocParamsForBufferLinear;
MOS_ALLOC_GFXRES_PARAMS allocParamsForBuffer2D;
MOS_LOCK_PARAMS lockFlagsWriteOnly;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
// initiate allocation paramters and lock flags
MOS_ZeroMemory(&allocParamsForBufferLinear, sizeof(MOS_ALLOC_GFXRES_PARAMS));
allocParamsForBufferLinear.Type = MOS_GFXRES_BUFFER;
allocParamsForBufferLinear.TileType = MOS_TILE_LINEAR;
allocParamsForBufferLinear.Format = Format_Buffer;
MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS));
allocParamsForBuffer2D.Type = MOS_GFXRES_2D;
allocParamsForBuffer2D.TileType = MOS_TILE_LINEAR;
allocParamsForBuffer2D.Format = Format_Buffer_2D;
MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
lockFlagsWriteOnly.WriteOnly = 1;
// BRC history buffer
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_brcBuffers.resBrcHistoryBuffer,
ENCODE_VP8_BRC_HISTORY_BUFFER_SIZE,
"BRC History Buffer"));
// internal segment map is provided from BRC update kernel
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_inSegmentMapSurface,
MOS_ALIGN_CEIL(m_picWidthInMb, 4),
m_picHeightInMb,
"BRC Segment Map Surface"));
if (m_brcDistortionBufferSupported)
{
// BRC Distortion Surface
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_brcBuffers.sMeBrcDistortionBuffer,
MOS_ALIGN_CEIL((params->dwDownscaledWidthInMB4x * 8), 64),
2 * MOS_ALIGN_CEIL((params->dwDownscaledHeightInMB4x * 4), 8),
"BRC Distortion Surface Buffer"));
}
// PAK Statistics buffer
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_brcBuffers.resBrcPakStatisticBuffer[0],
m_brcPakStatisticsSize,
"BRC PAK Statistics Buffer"));
// Encoder CFG State Cmd
// Use BRC_MAXIMUM_NUM_PASSES here since actual number of passes is
// determined later using PicParams.BRCPrecision
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_brcBuffers.resEncoderCfgCommandReadBuffer,
BRC_IMG_STATE_SIZE_PER_PASS * CODECHAL_ENCODE_BRC_MAXIMUM_NUM_PASSES,
"Encoder CFG State Read Buffer"));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_brcBuffers.resEncoderCfgCommandWriteBuffer,
BRC_IMG_STATE_SIZE_PER_PASS * CODECHAL_ENCODE_BRC_MAXIMUM_NUM_PASSES,
"Encoder CFG State Write Buffer"));
// Check if the constant data surface is present
if (m_brcConstantBufferSupported)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_brcBuffers.resBrcConstantDataBuffer,
BRC_CONSTANTSURFACE_VP8,
"BRC Constant Data Buffer"));
for (i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
{
//BRC Constant Data Surfaces
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer2D(&m_brcBuffers.sBrcConstantDataBuffer[i],
MOS_ALIGN_CEIL(m_brcConstantSurfaceWidth, 64),
m_brcConstantSurfaceHeight,
"BRC Constant Data Buffer"));
}
}
// PAK Statistics Dump buffer that stores stats per pak pass. useful for debugging
// 12: 10 data buffers + 2 extra buffers for empty spaces (easier to read dumps)
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_brcBuffers.resBrcPakStatsBeforeDumpBuffer,
m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses() * sizeof(uint32_t) * 12,
"BRC PAK Statistics Dump Buffer"));
// PAK Statistics Dump buffer that stores stats per pak pass. useful for debugging
CODECHAL_ENCODE_CHK_STATUS_RETURN(
AllocateBuffer(&m_brcBuffers.resBrcPakStatsAfterDumpBuffer,
m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses() * sizeof(uint32_t) * 12,
"BRC PAK Statistics Init Dump Buffer"));
return status;
}
void CodechalEncodeVp8::FreeResources()
{
CODECHAL_ENCODE_FUNCTION_ENTER;
CodechalEncoderState::FreeResources();
// Release Ref Lists
CodecHalFreeDataList(m_refList, CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP8);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resRefMbCountSurface);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mbModeCostLumaBuffer.OsResource);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_blockModeCostBuffer.OsResource);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_chromaReconBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_perMbQuantDataBuffer.OsResource);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resModeCostUpdateSurface);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resPredMvDataSurface);
FreeBrcResources();
if (m_encEnabled)
{
if (m_vmeKernelDump)
{
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resVmeKernelDumpBuffer);
}
if (m_hmeSupported)
{
// 4xME ME MV data buffer
m_osInterface->pfnFreeResource(
m_osInterface,
&m_s4XMemvDataBuffer.OsResource);
// 4xME distortion buffer
m_osInterface->pfnFreeResource(
m_osInterface,
&m_s4XMeDistortionBuffer.OsResource);
}
// 16xME MV data buffer
if (m_16xMeSupported)
{
m_osInterface->pfnFreeResource(
m_osInterface,
&m_s16XMemvDataBuffer.OsResource);
}
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resHistogram);
}
if (m_encEnabled)
{
m_osInterface->pfnFreeResource(
m_osInterface,
&m_inSegmentMapSurface.OsResource);
}
if (m_pakEnabled)
{
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resFrameHeader);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resModeProbs);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resRefModeProbs);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resCoeffProbs);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resRefCoeffProbs);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resTokenBitsData);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resPictureState);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resMpuBitstream);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resTpuBitstream);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resEntropyCostTable);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resPakTokenStatistics);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resPakTokenUpdateFlags);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resDefaultTokenProbability);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resKeyFrameTokenProbability);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resUpdatedTokenProbability);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resHwTokenProbabilityPass2);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resPakIntermediateBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resIntraRowStoreScratchBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_mpuTpuBuffers.resRepakDecisionSurface);
}
return;
}
void CodechalEncodeVp8::FreeBrcResources()
{
CODECHAL_ENCODE_FUNCTION_ENTER;
for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++)
{
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.sBrcConstantDataBuffer[i].OsResource);
}
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.resBrcPakStatisticBuffer[0]);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.sMeBrcDistortionBuffer.OsResource);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.resBrcHistoryBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.resBrcConstantDataBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.resBrcPakStatsBeforeDumpBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.resBrcPakStatsAfterDumpBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.resEncoderCfgCommandReadBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.resEncoderCfgCommandWriteBuffer);
m_osInterface->pfnFreeResource(
m_osInterface,
&m_brcBuffers.resPakQPInputTable);
return;
}
void CodechalEncodeVp8::ResizeBuffer()
{
CODECHAL_ENCODE_FUNCTION_ENTER;
// if resolution changed, free existing DS/CSC/MbCode/MvData resources
m_trackedBuf->Resize();
}
//MOS_STATUS CodechalEncodeVp8::EncodeInitialize()
MOS_STATUS CodechalEncodeVp8::InitializePicture(const EncoderParams& params)
{
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
m_bitstreamUpperBound = params.dwBitstreamSize;
m_mbSegmentMapSurface = *(params.psMbSegmentMapSurface);
m_vp8SeqParams = (PCODEC_VP8_ENCODE_SEQUENCE_PARAMS)(params.pSeqParams);
m_vp8PicParams = (PCODEC_VP8_ENCODE_PIC_PARAMS)(params.pPicParams);
m_vp8QuantData = (PCODEC_VP8_ENCODE_QUANT_DATA)(params.pQuantData);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_vp8SeqParams);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_vp8PicParams);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_vp8QuantData);
// reset for next frame
if (m_b16XMeEnabled)
{
m_b16XMeDone = false;
}
if (m_hmeEnabled)
{
m_hmeDone = false;
}
if (m_newSeq)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetSequenceStructs());
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetPictureStructs());
// Scaling occurs when HME is enabled
m_scalingEnabled = m_hmeSupported;
m_useRawForRef = m_vp8SeqParams->UseRawReconRef;
CODECHAL_ENCODE_CHK_STATUS_RETURN(
SetStatusReportParams(m_refList[m_currReconstructedPic.FrameIdx]));
CODECHAL_DEBUG_TOOL(
m_debugInterface->m_currPic = m_vp8PicParams->CurrOriginalPic;
m_debugInterface->m_bufferDumpFrameNum = m_storeData;
m_debugInterface->m_frameType = m_pictureCodingType;
if (m_newSeq) {
CODECHAL_ENCODE_CHK_STATUS_RETURN(
DumpVp8EncodeSeqParams(m_vp8SeqParams));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(
DumpVp8EncodePicParams(m_vp8PicParams));)
return status;
}
MOS_STATUS CodechalEncodeVp8::SetSequenceStructs()
{
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
// setup internal parameters
m_oriFrameWidth = m_vp8SeqParams->FrameWidth;
m_oriFrameHeight = m_vp8SeqParams->FrameHeight;
m_picWidthInMb = (uint16_t)CODECHAL_GET_WIDTH_IN_MACROBLOCKS(m_oriFrameWidth);
m_picHeightInMb = (uint16_t)CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_oriFrameHeight);
m_frameWidth = m_picWidthInMb * CODECHAL_MACROBLOCK_WIDTH;
m_frameHeight = m_picHeightInMb * CODECHAL_MACROBLOCK_HEIGHT;
// HME Scaling WxH
m_downscaledWidthInMb4x =
CODECHAL_GET_WIDTH_IN_MACROBLOCKS(m_frameWidth / SCALE_FACTOR_4x);
m_downscaledHeightInMb4x =
CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameHeight / SCALE_FACTOR_4x);
m_downscaledWidth4x =
m_downscaledWidthInMb4x * CODECHAL_MACROBLOCK_WIDTH;
m_downscaledHeight4x =
m_downscaledHeightInMb4x * CODECHAL_MACROBLOCK_HEIGHT;
// SuperHME Scaling WxH
m_downscaledWidthInMb16x =
CODECHAL_GET_WIDTH_IN_MACROBLOCKS(m_frameWidth / SCALE_FACTOR_16x);
m_downscaledHeightInMb16x =
CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameHeight / SCALE_FACTOR_16x);
m_downscaledWidth16x =
m_downscaledWidthInMb16x * CODECHAL_MACROBLOCK_WIDTH;
m_downscaledHeight16x =
m_downscaledHeightInMb16x * CODECHAL_MACROBLOCK_HEIGHT;
MotionEstimationDisableCheck();
m_kernelMode = CodecHal_TargetUsageToMode_VP8[m_vp8SeqParams->TargetUsage & 0x7];
// Disable 16xMe in performance mode
if (m_16xMeSupported && (m_kernelMode == encodePerformanceMode))
{
m_16xMeSupported = false;
}
// All Rate control parameters currently not required for BDW and hence
// not being read from Sequence params
m_numPasses = 0;
m_usMinPakPasses = 1;
m_refCtrlOptimizationDone = false;
if (m_firstFrame)
{
m_oriFrameHeight = m_vp8SeqParams->FrameHeight;
m_oriFrameWidth = m_vp8SeqParams->FrameWidth;
}
// check if there is a dynamic resolution change
if ((m_oriFrameHeight && (m_oriFrameHeight != m_vp8SeqParams->FrameHeight)) ||
(m_oriFrameWidth && (m_oriFrameWidth != m_vp8SeqParams->FrameWidth)))
{
m_resolutionChanged = true;
m_oriFrameHeight = m_vp8SeqParams->FrameHeight;
m_oriFrameWidth = m_vp8SeqParams->FrameWidth;
}
else
{
m_resolutionChanged = false;
}
// if GOP structure is I-frame only, we use 3 non-ref slots for tracked buffer
m_gopIsIdrFrameOnly = (m_vp8SeqParams->GopPicSize == 1);
return status;
}
MOS_STATUS CodechalEncodeVp8::SetPictureStructs()
{
uint8_t currRefIdx, numRef;
uint16_t brcPrecision;
uint32_t averageQp = 0;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
if (Mos_ResourceIsNull(&m_reconSurface.OsResource) && (m_codecFunction != CODECHAL_FUNCTION_ENC))
{
return MOS_STATUS_INVALID_PARAMETER;
}
// Sync initialize
if ((m_firstFrame) ||
(m_codecFunction == CODECHAL_FUNCTION_ENC))
{
m_waitForPak = false;
}
else
{
m_waitForPak= true;
}
if (m_codecFunction != CODECHAL_FUNCTION_ENC)
{
m_signalEnc = true;
}
else
{
m_signalEnc = false;
}
currRefIdx = m_vp8PicParams->CurrReconstructedPic.FrameIdx;
if (m_vp8PicParams->segmentation_enabled)
{
for (uint8_t i = 0; i < CODECHAL_VP8_MAX_SEGMENTS; i++)
{
averageQp += CodecHal_Clip3(0, CODECHAL_VP8_QP_MAX, m_vp8QuantData->QIndex[i] + m_vp8QuantData->QIndexDelta[0]);
}
averageQp = averageQp / 4;
}
else
{
averageQp = CodecHal_Clip3(0, CODECHAL_VP8_QP_MAX, m_vp8QuantData->QIndex[0] + m_vp8QuantData->QIndexDelta[0]);
}
m_pictureCodingType = m_vp8PicParams->frame_type ? P_TYPE : I_TYPE;
if (m_pictureCodingType == I_TYPE)
{
m_averageKeyFrameQp = averageQp;
m_pFramePositionInGop = 0;
}
else
{
m_averagePFrameQp = averageQp;
m_pFramePositionInGop = m_vp8SeqParams->RateControlMethod == RATECONTROL_CQP ? 0 : (m_storeData - 1) % m_vp8SeqParams->GopPicSize;
}
numRef = 0;
if (!CodecHal_PictureIsInvalid(m_currOriginalPic))
{
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->LastRefPic))
{
m_refList[currRefIdx]->RefList[numRef++] = m_vp8PicParams->LastRefPic;
}
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->GoldenRefPic))
{
m_refList[currRefIdx]->RefList[numRef++] = m_vp8PicParams->GoldenRefPic;
}
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->AltRefPic))
{
m_refList[currRefIdx]->RefList[numRef++] = m_vp8PicParams->AltRefPic;
}
}
m_refList[currRefIdx]->ucNumRef = numRef;
m_refList[currRefIdx]->bUsedAsRef = true; /* VP8 has no non reference pictures */
m_currRefList = m_refList[currRefIdx];
if (m_codecFunction == CODECHAL_FUNCTION_ENC_PAK)
{
// the actual MbCode/MvData surface to be allocated later
m_trackedBuf->SetAllocationFlag(true);
}
else
{
CODECHAL_ENCODE_CHK_NULL_RETURN(m_encodeParams.presMbCodeSurface);
m_resMbCodeSurface = *m_encodeParams.presMbCodeSurface;
m_refList[currRefIdx]->resRefMbCodeBuffer = m_resMbCodeSurface;
}
m_refList[currRefIdx]->sRefReconBuffer = m_reconSurface;
m_refList[currRefIdx]->sRefRawBuffer = m_rawSurface;
m_refList[currRefIdx]->RefPic = m_vp8PicParams->CurrOriginalPic;
m_refList[currRefIdx]->resBitstreamBuffer = m_resBitstreamBuffer;
m_currOriginalPic = m_vp8PicParams->CurrOriginalPic;
m_currReconstructedPic = m_vp8PicParams->CurrReconstructedPic;
m_frameFieldHeight = m_frameHeight;
m_frameFieldHeightInMb = m_picHeightInMb;
m_downscaledFrameFieldHeightInMb4x = m_downscaledHeightInMb4x;
m_downscaledFrameFieldHeightInMb16x = m_downscaledHeightInMb16x;
m_currEncBbSet = MB_ENC_Frame_BB;
m_waitForPak = false;
m_statusReportFeedbackNumber = m_vp8PicParams->StatusReportFeedbackNumber;
m_hmeEnabled = m_hmeSupported && m_pictureCodingType != I_TYPE && (m_vp8PicParams->ref_frame_ctrl != 0);
m_b16XMeEnabled = m_16xMeSupported && m_pictureCodingType != I_TYPE;
m_mbEncIFrameDistEnabled =
m_brcDistortionBufferSupported &&
(m_pictureCodingType == I_TYPE);
m_brcEnabled = (m_vp8SeqParams->RateControlMethod == RATECONTROL_CBR || m_vp8SeqParams->RateControlMethod == RATECONTROL_VBR);
// Multi-Pass BRC
// brcPrecision = 2, GetNumBrcPakPasses(2) = BRC_DEFAULT_NUM_PASSES = 4
// brcPrecision = 1, GetNumBrcPakPasses(1) = BRC_MINIMUM_NUM_PASSES = 2
// CQP: dwBrcNumPakPasses = 1
// should be based on BRC precision but currenlty VP8 Encode DDI does not have anything for precision.
brcPrecision = 1;
m_hwInterface->GetMfxInterface()->SetBrcNumPakPasses(
(m_brcEnabled && m_multipassBrcSupported) ? GetNumBrcPakPasses(brcPrecision) : 1);
// Init Distortion buffer flag
m_initBrcDistortionBuffer = false;
if (m_brcEnabled)
{
if (m_pictureCodingType == I_TYPE)
{
m_initBrcDistortionBuffer = true;
}
else
{
//For P frame following I frame
if (m_pFramePositionInGop == 1)
{
m_initBrcDistortionBuffer = true;
}
}
}
//decide number of pak passes
m_numPasses = 0;
m_usMinPakPasses = 1;
m_waitForPak = false;
m_usRepakPassIterVal = 0;
// RePak = 0: m_numPasses = 0, usMinPakPasses = 1
// RePak = 1: m_numPasses = 1, usMinPakPasses = 2
switch (m_kernelMode)
{
case encodeQualityMode:
m_numPasses = 1;
m_usMinPakPasses = 2;
if (m_pFramePositionInGop >= 1 && m_repakSupported)
{
m_waitForPak = true;
}
break;
case encodeNormalMode:
// with adaptive RePAK, RePAK is enabled by default both with I & P frames
m_numPasses = 1;
m_usMinPakPasses = 2;
// needs to wait for PAK execution except 1st frame
if (m_repakSupported && m_storeData > 1)
{
m_waitForPak = true;
}
break;
case encodePerformanceMode:
m_numPasses = 0;
m_usMinPakPasses = 1;
break;
default:
m_numPasses = 0;
m_usMinPakPasses = 1;
}
//this will always override above decision on numpasses and minpakpasse, bRepakSupported is controlled through reg key
if (!m_repakSupported)
{
m_numPasses = 0;
m_usMinPakPasses = 1;
}
// Keep the code below for MultiPass BRC to be enabled in future
if (m_brcEnabled)
{
if (m_multipassBrcSupported) // Multi-Pass BRC
{
m_numPasses += GetNumBrcPakPasses(brcPrecision) - 1;
}
}
if (m_repakSupported && m_usMinPakPasses > 1) // Repak enabled by default for VP8
{
// Single-Pass BRC: ucNumPasses = 0 or 1
// Multi-Pass BRC: ucNumPasses = 3, Repak will always be 5th pass no matter how many PAK passes are executed
// example) even if 2 passes are executed, there are PAK commands for 4 passes and cmds for remaining 2 passes are skipped
m_usRepakPassIterVal = m_numPasses;
}
return status;
}
MOS_STATUS CodechalEncodeVp8::ExecuteKernelFunctions()
{
MOS_SYNC_PARAMS syncParams;
CodechalEncodeCscDs::KernelParams cscScalingKernelParams;
bool isEncPhase1NotRun;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
m_rawSurfaceToEnc,
CodechalDbgAttr::attrEncodeRawInputSurface,
"SrcSurf"))
);
MOS_ZeroMemory(&syncParams, sizeof(MOS_SYNC_PARAMS));
// Wait on PAK, if its the P frame after I frame only
if ((m_waitForPak) && !Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse))
{
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_renderContext;
syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
}
// BRC init/reset needs to be called before HME since it will reset the Brc Distortion surface
if (m_brcEnabled)
{
m_brcReset = m_vp8SeqParams->ResetBRC;
if (m_brcInit || m_brcReset)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcInitResetKernel());
}
}
// Csc, Downscaling, and/or 10-bit to 8-bit conversion
MOS_ZeroMemory(&cscScalingKernelParams, sizeof(cscScalingKernelParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_cscDsState->KernelFunctions(&cscScalingKernelParams));
if (m_hmeEnabled)
{
if (m_b16XMeEnabled)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(MeKernel());
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(MeKernel());
CODECHAL_DEBUG_TOOL(
if (m_hmeEnabled) {
CODECHAL_ME_OUTPUT_PARAMS meOutputParams;
MOS_ZeroMemory(&meOutputParams, sizeof(CODECHAL_ME_OUTPUT_PARAMS));
meOutputParams.psMeMvBuffer = &m_s4XMemvDataBuffer;
meOutputParams.psMeBrcDistortionBuffer = m_brcEnabled ? &m_brcBuffers.sMeBrcDistortionBuffer : nullptr;
meOutputParams.psMeDistortionBuffer = &m_s4XMeDistortionBuffer;
meOutputParams.b16xMeInUse = false;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
&meOutputParams.psMeMvBuffer->OsResource,
CodechalDbgAttr::attrOutput,
"MvData",
meOutputParams.psMeMvBuffer->dwHeight * meOutputParams.psMeMvBuffer->dwPitch,
CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 32), 64) * (m_downscaledFrameFieldHeightInMb4x * 4) : 0,
CODECHAL_MEDIA_STATE_4X_ME));
if (m_brcEnabled)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
&meOutputParams.psMeBrcDistortionBuffer->OsResource,
CodechalDbgAttr::attrOutput,
"BrcDist",
meOutputParams.psMeBrcDistortionBuffer->dwHeight * meOutputParams.psMeBrcDistortionBuffer->dwPitch,
CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 8), 64) * MOS_ALIGN_CEIL((m_downscaledFrameFieldHeightInMb4x * 4), 8) : 0,
CODECHAL_MEDIA_STATE_4X_ME));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
&meOutputParams.psMeDistortionBuffer->OsResource,
CodechalDbgAttr::attrOutput,
"MeDist",
meOutputParams.psMeDistortionBuffer->dwHeight * meOutputParams.psMeDistortionBuffer->dwPitch,
CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 8), 64) * MOS_ALIGN_CEIL((m_downscaledFrameFieldHeightInMb4x * 4 * 10), 8) : 0,
CODECHAL_MEDIA_STATE_4X_ME));
if (m_b16XMeEnabled)
{
meOutputParams.psMeMvBuffer = &m_s16XMemvDataBuffer;
meOutputParams.psMeBrcDistortionBuffer = nullptr;
meOutputParams.psMeDistortionBuffer = nullptr;
meOutputParams.b16xMeInUse = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
&meOutputParams.psMeMvBuffer->OsResource,
CodechalDbgAttr::attrOutput,
"MvData",
meOutputParams.psMeMvBuffer->dwHeight * meOutputParams.psMeMvBuffer->dwPitch,
CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb16x * 32), 64) * (m_downscaledFrameFieldHeightInMb16x * 4) : 0,
CODECHAL_MEDIA_STATE_16X_ME));
}
})
}
// Call Idistortion and BRCUpdate kernels
if (m_brcEnabled)
{
// Intra Distortion kernel
if (m_mbEncIFrameDistEnabled)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(MbEncKernel(false, false, true));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcUpdateKernel());
m_osInterface->pfnResetPerfBufferID(m_osInterface);
}
// Reset after BRC Init has been processed
m_brcInit = false;
// skip Phase 1 for I frame with performance mode
if ((m_pictureCodingType == I_TYPE) && (m_kernelMode == encodePerformanceMode))
{
isEncPhase1NotRun = true;
}
else
{
// Phase 1 MbEnc Kernel
CODECHAL_ENCODE_CHK_STATUS_RETURN(MbEncKernel(false, false, false));
isEncPhase1NotRun = false;
}
/* Call Phase 2 of I frame ENC kernel to process the Chroma component */
if (m_pictureCodingType == I_TYPE)
{
// Phase 2 MbEnc Kernel
CODECHAL_ENCODE_CHK_STATUS_RETURN(MbEncKernel(isEncPhase1NotRun, true, false));
}
/* Call MPU kernel */
CODECHAL_ENCODE_CHK_STATUS_RETURN(MpuKernel());
// send signal from render to video after MPU kernel execution
if (!Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse))
{
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_renderContext;
syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
}
if (m_brcEnabled)
{
m_mbEncCurbeSetInBrcUpdate = false;
m_mbPakCurbeSetInBrcUpdate = false;
}
m_frameNum += 1;
return status;
}
MOS_STATUS CodechalEncodeVp8::BrcInitResetKernel()
{
PMHW_STATE_HEAP_INTERFACE stateHeapInterface;
CODECHAL_MEDIA_STATE_TYPE encFunctionType;
PMHW_KERNEL_STATE kernelState;
MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
struct CodechalVp8BrcInitResetCurbeParams brcInitResetCurbeParams;
MOS_COMMAND_BUFFER cmdBuffer;
SendKernelCmdsParams sendKernelCmdsParams;
struct CodechalVp8BrcInitResetSurfaceParams brcInitResetSurfaceParams;
MHW_MEDIA_OBJECT_PARAMS mediaObjectParams;
PerfTagSetting perfTag;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface());
stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
CODECHAL_ENCODE_CHK_NULL_RETURN(stateHeapInterface);
perfTag.Value = 0;
perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_BRC_INIT_RESET;
perfTag.PictureCodingType = m_pictureCodingType;
m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
encFunctionType = CODECHAL_MEDIA_STATE_BRC_INIT_RESET;
kernelState = m_brcInit ? &m_brcKernelStates[CODECHAL_ENCODE_VP8_BRC_IDX_INIT] : &m_brcKernelStates[CODECHAL_ENCODE_VP8_BRC_IDX_RESET];
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
stateHeapInterface,
kernelState->KernelParams.iBTCount));
m_vmeStatesSize =
m_hwInterface->GetKernelLoadCommandSize(kernelState->KernelParams.iBTCount);
CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
false,
0,
false,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
MOS_ZeroMemory(&brcInitResetCurbeParams, sizeof(brcInitResetCurbeParams));
brcInitResetCurbeParams.CurrPic = m_currOriginalPic;
brcInitResetCurbeParams.pPicParams = m_vp8PicParams;
brcInitResetCurbeParams.pSeqParams = m_vp8SeqParams;
brcInitResetCurbeParams.dwFrameWidth = m_frameWidth;
brcInitResetCurbeParams.dwFrameHeight = m_frameHeight;
brcInitResetCurbeParams.dwAVBRAccuracy = m_usAvbrAccuracy;
brcInitResetCurbeParams.dwAVBRConvergence = m_usAvbrConvergence;
brcInitResetCurbeParams.bInitBrc = m_brcInit;
brcInitResetCurbeParams.bMbBrcEnabled = m_mbBrcEnabled;
brcInitResetCurbeParams.pdBrcInitCurrentTargetBufFullInBits =
&m_dBrcInitCurrentTargetBufFullInBits;
brcInitResetCurbeParams.pdwBrcInitResetBufSizeInBits =
&m_brcInitResetBufSizeInBits;
brcInitResetCurbeParams.pdBrcInitResetInputBitsPerFrame =
&m_dBrcInitResetInputBitsPerFrame;
brcInitResetCurbeParams.dwFramerate = m_frameRate;
brcInitResetCurbeParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetBrcInitResetCurbe(&brcInitResetCurbeParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_DSH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
encFunctionType,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_ISH_TYPE,
kernelState));
)
MOS_ZeroMemory(&cmdBuffer, sizeof(cmdBuffer));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
sendKernelCmdsParams = SendKernelCmdsParams();
sendKernelCmdsParams.EncFunctionType = encFunctionType;
sendKernelCmdsParams.bBrcResetRequested = m_brcReset ? true : false;
sendKernelCmdsParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
// Add binding table
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetBindingTable(
stateHeapInterface,
kernelState));
//Add surface states
MOS_ZeroMemory(&brcInitResetSurfaceParams, sizeof(brcInitResetSurfaceParams));
brcInitResetSurfaceParams.presBrcHistoryBuffer =
&m_brcBuffers.resBrcHistoryBuffer;
brcInitResetSurfaceParams.psMeBrcDistortionBuffer =
&m_brcBuffers.sMeBrcDistortionBuffer;
brcInitResetSurfaceParams.dwMeBrcDistortionBottomFieldOffset =
m_brcBuffers.dwMeBrcDistortionBottomFieldOffset;
brcInitResetSurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x;
brcInitResetSurfaceParams.dwDownscaledFrameHeightInMb4x =
m_downscaledHeightInMb4x;
brcInitResetSurfaceParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendBrcInitResetSurfaces(
&cmdBuffer,
&brcInitResetSurfaceParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_SSH_TYPE,
kernelState));
)
MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetRenderInterface()->AddMediaObject(
&cmdBuffer,
nullptr,
&mediaObjectParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSubmitBlocks(
stateHeapInterface,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnUpdateGlobalCmdBufId(
stateHeapInterface));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&cmdBuffer,
encFunctionType,
nullptr)));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
m_lastTaskInPhase = false;
return status;
}
MOS_STATUS CodechalEncodeVp8::BrcUpdateKernel()
{
PMHW_STATE_HEAP_INTERFACE stateHeapInterface;
PMHW_KERNEL_STATE kernelState, mbEncKernelState, mbEncChromaKernelState;
MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
struct CodechalVp8MbencCurbeParams mbEncCurbeParams;
struct CodechalVp8MbpakCurbeParams mbPakCurbeParams;
struct CodechalVp8MpuCurbeParams mpuCurbeParams;
struct CodechalVp8TpuCurbeParams tpuCurbeParams;
struct CodechalVp8BrcUpdateCurbeParams brcUpdateCurbeParams;
struct CodechalVp8InitBrcConstantBufferParams initBrcConstantBufferParams;
PMOS_RESOURCE resBrcImageStatesReadBuffer;
struct CodechalVp8BrcUpdateSurfaceParams brcUpdateSurfaceParams;
struct CodechalBindingTableVp8BrcUpdate bindingTable;
CODECHAL_MEDIA_STATE_TYPE encFunctionType, mbEncFunctionType, mbPakFunctionType;
SendKernelCmdsParams sendKernelCmdsParams;
MHW_MEDIA_OBJECT_PARAMS mediaObjectParams;
MOS_COMMAND_BUFFER cmdBuffer;
PerfTagSetting perfTag;
MHW_VDBOX_VP8_ENCODER_CFG_PARAMS encoderCfgParams;
uint32_t refFrameFlag, finalRefFrameFlag;
MOS_LOCK_PARAMS lockFlags;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface());
stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
CODECHAL_ENCODE_CHK_NULL_RETURN(stateHeapInterface);
MOS_ZeroMemory(&perfTag, sizeof(PerfTagSetting));
perfTag.Value = 0;
perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE;
perfTag.PictureCodingType = m_pictureCodingType;
m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
kernelState = &m_brcKernelStates[CODECHAL_ENCODE_VP8_BRC_IDX_UPDATE];
mbEncKernelState = nullptr;
mbEncChromaKernelState = nullptr;
if (m_pictureCodingType == I_TYPE)
{
mbEncKernelState = &m_mbEncKernelStates[CODECHAL_ENCODE_VP8_MBENC_IDX_I_LUMA];
mbEncChromaKernelState = &m_mbEncKernelStates[CODECHAL_ENCODE_VP8_MBENC_IDX_I_CHROMA];
}
else
{
mbEncKernelState = &m_mbEncKernelStates[CODECHAL_ENCODE_VP8_MBENC_IDX_P];
mbEncChromaKernelState = nullptr;
}
m_brcBuffers.pMbEncKernelStateInUse = mbEncKernelState;
encFunctionType = CODECHAL_MEDIA_STATE_BRC_UPDATE;
mbPakFunctionType = CODECHAL_MEDIA_STATE_HYBRID_PAK_P1;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
stateHeapInterface,
kernelState->KernelParams.iBTCount));
m_vmeStatesSize =
m_hwInterface->GetKernelLoadCommandSize(kernelState->KernelParams.iBTCount);
CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
// Request space for MbEnc DSH, no SSH space requested as single task phase not supported for VP8
// I frames require extra DSH space for the chroma ID
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
mbEncKernelState,
false,
mbEncChromaKernelState ? m_mbEncIFrameDshSize : 0,
true,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = mbEncKernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
if (mbEncChromaKernelState)
{
mbEncChromaKernelState->m_dshRegion = mbEncKernelState->m_dshRegion;
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = mbEncChromaKernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
}
MOS_ZeroMemory(&mbEncCurbeParams, sizeof(struct CodechalVp8MbencCurbeParams));
mbEncCurbeParams.pPicParams = m_vp8PicParams;
mbEncCurbeParams.pSeqParams = m_vp8SeqParams;
mbEncCurbeParams.pVp8QuantData = m_vp8QuantData;
mbEncCurbeParams.pVp8SliceParams = m_vp8SliceParams;
mbEncCurbeParams.ppRefList = &(m_refList[0]);
mbEncCurbeParams.wPicWidthInMb = m_picWidthInMb;
mbEncCurbeParams.wFieldFrameHeightInMb = m_frameFieldHeightInMb;
mbEncCurbeParams.ucKernelMode = m_kernelMode;
mbEncCurbeParams.bHmeEnabled = m_hmeEnabled;
mbEncCurbeParams.bVmeKernelDump = m_vmeKernelDump;
mbEncCurbeParams.wPictureCodingType = m_pictureCodingType;
mbEncCurbeParams.bMbEncIFrameDistInUse = false;
mbEncCurbeParams.bBrcEnabled = m_brcEnabled;
mbEncCurbeParams.pCurrOriginalPic = &m_currOriginalPic;
mbEncCurbeParams.pLastRefPic = &m_vp8PicParams->LastRefPic;
mbEncCurbeParams.pGoldenRefPic = &m_vp8PicParams->GoldenRefPic;
mbEncCurbeParams.pAlternateRefPic = &m_vp8PicParams->AltRefPic;
mbEncCurbeParams.bBrcEnabled = true;
mbEncCurbeParams.pKernelState = mbEncKernelState;
//driver and kernel optimization when multiref is supported
refFrameFlag = 0;
if (m_pictureCodingType == P_TYPE)
{
refFrameFlag = 0x07;
if (m_vp8PicParams->LastRefPic.FrameIdx == m_vp8PicParams->GoldenRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_GOLDEN_REF_FLAG;
}
if (m_vp8PicParams->LastRefPic.FrameIdx == m_vp8PicParams->AltRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_ALT_REF_FLAG;
}
if (m_vp8PicParams->GoldenRefPic.FrameIdx == m_vp8PicParams->AltRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_ALT_REF_FLAG;
}
}
else
{
refFrameFlag = 1;
}
finalRefFrameFlag = 0;
switch (m_vp8PicParams->ref_frame_ctrl)
{
case 0:
finalRefFrameFlag = 0;
break;
case 1:
finalRefFrameFlag = 1; //Last Ref only
break;
case 2:
finalRefFrameFlag = 2; //Gold Ref only
break;
case 4:
finalRefFrameFlag = 4; //Alt Ref only
break;
default:
finalRefFrameFlag = refFrameFlag;
}
m_vp8PicParams->ref_frame_ctrl = finalRefFrameFlag;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetMbEncCurbe(&mbEncCurbeParams));
m_mbEncCurbeSetInBrcUpdate = true;
// Request space for MPU DSH, no SSH space requested as single task phase not supported for VP8
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
&m_mpuKernelState,
false,
0,
true,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = &m_mpuKernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
// Setup MPU Curbe
MOS_ZeroMemory(&mpuCurbeParams, sizeof(struct CodechalVp8MpuCurbeParams));
mpuCurbeParams.pPicParams = m_vp8PicParams;
mpuCurbeParams.pSeqParams = m_vp8SeqParams;
mpuCurbeParams.pVp8QuantData = m_vp8QuantData;
mpuCurbeParams.ucKernelMode = m_kernelMode;
mpuCurbeParams.bVmeKernelDump = m_vmeKernelDump;
mpuCurbeParams.wPictureCodingType = m_pictureCodingType;
mpuCurbeParams.EncFunctionType = encFunctionType;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetMpuCurbe(&mpuCurbeParams));
m_mpuCurbeSetInBrcUpdate = true;
// Request space for TPU DSH, no SSH space requested as single task phase not supported for VP8
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
&m_tpuKernelState,
false,
0,
true,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = &m_tpuKernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
// Setup TPU Curbe for BRC
MOS_ZeroMemory(&tpuCurbeParams, sizeof(struct CodechalVp8TpuCurbeParams));
tpuCurbeParams.pPicParams = m_vp8PicParams;
tpuCurbeParams.pSeqParams = m_vp8SeqParams;
tpuCurbeParams.pVp8QuantData = m_vp8QuantData;
tpuCurbeParams.ucKernelMode = m_kernelMode;
tpuCurbeParams.bVmeKernelDump = m_vmeKernelDump;
tpuCurbeParams.wPictureCodingType = m_pictureCodingType;
tpuCurbeParams.EncFunctionType = encFunctionType;
tpuCurbeParams.wPicWidthInMb = m_picWidthInMb;
tpuCurbeParams.wFieldFrameHeightInMb = m_frameFieldHeightInMb;
tpuCurbeParams.bRebinarizationFrameHdr = m_usRepakPassIterVal > 0 ? true : false;
// Adaptive RePak can be enabled only when RePak is enabled
tpuCurbeParams.bAdaptiveRePak = m_usRepakPassIterVal > 0 ? m_adaptiveRepakSupported : 0;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetTpuCurbe(&tpuCurbeParams));
m_tpuCurbeSetInBrcUpdate = true;
// Request space for BRC DSH and SSH
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
false,
0,
false,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
// Setup BRC Update Curbe
MOS_ZeroMemory(&brcUpdateCurbeParams, sizeof(struct CodechalVp8BrcUpdateCurbeParams));
brcUpdateCurbeParams.CurrPic = m_currOriginalPic;
brcUpdateCurbeParams.pPicParams = m_vp8PicParams;
brcUpdateCurbeParams.pSeqParams = m_vp8SeqParams;
brcUpdateCurbeParams.pSliceParams = m_vp8SliceParams;
brcUpdateCurbeParams.pVp8QuantData = m_vp8QuantData;
brcUpdateCurbeParams.dwAVBRAccuracy = m_usAvbrAccuracy;
brcUpdateCurbeParams.dwAVBRConvergence = m_usAvbrConvergence;
brcUpdateCurbeParams.wPictureCodingType = m_pictureCodingType;
brcUpdateCurbeParams.dwFrameWidthInMB = m_picWidthInMb;
brcUpdateCurbeParams.dwFrameHeightInMB = m_picHeightInMb;
brcUpdateCurbeParams.bHmeEnabled = m_hmeEnabled;
brcUpdateCurbeParams.bInitBrc = m_brcInit;
brcUpdateCurbeParams.bUsedAsRef = m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef;
brcUpdateCurbeParams.ucKernelMode = m_kernelMode;
brcUpdateCurbeParams.dwVp8BrcNumPakPasses = m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses();
brcUpdateCurbeParams.dwHeaderBytesInserted = m_headerBytesInserted;
brcUpdateCurbeParams.wFrameNumber = m_frameNum;
brcUpdateCurbeParams.dwBrcInitResetBufSizeInBits = m_brcInitResetBufSizeInBits;
brcUpdateCurbeParams.dBrcInitResetInputBitsPerFrame = m_dBrcInitResetInputBitsPerFrame;
brcUpdateCurbeParams.pdBrcInitCurrentTargetBufFullInBits = &m_dBrcInitCurrentTargetBufFullInBits;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetBrcUpdateCurbe(
&brcUpdateCurbeParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_DSH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
encFunctionType,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_ISH_TYPE,
kernelState));
)
MOS_ZeroMemory(&cmdBuffer, sizeof(MOS_COMMAND_BUFFER));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
sendKernelCmdsParams = SendKernelCmdsParams();
sendKernelCmdsParams.EncFunctionType = encFunctionType;
sendKernelCmdsParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
// Check if the constant data surface is present
if (m_brcConstantBufferSupported)
{
MOS_ZeroMemory(&initBrcConstantBufferParams, sizeof(initBrcConstantBufferParams));
initBrcConstantBufferParams.pOsInterface = m_osInterface;
initBrcConstantBufferParams.pVp8PicIdx = &m_picIdx[0];
initBrcConstantBufferParams.resBrcConstantDataBuffer =
m_brcBuffers.resBrcConstantDataBuffer;
initBrcConstantBufferParams.pPicParams = m_vp8PicParams;
initBrcConstantBufferParams.wPictureCodingType = m_pictureCodingType;
CODECHAL_ENCODE_CHK_STATUS_RETURN(InitBrcConstantBuffer(&initBrcConstantBufferParams));
}
//Set MFX_VP8_ENCODER_CFG command
MOS_ZeroMemory(&encoderCfgParams, sizeof(encoderCfgParams));
encoderCfgParams.bFirstPass = !(m_currPass);
encoderCfgParams.bBRCEnabled = m_brcEnabled ? true : false;
encoderCfgParams.dwCfgBufferSize = HEADER_METADATA_SIZE;
encoderCfgParams.pEncodeVP8SeqParams = m_vp8SeqParams;
encoderCfgParams.pEncodeVP8PicParams = m_vp8PicParams;
encoderCfgParams.pEncodeVP8QuantData = m_vp8QuantData;
for (int i = 0; i < CODECHAL_ENCODE_BRC_MAXIMUM_NUM_PASSES; i++)
{
encoderCfgParams.dwCfgCmdOffset = i * HEADER_METADATA_SIZE;
encoderCfgParams.bFirstPass = !i;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMfxInterface()->InitMfxVp8EncoderCfgCmd(&m_brcBuffers.resEncoderCfgCommandWriteBuffer, &encoderCfgParams));
}
m_mfxEncoderConfigCommandInitialized = true;
// Add binding table
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetBindingTable(
stateHeapInterface,
kernelState));
if (m_vp8PicParams->segmentation_enabled)
{
CodecHalGetResourceInfo(m_osInterface, &m_mbSegmentMapSurface);
}
//Add surface states
MOS_ZeroMemory(&brcUpdateSurfaceParams, sizeof(struct CodechalVp8BrcUpdateSurfaceParams));
brcUpdateSurfaceParams.pMbEncKernelState = mbEncKernelState;
brcUpdateSurfaceParams.presBrcHistoryBuffer = &m_brcBuffers.resBrcHistoryBuffer;
brcUpdateSurfaceParams.presBrcPakStatisticBuffer = &m_brcBuffers.resBrcPakStatisticBuffer[0];
brcUpdateSurfaceParams.presVp8PakQPInputTable = &m_brcBuffers.resPakQPInputTable;
brcUpdateSurfaceParams.presVp8EncoderCfgCommandReadBuffer = &m_brcBuffers.resEncoderCfgCommandReadBuffer;
brcUpdateSurfaceParams.presVp8EncoderCfgCommandWriteBuffer = &m_brcBuffers.resEncoderCfgCommandWriteBuffer;
brcUpdateSurfaceParams.wPictureCodingType = m_pictureCodingType;
brcUpdateSurfaceParams.ps4xMeDistortionBuffer = &m_s4XMeDistortionBuffer;
brcUpdateSurfaceParams.psMeBrcDistortionBuffer = &m_brcBuffers.sMeBrcDistortionBuffer;
brcUpdateSurfaceParams.presVp8BrcConstantDataBuffer = &m_brcBuffers.resBrcConstantDataBuffer;
brcUpdateSurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x;
brcUpdateSurfaceParams.dwDownscaledFrameFieldHeightInMb4x = m_downscaledFrameFieldHeightInMb4x;
brcUpdateSurfaceParams.bMbBrcEnabled = m_mbBrcEnabled;
brcUpdateSurfaceParams.dwBrcPakStatisticsSize = m_brcPakStatisticsSize;
// Brc update kernel will always update internal segment map (sInSegmentMapSurface) regardless of MBRC = 0 or 1
// However, MbEnc kernel will ignore internal segment map when MBRC = 0
brcUpdateSurfaceParams.psSegmentationMap = &m_inSegmentMapSurface;
brcUpdateSurfaceParams.presMbCodeBuffer = &m_resMbCodeSurface;
brcUpdateSurfaceParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendBrcUpdateSurfaces(
&cmdBuffer,
&brcUpdateSurfaceParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_SSH_TYPE,
kernelState));
)
MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetRenderInterface()->AddMediaObject(
&cmdBuffer,
nullptr,
&mediaObjectParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSubmitBlocks(
stateHeapInterface,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnUpdateGlobalCmdBufId(
stateHeapInterface));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&cmdBuffer,
encFunctionType,
nullptr));
)
CODECHAL_ENCODE_CHK_STATUS_RETURN(
m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw);
m_lastTaskInPhase = false;
return status;
}
MOS_STATUS CodechalEncodeVp8::MbEncKernel(bool isEncPhase1NotRun, bool isEncPhase2, bool mbEncIFrameDistInUse)
{
PMHW_STATE_HEAP_INTERFACE stateHeapInterface;
PMHW_KERNEL_STATE kernelState, chromaKernelState;
MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
struct CodechalVp8MbencCurbeParams mbEncCurbeParams;
struct CodechalVp8MbencSurfaceParams mbEncSurfaceParams;
struct CodechalBindingTableVp8Mbenc bindingTable;
struct CodechalVp8InitMbencConstantBufferParams initMBEncConstantBufferParams;
CODECHAL_MEDIA_STATE_TYPE encFunctionType;
SendKernelCmdsParams sendKernelCmdsParams;
MHW_WALKER_PARAMS walkerParams;
CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams;
MOS_COMMAND_BUFFER cmdBuffer;
uint8_t* data;
PerfTagSetting perfTag;
bool use45DegreePattern;
uint8_t index;
MOS_LOCK_PARAMS lockFlags;
uint32_t resolutionX, resolutionY;
uint32_t refFrameFlag, finalRefFrameFlag;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_refList);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_vp8PicParams);
stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
CODECHAL_ENCODE_CHK_NULL_RETURN(stateHeapInterface);
use45DegreePattern = false;
chromaKernelState = nullptr;
perfTag.Value = 0;
perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_MBENC_PHASE1_KERNEL;
if (isEncPhase2 == true)
{
perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_MBENC_PHASE2_KERNEL;
}
if (mbEncIFrameDistInUse == true)
{
perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_INTRA_DIST;
}
perfTag.PictureCodingType = m_pictureCodingType;
m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
if (m_pictureCodingType == I_TYPE)
{
kernelState = &m_mbEncKernelStates[CODECHAL_ENCODE_VP8_MBENC_IDX_I_LUMA];
chromaKernelState = &m_mbEncKernelStates[CODECHAL_ENCODE_VP8_MBENC_IDX_I_CHROMA];
}
else
{
kernelState = &m_mbEncKernelStates[CODECHAL_ENCODE_VP8_MBENC_IDX_P];
}
if (mbEncIFrameDistInUse)
{
encFunctionType = CODECHAL_MEDIA_STATE_ENC_I_FRAME_DIST;
kernelState = &m_brcKernelStates[CODECHAL_ENCODE_VP8_BRC_IDX_IFRAMEDIST];
chromaKernelState = nullptr;
}
else if (m_kernelMode == encodeNormalMode)
{
encFunctionType = CODECHAL_MEDIA_STATE_ENC_NORMAL;
}
else if (m_kernelMode == encodePerformanceMode)
{
encFunctionType = CODECHAL_MEDIA_STATE_ENC_PERFORMANCE;
}
else
{
encFunctionType = CODECHAL_MEDIA_STATE_ENC_QUALITY;
}
if (isEncPhase2 &&
!mbEncIFrameDistInUse) // MB ENC I Chroma
{
encFunctionType = CODECHAL_MEDIA_STATE_ENC_I_FRAME_CHROMA;
kernelState = &m_mbEncKernelStates[CODECHAL_ENCODE_VP8_MBENC_IDX_I_CHROMA];
}
bindingTable = m_mbEncBindingTable;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
stateHeapInterface,
kernelState->KernelParams.iBTCount));
m_vmeStatesSize =
m_hwInterface->GetKernelLoadCommandSize(kernelState->KernelParams.iBTCount);
CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
/* Both Phase 1 & 2 can use the same memory area for Curbe data, as they accept identical Curbe data.
Same could have been done for the Surface states also but the SSH is part of the command buffer and right now we are using the different command buffer
for Phase 1 & 2, so the setup of surface states in each command buffer is necessary */
if ((isEncPhase2 == false) || (isEncPhase2 == true && isEncPhase1NotRun == true)) // Phase 1 OR Phase 2 (when Phase 1 not executed) // MB ENC I2
{
if (m_mbEncCurbeSetInBrcUpdate && !mbEncIFrameDistInUse)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
true,
0,
false,
m_storeData));
}
else
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
false,
chromaKernelState ? m_mbEncIFrameDshSize : 0,
false,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
if (chromaKernelState)
{
chromaKernelState->m_dshRegion = kernelState->m_dshRegion;
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = chromaKernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
}
// Setup VP8 Curbe
MOS_ZeroMemory(&mbEncCurbeParams, sizeof(struct CodechalVp8MbencCurbeParams));
mbEncCurbeParams.pPicParams = m_vp8PicParams;
mbEncCurbeParams.pSeqParams = m_vp8SeqParams;
mbEncCurbeParams.pVp8SliceParams = m_vp8SliceParams;
mbEncCurbeParams.pVp8QuantData = m_vp8QuantData;
mbEncCurbeParams.ppRefList = &(m_refList[0]);
mbEncCurbeParams.wPicWidthInMb = m_picWidthInMb;
mbEncCurbeParams.wFieldFrameHeightInMb = m_frameFieldHeightInMb;
mbEncCurbeParams.ucKernelMode = m_kernelMode;
mbEncCurbeParams.bHmeEnabled = m_hmeEnabled;
mbEncCurbeParams.bVmeKernelDump = m_vmeKernelDump;
mbEncCurbeParams.wPictureCodingType = m_pictureCodingType;
mbEncCurbeParams.bMbEncIFrameDistInUse = mbEncIFrameDistInUse;
mbEncCurbeParams.pCurrOriginalPic = &m_currOriginalPic;
mbEncCurbeParams.pLastRefPic = &m_vp8PicParams->LastRefPic;
mbEncCurbeParams.pGoldenRefPic = &m_vp8PicParams->GoldenRefPic;
mbEncCurbeParams.pAlternateRefPic = &m_vp8PicParams->AltRefPic;
mbEncCurbeParams.pKernelState = kernelState;
if (!m_refCtrlOptimizationDone)
{
// Driver and kernel optimization when multiref is supported.
// With this optimization ref_frame_ctrl value is modified to 1 for first P frame in the GOP
// and to 3 for the second P frame in the GOP when ref_frame_ctrl value sent by app is
// 3, 5, 6 or 7.
if (m_pictureCodingType == P_TYPE)
{
refFrameFlag = 0x07;
if (m_vp8PicParams->LastRefPic.FrameIdx == m_vp8PicParams->GoldenRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_GOLDEN_REF_FLAG;
}
if (m_vp8PicParams->LastRefPic.FrameIdx == m_vp8PicParams->AltRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_ALT_REF_FLAG;
}
if (m_vp8PicParams->GoldenRefPic.FrameIdx == m_vp8PicParams->AltRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_ALT_REF_FLAG;
}
}
else
{
refFrameFlag = 1;
}
switch (m_vp8PicParams->ref_frame_ctrl)
{
case 0:
finalRefFrameFlag = 0;
break;
case 1:
finalRefFrameFlag = 1; //Last Ref only
break;
case 2:
finalRefFrameFlag = 2; //Gold Ref only
break;
case 4:
finalRefFrameFlag = 4; //Alt Ref only
break;
default:
finalRefFrameFlag = refFrameFlag;
}
m_vp8PicParams->ref_frame_ctrl = finalRefFrameFlag;
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetMbEncCurbe(&mbEncCurbeParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_DSH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
encFunctionType,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_ISH_TYPE,
kernelState));
)
}
if (m_pictureCodingType == P_TYPE)
{
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->LastRefPic))
{
index = m_vp8PicParams->LastRefPic.FrameIdx;
m_refList[index]->sRefBuffer = m_vp8SeqParams->UseRawReconRef ? m_refList[index]->sRefRawBuffer : m_refList[index]->sRefReconBuffer;
CodecHalGetResourceInfo(m_osInterface, &m_refList[index]->sRefBuffer);
}
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->GoldenRefPic))
{
index = m_vp8PicParams->GoldenRefPic.FrameIdx;
m_refList[index]->sRefBuffer = m_refList[index]->sRefReconBuffer; /* Always Recon buffer for Golden ref pic */
CodecHalGetResourceInfo(m_osInterface, &m_refList[index]->sRefBuffer);
}
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->AltRefPic))
{
index = m_vp8PicParams->AltRefPic.FrameIdx;
m_refList[index]->sRefBuffer = m_refList[index]->sRefReconBuffer; /* Always Recon buffer for Alternate ref pic */
CodecHalGetResourceInfo(m_osInterface, &m_refList[index]->sRefBuffer);
}
}
else if (m_pictureCodingType == I_TYPE)
{
initMBEncConstantBufferParams.pOsInterface = m_osInterface;
initMBEncConstantBufferParams.sMBModeCostLumaBuffer = m_mbModeCostLumaBuffer;
initMBEncConstantBufferParams.sBlockModeCostBuffer = m_blockModeCostBuffer;
initMBEncConstantBufferParams.presHistogram = &m_resHistogram;
CODECHAL_ENCODE_CHK_STATUS_RETURN(InitMBEncConstantBuffer(&initMBEncConstantBufferParams));
}
if (m_initBrcDistortionBuffer && mbEncIFrameDistInUse)
{
InitBrcDistortionBuffer();
}
}
if (m_vp8PicParams->segmentation_enabled)
{
CodecHalGetResourceInfo(m_osInterface, &m_mbSegmentMapSurface);
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
sendKernelCmdsParams = SendKernelCmdsParams();
sendKernelCmdsParams.EncFunctionType = encFunctionType;
sendKernelCmdsParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
// Add binding table
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetBindingTable(
stateHeapInterface,
kernelState));
if (CodecHalUsesVideoEngine(m_codecFunction) &&
((isEncPhase2 == false) || (isEncPhase2 == true && isEncPhase1NotRun == true))) // Phase 1 OR Phase 2 (when Phase 1 not executed)
{
/* zero histogram surface only once */
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.WriteOnly = 1;
data = (uint8_t *)m_osInterface->pfnLockResource(
m_osInterface,
&m_resHistogram,
&lockFlags);
CODECHAL_ENCODE_CHK_NULL_RETURN(data);
MOS_ZeroMemory(data, HISTOGRAM_SIZE);
m_osInterface->pfnUnlockResource(
m_osInterface,
&m_resHistogram);
}
//Add surface states
MOS_ZeroMemory(&mbEncSurfaceParams, sizeof(struct CodechalVp8MbencSurfaceParams));
mbEncSurfaceParams.MediaStateType = encFunctionType;
mbEncSurfaceParams.ppRefList = &m_refList[0];
mbEncSurfaceParams.wPictureCodingType = m_pictureCodingType;
mbEncSurfaceParams.pCurrReconstructedPic = &m_currReconstructedPic;
mbEncSurfaceParams.psCurrPicSurface = m_rawSurfaceToEnc;
if (m_pictureCodingType == P_TYPE)
{
mbEncSurfaceParams.pLastRefPic = &m_vp8PicParams->LastRefPic;
mbEncSurfaceParams.pGoldenRefPic = &m_vp8PicParams->GoldenRefPic;
mbEncSurfaceParams.pAlternateRefPic = &m_vp8PicParams->AltRefPic;
mbEncSurfaceParams.ps4xMeMvDataBuffer = &m_s4XMemvDataBuffer;
mbEncSurfaceParams.ps4xMeDistortionBuffer = &m_s4XMeDistortionBuffer;
mbEncSurfaceParams.presRefMbCountSurface = &m_resRefMbCountSurface;
mbEncSurfaceParams.dwMvOffset = (uint32_t)m_mvOffset;
mbEncSurfaceParams.presModeCostUpdateSurface = &m_resModeCostUpdateSurface;
}
else
{
mbEncSurfaceParams.psMBModeCostLumaBuffer = &m_mbModeCostLumaBuffer;
mbEncSurfaceParams.psBlockModeCostBuffer = &m_blockModeCostBuffer;
}
mbEncSurfaceParams.dwFrameWidthInMb = (uint32_t)m_picWidthInMb;
mbEncSurfaceParams.dwFrameFieldHeightInMb = (uint32_t)m_frameFieldHeightInMb;
mbEncSurfaceParams.dwOriFrameWidth = m_oriFrameWidth;
mbEncSurfaceParams.dwOriFrameHeight = m_oriFrameHeight;
mbEncSurfaceParams.dwVerticalLineStride = m_verticalLineStride;
mbEncSurfaceParams.dwVerticalLineStrideOffset = m_verticalLineStrideOffset;
mbEncSurfaceParams.dwHistogramSize = HISTOGRAM_SIZE;
mbEncSurfaceParams.bHmeEnabled = m_hmeEnabled;
mbEncSurfaceParams.bVMEKernelDump = m_vmeKernelDump;
mbEncSurfaceParams.bSegmentationEnabled = m_vp8PicParams->segmentation_enabled;
mbEncSurfaceParams.presPerMB_MBCodeOpData = &m_resMbCodeSurface;
mbEncSurfaceParams.psPerMBQuantDataBuffer = &m_perMbQuantDataBuffer;
mbEncSurfaceParams.presVmeKernelDumpBuffer = &m_resVmeKernelDumpBuffer;
// 0: Default, decided internally based on target usage.
// 1: MB BRC enabled.
// 2: MB BRC disabled.
// MBRC = 1: internal segment map (sInSegmentMapSurface) is provided from BRC update kernel
// MBRC = 0, 2: external segment map (sMbSegmentMapSurface) is provided from the app, ignore internal segment map
mbEncSurfaceParams.psSegmentationMap = (m_vp8SeqParams->MBBRC == 1) ? &m_inSegmentMapSurface : &m_mbSegmentMapSurface;
mbEncSurfaceParams.presHistogram = &m_resHistogram;
mbEncSurfaceParams.psInterPredictionDistortionSurface = &m_s4XMeDistortionBuffer;
mbEncSurfaceParams.presPerMVDataSurface = &m_resPredMvDataSurface;
mbEncSurfaceParams.bMbEncIFrameDistInUse = mbEncIFrameDistInUse;
mbEncSurfaceParams.pVp8SliceParams = m_vp8SliceParams;
mbEncSurfaceParams.psMeBrcDistortionBuffer = mbEncIFrameDistInUse ? &m_brcBuffers.sMeBrcDistortionBuffer : &m_s4XMeDistortionBuffer;
mbEncSurfaceParams.uiRefCtrl = m_vp8PicParams->ref_frame_ctrl;
mbEncSurfaceParams.pMbEncBindingTable = &bindingTable;
mbEncSurfaceParams.pKernelState = kernelState;
mbEncSurfaceParams.psChromaReconBuffer = &m_chromaReconBuffer;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendMbEncSurfaces(&cmdBuffer, &mbEncSurfaceParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_SSH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
&m_resModeCostUpdateSurface,
CodechalDbgAttr::attrInput,
"ModeCostUpdate",
16 * sizeof(uint32_t),
0,
CODECHAL_NUM_MEDIA_STATES));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
&m_s4XMeDistortionBuffer,
"MBEncInterPredDistSurf",
"InterDistSurf"));
)
resolutionX = mbEncIFrameDistInUse ?
m_downscaledWidthInMb4x : (uint32_t)m_picWidthInMb;
resolutionY = mbEncIFrameDistInUse ?
m_downscaledHeightInMb4x : (uint32_t)m_frameFieldHeightInMb;
MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams));
walkerCodecParams.WalkerMode = m_walkerMode;
walkerCodecParams.bUseScoreboard = m_useHwScoreboard;
walkerCodecParams.dwResolutionX = resolutionX;
walkerCodecParams.dwResolutionY = resolutionY;
walkerCodecParams.wPictureCodingType = m_pictureCodingType;
if ((m_pictureCodingType == I_TYPE) && (isEncPhase2 == false))
{
walkerCodecParams.bNoDependency = true;
}
else
{
walkerCodecParams.WalkerDegree = CODECHAL_45_DEGREE;
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams(
m_hwInterface,
&walkerParams,
&walkerCodecParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetRenderInterface()->AddMediaObjectWalkerCmd(
&cmdBuffer,
&walkerParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
if( mbEncIFrameDistInUse ||
!isEncPhase2 ||
(isEncPhase2 && isEncPhase1NotRun))
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSubmitBlocks(
stateHeapInterface,
kernelState));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnUpdateGlobalCmdBufId(
stateHeapInterface));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&cmdBuffer,
encFunctionType,
nullptr)));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
CODECHAL_ENCODE_CHK_STATUS_RETURN(
m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw));
return status;
}
MOS_STATUS CodechalEncodeVp8::MeKernel()
{
PMHW_STATE_HEAP_INTERFACE stateHeapInterface;
PMHW_KERNEL_STATE kernelState;
MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
PerfTagSetting perfTag;
struct CodechalVp8MeCurbeParams meParams;
struct CodechalVp8MeSurfaceParams meSurfaceParams;
struct CodechalBindingTableVp8Me bindingTable;
CODECHAL_MEDIA_STATE_TYPE encFunctionType;
SendKernelCmdsParams sendKernelCmdsParams;
MHW_WALKER_PARAMS walkerParams;
CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams;
MOS_COMMAND_BUFFER cmdBuffer;
bool use16xMe;
uint32_t resolutionX, resolutionY;
uint8_t refScaledIdx, goldScaledIdx, altrefScaledIdx;
uint32_t refFrameFlag, finalRefFrameFlag;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface());
stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
CODECHAL_ENCODE_CHK_NULL_RETURN(stateHeapInterface);
use16xMe = m_b16XMeEnabled && !m_b16XMeDone;
perfTag.Value = 0;
perfTag.Mode = (uint16_t)m_mode >> CODECHAL_ENCODE_MODE_BIT_OFFSET;
perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_ME_KERNEL;
perfTag.PictureCodingType = m_pictureCodingType;
m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
encFunctionType = (use16xMe) ? CODECHAL_MEDIA_STATE_16X_ME : CODECHAL_MEDIA_STATE_4X_ME;
kernelState = &m_meKernelState;
bindingTable = m_meBindingTable;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
stateHeapInterface,
kernelState->KernelParams.iBTCount));
m_vmeStatesSize =
m_hwInterface->GetKernelLoadCommandSize(kernelState->KernelParams.iBTCount);
CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
false,
0,
false,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
// Driver and kernel optimization when multiref is supported.
// With this optimization ref_frame_ctrl value is modified to 1 for first P frame in the GOP
// and to 3 for the second P frame in the GOP when ref_frame_ctrl value sent by app is either
// 3, 5, 6 or 7.
if (m_pictureCodingType == P_TYPE)
{
refFrameFlag = 0x07;
if (m_vp8PicParams->LastRefPic.FrameIdx == m_vp8PicParams->GoldenRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_GOLDEN_REF_FLAG;
}
if (m_vp8PicParams->LastRefPic.FrameIdx == m_vp8PicParams->AltRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_ALT_REF_FLAG;
}
if (m_vp8PicParams->GoldenRefPic.FrameIdx == m_vp8PicParams->AltRefPic.FrameIdx)
{
refFrameFlag &= ~VP8_ALT_REF_FLAG;
}
}
else
{
refFrameFlag = 1;
}
switch (m_vp8PicParams->ref_frame_ctrl)
{
case 0:
finalRefFrameFlag = 0;
break;
case 1:
finalRefFrameFlag = 1; //Last Ref only
break;
case 2:
finalRefFrameFlag = 2; //Gold Ref only
break;
case 4:
finalRefFrameFlag = 4; //Alt Ref only
break;
default:
finalRefFrameFlag = refFrameFlag;
}
m_vp8PicParams->ref_frame_ctrl = finalRefFrameFlag;
m_refCtrlOptimizationDone = true;
// Setup VP8 Curbe
meParams.pPicParams = m_vp8PicParams;
meParams.pSeqParams = m_vp8SeqParams;
meParams.dwFrameWidth = m_frameWidth;
meParams.dwFrameFieldHeight = m_frameFieldHeight;
meParams.wPictureCodingType = m_pictureCodingType;
meParams.b16xME = use16xMe;
meParams.b16xMeEnabled = m_b16XMeEnabled;
meParams.ucKernelMode = m_kernelMode;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetMeCurbe(&meParams));
refScaledIdx = m_refList[m_vp8PicParams->LastRefPic.FrameIdx]->ucScalingIdx;
goldScaledIdx = m_refList[m_vp8PicParams->GoldenRefPic.FrameIdx]->ucScalingIdx;
altrefScaledIdx = m_refList[m_vp8PicParams->AltRefPic.FrameIdx]->ucScalingIdx;
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_DSH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
encFunctionType,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_ISH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
m_trackedBuf->Get4xDsSurface(refScaledIdx),
CodechalDbgAttr::attrReferenceSurfaces,
"MeRef4xScaledSurf"))
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
m_trackedBuf->Get4xDsSurface(goldScaledIdx),
CodechalDbgAttr::attrReferenceSurfaces,
"GoldenRef4xScaledSurf"))
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
m_trackedBuf->Get4xDsSurface(altrefScaledIdx),
CodechalDbgAttr::attrReferenceSurfaces,
"AltRef4xScaledSurf"))
)
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
sendKernelCmdsParams = SendKernelCmdsParams();
sendKernelCmdsParams.EncFunctionType = encFunctionType;
sendKernelCmdsParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
// Add binding table
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetBindingTable(
stateHeapInterface,
kernelState));
if (m_initBrcDistortionBuffer && !use16xMe)
{
InitBrcDistortionBuffer();
}
//Add surface states
MOS_ZeroMemory(&meSurfaceParams, sizeof(struct CodechalVp8MeSurfaceParams));
meSurfaceParams.ppRefList = &m_refList[0];
meSurfaceParams.pLastRefPic = &m_vp8PicParams->LastRefPic;
meSurfaceParams.pGoldenRefPic = &m_vp8PicParams->GoldenRefPic;
meSurfaceParams.pAlternateRefPic = &m_vp8PicParams->AltRefPic;
meSurfaceParams.ps4xMeMvDataBuffer = &m_s4XMemvDataBuffer;
meSurfaceParams.ps16xMeMvDataBuffer = &m_s16XMemvDataBuffer;
meSurfaceParams.psMeDistortionBuffer = &m_s4XMeDistortionBuffer;
// Me kernel is only for P frame, no need to worry about I frame
meSurfaceParams.psMeBrcDistortionBuffer = m_brcEnabled ? &m_brcBuffers.sMeBrcDistortionBuffer : &m_s4XMeDistortionBuffer;
meSurfaceParams.dwDownscaledWidthInMb =
(use16xMe) ? m_downscaledWidthInMb16x : m_downscaledWidthInMb4x;
meSurfaceParams.dwDownscaledHeightInMb =
(use16xMe) ? m_downscaledHeightInMb16x : m_downscaledHeightInMb4x;
meSurfaceParams.dwVerticalLineStride = m_verticalLineStride;
meSurfaceParams.dwVerticalLineStrideOffset = m_verticalLineStrideOffset;
meSurfaceParams.b16xMeInUse = use16xMe;
meSurfaceParams.b16xMeEnabled = m_b16XMeEnabled;
meSurfaceParams.RefCtrl = m_vp8PicParams->ref_frame_ctrl;
meSurfaceParams.pMeBindingTable = &bindingTable;
meSurfaceParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendMeSurfaces(&cmdBuffer, &meSurfaceParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_SSH_TYPE,
kernelState));
)
resolutionX = (use16xMe) ? m_downscaledWidthInMb16x : m_downscaledWidthInMb4x;
resolutionY = (use16xMe) ? m_downscaledFrameFieldHeightInMb16x : m_downscaledFrameFieldHeightInMb4x;
MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams));
walkerCodecParams.WalkerMode = m_walkerMode;
walkerCodecParams.dwResolutionX = resolutionX;
walkerCodecParams.dwResolutionY = resolutionY;
walkerCodecParams.bNoDependency = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams(
m_hwInterface,
&walkerParams,
&walkerCodecParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetRenderInterface()->AddMediaObjectWalkerCmd(
&cmdBuffer,
&walkerParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSubmitBlocks(
stateHeapInterface,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnUpdateGlobalCmdBufId(
stateHeapInterface));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&cmdBuffer,
encFunctionType,
nullptr)));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw));
if (use16xMe)
{
m_b16XMeDone = true;
}
return status;
}
MOS_STATUS CodechalEncodeVp8::MpuKernel()
{
PMHW_STATE_HEAP_INTERFACE stateHeapInterface;
PMHW_KERNEL_STATE kernelState;
MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
struct CodechalVp8MpuCurbeParams mpuCurbeParams;
struct CodechalVp8MpuSurfaceParams mpuSurfaceParams;
struct CodechalBindingTableVp8Mpu bindingTable;
SendKernelCmdsParams sendKernelCmdsParams;
MHW_WALKER_PARAMS walkerParams;
CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams;
MOS_COMMAND_BUFFER cmdBuffer;
CODECHAL_MEDIA_STATE_TYPE encFunctionType;
MHW_VDBOX_VP8_ENCODER_CFG_PARAMS encoderCfgParams;
struct CodechalVp8UpdateMpuTpuBufferParams updateMpuTpuBuffersParams;
MHW_MEDIA_OBJECT_PARAMS mediaObjectParams;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_refList);
stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
CODECHAL_ENCODE_CHK_NULL_RETURN(stateHeapInterface);
encFunctionType = CODECHAL_MEDIA_STATE_MPU_FHB;
kernelState = &m_mpuKernelState;
bindingTable = m_mpuBindingTable;
//Update all the data for the key frames
if (m_pictureCodingType == I_TYPE)
{
MOS_ZeroMemory(&updateMpuTpuBuffersParams, sizeof(updateMpuTpuBuffersParams));
updateMpuTpuBuffersParams.pOsInterface = m_osInterface;
updateMpuTpuBuffersParams.dwCoeffProbsSize = COEFFS_PROPABILITIES_SIZE;
updateMpuTpuBuffersParams.presCurrFrameTokenProbability = &m_mpuTpuBuffers.resCoeffProbs;
updateMpuTpuBuffersParams.presHwTokenProbabilityPass1 = &m_mpuTpuBuffers.resRefCoeffProbs;
updateMpuTpuBuffersParams.presKeyFrameTokenProbability = &m_mpuTpuBuffers.resKeyFrameTokenProbability;
updateMpuTpuBuffersParams.presHwTokenProbabilityPass2 = &m_mpuTpuBuffers.resHwTokenProbabilityPass2;
updateMpuTpuBuffersParams.presRepakDecisionSurface = &m_mpuTpuBuffers.resRepakDecisionSurface;
CODECHAL_ENCODE_CHK_STATUS_RETURN(KeyFrameUpdateMpuTpuBuffer(&updateMpuTpuBuffersParams));
}
if (!m_mfxEncoderConfigCommandInitialized)
{
//Set MFX_VP8_ENCODER_CFG
MOS_ZeroMemory(&encoderCfgParams, sizeof(encoderCfgParams));
encoderCfgParams.bFirstPass = !(m_currPass);
encoderCfgParams.bBRCEnabled = m_brcEnabled ? true : false;
encoderCfgParams.dwCfgCmdOffset = HEADER_METADATA_OFFSET;
encoderCfgParams.dwCfgBufferSize = PICTURE_STATE_SIZE;
encoderCfgParams.pEncodeVP8SeqParams = m_vp8SeqParams;
encoderCfgParams.pEncodeVP8PicParams = m_vp8PicParams;
encoderCfgParams.pEncodeVP8QuantData = m_vp8QuantData;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMfxInterface()->InitMfxVp8EncoderCfgCmd(&m_mpuTpuBuffers.resPictureState, &encoderCfgParams));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
stateHeapInterface,
kernelState->KernelParams.iBTCount));
m_vmeStatesSize =
m_hwInterface->GetKernelLoadCommandSize(kernelState->KernelParams.iBTCount);
CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
if (m_mpuCurbeSetInBrcUpdate)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
true,
0,
false,
m_storeData));
}
else
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
false,
0,
false,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
// Setup VP8 Curbe
MOS_ZeroMemory(&mpuCurbeParams, sizeof(mpuCurbeParams));
mpuCurbeParams.pPicParams = m_vp8PicParams;
mpuCurbeParams.pSeqParams = m_vp8SeqParams;
mpuCurbeParams.pVp8QuantData = m_vp8QuantData;
mpuCurbeParams.ucKernelMode = m_kernelMode;
mpuCurbeParams.bVmeKernelDump = m_vmeKernelDump;
mpuCurbeParams.wPictureCodingType = m_pictureCodingType;
mpuCurbeParams.EncFunctionType = encFunctionType;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetMpuCurbe(&mpuCurbeParams));
}
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_DSH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
encFunctionType,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_ISH_TYPE,
kernelState));
)
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
sendKernelCmdsParams = SendKernelCmdsParams();
sendKernelCmdsParams.EncFunctionType = encFunctionType;
sendKernelCmdsParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
// Add binding table
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetBindingTable(
stateHeapInterface,
kernelState));
//Add surface states
MOS_ZeroMemory(&mpuSurfaceParams, sizeof(mpuSurfaceParams));
mpuSurfaceParams.MediaStateType = encFunctionType;
mpuSurfaceParams.dwHistogramSize = HISTOGRAM_SIZE;
mpuSurfaceParams.dwModeProbabilitySize = MODE_PROPABILITIES_SIZE;
mpuSurfaceParams.dwTokenProbabilitySize = COEFFS_PROPABILITIES_SIZE;
mpuSurfaceParams.dwFrameHeaderSize = CODECHAL_VP8_FRAME_HEADER_SIZE;
mpuSurfaceParams.dwHeaderMetadataSize = HEADER_METADATA_SIZE;
mpuSurfaceParams.dwPictureStateSize = PICTURE_STATE_SIZE;
mpuSurfaceParams.dwMpuBitstreamSize = MPU_BITSTREAM_SIZE;
mpuSurfaceParams.dwTpuBitstreamSize = TPU_BITSTREAM_SIZE;
mpuSurfaceParams.dwEntropyCostTableSize = ENTROPY_COST_TABLE_SIZE;
mpuSurfaceParams.dwHeaderMetaDataOffset = m_brcEnabled ? 0 : HEADER_METADATA_OFFSET;
mpuSurfaceParams.dwTokenBitsDataSize = TOKEN_BITS_DATA_SIZE;
mpuSurfaceParams.dwKernelDumpSize = VP8_KERNEL_DUMP_SIZE;
mpuSurfaceParams.bVMEKernelDump = m_vmeKernelDump;
mpuSurfaceParams.presHistogram = &m_resHistogram;
mpuSurfaceParams.presRefModeProbability = &m_mpuTpuBuffers.resRefModeProbs;
mpuSurfaceParams.presModeProbability = &m_mpuTpuBuffers.resModeProbs;
mpuSurfaceParams.presRefTokenProbability = &m_mpuTpuBuffers.resRefCoeffProbs;
mpuSurfaceParams.presTokenProbability = &m_mpuTpuBuffers.resCoeffProbs;
mpuSurfaceParams.presFrameHeader = &m_resFrameHeader;
mpuSurfaceParams.presHeaderMetadata = m_brcEnabled ? &m_brcBuffers.resEncoderCfgCommandWriteBuffer : &m_mpuTpuBuffers.resPictureState;
mpuSurfaceParams.presPictureState = &m_mpuTpuBuffers.resPictureState;
mpuSurfaceParams.presMpuBitstream = &m_mpuTpuBuffers.resMpuBitstream;
mpuSurfaceParams.presTpuBitstream = &m_mpuTpuBuffers.resTpuBitstream;
mpuSurfaceParams.presVmeKernelDumpBuffer = &m_resVmeKernelDumpBuffer;
mpuSurfaceParams.presEntropyCostTable = &m_mpuTpuBuffers.resEntropyCostTable;
mpuSurfaceParams.presTokenBitsData = &m_mpuTpuBuffers.resTokenBitsData;
mpuSurfaceParams.presModeCostUpdateBuffer = &m_resModeCostUpdateSurface;
mpuSurfaceParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendMpuSurfaces(&cmdBuffer, &mpuSurfaceParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_SSH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
&m_resModeCostUpdateSurface,
CodechalDbgAttr::attrInput,
"ModeCostUpdate",
16 * sizeof(uint32_t),
0,
CODECHAL_NUM_MEDIA_STATES));
)
MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetRenderInterface()->AddMediaObject(
&cmdBuffer,
nullptr,
&mediaObjectParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport( &cmdBuffer, encFunctionType));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSubmitBlocks(
stateHeapInterface,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnUpdateGlobalCmdBufId(
stateHeapInterface));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&cmdBuffer,
encFunctionType,
nullptr)));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
CODECHAL_ENCODE_CHK_STATUS_RETURN(
m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw));
return status;
}
MOS_STATUS CodechalEncodeVp8::TpuKernel()
{
PMHW_STATE_HEAP_INTERFACE stateHeapInterface;
PMHW_KERNEL_STATE kernelState;
MHW_INTERFACE_DESCRIPTOR_PARAMS idParams;
struct CodechalVp8TpuCurbeParams tpuCurbeParams;
struct CodechalVp8TpuSurfaceParams tpuSurfaceParams;
struct CodechalBindingTableVp8Tpu bindingTable;
SendKernelCmdsParams sendKernelCmdsParams;
MHW_WALKER_PARAMS walkerParams;
CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams;
MOS_COMMAND_BUFFER cmdBuffer;
CODECHAL_MEDIA_STATE_TYPE encFunctionType;
MHW_MEDIA_OBJECT_PARAMS mediaObjectParams;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_refList);
stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
CODECHAL_ENCODE_CHK_NULL_RETURN(stateHeapInterface);
encFunctionType = CODECHAL_MEDIA_STATE_TPU_FHB;
kernelState = &m_tpuKernelState;
bindingTable = m_tpuBindingTable;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnRequestSshSpaceForCmdBuf(
stateHeapInterface,
kernelState->KernelParams.iBTCount));
m_vmeStatesSize =
m_hwInterface->GetKernelLoadCommandSize(kernelState->KernelParams.iBTCount);
CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable());
if (m_tpuCurbeSetInBrcUpdate)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
true,
0,
false,
m_storeData));
}
else
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace(
stateHeapInterface,
kernelState,
false,
0,
false,
m_storeData));
MOS_ZeroMemory(&idParams, sizeof(idParams));
idParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetInterfaceDescriptor(
stateHeapInterface,
1,
&idParams));
// Setup VP8 Curbe
MOS_ZeroMemory(&tpuCurbeParams, sizeof(struct CodechalVp8TpuCurbeParams));
tpuCurbeParams.pPicParams = m_vp8PicParams;
tpuCurbeParams.pSeqParams = m_vp8SeqParams;
tpuCurbeParams.pVp8QuantData = m_vp8QuantData;
tpuCurbeParams.ucKernelMode = m_kernelMode;
tpuCurbeParams.bVmeKernelDump = m_vmeKernelDump;
tpuCurbeParams.wPictureCodingType = m_pictureCodingType;
tpuCurbeParams.EncFunctionType = encFunctionType;
tpuCurbeParams.wPicWidthInMb = m_picWidthInMb;
tpuCurbeParams.wFieldFrameHeightInMb = m_frameFieldHeightInMb;
tpuCurbeParams.bRebinarizationFrameHdr = m_usRepakPassIterVal > 0 ? true : false;
// Adaptive RePak can be enabled only when RePak is enabled
tpuCurbeParams.bAdaptiveRePak = m_usRepakPassIterVal > 0 ? m_adaptiveRepakSupported : 0;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetTpuCurbe(&tpuCurbeParams));
}
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_DSH_TYPE,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe(
encFunctionType,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_ISH_TYPE,
kernelState));
)
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
sendKernelCmdsParams = SendKernelCmdsParams();
sendKernelCmdsParams.EncFunctionType = encFunctionType;
sendKernelCmdsParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams));
// Add binding table
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSetBindingTable(
stateHeapInterface,
kernelState));
//Add surface states
MOS_ZeroMemory(&tpuSurfaceParams, sizeof(tpuSurfaceParams));
tpuSurfaceParams.MediaStateType = encFunctionType;
tpuSurfaceParams.dwPakTokenStatsSize = TOKEN_STATISTICS_SIZE;
tpuSurfaceParams.dwTokenProbabilitySize = COEFFS_PROPABILITIES_SIZE;
tpuSurfaceParams.dwEntropyCostTableSize = ENTROPY_COST_TABLE_SIZE;
tpuSurfaceParams.dwFrameHeaderSize = CODECHAL_VP8_FRAME_HEADER_SIZE;
tpuSurfaceParams.dwPictureStateSize = PICTURE_STATE_SIZE;
tpuSurfaceParams.dwMpuCurbeSize = TOKEN_BITS_DATA_SIZE;
tpuSurfaceParams.dwHeaderMetadataSize = HEADER_METADATA_SIZE;
tpuSurfaceParams.dwHeaderMetaDataOffset = m_brcEnabled ? 0 : HEADER_METADATA_OFFSET;
tpuSurfaceParams.dwKernelDumpSize = VP8_KERNEL_DUMP_SIZE;
tpuSurfaceParams.dwRepakDecision = REPAK_DECISION_BUF_SIZE;
tpuSurfaceParams.bVMEKernelDump = m_vmeKernelDump;
tpuSurfaceParams.presPakTokenStatistics = &m_mpuTpuBuffers.resPakTokenStatistics;
tpuSurfaceParams.presPakTokenUpdateFlags = &m_mpuTpuBuffers.resPakTokenUpdateFlags;
tpuSurfaceParams.presEntropyCostTable = &m_mpuTpuBuffers.resEntropyCostTable;
tpuSurfaceParams.presFrameHeader = &m_resFrameHeader;
tpuSurfaceParams.presDefaultTokenProbability = &m_mpuTpuBuffers.resDefaultTokenProbability;
tpuSurfaceParams.presPictureState = &m_mpuTpuBuffers.resPictureState;
tpuSurfaceParams.presMpuCurbeData = &m_mpuTpuBuffers.resTokenBitsData;
tpuSurfaceParams.presHeaderMetadata = m_brcEnabled ? &m_brcBuffers.resEncoderCfgCommandWriteBuffer : &m_mpuTpuBuffers.resPictureState;
tpuSurfaceParams.presCurrFrameTokenProbability = &m_mpuTpuBuffers.resCoeffProbs;
tpuSurfaceParams.presHwTokenProbabilityPass1 = &m_mpuTpuBuffers.resRefCoeffProbs;
tpuSurfaceParams.presKeyFrameTokenProbability = &m_mpuTpuBuffers.resKeyFrameTokenProbability;
tpuSurfaceParams.presUpdatedFrameTokenProbability = &m_mpuTpuBuffers.resUpdatedTokenProbability;
tpuSurfaceParams.presHwTokenProbabilityPass2 = &m_mpuTpuBuffers.resHwTokenProbabilityPass2;
tpuSurfaceParams.presVmeKernelDumpBuffer = &m_resVmeKernelDumpBuffer;
tpuSurfaceParams.presRepakDecisionSurface = &m_mpuTpuBuffers.resRepakDecisionSurface;
tpuSurfaceParams.pKernelState = kernelState;
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendTpuSurfaces(&cmdBuffer, &tpuSurfaceParams));
CODECHAL_DEBUG_TOOL(
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion(
encFunctionType,
MHW_SSH_TYPE,
kernelState));
)
MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetRenderInterface()->AddMediaObject(
&cmdBuffer,
nullptr,
&mediaObjectParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport( &cmdBuffer, encFunctionType));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnSubmitBlocks(
stateHeapInterface,
kernelState));
CODECHAL_ENCODE_CHK_STATUS_RETURN(stateHeapInterface->pfnUpdateGlobalCmdBufId(
stateHeapInterface));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&cmdBuffer,
encFunctionType,
nullptr)));
CODECHAL_ENCODE_CHK_STATUS_RETURN(
m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw));
return status;
}
MOS_STATUS CodechalEncodeVp8::ExecutePictureLevel()
{
MhwMiInterface *commonMiInterface;
MOS_COMMAND_BUFFER cmdBuffer;
MHW_VDBOX_PIPE_MODE_SELECT_PARAMS pipeModeSelectParams;
MHW_VDBOX_SURFACE_PARAMS surfaceParams;
MHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams;
MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS indObjBaseAddrParams;
MHW_VDBOX_VP8_BSP_BUF_BASE_ADDR_PARAMS vp8BspBufBaseAddrParams;
MHW_MI_CONDITIONAL_BATCH_BUFFER_END_PARAMS miConditionalBatchBufferEndParams;
MHW_BATCH_BUFFER batchBuffer;
PerfTagSetting perfTag;
uint8_t index, picIdx;
int32_t i;
MOS_STATUS status = MOS_STATUS_SUCCESS;
bool deblockingEnable, suppressReconPic;
bool newCommandBufferStarted = false;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
commonMiInterface = m_hwInterface->GetMiInterface();
perfTag.Value = 0;
perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK;
perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_PAK_ENGINE;
perfTag.PictureCodingType = m_pictureCodingType;
m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value);
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
// set MFX_PIPE_MODE_SELECT values
pipeModeSelectParams.Mode = m_mode;
pipeModeSelectParams.bStreamOutEnabled = false;
deblockingEnable = ((m_vp8PicParams->version == 0) || (m_vp8PicParams->version == 1)) ? 1 : 0;
suppressReconPic =
((!m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef) && m_suppressReconPicSupported);
pipeModeSelectParams.bPreDeblockOutEnable = !deblockingEnable && !suppressReconPic;
pipeModeSelectParams.bPostDeblockOutEnable = deblockingEnable && !suppressReconPic;
// set MFX_PIPE_BUF_ADDR_STATE values
pipeBufAddrParams.Mode = m_mode;
pipeBufAddrParams.psPreDeblockSurface = &m_reconSurface;
pipeBufAddrParams.psPostDeblockSurface = &m_reconSurface;
pipeBufAddrParams.psRawSurface = m_rawSurfaceToPak;
pipeBufAddrParams.presStreamOutBuffer = &m_resStreamOutBuffer[m_currRecycledBufIdx];
pipeBufAddrParams.presMfdDeblockingFilterRowStoreScratchBuffer = &m_resDeblockingFilterRowStoreScratchBuffer;
pipeBufAddrParams.presMfdIntraRowStoreScratchBuffer = &m_resIntraRowStoreScratchBuffer;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_mmcState);
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mmcState->SetPipeBufAddr(&pipeBufAddrParams));
// Setting invalid entries to nullptr
for (i = 0; i < CODEC_MAX_NUM_REF_FRAME; i++)
{
pipeBufAddrParams.presReferences[i] = nullptr;
}
if (m_pictureCodingType == P_TYPE)
{
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->LastRefPic))
{
index = m_vp8PicParams->LastRefPic.FrameIdx;
pipeBufAddrParams.presReferences[0] = &(m_refList[index]->sRefBuffer.OsResource);
}
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->GoldenRefPic))
{
index = m_vp8PicParams->GoldenRefPic.FrameIdx;
pipeBufAddrParams.presReferences[1] = &(m_refList[index]->sRefBuffer.OsResource);
}
if (!CodecHal_PictureIsInvalid(m_vp8PicParams->AltRefPic))
{
index = m_vp8PicParams->AltRefPic.FrameIdx;
pipeBufAddrParams.presReferences[2] = &(m_refList[index]->sRefBuffer.OsResource);
}
}
for (i = 0; i < CODEC_MAX_NUM_REF_FRAME_NON_AVC; i++)
{
if (m_picIdx[i].bValid)
{
picIdx = m_picIdx[i].ucPicIdx;
CodecHalGetResourceInfo(
m_osInterface,
&(m_refList[picIdx]->sRefReconBuffer));
pipeBufAddrParams.presReferences[i] = &(m_refList[picIdx]->sRefReconBuffer.OsResource);
}
}
// set MFX_SURFACE_STATE values
MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
surfaceParams.Mode = m_mode;
// set MFX_IND_OBJ_BASE_ADDR_STATE values
MOS_ZeroMemory(&indObjBaseAddrParams, sizeof(indObjBaseAddrParams));
indObjBaseAddrParams.Mode = CODECHAL_ENCODE_MODE_VP8;
indObjBaseAddrParams.presMvObjectBuffer = &m_resMbCodeSurface;
indObjBaseAddrParams.dwMvObjectOffset = m_mvOffset + m_mvBottomFieldOffset;
indObjBaseAddrParams.dwMvObjectSize = m_mbCodeSize - m_mvOffset;
indObjBaseAddrParams.presPakBaseObjectBuffer = &m_resBitstreamBuffer;
indObjBaseAddrParams.presDataBuffer = &m_resBitstreamBuffer;
indObjBaseAddrParams.dwPakBaseObjectSize = m_bitstreamUpperBound;
indObjBaseAddrParams.dwDataSize = m_bitstreamUpperBound;
//set MFX_VP8_BSP_BUF_BASE_ADDR_STATE values
MOS_ZeroMemory(&vp8BspBufBaseAddrParams, sizeof(vp8BspBufBaseAddrParams));
vp8BspBufBaseAddrParams.presFrameHeaderBuffer = &m_resFrameHeader;
vp8BspBufBaseAddrParams.presPakIntermediateBuffer = &m_resPakIntermediateBuffer;
vp8BspBufBaseAddrParams.presPakFinalFrameBuffer = &m_resBitstreamBuffer;
vp8BspBufBaseAddrParams.presTokenStatisticsBuffer = &m_mpuTpuBuffers.resPakTokenStatistics;
vp8BspBufBaseAddrParams.presBsdMpcRowStoreScratchBuffer = &m_resMPCRowStoreScratchBuffer;
vp8BspBufBaseAddrParams.dwPakIntermediatePartition0Size = ((m_frameWidth * m_frameHeight) / 4) + INTERMEDIATE_PARTITION0_SIZE;
vp8BspBufBaseAddrParams.dwPakIntermediateTokenSize = (m_frameWidth * m_frameHeight * 2);
vp8BspBufBaseAddrParams.dwPartitions = 1 << (m_vp8PicParams->CodedCoeffTokenPartition);
vp8BspBufBaseAddrParams.presCoeffProbsBuffer = &m_mpuTpuBuffers.resCoeffProbs;
if (m_usRepakPassIterVal > 0 &&
m_pictureCodingType == I_TYPE &&
m_usRepakPassIterVal == m_currPass)
{
// When repak enabled, for I frames during repak pass assign key frame token prob. required by kernel
vp8BspBufBaseAddrParams.presCoeffProbsBuffer = &m_mpuTpuBuffers.resKeyFrameTokenProbability;
}
// Send command buffer header at the beginning
if (!m_brcEnabled)
{
newCommandBufferStarted = true;
}
else
{
if (m_currPass == 0)
{
newCommandBufferStarted = true;
}
else if (m_currPass == m_usRepakPassIterVal && m_usRepakPassIterVal > 0)
{
newCommandBufferStarted = true;
}
}
if (newCommandBufferStarted)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(&cmdBuffer, false));
}
// BRC 2-4th Pass (excludes RePAK)
if (m_brcEnabled &&
m_currPass > 0 &&
(m_currPass < m_usRepakPassIterVal || m_usRepakPassIterVal == 0))
{
// Insert conditional batch buffer end
MOS_ZeroMemory(
&miConditionalBatchBufferEndParams,
sizeof(MHW_MI_CONDITIONAL_BATCH_BUFFER_END_PARAMS));
miConditionalBatchBufferEndParams.presSemaphoreBuffer =
&m_encodeStatusBuf.resStatusBuffer;
miConditionalBatchBufferEndParams.dwOffset =
(m_encodeStatusBuf.wCurrIndex * m_encodeStatusBuf.dwReportSize) +
m_encodeStatusBuf.dwImageStatusMaskOffset +
(sizeof(uint32_t) * 2);
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiConditionalBatchBufferEndCmd(
&cmdBuffer,
&miConditionalBatchBufferEndParams));
}
// RePAK needed for both CQP and BRC
if ((m_usRepakPassIterVal > 0) && (m_currPass == m_usRepakPassIterVal))
{
// Execute RePAK based on decision from TPU kernel
// by using conditional batch buffer end command
MOS_ZeroMemory(
&miConditionalBatchBufferEndParams,
sizeof(MHW_MI_CONDITIONAL_BATCH_BUFFER_END_PARAMS));
miConditionalBatchBufferEndParams.presSemaphoreBuffer =
&m_mpuTpuBuffers.resRepakDecisionSurface;
miConditionalBatchBufferEndParams.dwOffset = 0;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiConditionalBatchBufferEndCmd(
&cmdBuffer,
&miConditionalBatchBufferEndParams));
}
if (!m_currPass && m_osInterface->bTagResourceSync)
{
// This is a short term WA to solve the sync tag issue: the sync tag write for PAK is inserted at the end of 2nd pass PAK BB
// which may be skipped in multi-pass PAK enabled case. The idea here is to insert the previous frame's tag at the beginning
// of the BB and keep the current frame's tag at the end of the BB. There will be a delay for tag update but it should be fine
// as long as Dec/VP/Enc won't depend on this PAK so soon.
MHW_MI_STORE_DATA_PARAMS Params;
PMOS_RESOURCE resGlobalGpuContextSyncTagBuffer = nullptr;
uint32_t dwValue;
CODECHAL_HW_CHK_STATUS_RETURN(m_osInterface->pfnGetGpuStatusBufferResource(
m_osInterface,
resGlobalGpuContextSyncTagBuffer));
CODECHAL_HW_CHK_NULL_RETURN(resGlobalGpuContextSyncTagBuffer);
dwValue = m_osInterface->pfnGetGpuStatusTag(m_osInterface, m_osInterface->CurrentGpuContextOrdinal);
Params.pOsResource = resGlobalGpuContextSyncTagBuffer;
Params.dwResourceOffset = m_osInterface->pfnGetGpuStatusTagOffset(m_osInterface, m_osInterface->CurrentGpuContextOrdinal);
Params.dwValue = (dwValue > 0) ? (dwValue - 1) : 0;
CODECHAL_HW_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiStoreDataImmCmd(&cmdBuffer, &Params));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(StartStatusReport(&cmdBuffer, CODECHAL_NUM_MEDIA_STATES));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMfxInterface()->AddMfxPipeModeSelectCmd(&cmdBuffer, &pipeModeSelectParams));
// Ref surface
surfaceParams.ucSurfaceStateId = CODECHAL_MFX_REF_SURFACE_ID;
surfaceParams.psSurface = &m_reconSurface;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMfxInterface()->AddMfxSurfaceCmd(&cmdBuffer, &surfaceParams));
// Src surface
surfaceParams.ucSurfaceStateId = CODECHAL_MFX_SRC_SURFACE_ID;
surfaceParams.psSurface = m_rawSurfaceToPak;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMfxInterface()->AddMfxSurfaceCmd(&cmdBuffer, &surfaceParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMfxInterface()->AddMfxPipeBufAddrCmd(&cmdBuffer, &pipeBufAddrParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMfxInterface()->AddMfxIndObjBaseAddrCmd(&cmdBuffer, &indObjBaseAddrParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMfxInterface()->AddMfxVp8BspBufBaseAddrCmd(&cmdBuffer, &vp8BspBufBaseAddrParams));
// MMIO register reads from PAK engine, different from PAK statistics buffer used for BrcUpdate kernel input
// save Pak stats into dump buffer BEFORE every PAK pass execution for debugging
CODECHAL_ENCODE_CHK_STATUS_RETURN(
SetPakStatsDebugBuffer(
&cmdBuffer,
&m_brcBuffers.resBrcPakStatsBeforeDumpBuffer,
m_currPass * 48));
// Insert Batch Buffer Start command to MFX_VP8_PIC_STATE and MFX_VP8_ENCODER_CFG and BB end
// Insert Batch Buffer Start command to Pic State command
MOS_ZeroMemory(&batchBuffer, sizeof(batchBuffer));
batchBuffer.OsResource = m_mpuTpuBuffers.resPictureState;
batchBuffer.bSecondLevel = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiBatchBufferStartCmd(
&cmdBuffer,
&batchBuffer));
if (m_brcEnabled)
{
// Insert Batch Buffer Start command to MFX_VP8_ENCODER_CFG Config States
MOS_ZeroMemory(&batchBuffer, sizeof(batchBuffer));
batchBuffer.OsResource = m_brcBuffers.resEncoderCfgCommandWriteBuffer;
if (m_usRepakPassIterVal == 0)
{
//No repak in this case
batchBuffer.dwOffset = m_currPass * BRC_IMG_STATE_SIZE_PER_PASS;
}
else
{
batchBuffer.dwOffset = m_usRepakPassIterVal == m_currPass ? 0 : m_currPass * BRC_IMG_STATE_SIZE_PER_PASS;
}
batchBuffer.bSecondLevel = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiBatchBufferStartCmd(
&cmdBuffer,
&batchBuffer));
}
// Insert Batch Buffer Start command to send VP8_PAK_OBJ data for MBs in this slice
MOS_ZeroMemory(&batchBuffer, sizeof(batchBuffer));
batchBuffer.OsResource = m_resMbCodeSurface;
batchBuffer.bSecondLevel = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiBatchBufferStartCmd(
&cmdBuffer,
&batchBuffer));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
return status;
}
MOS_STATUS CodechalEncodeVp8::SetPakStatsDebugBuffer(PMOS_COMMAND_BUFFER cmdBuffer, PMOS_RESOURCE pResource, uint32_t dwBaseOffset)
{
MhwMiInterface *commonMiInterface;
MHW_MI_STORE_REGISTER_MEM_PARAMS miStoreRegMemParams;
MHW_MI_FLUSH_DW_PARAMS flushDwParams;
MHW_MI_STORE_DATA_PARAMS storeDataParams;
MmioRegistersMfx *mmioRegisters;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(pResource);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
commonMiInterface = m_hwInterface->GetMiInterface();
CODECHAL_ENCODE_CHK_COND_RETURN((m_vdboxIndex > m_hwInterface->GetMfxInterface()->GetMaxVdboxIndex()), "ERROR - vdbox index exceed the maximum");
mmioRegisters = m_hwInterface->SelectVdboxAndGetMmioRegister(m_vdboxIndex, cmdBuffer);
// this is just for dump purpose after each PAK pass
// doesn't have to do with order in CodecHalVp8_EncodeReadPakStatistics
// this order can be changed based on driver need
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = pResource;
miStoreRegMemParams.dwOffset = dwBaseOffset + sizeof(uint32_t) * 0;
miStoreRegMemParams.dwRegister = mmioRegisters->mfcVP8ImageStatusMaskRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = pResource;
miStoreRegMemParams.dwOffset = dwBaseOffset + sizeof(uint32_t) * 1;
miStoreRegMemParams.dwRegister = mmioRegisters->mfcVP8ImageStatusCtrlRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = pResource;
miStoreRegMemParams.dwOffset = dwBaseOffset + sizeof(uint32_t) * 2;
miStoreRegMemParams.dwRegister = mmioRegisters->mfcVP8BitstreamBytecountFrameRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
// Driver needs to read MFX_VP8_PIC_STATUS.DW4 / MFX_VP8_PIC_STATUS.DW5 (DeltaQindex / DeltaLoopFilter reads).
// This would trigger HW to register DeltaQindex / DeltaLoopFilter to be used to update CumulativeDeltaQindex / CumulativeDeltaLoopFilter.
miStoreRegMemParams.presStoreBuffer = pResource;
miStoreRegMemParams.dwOffset = dwBaseOffset + sizeof(uint32_t) * 5;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDQIndex01RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = pResource;
miStoreRegMemParams.dwOffset = dwBaseOffset + sizeof(uint32_t) * 6;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDQIndex23RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = pResource;
miStoreRegMemParams.dwOffset = dwBaseOffset + sizeof(uint32_t) * 7;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDLoopFilter01RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = pResource;
miStoreRegMemParams.dwOffset = dwBaseOffset + sizeof(uint32_t) * 8;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDLoopFilter23RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = pResource;
miStoreRegMemParams.dwOffset = dwBaseOffset + sizeof(uint32_t) * 9;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcConvergenceStatusRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
return status;
}
MOS_STATUS CodechalEncodeVp8::AddBBEndToPicStateCmd()
{
MOS_LOCK_PARAMS lockFlagsWriteOnly;
uint32_t *data;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
//ADD BB End command to PIC_STATE_CMD
MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
lockFlagsWriteOnly.WriteOnly = 1;
data = (uint32_t *)m_osInterface->pfnLockResource(
m_osInterface,
&(m_mpuTpuBuffers.resPictureState),
&lockFlagsWriteOnly);
if (data == nullptr)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock VP8 Pic State CMD.");
return MOS_STATUS_UNKNOWN;
}
data += 38;
*data = 0x05000000; // BATCH Buffer End command.
m_osInterface->pfnUnlockResource(m_osInterface, &m_mpuTpuBuffers.resPictureState);
return status;
}
MOS_STATUS CodechalEncodeVp8::EncodeSliceLevelBrc(PMOS_COMMAND_BUFFER cmdBuffer)
{
MOS_SYNC_PARAMS syncParams;
EncodeReadBrcPakStatsParams readBrcPakStatsParams;
uint32_t dwOffset;
uint32_t *data;
MOS_LOCK_PARAMS lockFlagsWriteOnly;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
dwOffset =
(m_encodeStatusBuf.wCurrIndex * m_encodeStatusBuf.dwReportSize) +
m_encodeStatusBuf.dwNumPassesOffset + // Num passes offset
sizeof(uint32_t) * 2; // pEncodeStatus is offset by 2 DWs in the resource
// Read PaK statistics buffer here for next pass's use
readBrcPakStatsParams.pHwInterface = m_hwInterface;
readBrcPakStatsParams.presBrcPakStatisticBuffer = &m_brcBuffers.resBrcPakStatisticBuffer[0];
readBrcPakStatsParams.VideoContext = m_videoContext;
readBrcPakStatsParams.ucPass = m_currPass;
readBrcPakStatsParams.presStatusBuffer = &m_encodeStatusBuf.resStatusBuffer;
readBrcPakStatsParams.dwStatusBufNumPassesOffset = dwOffset;
// MMIO register reads from PAK engine, different from PAK statistics buffer used for BrcUpdate kernel input
// save Pak stats into dump buffer "AFTER" every pass for debugging
CODECHAL_ENCODE_CHK_STATUS_RETURN(
SetPakStatsDebugBuffer(
cmdBuffer,
&m_brcBuffers.resBrcPakStatsAfterDumpBuffer,
m_currPass * 48));
// LOAD_REG_MEM & STORE_REG_MEM in BRC flow diagram
// LOAD_REG_MEM is only needed for 2nd-4th PAK pass
CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadBrcPakStatistics(
cmdBuffer,
&readBrcPakStatsParams));
MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
lockFlagsWriteOnly.WriteOnly = 1;
data = (uint32_t *)m_osInterface->pfnLockResource(
m_osInterface,
&(m_mpuTpuBuffers.resPictureState),
&lockFlagsWriteOnly);
if (data == nullptr)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock Pic State Read Buffer.");
return MOS_STATUS_UNKNOWN;
}
data += 38;
*data = 0x05000000; // BATCH Buffer End command. Remove me once kernel is fixed.
m_osInterface->pfnUnlockResource(m_osInterface, &m_mpuTpuBuffers.resPictureState);
// Write MFC MMIO register values to Tpu curbe (including cumulative QP & cumulative LF)
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetPakStatsInTpuCurbe(cmdBuffer));
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport( cmdBuffer, CODECHAL_NUM_MEDIA_STATES));
// 4th BRC PAK pass go inside if statement
if (((m_usRepakPassIterVal > 0 && (m_currPass == m_numPasses - 1))) || // Repak enabled, last PAK pass before Repak
(m_usRepakPassIterVal == 0 && m_currPass == m_numPasses)) // Repak disabled, last PAK pass
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(cmdBuffer, nullptr));
// last PAK pass except RePak
std::string pakPassName = "PAK_PASS" + std::to_string(static_cast<uint32_t>(m_currPass));
CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
cmdBuffer,
CODECHAL_NUM_MEDIA_STATES,
pakPassName.data())));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, cmdBuffer, 0);
// MFX should wait for RenderContext aka MPU kernel to finish on the render engine
if (!Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse))
{
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
}
// Submit cmdBuffer at last BRC pass or at in the repak pass if repak is enabled.
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, m_videoContextUsesNullHw));
// send signal from video, last PAK pass except RePAK
if (m_signalEnc && !Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse))
{
// signal semaphore
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
}
}
else // remaining PAK passes
{
std::string pakPassName = "PAK_PASS" + std::to_string(static_cast<uint32_t>(m_currPass));
CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
cmdBuffer,
CODECHAL_NUM_MEDIA_STATES,
pakPassName.data())));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, cmdBuffer, 0);
}
return status;
}
MOS_STATUS CodechalEncodeVp8::ExecuteSliceLevel()
{
MOS_COMMAND_BUFFER cmdBuffer;
MOS_SYNC_PARAMS syncParams;
EncodeReadBrcPakStatsParams readBrcPakStatsParams;
uint32_t *data;
MOS_LOCK_PARAMS lockFlagsWriteOnly;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
// read image status
CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadMfcStatus(&cmdBuffer));
if (m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses() == CODECHAL_ENCODE_BRC_SINGLE_PASS) // Multi-Pass BRC: disabled by default
{
// BRC PAK statistics different for each pass
if (m_brcEnabled)
{
// Read PaK statistics buffer here for next frame's use
readBrcPakStatsParams.pHwInterface = m_hwInterface;
readBrcPakStatsParams.presBrcPakStatisticBuffer = &m_brcBuffers.resBrcPakStatisticBuffer[0];
readBrcPakStatsParams.VideoContext = m_videoContext;
CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadBrcPakStatistics(
&cmdBuffer,
&readBrcPakStatsParams));
MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
lockFlagsWriteOnly.WriteOnly = 1;
data = (uint32_t *)m_osInterface->pfnLockResource(
m_osInterface,
&(m_mpuTpuBuffers.resPictureState),
&lockFlagsWriteOnly);
if (data == nullptr)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC Encoder CFG Read Buffer.");
return MOS_STATUS_UNKNOWN;
}
data += 38;
*data = 0x05000000; // BATCH Buffer End command. Remove me once kernel is fixed.
m_osInterface->pfnUnlockResource(m_osInterface, &m_mpuTpuBuffers.resPictureState);
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport( &cmdBuffer, CODECHAL_NUM_MEDIA_STATES));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
std::string Pak_pass = "PAK_PASS" + std::to_string(static_cast<uint32_t>(m_currPass));
CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&cmdBuffer,
CODECHAL_NUM_MEDIA_STATES,
Pak_pass.data())));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
if (m_brcEnabled)
{
// RePAK waits for TPU kernel execution
if ((m_currPass == 0 || m_currPass == m_usRepakPassIterVal) &&
!Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse))
{
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
}
}
else
{
// MFX should wait for RenderContext
if (!Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse))
{
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
}
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_videoContextUsesNullHw));
if (m_brcEnabled)
{
if ((m_currPass == (m_numPasses - 1) || m_currPass == (m_numPasses)) &&
m_signalEnc &&
!Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse)
)
{
// signal semaphore
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
}
}
else // CQP
{
//Signal TPU on first pak pass and MBEnc in second pak pass if next frame is P
// PAK signals end of execution
// I frame only case also needs to signal RePAK end (ucCurrPass = 1 && GopSize = 1)
// since next frame render engine will always wait
if (m_signalEnc &&
!Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse) &&
((m_currPass == 0) || (m_vp8SeqParams->GopPicSize >= 1)))
{
// signal semaphore
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
}
}
}
else // Multi-Pass BRC: enabled
{
// PAK Passes except RePak
if ((m_brcEnabled) &&
((m_currPass < m_numPasses && m_usRepakPassIterVal > 0) || // Repak enabled
(m_currPass <= m_numPasses && m_usRepakPassIterVal == 0)) // Repak disabled
)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(EncodeSliceLevelBrc(&cmdBuffer));
}
else // CQP PAK pass, RePak pass for CQP & BRC
{
// RePak pass for BRC
if (m_brcEnabled)
{
uint32_t dwOffset;
dwOffset =
(m_encodeStatusBuf.wCurrIndex * m_encodeStatusBuf.dwReportSize) +
m_encodeStatusBuf.dwNumPassesOffset + // Num passes offset
sizeof(uint32_t) * 2; // pEncodeStatus is offset by 2 DWs in the resource
// Read PaK statistics buffer here for next pass's use
readBrcPakStatsParams.pHwInterface = m_hwInterface;
readBrcPakStatsParams.presBrcPakStatisticBuffer = &m_brcBuffers.resBrcPakStatisticBuffer[0];
readBrcPakStatsParams.VideoContext = m_videoContext;
readBrcPakStatsParams.ucPass = m_currPass;
readBrcPakStatsParams.presStatusBuffer = &m_encodeStatusBuf.resStatusBuffer;
readBrcPakStatsParams.dwStatusBufNumPassesOffset = dwOffset;
// LOAD_REG_MEM & STORE_REG_MEM in BRC flow diagram
CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadBrcPakStatistics(
&cmdBuffer,
&readBrcPakStatsParams));
}
//TPU kernel call, CQP Pak pass and Repak pass below
MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
lockFlagsWriteOnly.WriteOnly = 1;
data = (uint32_t *)m_osInterface->pfnLockResource(
m_osInterface,
&(m_mpuTpuBuffers.resPictureState),
&lockFlagsWriteOnly);
if (data == nullptr)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC Picture State Write Buffer.");
return MOS_STATUS_UNKNOWN;
}
data += 38;
*data = 0x05000000; // BATCH Buffer End command. Remove me once kernel is fixed.
m_osInterface->pfnUnlockResource(m_osInterface, &m_mpuTpuBuffers.resPictureState);
CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport( &cmdBuffer, CODECHAL_NUM_MEDIA_STATES));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
std::string pakPassName = "PAK_PASS" + std::to_string(static_cast<uint32_t>(m_currPass));
CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&cmdBuffer,
CODECHAL_NUM_MEDIA_STATES,
pakPassName.data())));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
// MFX should wait for CurrPass 0 and CurrPass 1
if (!Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse))
{
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_videoContextUsesNullHw));
// send signal from video, RePAK
//Signal after every PAK
if (m_signalEnc &&
!Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse))
{
// signal semaphore
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
}
}
}
CODECHAL_DEBUG_TOOL(
if (!m_mmcUserFeatureUpdated) {
CODECHAL_UPDATE_ENCODE_MMC_USER_FEATURE(m_reconSurface, m_osInterface);
m_mmcUserFeatureUpdated = true;
})
// Reset parameters for next PAK execution
if (m_currPass == m_numPasses)
{
m_newPpsHeader = 0;
m_newSeqHeader = 0;
}
//call the TPU kernel only once
if (((m_currPass == m_numPasses - 1) && m_usRepakPassIterVal > 0) || // RePAK enabled: last PAK pass before RePAK
(m_currPass == m_numPasses && m_usRepakPassIterVal == 0)) // RePAK disabled: last PAK pass
{
//call the TPU kernel
m_osInterface->pfnSetGpuContext(m_osInterface, m_renderContext);
m_osInterface->pfnResetOsStates(m_osInterface);
if (!Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse))
{
// TPU kernel waits for PAK execution
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_renderContext;
syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams));
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(TpuKernel());
// if repak is enabled, then need to signal after TPU kernel execution
// m_numPasses >= 1 even when RePak is disabled due to multi-pass BRC
// fix needed since P frame RePAK can be disabled sometimes
if (!Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse))
{
// TPU kernel signals RePAK after execution
syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_renderContext;
syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams));
}
m_osInterface->pfnSetGpuContext(m_osInterface, m_videoContext);
m_osInterface->pfnResetOsStates(m_osInterface);
}
return status;
}
MOS_STATUS CodechalEncodeVp8::ReadImageStatus(PMOS_COMMAND_BUFFER cmdBuffer)
{
MhwMiInterface *commonMiInterface;
EncodeStatusBuffer *encodeStatusBuf;
MHW_MI_STORE_REGISTER_MEM_PARAMS miStoreRegMemParams;
MHW_MI_FLUSH_DW_PARAMS flushDwParams;
uint32_t baseOffset;
MmioRegistersMfx *mmioRegisters;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
commonMiInterface = m_hwInterface->GetMiInterface();
CODECHAL_ENCODE_CHK_COND_RETURN((m_vdboxIndex > m_hwInterface->GetMfxInterface()->GetMaxVdboxIndex()), "ERROR - vdbox index exceed the maximum");
mmioRegisters = m_hwInterface->SelectVdboxAndGetMmioRegister(m_vdboxIndex, cmdBuffer);
commonMiInterface = m_hwInterface->GetMiInterface();
encodeStatusBuf = &m_encodeStatusBuf;
baseOffset =
(encodeStatusBuf->wCurrIndex * m_encodeStatusBuf.dwReportSize) +
sizeof(uint32_t) * 2; // pEncodeStatus is offset by 2 DWs in the resource
miStoreRegMemParams.presStoreBuffer = &encodeStatusBuf->resStatusBuffer;
miStoreRegMemParams.dwOffset = baseOffset + encodeStatusBuf->dwImageStatusMaskOffset;
miStoreRegMemParams.dwRegister = mmioRegisters->mfcVP8ImageStatusMaskRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = &encodeStatusBuf->resStatusBuffer;
miStoreRegMemParams.dwOffset = baseOffset + encodeStatusBuf->dwImageStatusCtrlOffset;
miStoreRegMemParams.dwRegister = mmioRegisters->mfcVP8ImageStatusCtrlRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiFlushDwCmd(cmdBuffer, &flushDwParams));
return status;
}
MOS_STATUS CodechalEncodeVp8::ReadMfcStatus(PMOS_COMMAND_BUFFER cmdBuffer)
{
MhwMiInterface *commonMiInterface;
EncodeStatusBuffer *encodeStatusBuf;
MHW_MI_STORE_REGISTER_MEM_PARAMS miStoreRegMemParams;
MHW_MI_FLUSH_DW_PARAMS flushDwParams;
MmioRegistersMfx *mmioRegisters;
uint32_t baseOffset;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
commonMiInterface = m_hwInterface->GetMiInterface();
CODECHAL_ENCODE_CHK_COND_RETURN((m_vdboxIndex > m_hwInterface->GetMfxInterface()->GetMaxVdboxIndex()), "ERROR - vdbox index exceed the maximum");
mmioRegisters = m_hwInterface->SelectVdboxAndGetMmioRegister(m_vdboxIndex, cmdBuffer);
encodeStatusBuf = &m_encodeStatusBuf;
baseOffset =
(encodeStatusBuf->wCurrIndex * m_encodeStatusBuf.dwReportSize) +
sizeof(uint32_t) * 2; // pEncodeStatus is offset by 2 DWs in the resource
MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiFlushDwCmd(cmdBuffer, &flushDwParams));
miStoreRegMemParams.presStoreBuffer = &encodeStatusBuf->resStatusBuffer;
miStoreRegMemParams.dwOffset = baseOffset + encodeStatusBuf->dwBSByteCountOffset;
miStoreRegMemParams.dwRegister = mmioRegisters->mfcVP8BitstreamBytecountFrameRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadImageStatus(cmdBuffer))
return status;
}
MOS_STATUS CodechalEncodeVp8::ReadBrcPakStatistics(
PMOS_COMMAND_BUFFER cmdBuffer,
EncodeReadBrcPakStatsParams* params)
{
MhwMiInterface *commonMiInterface;
MHW_MI_STORE_REGISTER_MEM_PARAMS miStoreRegMemParams;
MHW_MI_FLUSH_DW_PARAMS flushDwParams;
MHW_MI_STORE_DATA_PARAMS storeDataParams;
MmioRegistersMfx *mmioRegisters;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(params);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->pHwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(params->presBrcPakStatisticBuffer);
commonMiInterface = params->pHwInterface->GetMiInterface();
CODECHAL_ENCODE_CHK_COND_RETURN((m_vdboxIndex > m_hwInterface->GetMfxInterface()->GetMaxVdboxIndex()), "ERROR - vdbox index exceed the maximum");
mmioRegisters = m_hwInterface->SelectVdboxAndGetMmioRegister(m_vdboxIndex, cmdBuffer);
// MI_FLUSH
MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiFlushDwCmd(cmdBuffer, &flushDwParams));
// PAK statistics buffer DW0, DW2, DW4 are used by BrcUpdate kernel exeuction in the next frame
// PAK stats needs to be updated from PAK pass number from (N)th PAK pass N: # of PAK pass executed
if (params->ucPass < m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses())
{
// MI_STORE_DATA_IMM
MOS_ZeroMemory(&storeDataParams, sizeof(storeDataParams));
storeDataParams.pOsResource = params->presBrcPakStatisticBuffer;
storeDataParams.dwResourceOffset = sizeof(uint32_t) * 2;
storeDataParams.dwValue = ((uint32_t)params->ucPass + 1) << 8;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreDataImmCmd(cmdBuffer, &storeDataParams));
}
// MI_STORE_REGISTER_MEM - read from MMIO memory & write to buffer
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = 0;
miStoreRegMemParams.dwRegister = mmioRegisters->mfcVP8BitstreamBytecountFrameRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
// Read following registers as this will trigger HW to register these values
// and update cumulative Qp and LF registers for next pass
// PAK statistics buffer (DW5-6 & DW9-13) is used to write these values
// assuming BrcUpdate kernel doesn't need to use this later
// Driver just need buffer to write these values, but driver doesn't need to use them later
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = sizeof(uint32_t) * 5;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcDQIndexRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = sizeof(uint32_t) * 6;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcDLoopFilterRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
// PAK stats needs to be updated from QP/LF delta values from (N-1)th PAK pass N: # of PAK pass executed
if (params->ucPass == 0) // need to update if # of maximum PAK pass > 2 in the future
{
// MFX_VP8_BRC_CumulativeDQindex01 MMIO register read needs to come after
// MFX_VP8_BRC_DQindex & MFX_VP8_BRC_DLoopFilter MMIO register reads
// otherwise, cumulative QP value will not be read correctly
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = sizeof(uint32_t) * 4;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDQIndex01RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
}
// DW7-8 skipped on purpose since BrcUpdate Kernel started to use DW8 for Golden Ref Suggestion
// dwMfxVP8BrcCumulativeDQIndex01RegOffset: already read with DW4 above
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = sizeof(uint32_t) * 9;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDQIndex01RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = sizeof(uint32_t) * 10;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDQIndex23RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = sizeof(uint32_t) * 11;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDLoopFilter01RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = sizeof(uint32_t) * 12;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDLoopFilter23RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = params->presBrcPakStatisticBuffer;
miStoreRegMemParams.dwOffset = sizeof(uint32_t) * 13;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcConvergenceStatusRegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
return status;
}
MOS_STATUS CodechalEncodeVp8::GetStatusReport(
EncodeStatus *pEncodeStatus,
EncodeStatusReport *pEncodeStatusReport)
{
uint32_t longTermIndication;
uint32_t qindex;
PMOS_RESOURCE pakBuffer;
uint8_t *data;
MOS_LOCK_PARAMS lockFlagsReadOnly;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(pEncodeStatus);
CODECHAL_ENCODE_CHK_NULL_RETURN(pEncodeStatusReport);
pakBuffer = &m_brcBuffers.resBrcPakStatisticBuffer[0];
MOS_ZeroMemory(&lockFlagsReadOnly, sizeof(MOS_LOCK_PARAMS));
lockFlagsReadOnly.ReadOnly = 1;
data = (uint8_t*)m_osInterface->pfnLockResource(m_osInterface, pakBuffer, &lockFlagsReadOnly);
CODECHAL_ENCODE_CHK_NULL_RETURN(data);
longTermIndication = *(data + sizeof(uint32_t) * 8); // reading longterm reference suggestion
qindex = *(data + sizeof(uint32_t) * 4); // reading qindex
qindex = qindex & 0x7f; // masking for 7 bits
m_osInterface->pfnUnlockResource(m_osInterface, pakBuffer);
pEncodeStatusReport->LongTermIndication = (uint8_t)longTermIndication;
pEncodeStatusReport->CodecStatus = CODECHAL_STATUS_SUCCESSFUL;
pEncodeStatusReport->bitstreamSize = pEncodeStatus->dwMFCBitstreamByteCountPerFrame + pEncodeStatus->dwHeaderBytesInserted;
pEncodeStatusReport->AverageQp = (uint8_t)qindex;
// This loop filter value needs to revisit if the app needs to get a right value and do something
pEncodeStatusReport->loopFilterLevel = pEncodeStatus->LoopFilterLevel;
return status;
}
MOS_STATUS CodechalEncodeVp8::SendBrcUpdateSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8BrcUpdateSurfaceParams* params)
{
PMHW_STATE_HEAP_INTERFACE stateHeapInterface;
PMHW_KERNEL_STATE kernelState;
CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams;
struct CodechalBindingTableVp8BrcUpdate* vp8BrcUpdateBindingTable;
uint32_t size;
MOS_RESOURCE *dsh = nullptr;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface()->m_stateHeapInterface);
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(params);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->pMbEncKernelState);
vp8BrcUpdateBindingTable = &m_brcUpdateBindingTable;
stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
kernelState = params->pKernelState;
// 0. BRC history buffer
size = ENCODE_VP8_BRC_HISTORY_BUFFER_SIZE;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.presBuffer = params->presBrcHistoryBuffer;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcHistoryBuffer;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.bIsWritable = true;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 1. PAK Statistics buffer
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.presBuffer = params->presBrcPakStatisticBuffer;
surfaceCodecParams.dwSize = params->dwBrcPakStatisticsSize;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcPakStatisticsOutputBuffer;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 2. Encoder CFG command surface - read only
size = BRC_IMG_STATE_SIZE_PER_PASS * 7;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.presBuffer = params->presVp8EncoderCfgCommandWriteBuffer;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcEncoderCfgReadBuffer;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 3. Encoder CFG command surface - write only
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.presBuffer = params->presVp8EncoderCfgCommandWriteBuffer;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcEncoderCfgWriteBuffer;
surfaceCodecParams.bIsWritable = true;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 4. BRC ENC CURBE Buffer - read only
size = MOS_ALIGN_CEIL(
params->pMbEncKernelState->KernelParams.iCurbeLength,
stateHeapInterface->pStateHeapInterface->GetCurbeAlignment());
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = params->pMbEncKernelState->m_dshRegion.GetResource());
surfaceCodecParams.presBuffer = dsh;
surfaceCodecParams.dwOffset =
params->pMbEncKernelState->m_dshRegion.GetOffset() +
params->pMbEncKernelState->dwCurbeOffset;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcMbEncCurbeReadBuffer;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 5. BRC ENC CURBE Buffer - write only
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = params->pMbEncKernelState->m_dshRegion.GetResource());
surfaceCodecParams.presBuffer = dsh;
surfaceCodecParams.dwOffset =
params->pMbEncKernelState->m_dshRegion.GetOffset() +
params->pMbEncKernelState->dwCurbeOffset;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcMbEncCurbeWriteData;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bIsWritable = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 6. VP8_ME BRC Distortion data buffer - input/output
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.psSurface = (params->wPictureCodingType == I_TYPE) ?
params->psMeBrcDistortionBuffer : params->ps4xMeDistortionBuffer;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcDistortionBuffer;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 7. BRC Constant Data Surface
size = BRC_CONSTANTSURFACE_VP8;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.presBuffer = params->presVp8BrcConstantDataBuffer;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcConstantData;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 8. Segmap surface - Enable this when Segmentation is enabled
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.psSurface = params->psSegmentationMap;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwVp8BrcSegmentationMap;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 9. BRC Mpu CURBE Buffer - read only
size = MOS_ALIGN_CEIL(
m_mpuKernelState.KernelParams.iCurbeLength,
stateHeapInterface->pStateHeapInterface->GetCurbeAlignment());
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = m_mpuKernelState.m_dshRegion.GetResource());
surfaceCodecParams.presBuffer = dsh;
surfaceCodecParams.dwOffset =
m_mpuKernelState.m_dshRegion.GetOffset() +
m_mpuKernelState.dwCurbeOffset;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcMpuCurbeReadBuffer;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 10. BRC Mpu CURBE Buffer - write only
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
memset(&dsh, 0, sizeof(dsh));
CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = m_mpuKernelState.m_dshRegion.GetResource());
surfaceCodecParams.presBuffer = dsh;
surfaceCodecParams.dwOffset =
m_mpuKernelState.m_dshRegion.GetOffset() +
m_mpuKernelState.dwCurbeOffset;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcMpuCurbeWriteData;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bIsWritable = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 11. BRC Tpu CURBE Buffer - read only
size = MOS_ALIGN_CEIL(
m_tpuKernelState.KernelParams.iCurbeLength,
stateHeapInterface->pStateHeapInterface->GetCurbeAlignment());
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
memset(&dsh, 0, sizeof(dsh));
CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = m_tpuKernelState.m_dshRegion.GetResource());
surfaceCodecParams.presBuffer = dsh;
surfaceCodecParams.dwOffset =
m_tpuKernelState.m_dshRegion.GetOffset() +
m_tpuKernelState.dwCurbeOffset;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcTpuCurbeReadBuffer;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// 12. BRC Tpu CURBE Buffer - write only
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
memset(&dsh, 0, sizeof(dsh));
CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = m_tpuKernelState.m_dshRegion.GetResource());
surfaceCodecParams.presBuffer = dsh;
surfaceCodecParams.dwOffset =
m_tpuKernelState.m_dshRegion.GetOffset() +
m_tpuKernelState.dwCurbeOffset;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8BrcUpdateBindingTable->dwBrcTpuCurbeWriteData;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bIsWritable = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
return status;
}
MOS_STATUS CodechalEncodeVp8::SendMeSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8MeSurfaceParams* params)
{
PMOS_SURFACE scaledSurface, meMvDataBuffer;
uint32_t width, height;
uint8_t lastRefPicIdx, goldenRefPicIdx, alternateRefPicIdx, scaledIdx;
PMHW_KERNEL_STATE kernelState;
CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams;
struct CodechalBindingTableVp8Me* vp8MeBindingTable;
CODECHAL_MEDIA_STATE_TYPE encMediaStateType;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(params);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps4xMeMvDataBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps16xMeMvDataBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->pMeBindingTable);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState);
kernelState = params->pKernelState;
encMediaStateType = params->b16xMeInUse ? CODECHAL_MEDIA_STATE_16X_ME : CODECHAL_MEDIA_STATE_4X_ME;
vp8MeBindingTable = params->pMeBindingTable;
lastRefPicIdx = CODECHAL_ENCODE_VP8_INVALID_PIC_ID;
goldenRefPicIdx = CODECHAL_ENCODE_VP8_INVALID_PIC_ID;
alternateRefPicIdx = CODECHAL_ENCODE_VP8_INVALID_PIC_ID;
if (!CodecHal_PictureIsInvalid(*params->pLastRefPic))
{
lastRefPicIdx = params->pLastRefPic->FrameIdx;
}
if (!CodecHal_PictureIsInvalid(*params->pGoldenRefPic))
{
goldenRefPicIdx = params->pGoldenRefPic->FrameIdx;
}
if (!CodecHal_PictureIsInvalid(*params->pAlternateRefPic))
{
alternateRefPicIdx = params->pAlternateRefPic->FrameIdx;
}
if (params->b16xMeInUse)
{
scaledSurface = m_trackedBuf->Get16xDsSurface(CODEC_CURR_TRACKED_BUFFER);
meMvDataBuffer = params->ps16xMeMvDataBuffer;
}
else
{
scaledSurface = m_trackedBuf->Get4xDsSurface(CODEC_CURR_TRACKED_BUFFER);
meMvDataBuffer = params->ps4xMeMvDataBuffer;
}
width = params->dwDownscaledWidthInMb * 32;
width = MOS_ALIGN_CEIL(width, 64);
height = params->dwDownscaledHeightInMb * 4 * CODECHAL_VP8_ME_ME_DATA_SIZE_MULTIPLIER;
// Force the values
meMvDataBuffer->dwWidth = width;
meMvDataBuffer->dwHeight = height;
meMvDataBuffer->dwPitch = width;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.psSurface = meMvDataBuffer;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MEMVDataSurface;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Insert 16xMe Mv Buffer when 16xMe is enabled
if (params->b16xMeEnabled)
{
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.psSurface = params->ps16xMeMvDataBuffer;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp816xMEMVDataSurface;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
// Insert Distortion buffers only for 4xMe case
if (!params->b16xMeInUse)
{
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.psSurface = params->psMeDistortionBuffer;
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeDist;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value;
surfaceCodecParams.bIsWritable = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.psSurface = params->psMeBrcDistortionBuffer; // Using the Distortion buffer only, not yet allocated the BRC specifc distortion buffer
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeBrcDist;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value;
surfaceCodecParams.bIsWritable = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
// Current Picture - VME Inter Prediction Surface
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = scaledSurface;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeCurrPic;
surfaceCodecParams.ucVDirection = g_cMhw_VDirection[MHW_FRAME];
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Refctrl uses 3 bits- bit zero is Last ref, bit 1 is golden ref and bit 2 is alt ref
//Last - set this ref surface only for appropriate RefCtrl value
scaledIdx = params->ppRefList[lastRefPicIdx]->ucScalingIdx;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = params->b16xMeInUse ? m_trackedBuf->Get16xDsSurface(scaledIdx) : m_trackedBuf->Get4xDsSurface(scaledIdx);
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceCodecParams.ucVDirection = g_cMhw_VDirection[MHW_FRAME];
switch (params->RefCtrl)
{
case 1:
case 3:
case 5:
case 7:
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeRef1Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
}
//Golden- set this ref surface only for appropriate RefCtrl value
scaledIdx = params->ppRefList[goldenRefPicIdx]->ucScalingIdx;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = params->b16xMeInUse ? m_trackedBuf->Get16xDsSurface(scaledIdx) : m_trackedBuf->Get4xDsSurface(scaledIdx);
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceCodecParams.ucVDirection = g_cMhw_VDirection[MHW_FRAME];
switch (params->RefCtrl)
{
case 2:
case 6:
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeRef1Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
case 3:
case 7:
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeRef2Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
}
//Alt Ref- set this ref surface only for appropriate RefCtrl value
scaledIdx = params->ppRefList[alternateRefPicIdx]->ucScalingIdx;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = params->b16xMeInUse ? m_trackedBuf->Get16xDsSurface(scaledIdx) : m_trackedBuf->Get4xDsSurface(scaledIdx);
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceCodecParams.ucVDirection = g_cMhw_VDirection[MHW_FRAME];
switch (params->RefCtrl)
{
case 4:
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeRef1Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
case 5:
case 6:
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeRef2Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
case 7:
surfaceCodecParams.dwBindingTableOffset = vp8MeBindingTable->dwVp8MeRef3Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
}
return status;
}
MOS_STATUS CodechalEncodeVp8::SendTpuSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8TpuSurfaceParams* params)
{
uint32_t size;
PMHW_KERNEL_STATE kernelState;
CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams;
struct CodechalBindingTableVp8Tpu* vp8TpuBindingTable;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(params);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState);
vp8TpuBindingTable = &m_tpuBindingTable;
kernelState = params->pKernelState;
// Pak token statistics
size = params->dwPakTokenStatsSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presPakTokenStatistics;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuPakTokenStatistics;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bRawSurface = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Pak token Update flags
size = params->dwTokenProbabilitySize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presPakTokenUpdateFlags;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuTokenUpdateFlags;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Entropy cost
size = params->dwEntropyCostTableSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presEntropyCostTable;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuEntropyCost;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bRawSurface = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Frame header
size = params->dwFrameHeaderSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presFrameHeader;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuFrameHeaderBitstream;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Default token token probability
size = params->dwTokenProbabilitySize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presDefaultTokenProbability;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuDefaultTokenProbability;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Picture state surface
size = params->dwPictureStateSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presPictureState;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuPictureState;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// MPU Curbe info from TPU
size = params->dwMpuCurbeSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presMpuCurbeData;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuMpuCurbeData;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Encoder CFG command surface
size = params->dwHeaderMetadataSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwOffset = params->dwHeaderMetaDataOffset;
surfaceCodecParams.presBuffer = params->presHeaderMetadata;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuHeaderMetaData;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Current frame token probability
size = params->dwTokenProbabilitySize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presCurrFrameTokenProbability;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuTokenProbability;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Hardware token probability pass 1
size = params->dwTokenProbabilitySize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presHwTokenProbabilityPass1;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuPakHardwareTokenProbabilityPass1;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// key frame token probability
size = params->dwTokenProbabilitySize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presKeyFrameTokenProbability;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuKeyFrameTokenProbability;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// update token probability
size = params->dwTokenProbabilitySize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presUpdatedFrameTokenProbability;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuUpdatedTokenProbability;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Hardware token probability pass 2
size = params->dwTokenProbabilitySize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presHwTokenProbabilityPass2;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuPakHardwareTokenProbabilityPass2;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
if (params->bVMEKernelDump)
{
size = params->dwKernelDumpSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.presBuffer = params->presVmeKernelDumpBuffer;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuKernelDebugDump;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
size = params->dwRepakDecision;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presRepakDecisionSurface;
surfaceCodecParams.dwBindingTableOffset = vp8TpuBindingTable->dwVp8TpuRepakDecision;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
return status;
}
MOS_STATUS CodechalEncodeVp8::SendMbEncSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8MbencSurfaceParams* params)
{
uint32_t size;
uint8_t lastRefPicIdx, goldenRefPicIdx, alternateRefPicIdx;
PMHW_KERNEL_STATE kernelState;
CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams;
struct CodechalBindingTableVp8Mbenc* vp8MbEncBindingTable;
MOS_STATUS status = MOS_STATUS_SUCCESS;
uint8_t vdirection, scaledIdx;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(params);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->psCurrPicSurface);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->pMbEncBindingTable);
CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState);
lastRefPicIdx = CODECHAL_ENCODE_VP8_INVALID_PIC_ID;
goldenRefPicIdx = CODECHAL_ENCODE_VP8_INVALID_PIC_ID;
alternateRefPicIdx = CODECHAL_ENCODE_VP8_INVALID_PIC_ID;
vp8MbEncBindingTable = params->pMbEncBindingTable;
m_osInterface = m_hwInterface->GetOsInterface();
kernelState = params->pKernelState;
vdirection = CODECHAL_VDIRECTION_FRAME;
// Per-MB output data buffer
size = params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * 16;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.presBuffer = params->presPerMB_MBCodeOpData;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncMBOut;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Current Picture Y
CodecHalGetResourceInfo(m_osInterface, params->psCurrPicSurface);
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.bUseUVPlane = true;
surfaceCodecParams.psSurface = params->psCurrPicSurface;
surfaceCodecParams.dwOffset = params->dwCurrPicSurfaceOffset;
surfaceCodecParams.dwCacheabilityControl =
m_hwInterface->ComposeSurfaceCacheabilityControl(
MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE,
(codechalL3 | codechalLLC));
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncCurrY;
surfaceCodecParams.dwUVBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncCurrUV;
surfaceCodecParams.dwVerticalLineStride = params->dwVerticalLineStride;
surfaceCodecParams.dwVerticalLineStrideOffset = params->dwVerticalLineStrideOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Current Picture - VME Prediction Surface
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = params->psCurrPicSurface;
surfaceCodecParams.dwOffset = params->dwCurrPicSurfaceOffset;
surfaceCodecParams.dwCacheabilityControl =
m_hwInterface->ComposeSurfaceCacheabilityControl(
MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE,
(codechalL3 | codechalLLC));
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncVME;
surfaceCodecParams.ucVDirection = vdirection;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
if (params->wPictureCodingType == I_TYPE)
{
// MB Mode Cost Luma buffer
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.psSurface = params->psMBModeCostLumaBuffer;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_VP8_L3_LLC_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncMBModeCostLuma;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Block Mode Cost buffer
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.psSurface = params->psBlockModeCostBuffer;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_VP8_L3_LLC_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncBlockModeCost;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Chroma Recon Buffer
size = 64 * params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->psChromaReconBuffer;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_VP8_L3_LLC_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncChromaRecon;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bIsWritable = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Histogram
size = params->dwHistogramSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
//surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.presBuffer = params->presHistogram;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_VP8_HISTOGRAM_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncHistogram;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bRawSurface = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
if (params->bSegmentationEnabled)
{
// Segmentation map
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.psSurface = params->psSegmentationMap;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncSegmentationMap;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
// BRC distortion data buffer for I frame
if (params->bMbEncIFrameDistInUse)
{
// Distortion Surface (output)
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.psSurface = params->psMeBrcDistortionBuffer;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_VP8_L3_LLC_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncBRCDist;
surfaceCodecParams.bIsWritable = true;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// Curr Y downscaled (input)
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.psSurface = m_trackedBuf->Get4xDsSurface(CODEC_CURR_TRACKED_BUFFER);
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MbEncCurrYDownscaled;
surfaceCodecParams.ucVDirection = g_cMhw_VDirection[MHW_FRAME];
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// VME Coarse Intra downscaled (input)
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = m_trackedBuf->Get4xDsSurface(CODEC_CURR_TRACKED_BUFFER);
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncVMECoarseIntra;
surfaceCodecParams.ucVDirection = g_cMhw_VDirection[MHW_FRAME];
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
}
else
{
// P_TYPE
// MV data buffer
size = CODECHAL_GET_WIDTH_IN_MACROBLOCKS(params->dwOriFrameWidth) * CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(params->dwOriFrameHeight) * 64 /*64 * NumMBInFrame*/;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presPerMB_MBCodeOpData;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.dwOffset = params->dwMvOffset;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncIndMVData;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bIsWritable = true;
surfaceCodecParams.bRawSurface = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// VP8_ME MV data buffer
if (params->bHmeEnabled)
{
CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps4xMeMvDataBuffer);
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.psSurface = params->ps4xMeMvDataBuffer;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncMVDataFromME;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
//Reference Frame MB Count
size = sizeof(uint32_t) * 8;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.presBuffer = params->presRefMbCountSurface;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncRefMBCount;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
// VME Inter Prediction Surface
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = params->psCurrPicSurface;
surfaceCodecParams.dwOffset = params->dwCurrPicSurfaceOffset;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncVMEInterPred;
surfaceCodecParams.ucVDirection = vdirection;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
if (!CodecHal_PictureIsInvalid(*params->pLastRefPic))
{
lastRefPicIdx = params->pLastRefPic->FrameIdx;
}
if (!CodecHal_PictureIsInvalid(*params->pGoldenRefPic))
{
goldenRefPicIdx = params->pGoldenRefPic->FrameIdx;
}
if (!CodecHal_PictureIsInvalid(*params->pAlternateRefPic))
{
alternateRefPicIdx = params->pAlternateRefPic->FrameIdx;
}
// Last reference
if (lastRefPicIdx != CODECHAL_ENCODE_VP8_INVALID_PIC_ID)
{
// Picture Y VME
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = &params->ppRefList[lastRefPicIdx]->sRefBuffer;
surfaceCodecParams.ucVDirection = vdirection;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
switch (params->uiRefCtrl)
{
case 1:
case 3:
case 5:
case 7:
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncRef1Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
}
}
// Golden reference
if (goldenRefPicIdx != CODECHAL_ENCODE_VP8_INVALID_PIC_ID)
{
// Picture Y VME
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = &params->ppRefList[goldenRefPicIdx]->sRefBuffer;
surfaceCodecParams.ucVDirection = vdirection;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
switch (params->uiRefCtrl)
{
case 2:
case 6:
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncRef1Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
case 3:
case 7:
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncRef2Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
}
}
// Alternate reference
if (alternateRefPicIdx != CODECHAL_ENCODE_VP8_INVALID_PIC_ID)
{
// Picture Y VME
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bUseAdvState = true;
surfaceCodecParams.psSurface = &params->ppRefList[alternateRefPicIdx]->sRefBuffer;
surfaceCodecParams.ucVDirection = vdirection;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
switch (params->uiRefCtrl)
{
case 4:
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncRef1Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
case 5:
case 6:
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncRef2Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
case 7:
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncRef3Pic;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
break;
}
}
//Per MB Quant Data Surface
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.psSurface = params->psPerMBQuantDataBuffer;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncPerMBQuantDataP;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bIsWritable = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
if (params->bSegmentationEnabled)
{
//Per Segmentation Map
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.psSurface = params->psSegmentationMap;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncSegmentationMap;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
//Inter Prediction Distortion Surface
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.bIs2DSurface = true;
surfaceCodecParams.psSurface = params->psInterPredictionDistortionSurface;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8InterPredDistortion;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
//Per MV Data Surface
size = params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * 16;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.bMediaBlockRW = true;
surfaceCodecParams.presBuffer = params->presPerMVDataSurface;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8PerMVDataSurface;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
//MB/MV Counter Surface, initialize to zero
size = params->dwHistogramSize;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presHistogram;
surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_VP8_HISTOGRAM_ENCODE].Value;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBEncHistogram;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bRawSurface = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
//Mode Cost Update Surface, 64 bytes
size = CODECHAL_VP8_MODE_COST_SURFACE_SIZE;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.dwSize = size;
surfaceCodecParams.presBuffer = params->presModeCostUpdateSurface;
surfaceCodecParams.dwBindingTableOffset = vp8MbEncBindingTable->dwVp8MBModeCostUpdateSurface;
surfaceCodecParams.bRenderTarget = true;
surfaceCodecParams.bRawSurface = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
// Kernel Debug Dump surface
if (params->bVMEKernelDump)
{
size = params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * 32;
MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS));
surfaceCodecParams.presBuffer = params->presVmeKernelDumpBuffer;
surfaceCodecParams.dwSize = size;
surfaceCodecParams.dwOffset = params->dwMvOffset;
surfaceCodecParams.dwBindingTableOffset = (params->wPictureCodingType == I_TYPE) ?
vp8MbEncBindingTable->dwVp8MBEncVMEDebugStreamoutI : vp8MbEncBindingTable->dwVp8MBEncVMEDebugStreamoutP;
surfaceCodecParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceCodecParams,
kernelState));
}
return status;
}
MOS_STATUS CodechalEncodeVp8::SetPakStatsInTpuCurbe(PMOS_COMMAND_BUFFER cmdBuffer)
{
MhwMiInterface *commonMiInterface;
PMHW_STATE_HEAP_INTERFACE stateHeapInterface;
MHW_MI_STORE_REGISTER_MEM_PARAMS miStoreRegMemParams;
MHW_MI_FLUSH_DW_PARAMS flushDwParams;
uint32_t baseOffset;
PMOS_RESOURCE presTpuCurbeBuffer;
MHW_MI_STORE_DATA_PARAMS storeDataParams;
MmioRegistersMfx *mmioRegisters;
MOS_RESOURCE *dsh = nullptr;
MOS_STATUS status = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface);
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetMiInterface());
CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface()->m_stateHeapInterface);
commonMiInterface = m_hwInterface->GetMiInterface();
stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface;
CODECHAL_ENCODE_CHK_COND_RETURN((m_vdboxIndex > m_hwInterface->GetMfxInterface()->GetMaxVdboxIndex()), "ERROR - vdbox index exceed the maximum");
mmioRegisters = m_hwInterface->SelectVdboxAndGetMmioRegister(m_vdboxIndex, cmdBuffer);
CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = m_tpuKernelState.m_dshRegion.GetResource());
presTpuCurbeBuffer = dsh;
CODECHAL_ENCODE_CHK_NULL_RETURN(presTpuCurbeBuffer);
baseOffset =
m_tpuKernelState.m_dshRegion.GetOffset() +
m_tpuKernelState.dwCurbeOffset;
MOS_ZeroMemory(&storeDataParams, sizeof(storeDataParams));
storeDataParams.pOsResource = presTpuCurbeBuffer;
storeDataParams.dwResourceOffset = baseOffset + sizeof(uint32_t) * 6;
storeDataParams.dwValue = ((uint32_t)m_currPass + 1) << 8;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreDataImmCmd(cmdBuffer, &storeDataParams));
// TPU curbe needs to be updated from QP/LF delta values from (N-1)th PAK pass N: # of PAK pass executed
if (m_currPass == 0) // need to update if # of maximum PAK pass > 2 in the future
{
MOS_ZeroMemory(&miStoreRegMemParams, sizeof(miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = presTpuCurbeBuffer;
miStoreRegMemParams.dwOffset = baseOffset + sizeof(uint32_t) * 8;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDQIndex01RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = presTpuCurbeBuffer;
miStoreRegMemParams.dwOffset = baseOffset + sizeof(uint32_t) * 9;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDQIndex23RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = presTpuCurbeBuffer;
miStoreRegMemParams.dwOffset = baseOffset + sizeof(uint32_t) * 10;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDLoopFilter01RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
miStoreRegMemParams.presStoreBuffer = presTpuCurbeBuffer;
miStoreRegMemParams.dwOffset = baseOffset + sizeof(uint32_t) * 11;
miStoreRegMemParams.dwRegister = mmioRegisters->mfxVP8BrcCumulativeDLoopFilter23RegOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(commonMiInterface->AddMiStoreRegisterMemCmd(cmdBuffer, &miStoreRegMemParams));
}
return status;
}
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS CodechalEncodeVp8::DumpVp8EncodePicParams(
PCODEC_VP8_ENCODE_PIC_PARAMS picParams)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrPicParams))
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DEBUG_CHK_NULL(picParams);
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << "# DDI Parameters:" << std::endl;
oss << "CurrOriginalPic = " << std::dec << +picParams->CurrOriginalPic.FrameIdx << std::endl;
oss << "CurrReconstructedPic = " << std::dec << +picParams->CurrReconstructedPic.FrameIdx << std::endl;
oss << "LastRefPic = " << std::dec << +picParams->LastRefPic.FrameIdx << std::endl;
oss << "GoldenRefPic = " << std::dec << +picParams->GoldenRefPic.FrameIdx << std::endl;
oss << "AltRefPic = " << std::dec << +picParams->AltRefPic.FrameIdx << std::endl;
oss << "uPicFlags = " << std::dec << +picParams->uPicFlags << std::endl;
oss << "frame_type: " << std::hex << +picParams->frame_type << std::endl;
oss << "version: " << std::hex << +picParams->version << std::endl;
oss << "show_frame: " << std::hex << +picParams->show_frame << std::endl;
oss << "color_space: " << std::hex << +picParams->color_space << std::endl;
oss << "clamping_type: " << std::hex << +picParams->clamping_type << std::endl;
oss << "segmentation_enabled: " << std::hex << +picParams->segmentation_enabled << std::endl;
oss << "update_mb_segmentation_map: " << std::hex << +picParams->update_mb_segmentation_map << std::endl;
oss << "update_segment_feature_data: " << std::hex << +picParams->update_segment_feature_data << std::endl;
oss << "filter_type: " << std::hex << +picParams->filter_type << std::endl;
oss << "loop_filter_adj_enable: " << std::hex << +picParams->loop_filter_adj_enable << std::endl;
oss << "CodedCoeffTokenPartition: " << std::hex << +picParams->CodedCoeffTokenPartition << std::endl;
oss << "refresh_golden_frame: " << std::hex << +picParams->refresh_golden_frame << std::endl;
oss << "refresh_alternate_frame: " << std::hex << +picParams->refresh_alternate_frame << std::endl;
oss << "copy_buffer_to_golden: " << std::hex << +picParams->copy_buffer_to_golden << std::endl;
oss << "copy_buffer_to_alternate: " << std::hex << +picParams->copy_buffer_to_alternate << std::endl;
oss << "sign_bias_golden: " << std::hex << +picParams->sign_bias_golden << std::endl;
oss << "sign_bias_alternate: " << std::hex << +picParams->sign_bias_alternate << std::endl;
oss << "refresh_entropy_probs: " << std::hex << +picParams->refresh_entropy_probs << std::endl;
oss << "refresh_last: " << std::hex << +picParams->refresh_last << std::endl;
oss << "mb_no_coeff_skip: " << std::hex << +picParams->mb_no_coeff_skip << std::endl;
oss << "forced_lf_adjustment: " << std::hex << +picParams->forced_lf_adjustment << std::endl;
oss << "ref_frame_ctrl: " << std::hex << +picParams->ref_frame_ctrl << std::endl;
for (uint8_t i = 0; i < 4; ++i)
{
oss << "loop_filter_level[" << +i << "]: " << std::hex << +picParams->loop_filter_level[i] << std::endl;
}
for (uint8_t i = 0; i < 4; ++i)
{
oss << "ref_lf_delta[" << +i << "]: " << std::hex << +picParams->ref_lf_delta[i] << std::endl;
}
for (uint8_t i = 0; i < 4; ++i)
{
oss << "mode_lf_delta[" << +i << "]: " << std::hex << +picParams->mode_lf_delta[i] << std::endl;
}
oss << "sharpness_level: " << std::hex << +picParams->sharpness_level << std::endl;
oss << "StatusReportFeedbackNumber: " << std::hex << +picParams->StatusReportFeedbackNumber << std::endl;
oss << "ClampQindexHigh: " << std::hex << +picParams->ClampQindexHigh << std::endl;
oss << "ClampQindexLow: " << std::hex << +picParams->ClampQindexLow << std::endl;
oss << "temporal_id: " << std::hex << +picParams->temporal_id << std::endl;
const char * fileName = m_debugInterface->CreateFileName(
"_ENC",
CodechalDbgBufferType::bufPicParams,
CodechalDbgExtType::txt);
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalEncodeVp8::DumpVp8EncodeSeqParams(
PCODEC_VP8_ENCODE_SEQUENCE_PARAMS seqParams)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrSeqParams))
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DEBUG_CHK_NULL(seqParams);
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << "# DDI Parameters:" << std::endl;
oss << "FrameWidth = " << std::dec << +seqParams->FrameWidth << std::endl;
oss << "FrameWidthScale = " << std::dec << +seqParams->FrameWidthScale << std::endl;
oss << "FrameHeight = " << std::dec << +seqParams->FrameHeight << std::endl;
oss << "FrameHeightScale = " << std::dec << +seqParams->FrameHeightScale << std::endl;
oss << "GopPicSize = " << std::dec << +seqParams->GopPicSize << std::endl;
oss << "TargetUsage = " << std::dec << +seqParams->TargetUsage << std::endl;
oss << "RateControlMethod = " << std::dec << +seqParams->RateControlMethod << std::endl;
oss << "TargetBitRate = " << std::dec << +seqParams->TargetBitRate[0] << std::endl;
oss << "MaxBitRate = " << std::dec << +seqParams->MaxBitRate << std::endl;
oss << "MinBitRate = " << std::dec << +seqParams->MinBitRate << std::endl;
oss << "InitVBVBufferFullnessInBit = " << +seqParams->InitVBVBufferFullnessInBit << std::endl;
oss << "VBVBufferSizeInBit = " << std::dec << +seqParams->VBVBufferSizeInBit << std::endl;
// begining of union/struct
oss << "# bResetBRC = " << std::dec << +seqParams->ResetBRC << std::endl;
oss << "# bNoFrameHeaderInsertion = " << std::dec << +seqParams->NoFrameHeaderInsertion << std::endl;
// Next 5 fields not currently implemented. nullptr output
oss << "# UseRawReconRef = " << std::dec << +seqParams->UseRawReconRef << std::endl;
oss << "# MBBRC = " << std::dec << +seqParams->MBBRC << std::endl;
oss << "# bReserved = " << std::dec << +seqParams->bReserved << std::endl;
oss << "# sFlags = " << std::dec << +seqParams->sFlags << std::endl;
// end of union/struct
oss << "UserMaxFrameSize = " << std::dec << +seqParams->UserMaxFrameSize << std::endl;
oss << "FramesPer100Sec = " << std::dec << +seqParams->FramesPer100Sec[0] << std::endl;
const char * fileName = m_debugInterface->CreateFileName(
"_DDIEnc",
CodechalDbgBufferType::bufSeqParams,
CodechalDbgExtType::txt);
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
if (m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDriverUltDump))
{
if (!m_debugInterface->m_ddiFileName.empty())
{
std::ofstream ofs(m_debugInterface->m_ddiFileName, std::ios::app);
ofs << "SeqParamFile"
<< " = \"" << m_debugInterface->m_fileName << "\"" << std::endl;
ofs.close();
}
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalEncodeVp8::DumpMbEncPakOutput(PCODEC_REF_LIST currRefList, CodechalDebugInterface* debugInterface)
{
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(currRefList);
CODECHAL_ENCODE_CHK_NULL_RETURN(debugInterface);
CODECHAL_ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
&currRefList->resRefMbCodeBuffer,
CodechalDbgAttr::attrOutput,
"MbCode",
m_picWidthInMb * m_picHeightInMb * 16 * 4,
0,
CODECHAL_MEDIA_STATE_ENC_NORMAL));
CODECHAL_ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
&currRefList->resRefMbCodeBuffer,
CodechalDbgAttr::attrOutput,
"MVData",
m_picWidthInMb * m_picHeightInMb * 16 * 4,
m_mvOffset,
CODECHAL_MEDIA_STATE_ENC_NORMAL));
return MOS_STATUS_SUCCESS;
}
#endif