blob: d4394cf0beb91a12fc42d0b066287f0a6dbefd3c [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
James Zerne1cbb132018-08-22 14:10:36 -070012#ifndef AOM_AV1_ENCODER_ENCODEMB_H_
13#define AOM_AV1_ENCODER_ENCODEMB_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070014
Tom Finegan60e653d2018-05-22 11:34:58 -070015#include "config/aom_config.h"
16
Yaowu Xud6ea71c2016-11-07 10:24:14 -080017#include "av1/common/onyxc_int.h"
Xing Jinbd91e942018-06-21 13:43:17 +080018#include "av1/common/txb_common.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070019#include "av1/encoder/block.h"
Angie Chiang5b5f4df2017-12-06 10:41:12 -080020#include "av1/encoder/tokenize.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070021#ifdef __cplusplus
22extern "C" {
23#endif
24
25struct optimize_ctx {
Wan-Teh Chang660f8ed2018-05-11 17:28:08 -070026 ENTROPY_CONTEXT ta[MAX_MB_PLANE][MAX_MIB_SIZE];
27 ENTROPY_CONTEXT tl[MAX_MB_PLANE][MAX_MIB_SIZE];
Yaowu Xuc27fc142016-08-22 16:08:15 -070028};
29
30struct encode_b_args {
Michelle Findlay-Olynykfbab0622017-12-13 14:10:56 -080031 const struct AV1_COMP *cpi;
Yaowu Xuc27fc142016-08-22 16:08:15 -070032 MACROBLOCK *x;
33 struct optimize_ctx *ctx;
34 int8_t *skip;
35 ENTROPY_CONTEXT *ta;
36 ENTROPY_CONTEXT *tl;
37 int8_t enable_optimize_b;
38};
39
Satish Kumar Suman4667aa12018-12-14 18:28:19 +053040enum {
Yaowu Xuf883b422016-08-30 14:01:10 -070041 AV1_XFORM_QUANT_FP = 0,
42 AV1_XFORM_QUANT_B = 1,
43 AV1_XFORM_QUANT_DC = 2,
Debargha Mukherjeef0305582016-11-24 09:55:34 -080044 AV1_XFORM_QUANT_SKIP_QUANT,
45 AV1_XFORM_QUANT_TYPES,
Satish Kumar Suman4667aa12018-12-14 18:28:19 +053046} UENUM1BYTE(AV1_XFORM_QUANT);
Yaowu Xuc27fc142016-08-22 16:08:15 -070047
Michelle Findlay-Olynykfbab0622017-12-13 14:10:56 -080048void av1_encode_sb(const struct AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize,
49 int mi_row, int mi_col, RUN_TYPE dry_run);
Urvang Joshi10df0322018-07-31 14:03:30 -070050
51void av1_foreach_transformed_block_in_plane(
52 const MACROBLOCKD *const xd, BLOCK_SIZE bsize, int plane,
53 foreach_transformed_block_visitor visit, void *arg);
54
55void av1_foreach_transformed_block(const MACROBLOCKD *const xd,
56 BLOCK_SIZE bsize, int mi_row, int mi_col,
57 foreach_transformed_block_visitor visit,
58 void *arg, const int num_planes);
59
Angie Chiangff6d8902016-10-21 11:02:09 -070060void av1_encode_sby_pass1(AV1_COMMON *cm, MACROBLOCK *x, BLOCK_SIZE bsize);
Urvang Joshi10df0322018-07-31 14:03:30 -070061
Angie Chiangff6d8902016-10-21 11:02:09 -070062void av1_xform_quant(const AV1_COMMON *cm, MACROBLOCK *x, int plane, int block,
63 int blk_row, int blk_col, BLOCK_SIZE plane_bsize,
Peng Bin130cf1d2018-06-07 13:34:26 +080064 TX_SIZE tx_size, TX_TYPE tx_type,
65 AV1_XFORM_QUANT xform_quant_idx);
Yaowu Xuc27fc142016-08-22 16:08:15 -070066
Michelle Findlay-Olynykfbab0622017-12-13 14:10:56 -080067int av1_optimize_b(const struct AV1_COMP *cpi, MACROBLOCK *mb, int plane,
Xing Jinbd91e942018-06-21 13:43:17 +080068 int block, TX_SIZE tx_size, TX_TYPE tx_type,
69 const TXB_CTX *const txb_ctx, int fast_mode, int *rate_cost);
Yaowu Xuc27fc142016-08-22 16:08:15 -070070
Angie Chiang62e54cd2017-04-06 10:45:56 -070071void av1_subtract_txb(MACROBLOCK *x, int plane, BLOCK_SIZE plane_bsize,
72 int blk_col, int blk_row, TX_SIZE tx_size);
73
Yaowu Xuf883b422016-08-30 14:01:10 -070074void av1_subtract_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane);
Yaowu Xuc27fc142016-08-22 16:08:15 -070075
Hui Sudb0301e2018-04-02 10:57:21 -070076static INLINE void av1_set_txb_context(MACROBLOCK *x, int plane, int block,
77 TX_SIZE tx_size, ENTROPY_CONTEXT *a,
78 ENTROPY_CONTEXT *l) {
79 const uint8_t ctx = x->plane[plane].txb_entropy_ctx[block];
80 memset(a, ctx, tx_size_wide_unit[tx_size] * sizeof(*a));
81 memset(l, ctx, tx_size_high_unit[tx_size] * sizeof(*l));
82}
Angie Chiang36aca332017-03-23 14:16:24 -070083
Yaowu Xuf883b422016-08-30 14:01:10 -070084void av1_encode_block_intra(int plane, int block, int blk_row, int blk_col,
85 BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg);
Yaowu Xuc27fc142016-08-22 16:08:15 -070086
Michelle Findlay-Olynykfbab0622017-12-13 14:10:56 -080087void av1_encode_intra_block_plane(const struct AV1_COMP *cpi, MACROBLOCK *x,
Angie Chiangff6d8902016-10-21 11:02:09 -070088 BLOCK_SIZE bsize, int plane,
Yaowu Xu4ff59b52017-04-24 12:41:56 -070089 int enable_optimize_b, int mi_row,
90 int mi_col);
Yaowu Xuc27fc142016-08-22 16:08:15 -070091
92#ifdef __cplusplus
93} // extern "C"
94#endif
95
James Zerne1cbb132018-08-22 14:10:36 -070096#endif // AOM_AV1_ENCODER_ENCODEMB_H_