Add a hardware compatibility feature
This commit adds an encoder workaround to support better compatibility with a non-compliant hardware vp9 profile 2 decoder. The known issue with this decoder is: The decoder assumes a wrong value, 127 instead of the correct value of 511 and 2047, for any assumed top-left corner pixel in UV planes for 10 and 12 bit, respectively. Such assumed top-left corner pixel is used for INTRA prediction when a real decoded/reconstructed pixel is not avalable, e.g. when it is located inside the row above the top row or inside the column left to the leftest column of a video image. Change-Id: Ic15a938a3107e1b85e96cb7903a5c4220986b99d
This commit is contained in:
@@ -159,3 +159,18 @@ const struct {
|
|||||||
{0, 8 }, // 64X32 - {0b0000, 0b1000}
|
{0, 8 }, // 64X32 - {0b0000, 0b1000}
|
||||||
{0, 0 }, // 64X64 - {0b0000, 0b0000}
|
{0, 0 }, // 64X64 - {0b0000, 0b0000}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
const uint8_t need_top_left[INTRA_MODES] = {
|
||||||
|
0, // DC_PRED
|
||||||
|
0, // V_PRED
|
||||||
|
0, // H_PRED
|
||||||
|
0, // D45_PRED
|
||||||
|
1, // D135_PRED
|
||||||
|
1, // D117_PRED
|
||||||
|
1, // D153_PRED
|
||||||
|
0, // D207_PRED
|
||||||
|
0, // D63_PRED
|
||||||
|
1, // TM_PRED
|
||||||
|
};
|
||||||
|
#endif // CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ extern const TX_SIZE max_txsize_lookup[BLOCK_SIZES];
|
|||||||
extern const BLOCK_SIZE txsize_to_bsize[TX_SIZES];
|
extern const BLOCK_SIZE txsize_to_bsize[TX_SIZES];
|
||||||
extern const TX_SIZE tx_mode_to_biggest_tx_size[TX_MODES];
|
extern const TX_SIZE tx_mode_to_biggest_tx_size[TX_MODES];
|
||||||
extern const BLOCK_SIZE ss_size_lookup[BLOCK_SIZES][2][2];
|
extern const BLOCK_SIZE ss_size_lookup[BLOCK_SIZES][2][2];
|
||||||
|
#if CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
extern const uint8_t need_top_left[INTRA_MODES];
|
||||||
|
#endif // CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -902,4 +902,10 @@ void vp9_read_mode_info(VP9Decoder *const pbi, MACROBLOCKD *xd,
|
|||||||
frame_mvs += cm->mi_cols;
|
frame_mvs += cm->mi_cols;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
if ((xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) &&
|
||||||
|
(xd->above_mi == NULL || xd->left_mi == NULL) &&
|
||||||
|
!is_inter_block(mi) && need_top_left[mi->uv_mode])
|
||||||
|
assert(0);
|
||||||
|
#endif // CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4443,6 +4443,12 @@ static void encode_superblock(VP9_COMP *cpi, ThreadData *td,
|
|||||||
|
|
||||||
if (!is_inter_block(mi)) {
|
if (!is_inter_block(mi)) {
|
||||||
int plane;
|
int plane;
|
||||||
|
#if CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
if ((xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) &&
|
||||||
|
(xd->above_mi == NULL || xd->left_mi == NULL) &&
|
||||||
|
need_top_left[mi->uv_mode])
|
||||||
|
assert(0);
|
||||||
|
#endif // CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
mi->skip = 1;
|
mi->skip = 1;
|
||||||
for (plane = 0; plane < MAX_MB_PLANE; ++plane)
|
for (plane = 0; plane < MAX_MB_PLANE; ++plane)
|
||||||
vp9_encode_intra_block_plane(x, VPXMAX(bsize, BLOCK_8X8), plane, 1);
|
vp9_encode_intra_block_plane(x, VPXMAX(bsize, BLOCK_8X8), plane, 1);
|
||||||
|
|||||||
@@ -1214,6 +1214,11 @@ static int64_t rd_pick_intra_sbuv_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
|
for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
|
||||||
if (!(cpi->sf.intra_uv_mode_mask[max_tx_size] & (1 << mode)))
|
if (!(cpi->sf.intra_uv_mode_mask[max_tx_size] & (1 << mode)))
|
||||||
continue;
|
continue;
|
||||||
|
#if CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
if ((xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) &&
|
||||||
|
(xd->above_mi == NULL || xd->left_mi == NULL) && need_top_left[mode])
|
||||||
|
continue;
|
||||||
|
#endif // CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
xd->mi[0]->uv_mode = mode;
|
xd->mi[0]->uv_mode = mode;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user