Skip to content
  • Yunqing Wang's avatar
    Encoder denoiser performance improvement · 64075c9b
    Yunqing Wang authored
    The denoiser function was modified to reduce the computational
    complexity.
    
    1. The denoiser c function modification:
    The original implementation calculated pixel's filter_coefficient
    based on the pixel value difference between current raw frame and last
    denoised raw frame, and stored them in lookup tables. For each pixel c,
    find its coefficient using
        filter_coefficient[c] = LUT[abs_diff[c]];
    and then apply filtering operation for the pixel.
    
    The denoising filter costed about 12% of encoding time when it was
    turned on, and half of the time was spent on finding coefficients in
    lookup tables. In order to simplify the process, a short cut was taken.
    The pixel adjustments vs. pixel diff value were calculated ahead of time.
        adjustment = filtered_value - current_raw
                   = (filter_coefficient * diff + 128) >> 8
    
    The adjustment vs. diff curve becomes flat very quick when diff increases.
    This allowed us to use only several levels to get a close approximation
    of the curve. Following the denoiser algorithm, the adjustments are
    further modified according to how big the motion magnitude is.
    
    2. The sse2 function was rewritten.
    
    This change made denoiser filter function 3x faster, and improved the
    encoder performance by 7% ~ 10% with the denoiser on.
    
    Change-Id: I93a4308963b8e80c7307f96ffa8b8c667425bf50
    64075c9b