diff options
Diffstat (limited to 'vp8/encoder/onyx_if.c')
-rw-r--r-- | vp8/encoder/onyx_if.c | 60 |
1 files changed, 47 insertions, 13 deletions
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 5ad51e846..cd62c9c17 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -144,7 +144,7 @@ extern void vp8cx_init_quantizer(VP8_COMP *cpi); extern const int vp8cx_base_skip_false_prob[128]; // Tables relating active max Q to active min Q -static const int kf_low_motion_minq[QINDEX_RANGE] = +static const unsigned char kf_low_motion_minq[QINDEX_RANGE] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -155,7 +155,7 @@ static const int kf_low_motion_minq[QINDEX_RANGE] = 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16, 16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23 }; -static const int kf_high_motion_minq[QINDEX_RANGE] = +static const unsigned char kf_high_motion_minq[QINDEX_RANGE] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -166,7 +166,7 @@ static const int kf_high_motion_minq[QINDEX_RANGE] = 16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21, 21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30 }; -static const int gf_low_motion_minq[QINDEX_RANGE] = +static const unsigned char gf_low_motion_minq[QINDEX_RANGE] = { 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2, 3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6, @@ -177,7 +177,7 @@ static const int gf_low_motion_minq[QINDEX_RANGE] = 35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42, 43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 }; -static const int gf_mid_motion_minq[QINDEX_RANGE] = +static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] = { 0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4, 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9, @@ -188,7 +188,7 @@ static const int gf_mid_motion_minq[QINDEX_RANGE] = 38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48, 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 }; -static const int gf_high_motion_minq[QINDEX_RANGE] = +static const unsigned char gf_high_motion_minq[QINDEX_RANGE] = { 0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4, 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9, @@ -199,7 +199,7 @@ static const int gf_high_motion_minq[QINDEX_RANGE] = 41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54, 55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80 }; -static const int inter_minq[QINDEX_RANGE] = +static const unsigned char inter_minq[QINDEX_RANGE] = { 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9, 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20, @@ -1107,8 +1107,7 @@ void vp8_alloc_compressor_data(VP8_COMP *cpi) vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR, "Failed to allocate scaled source buffer"); - - vpx_free(cpi->tok); + vpx_free(cpi->tok); { #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING @@ -1680,6 +1679,17 @@ void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) cpi->alt_ref_source = NULL; cpi->is_src_frame_alt_ref = 0; +#if CONFIG_TEMPORAL_DENOISING + if (cpi->oxcf.noise_sensitivity) + { + if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc) + { + int width = (cpi->oxcf.Width + 15) & ~15; + int height = (cpi->oxcf.Height + 15) & ~15; + vp8_denoiser_allocate(&cpi->denoiser, width, height); + } + } +#endif #if 0 // Experimental RD Code @@ -2314,6 +2324,9 @@ void vp8_remove_compressor(VP8_COMP **ptr) vp8cx_remove_encoder_threads(cpi); #endif +#if CONFIG_TEMPORAL_DENOISING + vp8_denoiser_free(&cpi->denoiser); +#endif dealloc_compressor_data(cpi); vpx_free(cpi->mb.ss); vpx_free(cpi->tok); @@ -2920,7 +2933,6 @@ static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, (void) frame_flags; vp8_set_quantizer(cpi, 26); - scale_and_extend_source(cpi->un_scaled_source, cpi); vp8_first_pass(cpi); } #endif @@ -3133,7 +3145,12 @@ void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) } vp8_yv12_extend_frame_borders_ptr(cm->frame_to_show); - +#if CONFIG_TEMPORAL_DENOISING + if (cpi->oxcf.noise_sensitivity) + { + vp8_yv12_extend_frame_borders(&cpi->denoiser.yv12_running_avg); + } +#endif } static void encode_frame_to_data_rate @@ -3589,7 +3606,7 @@ static void encode_frame_to_data_rate scale_and_extend_source(cpi->un_scaled_source, cpi); -#if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC +#if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING) if (cpi->oxcf.noise_sensitivity > 0) { @@ -4702,7 +4719,8 @@ int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned l cpi->source_alt_ref_pending) { if ((cpi->source = vp8_lookahead_peek(cpi->lookahead, - cpi->frames_till_gf_update_due))) + cpi->frames_till_gf_update_due, + PEEK_FORWARD))) { cpi->alt_ref_source = cpi->source; if (cpi->oxcf.arnr_max_frames > 0) @@ -4724,6 +4742,15 @@ int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned l if (!cpi->source) { + /* Read last frame source if we are encoding first pass. */ + if (cpi->pass == 1 && cm->current_video_frame > 0) + { + if((cpi->last_source = vp8_lookahead_peek(cpi->lookahead, 1, + PEEK_BACKWARD)) == NULL) + return -1; + } + + if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush))) { cm->show_frame = 1; @@ -4743,6 +4770,11 @@ int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned l *time_stamp = cpi->source->ts_start; *time_end = cpi->source->ts_end; *frame_flags = cpi->source->flags; + + if (cpi->pass == 1 && cm->current_video_frame > 0) + { + cpi->last_frame_unscaled_source = &cpi->last_source->img; + } } else { @@ -5026,7 +5058,6 @@ int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned l double frame_psnr; YV12_BUFFER_CONFIG *orig = cpi->Source; YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show; - YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer; int y_samples = orig->y_height * orig->y_width ; int uv_samples = orig->uv_height * orig->uv_width ; int t_samples = y_samples + 2 * uv_samples; @@ -5050,7 +5081,9 @@ int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned l cpi->total_v += vp8_mse2psnr(uv_samples, 255.0, ve); cpi->total_sq_error += sq_error; cpi->total += frame_psnr; +#if CONFIG_POSTPROC { + YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer; double frame_psnr2, frame_ssim2 = 0; double weight = 0; @@ -5101,6 +5134,7 @@ int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned l } } } +#endif } if (cpi->b_calculate_ssimg) |