drivers/staging/media/sunxi/cedrus/cedrus_vp8.c

Source file repositories/reference/linux-study-clean/drivers/staging/media/sunxi/cedrus/cedrus_vp8.c

File Facts

System
Linux kernel
Corpus path
drivers/staging/media/sunxi/cedrus/cedrus_vp8.c
Extension
.c
Size
30697 bytes
Lines
883
Domain
Driver Families
Bucket
drivers/staging
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 (read_bits(dev, 1, VP8_PROB_HALF)) {
				read_bits(dev, 7, VP8_PROB_HALF);
				read_bits(dev, 1, VP8_PROB_HALF);
			}

		for (i = 0; i < 4; i++)
			if (read_bits(dev, 1, VP8_PROB_HALF)) {
				read_bits(dev, 6, VP8_PROB_HALF);
				read_bits(dev, 1, VP8_PROB_HALF);
			}
	}

	if (update)
		for (i = 0; i < 3; i++)
			if (read_bits(dev, 1, VP8_PROB_HALF))
				read_bits(dev, 8, VP8_PROB_HALF);
}

static void process_ref_lf_delta_info(struct cedrus_dev *dev)
{
	if (read_bits(dev, 1, VP8_PROB_HALF)) {
		int i;

		for (i = 0; i < 4; i++)
			if (read_bits(dev, 1, VP8_PROB_HALF)) {
				read_bits(dev, 6, VP8_PROB_HALF);
				read_bits(dev, 1, VP8_PROB_HALF);
			}

		for (i = 0; i < 4; i++)
			if (read_bits(dev, 1, VP8_PROB_HALF)) {
				read_bits(dev, 6, VP8_PROB_HALF);
				read_bits(dev, 1, VP8_PROB_HALF);
			}
	}
}

static void process_ref_frame_info(struct cedrus_dev *dev)
{
	u8 refresh_golden_frame = read_bits(dev, 1, VP8_PROB_HALF);
	u8 refresh_alt_ref_frame = read_bits(dev, 1, VP8_PROB_HALF);

	if (!refresh_golden_frame)
		read_bits(dev, 2, VP8_PROB_HALF);

	if (!refresh_alt_ref_frame)
		read_bits(dev, 2, VP8_PROB_HALF);

	read_bits(dev, 1, VP8_PROB_HALF);
	read_bits(dev, 1, VP8_PROB_HALF);
}

static void cedrus_irq_clear(struct cedrus_dev *dev)
{
	cedrus_write(dev, VE_H264_STATUS,
		     VE_H264_STATUS_INT_MASK);
}

static void cedrus_read_header(struct cedrus_dev *dev,
			       const struct v4l2_ctrl_vp8_frame *slice)
{
	int i, j;

	if (V4L2_VP8_FRAME_IS_KEY_FRAME(slice)) {
		read_bits(dev, 1, VP8_PROB_HALF);
		read_bits(dev, 1, VP8_PROB_HALF);
	}

	if (read_bits(dev, 1, VP8_PROB_HALF))
		process_segmentation_info(dev);

	read_bits(dev, 1, VP8_PROB_HALF);
	read_bits(dev, 6, VP8_PROB_HALF);
	read_bits(dev, 3, VP8_PROB_HALF);

	if (read_bits(dev, 1, VP8_PROB_HALF))
		process_ref_lf_delta_info(dev);

	read_bits(dev, 2, VP8_PROB_HALF);

	/* y_ac_qi */
	read_bits(dev, 7, VP8_PROB_HALF);

	/* Parses y_dc_delta, y2_dc_delta, etc. */
	for (i = 0; i < QUANT_DELTA_COUNT; i++)
		get_delta_q(dev);

	if (!V4L2_VP8_FRAME_IS_KEY_FRAME(slice))
		process_ref_frame_info(dev);

Annotation

Implementation Notes