drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c

Source file repositories/reference/linux-study-clean/drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c
Extension
.c
Size
17082 bytes
Lines
402
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (num_y_points > 0) {
				rockchip_av1_update_random_register
				    (&grain_random_register);
				(*luma_grain_block)[i][j] =
				    round_power_of_two(gaussian_sequence
					     [rockchip_av1_get_random_number
					      (grain_random_register)],
					     gauss_sec_shift);
			} else {
				(*luma_grain_block)[i][j] = 0;
			}
		}
	}

	for (i = 3; i < 73; i++)
		for (j = 3; j < 82 - 3; j++) {
			s32 pos = 0;
			s32 wsum = 0;
			s32 deltarow, deltacol;

			for (deltarow = -ar_coeff_lag; deltarow <= 0;
			     deltarow++) {
				for (deltacol = -ar_coeff_lag;
				     deltacol <= ar_coeff_lag; deltacol++) {
					if (deltarow == 0 && deltacol == 0)
						break;
					wsum = wsum + (*ar_coeffs_y)[pos] *
					    (*luma_grain_block)[i + deltarow][j + deltacol];
					++pos;
				}
			}
			(*luma_grain_block)[i][j] =
				clamp((*luma_grain_block)[i][j] +
				      round_power_of_two(wsum, ar_coeff_shift),
				      grain_min, grain_max);
		}
}

// Calculate chroma grain noise once per frame
void rockchip_av1_generate_chroma_grain_block(s32 (*luma_grain_block)[73][82],
					      s32 (*cb_grain_block)[38][44],
					      s32 (*cr_grain_block)[38][44],
					      s32 bitdepth,
					      u8 num_y_points,
					      u8 num_cb_points,
					      u8 num_cr_points,
					      s32 grain_scale_shift,
					      s32 ar_coeff_lag,
					      s32 (*ar_coeffs_cb)[25],
					      s32 (*ar_coeffs_cr)[25],
					      s32 ar_coeff_shift,
					      s32 grain_min,
					      s32 grain_max,
					      u8 chroma_scaling_from_luma,
					      u16 random_seed)
{
	s32 gauss_sec_shift = 12 - bitdepth + grain_scale_shift;
	u16 grain_random_register = 0;
	s32 i, j;

	rockchip_av1_init_random_generator(7, random_seed,
					   &grain_random_register);
	for (i = 0; i < 38; i++) {
		for (j = 0; j < 44; j++) {
			if (num_cb_points || chroma_scaling_from_luma) {
				rockchip_av1_update_random_register
				    (&grain_random_register);
				(*cb_grain_block)[i][j] =
				    round_power_of_two(gaussian_sequence
					     [rockchip_av1_get_random_number
					      (grain_random_register)],
					     gauss_sec_shift);
			} else {
				(*cb_grain_block)[i][j] = 0;
			}
		}
	}

	rockchip_av1_init_random_generator(11, random_seed,
					   &grain_random_register);
	for (i = 0; i < 38; i++) {
		for (j = 0; j < 44; j++) {
			if (num_cr_points || chroma_scaling_from_luma) {
				rockchip_av1_update_random_register
				    (&grain_random_register);
				(*cr_grain_block)[i][j] =
				    round_power_of_two(gaussian_sequence
					     [rockchip_av1_get_random_number
					      (grain_random_register)],
					     gauss_sec_shift);

Annotation

Implementation Notes