drivers/media/v4l2-core/v4l2-vp9.c

Source file repositories/reference/linux-study-clean/drivers/media/v4l2-core/v4l2-vp9.c

File Facts

System
Linux kernel
Corpus path
drivers/media/v4l2-core/v4l2-vp9.c
Extension
.c
Size
53356 bytes
Lines
1851
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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 (dec_params->flags & V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV) {
			p = probs->mv.class0_hp;
			d = deltas->mv.class0_hp;
			p[i] = update_mv_prob(d[i], p[i]);

			p = probs->mv.hp;
			d = deltas->mv.hp;
			p[i] = update_mv_prob(d[i], p[i]);
		}
	}
}

/* Counterpart to 6.3 compressed_header(), but parsing has been done in userspace. */
void v4l2_vp9_fw_update_probs(struct v4l2_vp9_frame_context *probs,
			      const struct v4l2_ctrl_vp9_compressed_hdr *deltas,
			      const struct v4l2_ctrl_vp9_frame *dec_params)
{
	if (deltas->tx_mode == V4L2_VP9_TX_MODE_SELECT)
		update_tx_probs(probs, deltas);

	update_coef_probs(probs, deltas, dec_params);

	update_skip_probs(probs, deltas);

	if (dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME ||
	    dec_params->flags & V4L2_VP9_FRAME_FLAG_INTRA_ONLY)
		return;

	update_inter_mode_probs(probs, deltas);

	if (dec_params->interpolation_filter == V4L2_VP9_INTERP_FILTER_SWITCHABLE)
		update_interp_filter_probs(probs, deltas);

	update_is_inter_probs(probs, deltas);

	update_frame_reference_mode_probs(dec_params->reference_mode, probs, deltas);

	update_y_mode_probs(probs, deltas);

	update_partition_probs(probs, deltas);

	update_mv_probs(probs, deltas, dec_params);
}
EXPORT_SYMBOL_GPL(v4l2_vp9_fw_update_probs);

u8 v4l2_vp9_reset_frame_ctx(const struct v4l2_ctrl_vp9_frame *dec_params,
			    struct v4l2_vp9_frame_context *frame_context)
{
	int i;

	u8 fctx_idx = dec_params->frame_context_idx;

	if (dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME ||
	    dec_params->flags & V4L2_VP9_FRAME_FLAG_INTRA_ONLY ||
	    dec_params->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT) {
		/*
		 * setup_past_independence()
		 * We do nothing here. Instead of storing default probs in some intermediate
		 * location and then copying from that location to appropriate contexts
		 * in save_probs() below, we skip that step and save default probs directly
		 * to appropriate contexts.
		 */
		if (dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME ||
		    dec_params->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT ||
		    dec_params->reset_frame_context == V4L2_VP9_RESET_FRAME_CTX_ALL)
			for (i = 0; i < 4; ++i)
				/* save_probs(i) */
				memcpy(&frame_context[i], &v4l2_vp9_default_probs,
				       sizeof(v4l2_vp9_default_probs));
		else if (dec_params->reset_frame_context == V4L2_VP9_RESET_FRAME_CTX_SPEC)
			/* save_probs(fctx_idx) */
			memcpy(&frame_context[fctx_idx], &v4l2_vp9_default_probs,
			       sizeof(v4l2_vp9_default_probs));
		fctx_idx = 0;
	}

	return fctx_idx;
}
EXPORT_SYMBOL_GPL(v4l2_vp9_reset_frame_ctx);

/* 8.4.1 Merge prob process */
static u8 merge_prob(u8 pre_prob, u32 ct0, u32 ct1, u16 count_sat, u32 max_update_factor)
{
	u32 den, prob, count, factor;

	den = ct0 + ct1;
	if (!den) {
		/*
		 * prob = 128, count = 0, update_factor = 0
		 * Round2's argument: pre_prob * 256

Annotation

Implementation Notes