Merge changes Idfb71188,Ibe1e72db * changes: build: convert rtcd.sh to perl configure: check for perl
diff --git a/libs.mk b/libs.mk index aa2f409..a5c4b76 100644 --- a/libs.mk +++ b/libs.mk
@@ -236,6 +236,13 @@ --out=$@ $^ CLEAN-OBJS += vpx.def +# Assembly files that are included, but don't define symbols themselves. +# Filtered out to avoid Visual Studio build warnings. +ASM_INCLUDES := \ + third_party/x86inc/x86inc.asm \ + vpx_config.asm \ + vpx_ports/x86_abi_support.asm \ + vpx.$(VCPROJ_SFX): $(CODEC_SRCS) vpx.def obj_int_extract.$(VCPROJ_SFX) @echo " [CREATE] $@" $(qexec)$(GEN_VCPROJ) \ @@ -246,7 +253,8 @@ --proj-guid=DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74 \ --module-def=vpx.def \ --ver=$(CONFIG_VS_VERSION) \ - --out=$@ $(CFLAGS) $^ \ + --out=$@ $(CFLAGS) \ + $(filter-out $(addprefix %, $(ASM_INCLUDES)), $^) \ --src-path-bare="$(SRC_PATH_BARE)" \ PROJECTS-$(BUILD_LIBVPX) += vpx.$(VCPROJ_SFX)
diff --git a/test/vp8_boolcoder_test.cc b/test/vp8_boolcoder_test.cc index 7c6c601..9cd1987 100644 --- a/test/vp8_boolcoder_test.cc +++ b/test/vp8_boolcoder_test.cc
@@ -35,14 +35,14 @@ 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0 }; -void encrypt_buffer(uint8_t *buffer, int size) { - for (int i = 0; i < size; ++i) { +void encrypt_buffer(uint8_t *buffer, size_t size) { + for (size_t i = 0; i < size; ++i) { buffer[i] ^= secret_key[i & 15]; } } void test_decrypt_cb(void *decrypt_state, const uint8_t *input, - uint8_t *output, int count) { + uint8_t *output, int count) { const size_t offset = input - reinterpret_cast<uint8_t*>(decrypt_state); for (int i = 0; i < count; i++) { output[i] = input[i] ^ secret_key[(offset + i) & 15];
diff --git a/test/vp8_decrypt_test.cc b/test/vp8_decrypt_test.cc index b092509..1b5b083 100644 --- a/test/vp8_decrypt_test.cc +++ b/test/vp8_decrypt_test.cc
@@ -26,9 +26,9 @@ 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0 }; -void encrypt_buffer(const uint8_t *src, uint8_t *dst, - int size, int offset = 0) { - for (int i = 0; i < size; ++i) { +void encrypt_buffer(const uint8_t *src, uint8_t *dst, size_t size, + ptrdiff_t offset) { + for (size_t i = 0; i < size; ++i) { dst[i] = src[i] ^ test_key[(offset + i) & 15]; } } @@ -61,7 +61,7 @@ #if CONFIG_DECRYPT std::vector<uint8_t> encrypted(video.frame_size()); - encrypt_buffer(video.cxdata(), &encrypted[0], video.frame_size()); + encrypt_buffer(video.cxdata(), &encrypted[0], video.frame_size(), 0); vp8_decrypt_init di = { test_decrypt_cb, &encrypted[0] }; decoder.Control(VP8D_SET_DECRYPTOR, &di); #endif // CONFIG_DECRYPT
diff --git a/third_party/nestegg/README.webm b/third_party/nestegg/README.webm index 7860a7c..8e3760b 100644 --- a/third_party/nestegg/README.webm +++ b/third_party/nestegg/README.webm
@@ -18,3 +18,7 @@ - fix track_number uint64->uint32 warnings - fix track_scale double->uint64 warning - nestegg_packet_track: fix uint64->uint32 warning +- ne_read_(string|binary|block): normalize size_t usage +- ne_parse: normalize size_t usage +- quiet read related uint64->size_t warnings +- ne_buffer_read: quiet uint64->size_t warning
diff --git a/third_party/nestegg/src/nestegg.c b/third_party/nestegg/src/nestegg.c index 35ce9f1..c7e2b02 100644 --- a/third_party/nestegg/src/nestegg.c +++ b/third_party/nestegg/src/nestegg.c
@@ -694,14 +694,15 @@ { char * str; int r; + const size_t alloc_size = (size_t)length + 1; if (length == 0 || length > LIMIT_STRING) return -1; - str = ne_pool_alloc(length + 1, ctx->alloc_pool); - r = ne_io_read(ctx->io, (unsigned char *) str, length); + str = ne_pool_alloc(alloc_size, ctx->alloc_pool); + r = ne_io_read(ctx->io, (unsigned char *) str, alloc_size - 1); if (r != 1) return r; - str[length] = '\0'; + str[alloc_size - 1] = '\0'; *val = str; return 1; } @@ -711,9 +712,9 @@ { if (length == 0 || length > LIMIT_BINARY) return -1; - val->data = ne_pool_alloc(length, ctx->alloc_pool); - val->length = length; - return ne_io_read(ctx->io, val->data, length); + val->length = (size_t)length; + val->data = ne_pool_alloc(val->length, ctx->alloc_pool); + return ne_io_read(ctx->io, val->data, val->length); } static int @@ -1043,7 +1044,7 @@ ne_read_single_master(ctx, element); continue; } else { - r = ne_read_simple(ctx, element, size); + r = ne_read_simple(ctx, element, (size_t)size); if (r < 0) break; } @@ -1062,7 +1063,7 @@ if (id != ID_VOID && id != ID_CRC32) ctx->log(ctx, NESTEGG_LOG_DEBUG, "unknown element %llx", id); - r = ne_io_read_skip(ctx->io, size); + r = ne_io_read_skip(ctx->io, (size_t)size); if (r != 1) break; } @@ -1151,7 +1152,8 @@ r = ne_read_vint(io, &lace, &length); if (r != 1) return r; - *read += length; + assert(length <= 8); + *read += (size_t)length; sizes[i] = lace; sum = sizes[i]; @@ -1163,7 +1165,8 @@ r = ne_read_svint(io, &slace, &length); if (r != 1) return r; - *read += length; + assert(length <= 8); + *read += (size_t)length; sizes[i] = sizes[i - 1] + slace; sum += sizes[i]; i += 1; @@ -1263,7 +1266,8 @@ if (track_number == 0 || (unsigned int)track_number != track_number) return -1; - consumed += length; + assert(length <= 8); + consumed += (size_t)length; r = ne_read_int(ctx->io, &timecode, 2); if (r != 1) @@ -1307,7 +1311,7 @@ case LACING_XIPH: if (frames == 1) return -1; - r = ne_read_xiph_lacing(ctx->io, block_size, &consumed, frames, frame_sizes); + r = ne_read_xiph_lacing(ctx->io, (size_t)block_size, &consumed, frames, frame_sizes); if (r != 1) return r; break; @@ -1320,7 +1324,7 @@ case LACING_EBML: if (frames == 1) return -1; - r = ne_read_ebml_lacing(ctx->io, block_size, &consumed, frames, frame_sizes); + r = ne_read_ebml_lacing(ctx->io, (size_t)block_size, &consumed, frames, frame_sizes); if (r != 1) return r; break; @@ -1365,9 +1369,9 @@ return -1; } f = ne_alloc(sizeof(*f)); - f->data = ne_alloc(frame_sizes[i]); - f->length = frame_sizes[i]; - r = ne_io_read(ctx->io, f->data, frame_sizes[i]); + f->length = (size_t)frame_sizes[i]; + f->data = ne_alloc(f->length); + r = ne_io_read(ctx->io, f->data, f->length); if (r != 1) { free(f->data); free(f); @@ -1406,7 +1410,8 @@ if (!element) return 1; - r = ne_read_simple(ctx, element, size); + assert((size_t)size == size); + r = ne_read_simple(ctx, element, (size_t)size); if (r != 1) return r; storage = (struct ebml_type *) (ctx->ancestor->data + element->offset); @@ -1600,7 +1605,7 @@ struct sniff_buffer * sb = user_data; int rv = 1; - size_t available = sb->length - sb->offset; + size_t available = sb->length - (size_t)sb->offset; if (available < length) return 0; @@ -2074,7 +2079,7 @@ p += sizes[i]; } *data = p; - *length = sizes[item]; + *length = (size_t)sizes[item]; } else { *data = codec_private.data; *length = codec_private.length;
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 8e454e6..b507c6e 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c
@@ -415,6 +415,8 @@ x->sadperbit16, &num00, &v_fn_ptr, x->nmvjointcost, x->mvcost, ref_mv); + if (tmp_err < INT_MAX) + tmp_err = vp9_get_mvpred_var(x, &tmp_mv, ref_mv, &v_fn_ptr, 1); if (tmp_err < INT_MAX - new_mv_mode_penalty) tmp_err += new_mv_mode_penalty; @@ -439,6 +441,8 @@ &num00, &v_fn_ptr, x->nmvjointcost, x->mvcost, ref_mv); + if (tmp_err < INT_MAX) + tmp_err = vp9_get_mvpred_var(x, &tmp_mv, ref_mv, &v_fn_ptr, 1); if (tmp_err < INT_MAX - new_mv_mode_penalty) tmp_err += new_mv_mode_penalty;
diff --git a/vp9/encoder/vp9_mcomp.c b/vp9/encoder/vp9_mcomp.c index 7d6fd3b..d3a9977 100644 --- a/vp9/encoder/vp9_mcomp.c +++ b/vp9/encoder/vp9_mcomp.c
@@ -98,42 +98,23 @@ } void vp9_init_dsmotion_compensation(MACROBLOCK *x, int stride) { - int len; - int search_site_count = 0; + int len, ss_count = 1; - // Generate offsets for 4 search sites per step. - x->ss[search_site_count].mv.col = 0; - x->ss[search_site_count].mv.row = 0; - x->ss[search_site_count].offset = 0; - search_site_count++; + x->ss[0].mv.col = x->ss[0].mv.row = 0; + x->ss[0].offset = 0; for (len = MAX_FIRST_STEP; len > 0; len /= 2) { - // Compute offsets for search sites. - x->ss[search_site_count].mv.col = 0; - x->ss[search_site_count].mv.row = -len; - x->ss[search_site_count].offset = -len * stride; - search_site_count++; - - // Compute offsets for search sites. - x->ss[search_site_count].mv.col = 0; - x->ss[search_site_count].mv.row = len; - x->ss[search_site_count].offset = len * stride; - search_site_count++; - - // Compute offsets for search sites. - x->ss[search_site_count].mv.col = -len; - x->ss[search_site_count].mv.row = 0; - x->ss[search_site_count].offset = -len; - search_site_count++; - - // Compute offsets for search sites. - x->ss[search_site_count].mv.col = len; - x->ss[search_site_count].mv.row = 0; - x->ss[search_site_count].offset = len; - search_site_count++; + // Generate offsets for 4 search sites per step. + const MV ss_mvs[] = {{-len, 0}, {len, 0}, {0, -len}, {0, len}}; + int i; + for (i = 0; i < 4; ++i) { + search_site *const ss = &x->ss[ss_count++]; + ss->mv = ss_mvs[i]; + ss->offset = ss->mv.row * stride + ss->mv.col; + } } - x->ss_count = search_site_count; + x->ss_count = ss_count; x->searches_per_step = 4; } @@ -728,16 +709,52 @@ best_mv->col; this_mv.row = best_mv->row * 8; this_mv.col = best_mv->col * 8; - if (bestsad == INT_MAX) - return INT_MAX; - - return vfp->vf(what, what_stride, this_offset, in_what_stride, - (unsigned int *)&bestsad) + - use_mvcost ? mv_err_cost(&this_mv, center_mv, - x->nmvjointcost, x->mvcost, x->errorperbit) - : 0; + return bestsad; } +int vp9_get_mvpred_var(const MACROBLOCK *x, + MV *best_mv, + const MV *center_mv, + const vp9_variance_fn_ptr_t *vfp, + int use_mvcost) { + unsigned int bestsad; + MV this_mv; + const MACROBLOCKD *const xd = &x->e_mbd; + const uint8_t *what = x->plane[0].src.buf; + const int what_stride = x->plane[0].src.stride; + const int in_what_stride = xd->plane[0].pre[0].stride; + const uint8_t *base_offset = xd->plane[0].pre[0].buf; + const uint8_t *this_offset = base_offset + (best_mv->row * in_what_stride) + + best_mv->col; + this_mv.row = best_mv->row * 8; + this_mv.col = best_mv->col * 8; + return vfp->vf(what, what_stride, this_offset, in_what_stride, &bestsad) + + (use_mvcost ? mv_err_cost(&this_mv, center_mv, x->nmvjointcost, + x->mvcost, x->errorperbit) : 0); +} + +int vp9_get_mvpred_av_var(const MACROBLOCK *x, + MV *best_mv, + const MV *center_mv, + const uint8_t *second_pred, + const vp9_variance_fn_ptr_t *vfp, + int use_mvcost) { + unsigned int bestsad; + MV this_mv; + const MACROBLOCKD *const xd = &x->e_mbd; + const uint8_t *what = x->plane[0].src.buf; + const int what_stride = x->plane[0].src.stride; + const int in_what_stride = xd->plane[0].pre[0].stride; + const uint8_t *base_offset = xd->plane[0].pre[0].buf; + const uint8_t *this_offset = base_offset + (best_mv->row * in_what_stride) + + best_mv->col; + this_mv.row = best_mv->row * 8; + this_mv.col = best_mv->col * 8; + return vfp->svaf(this_offset, in_what_stride, 0, 0, what, what_stride, + &bestsad, second_pred) + + (use_mvcost ? mv_err_cost(&this_mv, center_mv, x->nmvjointcost, + x->mvcost, x->errorperbit) : 0); +} int vp9_hex_search(const MACROBLOCK *x, MV *ref_mv, @@ -855,182 +872,18 @@ square_num_candidates, square_candidates); }; -// Number of candidates in first hex search -#define FIRST_HEX_CANDIDATES 6 -// Index of previous hex search's best match -#define PRE_BEST_CANDIDATE 6 -// Number of candidates in following hex search -#define NEXT_HEX_CANDIDATES 3 -// Number of candidates in refining search -#define REFINE_CANDIDATES 4 - int vp9_fast_hex_search(const MACROBLOCK *x, MV *ref_mv, int search_param, int sad_per_bit, + int do_init_search, // must be zero for fast_hex const vp9_variance_fn_ptr_t *vfp, int use_mvcost, const MV *center_mv, MV *best_mv) { - const MACROBLOCKD* const xd = &x->e_mbd; - static const MV hex[FIRST_HEX_CANDIDATES] = { - { -1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0} - }; - static const MV next_chkpts[PRE_BEST_CANDIDATE][NEXT_HEX_CANDIDATES] = { - {{ -2, 0}, { -1, -2}, {1, -2}}, - {{ -1, -2}, {1, -2}, {2, 0}}, - {{1, -2}, {2, 0}, {1, 2}}, - {{2, 0}, {1, 2}, { -1, 2}}, - {{1, 2}, { -1, 2}, { -2, 0}}, - {{ -1, 2}, { -2, 0}, { -1, -2}} - }; - static const MV neighbors[REFINE_CANDIDATES] = { - {0, -1}, { -1, 0}, {1, 0}, {0, 1} - }; - int i, j; - - const uint8_t *what = x->plane[0].src.buf; - const int what_stride = x->plane[0].src.stride; - const int in_what_stride = xd->plane[0].pre[0].stride; - int br, bc; - MV this_mv; - unsigned int bestsad = 0x7fffffff; - unsigned int thissad; - const uint8_t *base_offset; - const uint8_t *this_offset; - int k = -1; - int best_site = -1; - const int max_hex_search = 512; - const int max_dia_search = 32; - - const int *mvjsadcost = x->nmvjointsadcost; - int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; - - const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; - - // Adjust ref_mv to make sure it is within MV range - clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); - br = ref_mv->row; - bc = ref_mv->col; - - // Check the start point - base_offset = xd->plane[0].pre[0].buf; - this_offset = base_offset + (br * in_what_stride) + bc; - this_mv.row = br; - this_mv.col = bc; - bestsad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 0x7fffffff) - + mvsad_err_cost(&this_mv, &fcenter_mv, mvjsadcost, mvsadcost, - sad_per_bit); - - // Initial 6-point hex search - if (check_bounds(x, br, bc, 2)) { - for (i = 0; i < FIRST_HEX_CANDIDATES; i++) { - this_mv.row = br + hex[i].row; - this_mv.col = bc + hex[i].col; - this_offset = base_offset + (this_mv.row * in_what_stride) + this_mv.col; - thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, - bestsad); - CHECK_BETTER - } - } else { - for (i = 0; i < FIRST_HEX_CANDIDATES; i++) { - this_mv.row = br + hex[i].row; - this_mv.col = bc + hex[i].col; - if (!is_mv_in(x, &this_mv)) - continue; - this_offset = base_offset + (this_mv.row * in_what_stride) + this_mv.col; - thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, - bestsad); - CHECK_BETTER - } - } - - // Continue hex search if we find a better match in first round - if (best_site != -1) { - br += hex[best_site].row; - bc += hex[best_site].col; - k = best_site; - - // Allow search covering maximum MV range - for (j = 1; j < max_hex_search; j++) { - best_site = -1; - - if (check_bounds(x, br, bc, 2)) { - for (i = 0; i < 3; i++) { - this_mv.row = br + next_chkpts[k][i].row; - this_mv.col = bc + next_chkpts[k][i].col; - this_offset = base_offset + (this_mv.row * in_what_stride) + - this_mv.col; - thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, - bestsad); - CHECK_BETTER - } - } else { - for (i = 0; i < 3; i++) { - this_mv.row = br + next_chkpts[k][i].row; - this_mv.col = bc + next_chkpts[k][i].col; - if (!is_mv_in(x, &this_mv)) - continue; - this_offset = base_offset + (this_mv.row * in_what_stride) + - this_mv.col; - thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, - bestsad); - CHECK_BETTER - } - } - - if (best_site == -1) { - break; - } else { - br += next_chkpts[k][best_site].row; - bc += next_chkpts[k][best_site].col; - k += 5 + best_site; - if (k >= 12) k -= 12; - else if (k >= 6) k -= 6; - } - } - } - - // Check 4 1-away neighbors - for (j = 0; j < max_dia_search; j++) { - best_site = -1; - - if (check_bounds(x, br, bc, 1)) { - for (i = 0; i < REFINE_CANDIDATES; i++) { - this_mv.row = br + neighbors[i].row; - this_mv.col = bc + neighbors[i].col; - this_offset = base_offset + (this_mv.row * in_what_stride) + - this_mv.col; - thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, - bestsad); - CHECK_BETTER - } - } else { - for (i = 0; i < REFINE_CANDIDATES; i++) { - this_mv.row = br + neighbors[i].row; - this_mv.col = bc + neighbors[i].col; - if (!is_mv_in(x, &this_mv)) - continue; - this_offset = base_offset + (this_mv.row * in_what_stride) + - this_mv.col; - thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, - bestsad); - CHECK_BETTER - } - } - - if (best_site == -1) { - break; - } else { - br += neighbors[best_site].row; - bc += neighbors[best_site].col; - } - } - - best_mv->row = br; - best_mv->col = bc; - - return bestsad; + return vp9_hex_search(x, ref_mv, MAX(MAX_MVSEARCH_STEPS - 2, search_param), + sad_per_bit, do_init_search, vfp, use_mvcost, + center_mv, best_mv); } #undef CHECK_BETTER @@ -1045,8 +898,6 @@ const int what_stride = x->plane[0].src.stride; const uint8_t *in_what; const int in_what_stride = xd->plane[0].pre[0].stride; - const uint8_t *best_address; - MV this_mv; unsigned int bestsad = INT_MAX; @@ -1076,7 +927,6 @@ // Work out the start point for the search in_what = xd->plane[0].pre[0].buf + ref_row * in_what_stride + ref_col; - best_address = in_what; // Check the starting position bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) @@ -1134,20 +984,9 @@ } } } - best_mv->row += best_tr; best_mv->col += best_tc; - - this_mv.row = best_mv->row * 8; - this_mv.col = best_mv->col * 8; - - if (bestsad == INT_MAX) - return INT_MAX; - - return fn_ptr->vf(what, what_stride, best_address, in_what_stride, - (unsigned int *)(&thissad)) + - mv_err_cost(&this_mv, center_mv, - mvjcost, mvcost, x->errorperbit); + return bestsad; } int vp9_diamond_search_sad_c(const MACROBLOCK *x, @@ -1272,17 +1111,7 @@ (*num00)++; } } - - this_mv.row = best_mv->row * 8; - this_mv.col = best_mv->col * 8; - - if (bestsad == INT_MAX) - return INT_MAX; - - return fn_ptr->vf(what, what_stride, best_address, in_what_stride, - (unsigned int *)(&thissad)) + - mv_err_cost(&this_mv, center_mv, - mvjcost, mvcost, x->errorperbit); + return bestsad; } int vp9_diamond_search_sadx4(const MACROBLOCK *x, @@ -1448,24 +1277,14 @@ (*num00)++; } } - - this_mv.row = best_mv->row * 8; - this_mv.col = best_mv->col * 8; - - if (bestsad == INT_MAX) - return INT_MAX; - - return fn_ptr->vf(what, what_stride, best_address, in_what_stride, - (unsigned int *)(&thissad)) + - mv_err_cost(&this_mv, center_mv, - mvjcost, mvcost, x->errorperbit); + return bestsad; } /* do_refine: If last step (1-away) of n-step search doesn't pick the center point as the best match, we will do a final 1-away diamond refining search */ -int vp9_full_pixel_diamond(VP9_COMP *cpi, MACROBLOCK *x, +int vp9_full_pixel_diamond(const VP9_COMP *cpi, MACROBLOCK *x, MV *mvp_full, int step_param, int sadpb, int further_steps, int do_refine, const vp9_variance_fn_ptr_t *fn_ptr, @@ -1476,6 +1295,8 @@ step_param, sadpb, &n, fn_ptr, x->nmvjointcost, x->mvcost, ref_mv); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_var(x, &temp_mv, ref_mv, fn_ptr, 1); *dst_mv = temp_mv; // If there won't be more n-step search, check to see if refining search is @@ -1493,6 +1314,8 @@ step_param + n, sadpb, &num00, fn_ptr, x->nmvjointcost, x->mvcost, ref_mv); + if (thissme < INT_MAX) + thissme = vp9_get_mvpred_var(x, &temp_mv, ref_mv, fn_ptr, 1); // check to see if refining search is needed. if (num00 > further_steps - n) @@ -1512,12 +1335,13 @@ thissme = cpi->refining_search_sad(x, &best_mv, sadpb, search_range, fn_ptr, x->nmvjointcost, x->mvcost, ref_mv); + if (thissme < INT_MAX) + thissme = vp9_get_mvpred_var(x, &best_mv, ref_mv, fn_ptr, 1); if (thissme < bestsme) { bestsme = thissme; *dst_mv = best_mv; } } - return bestsme; } @@ -1562,15 +1386,7 @@ } } } - - if (best_sad < INT_MAX) { - unsigned int unused; - const MV mv = {best_mv->row * 8, best_mv->col * 8}; - return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &unused) - + mv_err_cost(&mv, center_mv, mvjcost, mvcost, x->errorperbit); - } else { - return INT_MAX; - } + return best_sad; } int vp9_full_search_sadx3(const MACROBLOCK *x, const MV *ref_mv, @@ -1665,17 +1481,7 @@ c++; } } - - this_mv.row = best_mv->row * 8; - this_mv.col = best_mv->col * 8; - - if (bestsad < INT_MAX) - return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, - (unsigned int *)(&thissad)) + - mv_err_cost(&this_mv, center_mv, - mvjcost, mvcost, x->errorperbit); - else - return INT_MAX; + return bestsad; } int vp9_full_search_sadx8(const MACROBLOCK *x, const MV *ref_mv, @@ -1798,17 +1604,7 @@ c++; } } - - this_mv.row = best_mv->row * 8; - this_mv.col = best_mv->col * 8; - - if (bestsad < INT_MAX) - return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, - (unsigned int *)(&thissad)) + - mv_err_cost(&this_mv, center_mv, - mvjcost, mvcost, x->errorperbit); - else - return INT_MAX; + return bestsad; } int vp9_refining_search_sad_c(const MACROBLOCK *x, @@ -1866,16 +1662,7 @@ best_address = &in_what[ref_mv->row * in_what_stride + ref_mv->col]; } } - - if (bestsad < INT_MAX) { - unsigned int unused; - const MV mv = {ref_mv->row * 8, ref_mv->col * 8}; - return fn_ptr->vf(what, what_stride, best_address, in_what_stride, - &unused) + - mv_err_cost(&mv, center_mv, mvjcost, mvcost, x->errorperbit); - } else { - return INT_MAX; - } + return bestsad; } int vp9_refining_search_sadx4(const MACROBLOCK *x, @@ -1977,17 +1764,7 @@ neighbors[best_site].col; } } - - this_mv.row = ref_mv->row * 8; - this_mv.col = ref_mv->col * 8; - - if (bestsad < INT_MAX) - return fn_ptr->vf(what, what_stride, best_address, in_what_stride, - (unsigned int *)(&thissad)) + - mv_err_cost(&this_mv, center_mv, - mvjcost, mvcost, x->errorperbit); - else - return INT_MAX; + return bestsad; } // This function is called when we do joint motion search in comp_inter_inter @@ -2055,18 +1832,5 @@ best_address = &in_what[ref_mv->row * in_what_stride + ref_mv->col]; } } - - this_mv.row = ref_mv->row * 8; - this_mv.col = ref_mv->col * 8; - - if (bestsad < INT_MAX) { - // FIXME(rbultje, yunqing): add full-pixel averaging variance functions - // so we don't have to use the subpixel with xoff=0,yoff=0 here. - return fn_ptr->svaf(best_address, in_what_stride, 0, 0, what, what_stride, - (unsigned int *)(&thissad), second_pred) + - mv_err_cost(&this_mv, center_mv, - mvjcost, mvcost, x->errorperbit); - } else { - return INT_MAX; - } + return bestsad; }
diff --git a/vp9/encoder/vp9_mcomp.h b/vp9/encoder/vp9_mcomp.h index 586a74c..39360f1 100644 --- a/vp9/encoder/vp9_mcomp.h +++ b/vp9/encoder/vp9_mcomp.h
@@ -35,6 +35,19 @@ void vp9_set_mv_search_range(MACROBLOCK *x, const MV *mv); int vp9_mv_bit_cost(const MV *mv, const MV *ref, const int *mvjcost, int *mvcost[2], int weight); + +// Utility to compute variance + MV rate cost for a given MV +int vp9_get_mvpred_var(const MACROBLOCK *x, + MV *best_mv, + const MV *center_mv, + const vp9_variance_fn_ptr_t *vfp, + int use_mvcost); +int vp9_get_mvpred_av_var(const MACROBLOCK *x, + MV *best_mv, + const MV *center_mv, + const uint8_t *second_pred, + const vp9_variance_fn_ptr_t *vfp, + int use_mvcost); void vp9_init_dsmotion_compensation(MACROBLOCK *x, int stride); void vp9_init3smotion_compensation(MACROBLOCK *x, int stride); @@ -42,47 +55,27 @@ int vp9_init_search_range(struct VP9_COMP *cpi, int size); // Runs sequence of diamond searches in smaller steps for RD -int vp9_full_pixel_diamond(struct VP9_COMP *cpi, MACROBLOCK *x, +int vp9_full_pixel_diamond(const struct VP9_COMP *cpi, MACROBLOCK *x, MV *mvp_full, int step_param, int sadpb, int further_steps, int do_refine, const vp9_variance_fn_ptr_t *fn_ptr, const MV *ref_mv, MV *dst_mv); -int vp9_hex_search(const MACROBLOCK *x, - MV *ref_mv, - int search_param, - int error_per_bit, - int do_init_search, - const vp9_variance_fn_ptr_t *vf, - int use_mvcost, - const MV *center_mv, - MV *best_mv); -int vp9_bigdia_search(const MACROBLOCK *x, - MV *ref_mv, - int search_param, - int error_per_bit, - int do_init_search, - const vp9_variance_fn_ptr_t *vf, - int use_mvcost, - const MV *center_mv, - MV *best_mv); -int vp9_square_search(const MACROBLOCK *x, - MV *ref_mv, - int search_param, - int error_per_bit, - int do_init_search, - const vp9_variance_fn_ptr_t *vf, - int use_mvcost, - const MV *center_mv, - MV *best_mv); -int vp9_fast_hex_search(const MACROBLOCK *x, - MV *ref_mv, - int search_param, - int sad_per_bit, - const vp9_variance_fn_ptr_t *vfp, - int use_mvcost, - const MV *center_mv, - MV *best_mv); +typedef int (integer_mv_pattern_search_fn) ( + const MACROBLOCK *x, + MV *ref_mv, + int search_param, + int error_per_bit, + int do_init_search, + const vp9_variance_fn_ptr_t *vf, + int use_mvcost, + const MV *center_mv, + MV *best_mv); + +integer_mv_pattern_search_fn vp9_hex_search; +integer_mv_pattern_search_fn vp9_bigdia_search; +integer_mv_pattern_search_fn vp9_square_search; +integer_mv_pattern_search_fn vp9_fast_hex_search; typedef int (fractional_mv_step_fp) ( const MACROBLOCK *x,
diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 9ba48a1..75122bc 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c
@@ -34,7 +34,7 @@ MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; int bestsme = INT_MAX; - int further_steps, step_param; + int step_param; int sadpb = x->sadperbit16; MV mvp_full; int ref = mbmi->ref_frame[0]; @@ -67,7 +67,6 @@ // TODO(jingning) exploiting adaptive motion search control in non-RD // mode decision too. step_param = 6; - further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; for (i = LAST_FRAME; i <= LAST_FRAME && cpi->common.show_frame; ++i) { if ((x->pred_mv_sad[ref] >> 3) > x->pred_mv_sad[i]) { @@ -88,22 +87,28 @@ mvp_full.row >>= 3; if (cpi->sf.search_method == FAST_HEX) { - bestsme = vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, + // NOTE: this returns SAD + bestsme = vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, 0, &cpi->fn_ptr[bsize], 1, &ref_mv.as_mv, &tmp_mv->as_mv); } else if (cpi->sf.search_method == HEX) { + // NOTE: this returns SAD bestsme = vp9_hex_search(x, &mvp_full, step_param, sadpb, 1, &cpi->fn_ptr[bsize], 1, &ref_mv.as_mv, &tmp_mv->as_mv); } else if (cpi->sf.search_method == SQUARE) { + // NOTE: this returns SAD bestsme = vp9_square_search(x, &mvp_full, step_param, sadpb, 1, &cpi->fn_ptr[bsize], 1, &ref_mv.as_mv, &tmp_mv->as_mv); } else if (cpi->sf.search_method == BIGDIA) { + // NOTE: this returns SAD bestsme = vp9_bigdia_search(x, &mvp_full, step_param, sadpb, 1, &cpi->fn_ptr[bsize], 1, &ref_mv.as_mv, &tmp_mv->as_mv); } else { + int further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; + // NOTE: this returns variance bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, sadpb, further_steps, 1, &cpi->fn_ptr[bsize],
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 89aa821..8430e4b 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c
@@ -587,6 +587,7 @@ q_adj_factor); } } else if (!rc->is_src_frame_alt_ref && + !cpi->use_svc && (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { // Use the lower of active_worst_quality and recent // average Q as basis for GF/ARF best Q limit unless last frame was
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 810f8ba..a6f54fd 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c
@@ -1848,18 +1848,30 @@ sadpb, 1, v_fn_ptr, 1, &bsi->ref_mv[0]->as_mv, &new_mv->as_mv); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv, + &bsi->ref_mv[0]->as_mv, + v_fn_ptr, 1); } else if (cpi->sf.search_method == SQUARE) { bestsme = vp9_square_search(x, &mvp_full, step_param, sadpb, 1, v_fn_ptr, 1, &bsi->ref_mv[0]->as_mv, &new_mv->as_mv); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv, + &bsi->ref_mv[0]->as_mv, + v_fn_ptr, 1); } else if (cpi->sf.search_method == BIGDIA) { bestsme = vp9_bigdia_search(x, &mvp_full, step_param, sadpb, 1, v_fn_ptr, 1, &bsi->ref_mv[0]->as_mv, &new_mv->as_mv); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv, + &bsi->ref_mv[0]->as_mv, + v_fn_ptr, 1); } else { bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, sadpb, further_steps, 0, v_fn_ptr, @@ -2470,21 +2482,33 @@ further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; if (cpi->sf.search_method == FAST_HEX) { - bestsme = vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, + bestsme = vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, 0, &cpi->fn_ptr[bsize], 1, &ref_mv, &tmp_mv->as_mv); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv, + &cpi->fn_ptr[bsize], 1); } else if (cpi->sf.search_method == HEX) { bestsme = vp9_hex_search(x, &mvp_full, step_param, sadpb, 1, &cpi->fn_ptr[bsize], 1, &ref_mv, &tmp_mv->as_mv); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv, + &cpi->fn_ptr[bsize], 1); } else if (cpi->sf.search_method == SQUARE) { bestsme = vp9_square_search(x, &mvp_full, step_param, sadpb, 1, &cpi->fn_ptr[bsize], 1, &ref_mv, &tmp_mv->as_mv); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv, + &cpi->fn_ptr[bsize], 1); } else if (cpi->sf.search_method == BIGDIA) { bestsme = vp9_bigdia_search(x, &mvp_full, step_param, sadpb, 1, &cpi->fn_ptr[bsize], 1, &ref_mv, &tmp_mv->as_mv); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv, + &cpi->fn_ptr[bsize], 1); } else { bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, sadpb, further_steps, 1, @@ -2610,6 +2634,9 @@ x->nmvjointcost, x->mvcost, &ref_mv[id].as_mv, second_pred, pw, ph); + if (bestsme < INT_MAX) + bestsme = vp9_get_mvpred_av_var(x, &tmp_mv.as_mv, &ref_mv[id].as_mv, + second_pred, &cpi->fn_ptr[bsize], 1); x->mv_col_min = tmp_col_min; x->mv_col_max = tmp_col_max;