vp9_pred_common.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #ifndef VP9_COMMON_VP9_PRED_COMMON_H_
  11. #define VP9_COMMON_VP9_PRED_COMMON_H_
  12. #include "vp9/common/vp9_blockd.h"
  13. #include "vp9/common/vp9_onyxc_int.h"
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. int vp9_get_segment_id(const VP9_COMMON *cm, const uint8_t *segment_ids,
  18. BLOCK_SIZE bsize, int mi_row, int mi_col);
  19. static INLINE int vp9_get_pred_context_seg_id(const MACROBLOCKD *xd) {
  20. const MODE_INFO *const above_mi = xd->above_mi;
  21. const MODE_INFO *const left_mi = xd->left_mi;
  22. const int above_sip = (above_mi != NULL) ?
  23. above_mi->mbmi.seg_id_predicted : 0;
  24. const int left_sip = (left_mi != NULL) ? left_mi->mbmi.seg_id_predicted : 0;
  25. return above_sip + left_sip;
  26. }
  27. static INLINE vp9_prob vp9_get_pred_prob_seg_id(const struct segmentation *seg,
  28. const MACROBLOCKD *xd) {
  29. return seg->pred_probs[vp9_get_pred_context_seg_id(xd)];
  30. }
  31. static INLINE int vp9_get_skip_context(const MACROBLOCKD *xd) {
  32. const MODE_INFO *const above_mi = xd->above_mi;
  33. const MODE_INFO *const left_mi = xd->left_mi;
  34. const int above_skip = (above_mi != NULL) ? above_mi->mbmi.skip : 0;
  35. const int left_skip = (left_mi != NULL) ? left_mi->mbmi.skip : 0;
  36. return above_skip + left_skip;
  37. }
  38. static INLINE vp9_prob vp9_get_skip_prob(const VP9_COMMON *cm,
  39. const MACROBLOCKD *xd) {
  40. return cm->fc->skip_probs[vp9_get_skip_context(xd)];
  41. }
  42. int vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd);
  43. int vp9_get_intra_inter_context(const MACROBLOCKD *xd);
  44. static INLINE vp9_prob vp9_get_intra_inter_prob(const VP9_COMMON *cm,
  45. const MACROBLOCKD *xd) {
  46. return cm->fc->intra_inter_prob[vp9_get_intra_inter_context(xd)];
  47. }
  48. int vp9_get_reference_mode_context(const VP9_COMMON *cm, const MACROBLOCKD *xd);
  49. static INLINE vp9_prob vp9_get_reference_mode_prob(const VP9_COMMON *cm,
  50. const MACROBLOCKD *xd) {
  51. return cm->fc->comp_inter_prob[vp9_get_reference_mode_context(cm, xd)];
  52. }
  53. int vp9_get_pred_context_comp_ref_p(const VP9_COMMON *cm,
  54. const MACROBLOCKD *xd);
  55. static INLINE vp9_prob vp9_get_pred_prob_comp_ref_p(const VP9_COMMON *cm,
  56. const MACROBLOCKD *xd) {
  57. const int pred_context = vp9_get_pred_context_comp_ref_p(cm, xd);
  58. return cm->fc->comp_ref_prob[pred_context];
  59. }
  60. int vp9_get_pred_context_single_ref_p1(const MACROBLOCKD *xd);
  61. static INLINE vp9_prob vp9_get_pred_prob_single_ref_p1(const VP9_COMMON *cm,
  62. const MACROBLOCKD *xd) {
  63. return cm->fc->single_ref_prob[vp9_get_pred_context_single_ref_p1(xd)][0];
  64. }
  65. int vp9_get_pred_context_single_ref_p2(const MACROBLOCKD *xd);
  66. static INLINE vp9_prob vp9_get_pred_prob_single_ref_p2(const VP9_COMMON *cm,
  67. const MACROBLOCKD *xd) {
  68. return cm->fc->single_ref_prob[vp9_get_pred_context_single_ref_p2(xd)][1];
  69. }
  70. int vp9_get_tx_size_context(const MACROBLOCKD *xd);
  71. static INLINE const vp9_prob *get_tx_probs(TX_SIZE max_tx_size, int ctx,
  72. const struct tx_probs *tx_probs) {
  73. switch (max_tx_size) {
  74. case TX_8X8:
  75. return tx_probs->p8x8[ctx];
  76. case TX_16X16:
  77. return tx_probs->p16x16[ctx];
  78. case TX_32X32:
  79. return tx_probs->p32x32[ctx];
  80. default:
  81. assert(0 && "Invalid max_tx_size.");
  82. return NULL;
  83. }
  84. }
  85. static INLINE const vp9_prob *get_tx_probs2(TX_SIZE max_tx_size,
  86. const MACROBLOCKD *xd,
  87. const struct tx_probs *tx_probs) {
  88. return get_tx_probs(max_tx_size, vp9_get_tx_size_context(xd), tx_probs);
  89. }
  90. static INLINE unsigned int *get_tx_counts(TX_SIZE max_tx_size, int ctx,
  91. struct tx_counts *tx_counts) {
  92. switch (max_tx_size) {
  93. case TX_8X8:
  94. return tx_counts->p8x8[ctx];
  95. case TX_16X16:
  96. return tx_counts->p16x16[ctx];
  97. case TX_32X32:
  98. return tx_counts->p32x32[ctx];
  99. default:
  100. assert(0 && "Invalid max_tx_size.");
  101. return NULL;
  102. }
  103. }
  104. #ifdef __cplusplus
  105. } // extern "C"
  106. #endif
  107. #endif // VP9_COMMON_VP9_PRED_COMMON_H_