diff options
-rw-r--r-- | test/convolve_test.cc | 6 | ||||
-rw-r--r-- | test/external_frame_buffer_test.cc | 8 | ||||
-rw-r--r-- | test/invalid_file_test.cc | 4 | ||||
-rw-r--r-- | test/test-data.mk | 8 | ||||
-rw-r--r-- | test/test-data.sha1 | 8 | ||||
-rw-r--r-- | vp8/decoder/decodeframe.c | 1 | ||||
-rw-r--r-- | vp8/decoder/onyxd_if.c | 4 | ||||
-rw-r--r-- | vp8/decoder/onyxd_int.h | 6 | ||||
-rw-r--r-- | vp8/vp8_dx_iface.c | 43 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.h | 6 | ||||
-rw-r--r-- | vp9/encoder/vp9_mcomp.c | 16 | ||||
-rw-r--r-- | vp9/encoder/vp9_mcomp.h | 3 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.c | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_svc_layercontext.c | 22 | ||||
-rw-r--r-- | vp9/encoder/vp9_svc_layercontext.h | 1 | ||||
-rw-r--r-- | vp9/encoder/vp9_temporal_filter.c | 20 | ||||
-rw-r--r-- | vpx/vpx_frame_buffer.h | 6 | ||||
-rw-r--r-- | vpx_dsp/arm/highbd_idct16x16_add_neon.c | 23 | ||||
-rw-r--r-- | vpx_scale/generic/yv12config.c | 1 |
19 files changed, 137 insertions, 51 deletions
diff --git a/test/convolve_test.cc b/test/convolve_test.cc index 02cc7ff5c..cef602eec 100644 --- a/test/convolve_test.cc +++ b/test/convolve_test.cc @@ -416,8 +416,14 @@ class ConvolveTest : public ::testing::TestWithParam<ConvolveParam> { for (int i = 0; i < kOutputBufferSize; ++i) { if (IsIndexInBorder(i)) { output_[i] = 255; +#if CONFIG_VP9_HIGHBITDEPTH + output16_[i] = mask_; +#endif } else { output_[i] = 0; +#if CONFIG_VP9_HIGHBITDEPTH + output16_[i] = 0; +#endif } } diff --git a/test/external_frame_buffer_test.cc b/test/external_frame_buffer_test.cc index b0ea61f9d..438eeb3ec 100644 --- a/test/external_frame_buffer_test.cc +++ b/test/external_frame_buffer_test.cc @@ -114,9 +114,9 @@ class ExternalFrameBufferList { return 0; } - // Checks that the ximage data is contained within the external frame buffer - // private data passed back in the ximage. - void CheckXImageFrameBuffer(const vpx_image_t *img) { + // Checks that the vpx_image_t data is contained within the external frame + // buffer private data passed back in the vpx_image_t. + void CheckImageFrameBuffer(const vpx_image_t *img) { if (img->fb_priv != NULL) { const struct ExternalFrameBuffer *const ext_fb = reinterpret_cast<ExternalFrameBuffer *>(img->fb_priv); @@ -342,7 +342,7 @@ class ExternalFrameBufferTest : public ::testing::Test { // Get decompressed data while ((img = dec_iter.Next()) != NULL) { - fb_list_.CheckXImageFrameBuffer(img); + fb_list_.CheckImageFrameBuffer(img); } } diff --git a/test/invalid_file_test.cc b/test/invalid_file_test.cc index a92612af4..8eed05eb4 100644 --- a/test/invalid_file_test.cc +++ b/test/invalid_file_test.cc @@ -123,9 +123,9 @@ TEST_P(InvalidFileTest, ReturnCode) { RunTest(); } #if CONFIG_VP8_DECODER const DecodeParam kVP8InvalidFileTests[] = { - { 1, "invalid-bug-1443-v2.ivf" }, + { 1, "invalid-bug-1443.ivf" }, { 1, "invalid-token-partition.ivf" }, - { 1, "invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf" }, + { 1, "invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf" }, }; VP8_INSTANTIATE_TEST_CASE(InvalidFileTest, diff --git a/test/test-data.mk b/test/test-data.mk index 49edc3087..88f3c658f 100644 --- a/test/test-data.mk +++ b/test/test-data.mk @@ -734,14 +734,14 @@ LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp93-2-20-12bit-yuv444.webm.md5 endif # CONFIG_VP9_HIGHBITDEPTH # Invalid files for testing libvpx error checking. -LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-bug-1443-v2.ivf -LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-bug-1443-v2.ivf.res +LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-bug-1443.ivf +LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-bug-1443.ivf.res LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-token-partition.ivf LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-token-partition.ivf.res LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-018.ivf.2kf_0x6.ivf LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-018.ivf.2kf_0x6.ivf.res -LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf -LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf.res +LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf +LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf.res LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-01-v3.webm LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-01-v3.webm.res LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-02-v2.webm diff --git a/test/test-data.sha1 b/test/test-data.sha1 index 2e279e191..cfe4df40d 100644 --- a/test/test-data.sha1 +++ b/test/test-data.sha1 @@ -850,14 +850,14 @@ a000d568431d07379dd5a8ec066061c07e560b47 *invalid-vp90-2-00-quantizer-63.ivf.kf_ 6fa3d3ac306a3d9ce1d610b78441dc00d2c2d4b9 *tos_vp8.webm e402cbbf9e550ae017a1e9f1f73931c1d18474e8 *invalid-crbug-667044.webm d3964f9dad9f60363c81b688324d95b4ec7c8038 *invalid-crbug-667044.webm.res -fd9df7f3f6992af1d7a9dde975c9a0d6f28c053d *invalid-bug-1443-v2.ivf -3198c7af55a7d50173ce3c369c0cf2d9cdfface6 *invalid-bug-1443-v2.ivf.res +fd9df7f3f6992af1d7a9dde975c9a0d6f28c053d *invalid-bug-1443.ivf +fd3020fa6e9ca5966206738654c97dec313b0a95 *invalid-bug-1443.ivf.res 1a0e405606939f2febab1a21b30c37cb8f2c8cb1 *invalid-token-partition.ivf 90a8a95e7024f015b87f5483a65036609b3d1b74 *invalid-token-partition.ivf.res 17696cd21e875f1d6e5d418cbf89feab02c8850a *vp90-2-22-svc_1280x720_1.webm e2f9e1e47a791b4e939a9bdc50bf7a25b3761f77 *vp90-2-22-svc_1280x720_1.webm.md5 -a0fbbbc5dd50fd452096f4455a58c1a8c9f66697 *invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf -591715fc7ea37dbda0397f45eee9d530f7f4f8ce *invalid-vp80-00-comprehensive-s17661_r01-05_b6-.v2.ivf.res +a0fbbbc5dd50fd452096f4455a58c1a8c9f66697 *invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf +a61774cf03fc584bd9f0904fc145253bb8ea6c4c *invalid-vp80-00-comprehensive-s17661_r01-05_b6-.ivf.res 894fae3afee0290546590823974203ab4b8abd95 *crbug-1539.rawfile f1026c03efd5da21b381c8eb21f0d64e6d7e4ba3 *invalid-crbug-1558.ivf eb198c25f861c3fe2cbd310de11eb96843019345 *invalid-crbug-1558.ivf.res diff --git a/vp8/decoder/decodeframe.c b/vp8/decoder/decodeframe.c index 617abf77c..650d1d040 100644 --- a/vp8/decoder/decodeframe.c +++ b/vp8/decoder/decodeframe.c @@ -1222,6 +1222,7 @@ int vp8_decode_frame(VP8D_COMP *pbi) { unsigned int thread; if (vp8mt_decode_mb_rows(pbi, xd)) { vp8_decoder_remove_threads(pbi); + pbi->restart_threads = 1; vpx_internal_error(&pbi->common.error, VPX_CODEC_CORRUPT_FRAME, NULL); } vp8_yv12_extend_frame_borders(yv12_fb_new); diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c index e7e1cfc94..c6fb51d0c 100644 --- a/vp8/decoder/onyxd_if.c +++ b/vp8/decoder/onyxd_if.c @@ -16,6 +16,7 @@ #include "onyxd_int.h" #include "vpx_mem/vpx_mem.h" #include "vp8/common/alloccommon.h" +#include "vp8/common/common.h" #include "vp8/common/loopfilter.h" #include "vp8/common/swapyv12buffer.h" #include "vp8/common/threading.h" @@ -428,7 +429,6 @@ int vp8dx_references_buffer(VP8_COMMON *oci, int ref_frame) { } int vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf) { - if (fb->pbi[0]) remove_decompressor(fb->pbi[0]); /* decoder instance for single thread mode */ fb->pbi[0] = create_decompressor(oxcf); if (!fb->pbi[0]) return VPX_CODEC_ERROR; @@ -436,7 +436,7 @@ int vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf) { #if CONFIG_MULTITHREAD if (setjmp(fb->pbi[0]->common.error.jmp)) { vp8_remove_decoder_instances(fb); - memset(fb->pbi, 0, sizeof(fb->pbi)); + vp8_zero(fb->pbi); vpx_clear_system_state(); return VPX_CODEC_ERROR; } diff --git a/vp8/decoder/onyxd_int.h b/vp8/decoder/onyxd_int.h index 5e1687d1a..75286e430 100644 --- a/vp8/decoder/onyxd_int.h +++ b/vp8/decoder/onyxd_int.h @@ -118,6 +118,12 @@ typedef struct VP8D_COMP { vpx_decrypt_cb decrypt_cb; void *decrypt_state; +#if CONFIG_MULTITHREAD + // Restart threads on next frame if set to 1. + // This is set when error happens in multithreaded decoding and all threads + // are shut down. + int restart_threads; +#endif } VP8D_COMP; void vp8cx_init_de_quantizer(VP8D_COMP *pbi); diff --git a/vp8/vp8_dx_iface.c b/vp8/vp8_dx_iface.c index a72d80505..7db77195b 100644 --- a/vp8/vp8_dx_iface.c +++ b/vp8/vp8_dx_iface.c @@ -45,6 +45,12 @@ struct vpx_codec_alg_priv { vpx_codec_dec_cfg_t cfg; vp8_stream_info_t si; int decoder_init; +#if CONFIG_MULTITHREAD + // Restart threads on next frame if set to 1. + // This is set when error happens in multithreaded decoding and all threads + // are shut down. + int restart_threads; +#endif int postproc_cfg_set; vp8_postproc_cfg_t postproc_cfg; vpx_decrypt_cb decrypt_cb; @@ -268,7 +274,7 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, const uint8_t *data, unsigned int data_sz, void *user_priv, long deadline) { volatile vpx_codec_err_t res; - unsigned int resolution_change = 0; + volatile unsigned int resolution_change = 0; unsigned int w, h; if (!ctx->fragments.enabled && (data == NULL && data_sz == 0)) { @@ -298,6 +304,27 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, if ((ctx->si.h != h) || (ctx->si.w != w)) resolution_change = 1; +#if CONFIG_MULTITHREAD + if (!res && ctx->restart_threads) { + struct frame_buffers *fb = &ctx->yv12_frame_buffers; + VP8D_COMP *pbi = ctx->yv12_frame_buffers.pbi[0]; + VP8_COMMON *const pc = &pbi->common; + if (setjmp(pbi->common.error.jmp)) { + vp8_remove_decoder_instances(fb); + vp8_zero(fb->pbi); + vpx_clear_system_state(); + return VPX_CODEC_ERROR; + } + pbi->common.error.setjmp = 1; + pbi->max_threads = ctx->cfg.threads; + vp8_decoder_create_threads(pbi); + if (vpx_atomic_load_acquire(&pbi->b_multithreaded_rd)) { + vp8mt_alloc_temp_buffers(pbi, pc->Width, pc->mb_rows); + } + ctx->restart_threads = 0; + pbi->common.error.setjmp = 0; + } +#endif /* Initialize the decoder instance on the first frame*/ if (!res && !ctx->decoder_init) { VP8D_CONFIG oxcf; @@ -439,9 +466,13 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, pc->fb_idx_ref_cnt[pc->new_fb_idx]--; } pc->error.setjmp = 0; - ctx->si.w = 0; - ctx->si.h = 0; - ctx->decoder_init = 0; +#if CONFIG_MULTITHREAD + if (pbi->restart_threads) { + ctx->si.w = 0; + ctx->si.h = 0; + ctx->restart_threads = 1; + } +#endif res = update_error_state(ctx, &pbi->common.error); return res; } @@ -450,7 +481,9 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, /* update the pbi fragment data */ pbi->fragments = ctx->fragments; - +#if CONFIG_MULTITHREAD + pbi->restart_threads = 0; +#endif ctx->user_priv = user_priv; if (vp8dx_receive_compressed_data(pbi, data_sz, data, deadline)) { res = update_error_state(ctx, &pbi->common.error); diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h index 18adfebfe..cb9ea2de2 100644 --- a/vp9/encoder/vp9_encoder.h +++ b/vp9/encoder/vp9_encoder.h @@ -337,8 +337,7 @@ static INLINE int get_square_block_idx(BLOCK_SIZE bsize) { if (bsize == BLOCK_32X32) { return 3; } - printf("ERROR: non-square block size\n"); - assert(0); + assert(0 && "ERROR: non-square block size"); return -1; } @@ -355,8 +354,7 @@ static INLINE BLOCK_SIZE square_block_idx_to_bsize(int square_block_idx) { if (square_block_idx == 3) { return BLOCK_32X32; } - printf("ERROR: invalid square_block_idx\n"); - assert(0); + assert(0 && "ERROR: invalid square_block_idx"); return BLOCK_INVALID; } diff --git a/vp9/encoder/vp9_mcomp.c b/vp9/encoder/vp9_mcomp.c index 05f3f2857..534b15acc 100644 --- a/vp9/encoder/vp9_mcomp.c +++ b/vp9/encoder/vp9_mcomp.c @@ -1646,7 +1646,7 @@ static int fast_dia_search(const MACROBLOCK *x, MV *ref_mv, int search_param, // Exhuastive motion search around a given centre position with a given // step size. -static int exhuastive_mesh_search(const MACROBLOCK *x, MV *ref_mv, MV *best_mv, +static int exhaustive_mesh_search(const MACROBLOCK *x, MV *ref_mv, MV *best_mv, int range, int step, int sad_per_bit, const vp9_variance_fn_ptr_t *fn_ptr, const MV *center_mv) { @@ -1760,7 +1760,7 @@ double vp9_nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs, return best_cost; } -static double exhuastive_mesh_search_new(const MACROBLOCK *x, MV *best_mv, +static double exhaustive_mesh_search_new(const MACROBLOCK *x, MV *best_mv, int range, int step, const vp9_variance_fn_ptr_t *fn_ptr, const MV *center_mv, double lambda, @@ -1883,7 +1883,7 @@ static double full_pixel_exhaustive_new(const VP9_COMP *cpi, MACROBLOCK *x, // initial search bestsme = - exhuastive_mesh_search_new(x, &temp_mv, range, interval, fn_ptr, &temp_mv, + exhaustive_mesh_search_new(x, &temp_mv, range, interval, fn_ptr, &temp_mv, lambda, nb_full_mvs, full_mv_num); if ((interval > MIN_INTERVAL) && (range > MIN_RANGE)) { @@ -1891,7 +1891,7 @@ static double full_pixel_exhaustive_new(const VP9_COMP *cpi, MACROBLOCK *x, // till we reach a step size of 1. Then break out. for (i = 1; i < MAX_MESH_STEP; ++i) { // First pass with coarser step and longer range - bestsme = exhuastive_mesh_search_new( + bestsme = exhaustive_mesh_search_new( x, &temp_mv, sf->mesh_patterns[i].range, sf->mesh_patterns[i].interval, fn_ptr, &temp_mv, lambda, nb_full_mvs, full_mv_num); @@ -2581,7 +2581,7 @@ static int full_pixel_exhaustive(VP9_COMP *cpi, MACROBLOCK *x, interval = VPXMAX(interval, range / baseline_interval_divisor); // initial search - bestsme = exhuastive_mesh_search(x, &f_ref_mv, &temp_mv, range, interval, + bestsme = exhaustive_mesh_search(x, &f_ref_mv, &temp_mv, range, interval, sadpb, fn_ptr, &temp_mv); if ((interval > MIN_INTERVAL) && (range > MIN_RANGE)) { @@ -2589,7 +2589,7 @@ static int full_pixel_exhaustive(VP9_COMP *cpi, MACROBLOCK *x, // till we reach a step size of 1. Then break out. for (i = 1; i < MAX_MESH_STEP; ++i) { // First pass with coarser step and longer range - bestsme = exhuastive_mesh_search( + bestsme = exhaustive_mesh_search( x, &f_ref_mv, &temp_mv, sf->mesh_patterns[i].range, sf->mesh_patterns[i].interval, sadpb, fn_ptr, &temp_mv); @@ -2868,10 +2868,10 @@ int vp9_full_pixel_search(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize, if (method == NSTEP) { if (sf->exhaustive_searches_thresh < INT_MAX && !cpi->rc.is_src_frame_alt_ref) { - const int64_t exhuastive_thr = + const int64_t exhaustive_thr = sf->exhaustive_searches_thresh >> (8 - (b_width_log2_lookup[bsize] + b_height_log2_lookup[bsize])); - if (var > exhuastive_thr) run_exhaustive_search = 1; + if (var > exhaustive_thr) run_exhaustive_search = 1; } } else if (method == MESH) { run_exhaustive_search = 1; diff --git a/vp9/encoder/vp9_mcomp.h b/vp9/encoder/vp9_mcomp.h index ab880ff9c..6bef88747 100644 --- a/vp9/encoder/vp9_mcomp.h +++ b/vp9/encoder/vp9_mcomp.h @@ -167,8 +167,7 @@ static INLINE BLOCK_SIZE get_square_block_size(BLOCK_SIZE bsize) { case BLOCK_64X64: square_bsize = BLOCK_32X32; break; default: square_bsize = BLOCK_INVALID; - printf("ERROR: invlid block size %d\n", bsize); - assert(0); + assert(0 && "ERROR: invalid block size"); break; } return square_bsize; diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 5ad68e2e5..4b9fb2754 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -1800,6 +1800,8 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) { } } + if (cpi->use_svc) vp9_svc_adjust_avg_frame_qindex(cpi); + // Keep record of last boosted (KF/KF/ARF) Q value. // If the current frame is coded at a lower Q then we also update it. // If all mbs in this group are skipped only update if the Q value is diff --git a/vp9/encoder/vp9_svc_layercontext.c b/vp9/encoder/vp9_svc_layercontext.c index 3223f714b..35155c71f 100644 --- a/vp9/encoder/vp9_svc_layercontext.c +++ b/vp9/encoder/vp9_svc_layercontext.c @@ -1227,3 +1227,25 @@ void vp9_svc_adjust_frame_rate(VP9_COMP *const cpi) { cpi->svc.timebase_fac * cpi->svc.duration[cpi->svc.spatial_layer_id]; vp9_new_framerate(cpi, 10000000.0 / this_duration); } + +void vp9_svc_adjust_avg_frame_qindex(VP9_COMP *const cpi) { + VP9_COMMON *const cm = &cpi->common; + SVC *const svc = &cpi->svc; + RATE_CONTROL *const rc = &cpi->rc; + // On key frames in CBR mode: reset the avg_frame_index for base layer + // (to level closer to worst_quality) if the overshoot is significant. + // Reset it for all temporal layers on base spatial layer. + if (cm->frame_type == KEY_FRAME && cpi->oxcf.rc_mode == VPX_CBR && + rc->projected_frame_size > 3 * rc->avg_frame_bandwidth) { + int tl; + rc->avg_frame_qindex[INTER_FRAME] = + VPXMAX(rc->avg_frame_qindex[INTER_FRAME], + (cm->base_qindex + rc->worst_quality) >> 1); + for (tl = 0; tl < svc->number_temporal_layers; ++tl) { + const int layer = LAYER_IDS_TO_IDX(0, tl, svc->number_temporal_layers); + LAYER_CONTEXT *lc = &svc->layer_context[layer]; + RATE_CONTROL *lrc = &lc->rc; + lrc->avg_frame_qindex[INTER_FRAME] = rc->avg_frame_qindex[INTER_FRAME]; + } + } +} diff --git a/vp9/encoder/vp9_svc_layercontext.h b/vp9/encoder/vp9_svc_layercontext.h index c25644617..34795d841 100644 --- a/vp9/encoder/vp9_svc_layercontext.h +++ b/vp9/encoder/vp9_svc_layercontext.h @@ -262,6 +262,7 @@ void vp9_svc_update_ref_frame(struct VP9_COMP *const cpi); void vp9_svc_adjust_frame_rate(struct VP9_COMP *const cpi); +void vp9_svc_adjust_avg_frame_qindex(struct VP9_COMP *const cpi); #ifdef __cplusplus } // extern "C" #endif diff --git a/vp9/encoder/vp9_temporal_filter.c b/vp9/encoder/vp9_temporal_filter.c index db23b8e6f..cd340c394 100644 --- a/vp9/encoder/vp9_temporal_filter.c +++ b/vp9/encoder/vp9_temporal_filter.c @@ -110,11 +110,16 @@ static void temporal_filter_predictors_mb_c( CONVERT_TO_SHORTPTR(y_mb_ptr + y_offset), stride, CONVERT_TO_SHORTPTR(&pred[p_offset]), BW, &mv, scale, xs, ys, which_mv, kernel, MV_PRECISION_Q3, x, y, xd->bd); + } else { + vp9_build_inter_predictor(y_mb_ptr + y_offset, stride, &pred[p_offset], + BW, &mv, scale, xs, ys, which_mv, kernel, + MV_PRECISION_Q3, x, y); } -#endif // CONFIG_VP9_HIGHBITDEPTH +#else vp9_build_inter_predictor(y_mb_ptr + y_offset, stride, &pred[p_offset], BW, &mv, scale, xs, ys, which_mv, kernel, MV_PRECISION_Q3, x, y); +#endif // CONFIG_VP9_HIGHBITDEPTH k++; } } @@ -143,8 +148,18 @@ static void temporal_filter_predictors_mb_c( CONVERT_TO_SHORTPTR(&pred[(BLK_PELS << 1) + p_offset]), uv_block_width, &mv, scale, xs, ys, which_mv, kernel, mv_precision_uv, x, y, xd->bd); + } else { + vp9_build_inter_predictor(u_mb_ptr + uv_offset, uv_stride, + &pred[BLK_PELS + p_offset], uv_block_width, + &mv, scale, xs, ys, which_mv, kernel, + mv_precision_uv, x, y); + + vp9_build_inter_predictor(v_mb_ptr + uv_offset, uv_stride, + &pred[(BLK_PELS << 1) + p_offset], + uv_block_width, &mv, scale, xs, ys, which_mv, + kernel, mv_precision_uv, x, y); } -#endif // CONFIG_VP9_HIGHBITDEPTH +#else vp9_build_inter_predictor(u_mb_ptr + uv_offset, uv_stride, &pred[BLK_PELS + p_offset], uv_block_width, &mv, scale, xs, ys, which_mv, kernel, @@ -154,6 +169,7 @@ static void temporal_filter_predictors_mb_c( &pred[(BLK_PELS << 1) + p_offset], uv_block_width, &mv, scale, xs, ys, which_mv, kernel, mv_precision_uv, x, y); +#endif // CONFIG_VP9_HIGHBITDEPTH k++; } } diff --git a/vpx/vpx_frame_buffer.h b/vpx/vpx_frame_buffer.h index 2813ca6d9..fc8320017 100644 --- a/vpx/vpx_frame_buffer.h +++ b/vpx/vpx_frame_buffer.h @@ -52,9 +52,9 @@ typedef struct vpx_codec_frame_buffer { * data. The callback is triggered when the decoder needs a frame buffer to * decode a compressed image into. This function may be called more than once * for every call to vpx_codec_decode. The application may set fb->priv to - * some data which will be passed back in the ximage and the release function - * call. |fb| is guaranteed to not be NULL. On success the callback must - * return 0. Any failure the callback must return a value less than 0. + * some data which will be passed back in the vpx_image_t and the release + * function call. |fb| is guaranteed to not be NULL. On success the callback + * must return 0. Any failure the callback must return a value less than 0. * * \param[in] priv Callback's private data * \param[in] min_size Size in bytes needed by the buffer diff --git a/vpx_dsp/arm/highbd_idct16x16_add_neon.c b/vpx_dsp/arm/highbd_idct16x16_add_neon.c index 69196e174..654ab42ca 100644 --- a/vpx_dsp/arm/highbd_idct16x16_add_neon.c +++ b/vpx_dsp/arm/highbd_idct16x16_add_neon.c @@ -926,8 +926,8 @@ static void vpx_highbd_idct16x16_38_add_half1d(const int32_t *input, } } -void vpx_highbd_idct16x16_10_add_half1d_pass1(const tran_low_t *input, - int32_t *output) { +static void highbd_idct16x16_10_add_half1d_pass1(const tran_low_t *input, + int32_t *output) { const int32x4_t cospi_0_8_16_24 = vld1q_s32(kCospi32 + 0); const int32x4_t cospi_4_12_20N_28 = vld1q_s32(kCospi32 + 4); const int32x4_t cospi_2_30_10_22 = vld1q_s32(kCospi32 + 8); @@ -1065,10 +1065,11 @@ void vpx_highbd_idct16x16_10_add_half1d_pass1(const tran_low_t *input, vst1q_s32(output, out[15]); } -void vpx_highbd_idct16x16_10_add_half1d_pass2(const int32_t *input, - int32_t *const output, - uint16_t *const dest, - const int stride, const int bd) { +static void highbd_idct16x16_10_add_half1d_pass2(const int32_t *input, + int32_t *const output, + uint16_t *const dest, + const int stride, + const int bd) { const int32x4_t cospi_0_8_16_24 = vld1q_s32(kCospi32 + 0); const int32x4_t cospi_4_12_20N_28 = vld1q_s32(kCospi32 + 4); const int32x4_t cospi_2_30_10_22 = vld1q_s32(kCospi32 + 8); @@ -1289,16 +1290,16 @@ void vpx_highbd_idct16x16_10_add_neon(const tran_low_t *input, uint16_t *dest, // pass 1 // Parallel idct on the upper 8 rows - vpx_highbd_idct16x16_10_add_half1d_pass1(input, row_idct_output); + highbd_idct16x16_10_add_half1d_pass1(input, row_idct_output); // pass 2 // Parallel idct to get the left 8 columns - vpx_highbd_idct16x16_10_add_half1d_pass2(row_idct_output, NULL, dest, - stride, bd); + highbd_idct16x16_10_add_half1d_pass2(row_idct_output, NULL, dest, stride, + bd); // Parallel idct to get the right 8 columns - vpx_highbd_idct16x16_10_add_half1d_pass2(row_idct_output + 4 * 8, NULL, - dest + 8, stride, bd); + highbd_idct16x16_10_add_half1d_pass2(row_idct_output + 4 * 8, NULL, + dest + 8, stride, bd); } } diff --git a/vpx_scale/generic/yv12config.c b/vpx_scale/generic/yv12config.c index 08679a472..eee291c30 100644 --- a/vpx_scale/generic/yv12config.c +++ b/vpx_scale/generic/yv12config.c @@ -228,6 +228,7 @@ int vpx_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, // Allocation to hold larger frame, or first allocation. vpx_free(ybf->buffer_alloc); ybf->buffer_alloc = NULL; + ybf->buffer_alloc_sz = 0; ybf->buffer_alloc = (uint8_t *)vpx_memalign(32, (size_t)frame_size); if (!ybf->buffer_alloc) return -1; |