pc->sb32_coded = get_binary_prob(cpi->sb32_count[0], cpi->sb32_count[1]);
vp9_write_literal(&header_bc, pc->sb32_coded, 8);
#if CONFIG_LOSSLESS
- vp9_write_bit(&header_bc, cpi->oxcf.lossless);
- if (cpi->oxcf.lossless) {
+ vp9_write_bit(&header_bc, cpi->mb.e_mbd.lossless);
+ if (cpi->mb.e_mbd.lossless) {
pc->txfm_mode = ONLY_4X4;
}
else
#include "vp9/common/vp9_seg_common.h"
#include "vp9/common/vp9_tile_common.h"
#include "vp9/encoder/vp9_tokenize.h"
-#include "vp9_rtcd.h"
+#include "./vp9_rtcd.h"
#include <stdio.h>
#include <math.h>
#include <limits.h>
if (cm->full_pixel)
xd->fullpixel_mask = 0xfffffff8;
}
+#if CONFIG_LOSSLESS
+static void switch_lossless_mode(VP9_COMP *cpi, int lossless) {
+ if (lossless) {
+ cpi->mb.fwd_txm8x4 = vp9_short_walsh8x4_x8;
+ cpi->mb.fwd_txm4x4 = vp9_short_walsh4x4_x8;
+ cpi->mb.e_mbd.inv_txm4x4_1 = vp9_short_inv_walsh4x4_1_x8;
+ cpi->mb.e_mbd.inv_txm4x4 = vp9_short_inv_walsh4x4_x8;
+ cpi->mb.optimize = 0;
+ cpi->common.filter_level = 0;
+ cpi->zbin_mode_boost_enabled = FALSE;
+ cpi->common.txfm_mode = ONLY_4X4;
+ } else {
+ cpi->mb.fwd_txm8x4 = vp9_short_fdct8x4;
+ cpi->mb.fwd_txm4x4 = vp9_short_fdct4x4;
+ cpi->mb.e_mbd.inv_txm4x4_1 = vp9_short_idct4x4llm_1;
+ cpi->mb.e_mbd.inv_txm4x4 = vp9_short_idct4x4llm;
+ }
+}
+#endif
static void encode_frame_internal(VP9_COMP *cpi) {
int mb_row;
vp9_zero(cpi->mb_mv_ref_count);
#endif
+#if CONFIG_LOSSLESS
+ // force lossless mode when Q0 is selected
+ cpi->mb.e_mbd.lossless = (cm->base_qindex == 0 &&
+ cm->y1dc_delta_q == 0 &&
+ cm->uvdc_delta_q == 0 &&
+ cm->uvac_delta_q == 0);
+ switch_lossless_mode(cpi, cpi->mb.e_mbd.lossless);
+#endif
vp9_frame_init_quantizer(cpi);
vp9_initialize_rd_consts(cpi, cm->base_qindex + cm->y1dc_delta_q);
cpi->mb.fwd_txm4x4 = vp9_short_fdct4x4;
#if CONFIG_LOSSLESS
- if (cpi->oxcf.lossless) {
+ if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
cpi->mb.fwd_txm8x4 = vp9_short_walsh8x4_x8;
cpi->mb.fwd_txm4x4 = vp9_short_walsh4x4_x8;
}
cm->filter_level = 0;
}
#if CONFIG_LOSSLESS
- else if (cpi->oxcf.lossless) {
+ else if (cpi->mb.e_mbd.lossless) {
cm->filter_level = 0;
}
#endif
for (Q = 0; Q < QINDEX_RANGE; Q++) {
int qzbin_factor = (vp9_dc_quant(Q, 0) < 148) ? 84 : 80;
-
int qrounding_factor = 48;
-#if CONFIG_LOSSLESS
- if (cpi->oxcf.lossless && Q == 0) {
+ if (Q == 0) {
qzbin_factor = 64;
qrounding_factor = 64;
}
-#endif
-
// dc values
quant_val = vp9_dc_quant(Q, cpi->common.y1dc_delta_q);
invert_quant(cpi->Y1quant[Q] + 0,