UNPKG

jsvpx

Version:

Javascript implementation of libvpx

669 lines (489 loc) 20.2 kB
'use strict'; var reconintra4x4 = require('./reconintra4x4.js'); var intra_prediction_down_copy = reconintra4x4.intra_prediction_down_copy; var DC_PRED = 0; var V_PRED = 1; var H_PRED = 2; var TM_PRED = 3; var B_PRED = 4; var B_DC_PRED = 0; var B_TM_PRED = 1; var B_VE_PRED = 2; var B_HE_PRED = 3; var B_LD_PRED = 4; var B_RD_PRED = 5; var B_VR_PRED = 6; var B_VL_PRED = 7; var B_HD_PRED = 8; var B_HU_PRED = 9; var idctllm = require('../common/idctllm.js'); var vp8_short_inv_walsh4x4_c = idctllm.vp8_short_inv_walsh4x4_c; var vp8_short_idct4x4llm_c = idctllm.vp8_short_idct4x4llm_c; function CLAMP_255(x) { return Math.min(Math.max(x, 0), 255); } function predict_tm_16x16(predict, predict_off, stride){ predict_tm_nxn(predict, predict_off, stride, 16); } function predict_v_8x8(predict, predict_off, stride) { predict_v_nxn(predict, predict_off, stride, 8); } function predict_h_16x16(predict, predict_off, stride) { predict_h_nxn(predict, predict_off, stride, 16); } function predict_v_16x16(predict, predict_off, stride) { predict_v_nxn(predict, predict_off, stride, 16); } function predict_tm_8x8(predict, predict_off, stride) { predict_tm_nxn(predict, predict_off, stride, 8); } function predict_h_8x8(predict, predict_off, stride) { predict_h_nxn(predict, predict_off, stride, 8); } function predict_tm_8x8(predict, predict_off, stride) { predict_tm_nxn(predict, predict_off, stride, 8); } //likely vp8_build_intra_predictors_mbuv_s function predict_intra_chroma(predict_u, predict_u_off, predict_v, predict_v_off, stride, mbi, coeffs, coeffs_off) { var i = 0; switch (mbi.mbmi.uv_mode) { case DC_PRED: //line84 predict_dc_nxn(predict_u, predict_u_off, stride, 8); predict_dc_nxn(predict_v, predict_v_off, stride, 8); break; case V_PRED: predict_v_8x8(predict_u, predict_u_off, stride); predict_v_8x8(predict_v, predict_v_off, stride); break; case H_PRED: predict_h_8x8(predict_u, predict_u_off, stride); predict_h_8x8(predict_v, predict_v_off, stride); break; case TM_PRED: predict_tm_8x8(predict_u, predict_u_off, stride); predict_tm_8x8(predict_v, predict_v_off, stride); break; default: } coeffs_off += 256; var stride4_8 = stride * 4 - 8; //likely line 178 for (i = 16; i < 20; i++) { vp8_short_idct4x4llm_c(predict_u, predict_u_off, predict_u, predict_u_off, stride, coeffs, coeffs_off); coeffs_off += 16; predict_u_off += 4; if (i & 1) predict_u_off += stride4_8; } for (i = 20; i < 24; i++) { vp8_short_idct4x4llm_c(predict_v, predict_v_off, predict_v, predict_v_off, stride, coeffs, coeffs_off); coeffs_off += 16; predict_v_off += 4; if (i & 1) predict_v_off += stride4_8; } } function predict_v_nxn(predict, predict_off, stride, n) { var above = predict; var above_off = (predict_off - stride) | 0; var i = 0, j = 0; var istride = 0; for (i = 0; i < n; i++) { istride = i * stride; for (j = 0; j < n; j++) predict[predict_off + istride + j] = above[above_off + j]; } } function predict_h_nxn(predict, predict_off, stride, n) { var left = predict; var left_off = (predict_off - 1) | 0; var i = 0; var j = 0; var istride = 0; var predic_pixel = 0; for (i = 0; i < n; i++) { istride = i * stride; predic_pixel = left[left_off + i * stride]; for (j = 0; j < n; j++) predict[predict_off + istride + j] = predic_pixel; } } function predict_dc_nxn(predict, predict_off, stride, n) { n = n | 0; var left = predict; var left_off = predict_off - 1; var above = predict; var above_off = predict_off - stride; var i = 0, j = 0; var dc = 0; for (i = 0; i < n; i++) { dc += left[left_off] + above[above_off + i]; left_off += stride; } switch (n) { case 16: dc = ((dc + 16) >> 5); break; case 8: dc = ((dc + 8) >> 4); break; case 4: dc = ((dc + 4) >> 3); break; } for (i = 0; i < n; i++) for (j = 0; j < n; j++) predict[predict_off + i * stride + j] = dc; } function predict_tm_nxn(predict, predict_off, stride, n) { /* Transposes the left column to the top row for later consumption * by the idct/recon stage */ var left = predict; var left_off = predict_off - 1; var above = predict; var above_off = predict_off - stride; var p = above[above_off - 1]; var i = 0, j = 0; for (j = 0; j < n; j++) { for (i = 0; i < n; i++) predict[predict_off + i] = CLAMP_255(left[left_off] + above[above_off + i] - p);//*left //CLAMP_255 predict_off += stride; left_off += stride; } } //possibly vp8_build_intra_predictors_mby_s function predict_intra_luma(predict, predict_off, stride, mbi, coeffs, coeffs_off) { if (mbi.mbmi.y_mode === B_PRED) b_pred(predict, predict_off, stride, mbi, coeffs, coeffs_off); else { var i = 0; switch (mbi.mbmi.y_mode) { case DC_PRED: predict_dc_nxn(predict, predict_off, stride, 16); break; case V_PRED: predict_v_16x16(predict, predict_off, stride); break; case H_PRED: predict_h_16x16(predict, predict_off, stride); break; case TM_PRED: predict_tm_16x16(predict, predict_off, stride); break; default: } vp8_short_inv_walsh4x4_c(coeffs, coeffs_off + 384, coeffs_off); for (i = 0; i < 16; i++) { vp8_short_idct4x4llm_c(predict, predict_off, predict, predict_off, stride, coeffs, coeffs_off); coeffs_off += 16; predict_off += 4; if ((i & 3) === 3) predict_off += (stride << 2) - 16; } } } //found in reconintra4x4 //likeley line 183 function b_pred(predict, predict_off, stride, mbi, coeffs, coeffs_off) { var i = 0; intra_prediction_down_copy(predict, predict_off, stride); //line 165 in decode frame var modes = mbi.bmi.modes; for (i = 0; i < 16; i++) { var b_predict = predict; var b_predict_off = predict_off + ((i & 3) << 2); switch (modes[i]) { case B_DC_PRED: predict_dc_nxn(b_predict, b_predict_off, stride, 4); break; case B_TM_PRED: predict_tm_nxn(b_predict, b_predict_off, stride, 4); break; case B_VE_PRED: predict_ve_4x4(b_predict, b_predict_off, stride); break; case B_HE_PRED: predict_he_4x4(b_predict, b_predict_off, stride); break; case B_LD_PRED: predict_ld_4x4(b_predict, b_predict_off, stride); break; case B_RD_PRED: predict_rd_4x4(b_predict, b_predict_off, stride); break; case B_VR_PRED: predict_vr_4x4(b_predict, b_predict_off, stride); break; case B_VL_PRED: predict_vl_4x4(b_predict, b_predict_off, stride); break; case B_HD_PRED: predict_hd_4x4(b_predict, b_predict_off, stride); break; case B_HU_PRED: predict_hu_4x4(b_predict, b_predict_off, stride); break; } vp8_short_idct4x4llm_c(b_predict, b_predict_off, b_predict, b_predict_off, stride, coeffs, coeffs_off); coeffs_off += 16; if ((i & 3) === 3) { predict_off += stride * 4; } } } function predict_hd_4x4(predict, predict_off, stride) { var left = predict; var left_off = predict_off - 1; var above = predict; var above_off = predict_off - stride; var pred0 = 0, pred1 = 0, pred2 = 0, pred3 = 0, pred4 = 0, pred5 = 0, pred6 = 0, pred7 = 0, pred8 = 0, pred9 = 0; var abovem1 = above[above_off - 1] | 0; var above0 = above[above_off] | 0; var above1 = above[above_off + 1] | 0; var above2 = above[above_off + 2] | 0; var stride2 = stride << 1; var stride3 = stride * 3; var left0 = left[left_off]|0; var left1 = left[left_off + stride]|0; var left2 = left[left_off + stride2]|0; var left3 = left[left_off + stride3]|0; var pred_32 = predict.data_32; pred0 = (left0 + abovem1 + 1) >> 1; pred1 = (left0 + 2 * abovem1 + above0 + 2) >> 2; pred2 = (above[above_off - 1] + 2 * above0 + above1 + 2) >> 2; pred3 = (above0 + (above1 << 1) + above2 + 2) >> 2; pred_32[predict_off >> 2] = pred0 | (pred1 << 8) | (pred2 << 16) | (pred3 << 24); predict_off += stride; pred4 = (left1 + left0 + 1) >> 1; pred5 = (left1 + 2 * left0 + abovem1 + 2) >> 2; pred_32[predict_off >> 2] = pred4 | (pred5 << 8) | (pred0 << 16) | (pred1 << 24); predict_off += stride; pred6 = (left2 + left1 + 1) >> 1; pred7 = (left2 + 2 * left1 + left0 + 2) >> 2; pred_32[predict_off >> 2] = pred6 | (pred7 << 8) | (pred4 << 16) | (pred5 << 24); predict_off += stride; pred8 = (left3 + left2 + 1) >> 1; pred9 = (left3 + 2 * left2 + left1 + 2) >> 2; pred_32[predict_off >> 2] = pred8 | (pred9 << 8) | (pred6 << 16) | (pred7 << 24); } function predict_vr_4x4(predict, predict_off, stride) { var left = predict; var left_off = predict_off - 1; var above = predict; var above_off = predict_off - stride; var pred0 = 0, pred1 = 0, pred2 = 0, pred3 = 0, pred4 = 0, pred5 = 0, pred6 = 0, pred7 = 0, pred8 = 0, pred9 = 0; var above_32 = above.data_32[above_off >> 2]; var above0 = above_32 & 0xFF; var above1 = (above_32 >> 8) & 0xFF; var above2 = (above_32 >> 16) & 0xFF; var above3 = (above_32 >> 24) & 0xFF; var above_m1 = above[above_off - 1]; var left0 = left[left_off + 0]; pred0 = (above[above_off - 1] + above0 + 1) >> 1; pred1 = (above0 + above1 + 1) >> 1; pred2 = (above1 + above2 + 1) >> 1; pred3 = (above2 + above3 + 1) >> 1; predict.data_32[predict_off >> 2] = pred0 | (pred1 << 8) | (pred2 << 16) | (pred3 << 24); predict_off += stride; pred4 = (left[left_off + 0] + 2 * above_m1 + above0 + 2) >> 2; pred5 = (above_m1 + 2 * above0 + above1 + 2) >> 2; pred6 = (above0 + 2 * above1 + above2 + 2) >> 2; pred7 = (above1 + 2 * above2 + above[above_off + 3] + 2) >> 2; predict.data_32[predict_off >> 2] = pred4 | (pred5 << 8) | (pred6 << 16) | (pred7 << 24); predict_off += stride; pred8 = (left[left_off + stride] + 2 * left0 + above[above_off - 1] + 2) >> 2; predict.data_32[predict_off >> 2] = pred8 | (pred0 << 8) | (pred1 << 16) | (pred2 << 24); predict_off += stride; pred9 = (left[left_off + stride * 2] + 2 * left[left_off + stride] + left0 + 2) >> 2; predict.data_32[predict_off >> 2] = pred9 | (pred4 << 8) | (pred5 << 16) | (pred6 << 24); } function predict_rd_4x4(predict, predict_off, stride) { var left = predict; var left_off = predict_off - 1; var above = predict; var above_off = predict_off - stride; var pred0 = 0, pred1 = 0, pred2 = 0, pred3 = 0, pred4 = 0, pred5 = 0, pred6 = 0; var above_32 = above.data_32[above_off >> 2]; var above0 = above_32 & 0xFF; var above1 = (above_32 >> 8) & 0xFF; var above2 = (above_32 >> 16) & 0xFF; var above3 = (above_32 >> 24) & 0xFF; var left0 = left[left_off]; var left1 = left[left_off + stride]; var left2 = left[left_off + stride * 2]; pred0 = (left[left_off + 0] + 2 * above[above_off - 1] + above0 + 2) >> 2; pred1 = (above[above_off - 1] + 2 * above0 + above1 + 2) >> 2; pred2 = (above0 + 2 * above1 + above2 + 2) >> 2; pred3 = (above1 + 2 * above2 + above3 + 2) >> 2; predict.data_32[predict_off >> 2] = pred0 | (pred1 << 8) | (pred2 << 16) | (pred3 << 24); predict_off += stride; pred4 = (left1 + 2 * left0 + above[above_off - 1] + 2) >> 2; predict.data_32[predict_off >> 2] = pred4 | (pred0 << 8) | (pred1 << 16) | (pred2 << 24); predict_off += stride; pred5 = (left2 + 2 * left1 + left0 + 2) >> 2; predict.data_32[predict_off >> 2] = pred5 | (pred4 << 8) | (pred0 << 16) | (pred1 << 24); predict_off += stride; pred6 = (left[left_off + stride * 3] + 2 * left2 + left1 + 2) >> 2; predict.data_32[predict_off >> 2] = pred6 | (pred5 << 8) | (pred4 << 16) | (pred0 << 24); } function predict_ve_4x4(predict, predict_off, stride) { var above = predict; var above_32 = predict.data_32; var above_off = predict_off - stride; var i = 0, j = 0; var above_temp = above_32[above_off >> 2] | 0; var above0 = above_temp & 0xFF; //above[above_off] | 0;// var above1 = (above_temp >> 8) & 0xFF; //above[above_off + 1] | 0; // var above2 = (above_temp >> 16) & 0xFF; // above[above_off + 2] | 0; // var above3 = (above_temp >> 24) & 0xFF; //above[above_off + 3] | 0;// var pred1 = (above[above_off - 1] + (above0 << 1) + above1 + 2) >> 2; var pred2 = (above0 + (above1 << 1) + above2 + 2) >> 2; var pred3 = (above1 + (above2 << 1) + above3 + 2) >> 2; var pred4 = (above2 + (above3 << 1) + above[above_off + 4] + 2) >> 2; predict.data_32[predict_off >> 2] = pred1 | (pred2 << 8) | (pred3 << 16) | (pred4 << 24); var istride = 0;// i * stride; for (i = 1; i < 4; i++) { istride = i * stride; for (j = 0; j < 4; j++) { predict[predict_off + istride + j] = predict[predict_off + j]; } } } function predict_he_4x4(predict, predict_off, stride) { var left = predict; var left_off = predict_off - 1; var above_32 = predict.data_32; var temp = (left[left_off - stride] + 2 * left[left_off] + left[left_off + stride] + 2) >> 2; above_32[predict_off >> 2] = temp | (temp << 8) | (temp << 16) | (temp << 24); predict_off += stride; left_off += stride; temp = (left[left_off - stride] + 2 * left[left_off] + left[left_off + stride] + 2) >> 2; above_32[predict_off >> 2] = temp | (temp << 8) | (temp << 16) | (temp << 24); predict_off += stride; left_off += stride; temp = (left[left_off - stride] + 2 * left[left_off] + left[left_off + stride] + 2) >> 2; above_32[predict_off >> 2] = temp | (temp << 8) | (temp << 16) | (temp << 24); predict_off += stride; left_off += stride; temp = (left[left_off - stride] + 2 * left[left_off] + left[left_off + 0] + 2) >> 2; above_32[predict_off >> 2] = temp | (temp << 8) | (temp << 16) | (temp << 24); } function predict_hu_4x4(predict, predict_off, stride) { var left = predict; var left_off = predict_off - 1; var pred0 = 0, pred1 = 0, pred2 = 0, pred3 = 0, pred4 = 0, pred5 = 0, pred6 = 0; var stride3 = (stride * 3) | 0; var stride2 = (stride << 1); var left0 = left[left_off]; var left1 = left[left_off + stride]; var left2 = left[left_off + stride * 2]; var left3 = left[left_off + stride * 3]; pred0 = (left0 + left1 + 1) >> 1; pred1 = (left0 + 2 * left1 + left2 + 2) >> 2; pred2 = (left1 + left2 + 1) >> 1; pred3 = (left1 + 2 * left2 + left3 + 2) >> 2; predict.data_32[predict_off >> 2] = pred0 | pred1 << 8 | pred2 << 16 | pred3 << 24; predict_off += stride; //predict[predict_off + 0] = pred2; //predict[predict_off + 1] = pred3; pred4 = (left2 + left3 + 1) >> 1; pred5 = (left2 + 2 * left3 + left3 + 2) >> 2; predict.data_32[predict_off >> 2] = pred2 | pred3 << 8 | pred4 << 16 | pred5 << 24; predict_off += stride; pred6 = left3; predict.data_32[predict_off >> 2] = pred4 | pred5 << 8 | pred6 << 16 | pred6 << 24; predict_off += stride; predict.data_32[predict_off >> 2] = pred6 | pred6 << 8 | pred6 << 16 | pred6 << 24; } function predict_ld_4x4(predict, predict_off, stride) { var above = predict; var above_off = predict_off - stride; var pred0 = 0, pred1 = 0, pred2 = 0, pred3 = 0, pred4 = 0, pred5 = 0, pred6 = 0; var above_32 = predict.data_32; var above_32_value = above_32[above_off >> 2]; var above0 = above_32_value & 0xFF; //above[above_off] | 0; var above1 = (above_32_value >> 8) & 0xFF; // above[above_off + 1] | 0; var above2 = (above_32_value >> 16) & 0xFF; //above[above_off + 2] | 0; var above3 = (above_32_value >> 24) & 0xFF; above_32_value = above_32[(above_off >> 2) + 1]; var above4 = above_32_value & 0xFF; //above[above_off] | 0; var above5 = (above_32_value >> 8) & 0xFF; // above[above_off + 1] | 0; var above6 = (above_32_value >> 16) & 0xFF; //above[above_off + 2] | 0; var above7 = (above_32_value >> 24) & 0xFF; pred0 = (above0 + (above1 << 1) + above2 + 2) >> 2; pred1 = (above1 + (above2 << 1) + above3 + 2) >> 2; pred2 = (above2 + (above3 << 1) + above4 + 2) >> 2; pred3 = (above3 + (above4 << 1) + above5 + 2) >> 2; predict.data_32[predict_off >> 2] = pred0 | (pred1 << 8) | (pred2 << 16) | (pred3 << 24); predict_off += stride; pred4 = (above4 + 2 * above5 + above6 + 2) >> 2; predict.data_32[predict_off >> 2] = pred1 | (pred2 << 8) | (pred3 << 16) | (pred4 << 24); predict_off += stride; pred5 = (above5 + (above6 << 1) + above7 + 2) >> 2; predict.data_32[predict_off >> 2] = pred2 | (pred3 << 8) | (pred4 << 16) | (pred5 << 24); predict_off += stride; pred6 = (above6 + 2 * above7 + above7 + 2) >> 2; predict.data_32[predict_off >> 2] = pred3 | (pred4 << 8) | (pred5 << 16) | (pred6 << 24); } function predict_vl_4x4(predict, predict_off, stride) { var above = predict; var above_off = predict_off - stride; var pred0 = 0, pred1 = 0, pred2 = 0, pred3 = 0, pred4 = 0, pred5 = 0, pred6 = 0, pred7 = 0, pred8 = 0, pred9 = 0; var above_32 = above.data_32[above_off >> 2]; var above0 = above_32 & 0xFF; var above1 = (above_32 >> 8) & 0xFF; var above2 = (above_32 >> 16) & 0xFF; var above3 = (above_32 >> 24) & 0xFF; above_32 = above.data_32[(above_off >> 2) + 1]; var above4 = above_32 & 0xFF; //above[above_off] | 0; var above5 = (above_32 >> 8) & 0xFF; // above[above_off + 1] | 0; var above6 = (above_32 >> 16) & 0xFF; //above[above_off + 2] | 0; var above7 = (above_32 >> 24) & 0xFF; pred0 = (above0 + above1 + 1) >> 1; pred1 = (above1 + above2 + 1) >> 1; pred2 = (above2 + above3 + 1) >> 1; pred3 = (above[above_off + 3] + above4 + 1) >> 1; predict.data_32[predict_off >> 2] = pred0 | pred1 << 8 | pred2 << 16 | pred3 << 24; predict_off += stride; pred4 = (above0 + 2 * above1 + above2 + 2) >> 2; pred5 = (above1 + 2 * above2 + above3 + 2) >> 2; pred6 = (above2 + 2 * above3 + above4 + 2) >> 2; pred7 = (above3 + 2 * above4 + above5 + 2) >> 2; predict.data_32[predict_off >> 2] = pred4 | pred5 << 8 | pred6 << 16 | pred7 << 24; predict_off += stride; pred8 = (above4 + 2 * above5 + above6 + 2) >> 2; predict.data_32[predict_off >> 2] = pred1 | pred2 << 8 | pred3 << 16 | pred8 << 24; predict_off += stride; pred8 = (above5 + 2 * above6 + above7 + 2) >> 2; predict.data_32[predict_off >> 2] = pred5 | pred6 << 8 | pred7 << 16 | pred8 << 24; } module.exports = {}; module.exports.predict_intra_chroma = predict_intra_chroma; module.exports.predict_intra_luma = predict_intra_luma;