drivers/media/test-drivers/visl/visl-dec.c

Source file repositories/reference/linux-study-clean/drivers/media/test-drivers/visl/visl-dec.c

File Facts

System
Linux kernel
Corpus path
drivers/media/test-drivers/visl/visl-dec.c
Extension
.c
Size
20743 bytes
Lines
656
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 (tpg_verbose && vb2_buf) {
				len = scnprintf(buf, buflen, entry, i,
						run->h264.dpram->dpb[i].reference_ts,
						vb2_buf->index);
			} else {
				len = scnprintf(buf, buflen, entry_stable, i,
						run->h264.dpram->dpb[i].reference_ts);
			}
			buf += len;
			buflen -= len;
		}

		break;
	}

	case VISL_CODEC_HEVC: {
		char entry[] = "dpb[%d]:%u, vb2_index: %d\n";
		char entry_stable[] = "dpb[%d]:%u\n";
		struct vb2_buffer *vb2_buf;

		for (i = 0; i < ARRAY_SIZE(run->hevc.dpram->dpb); i++) {
			vb2_buf = vb2_find_buffer(cap_q, run->hevc.dpram->dpb[i].timestamp);
			if (tpg_verbose && vb2_buf) {
				len = scnprintf(buf, buflen, entry, i,
						run->hevc.dpram->dpb[i].timestamp,
						vb2_buf->index);
			} else {
				len = scnprintf(buf, buflen, entry_stable, i,
						run->hevc.dpram->dpb[i].timestamp);
			}

			buf += len;
			buflen -= len;
		}

		break;
	}

	case VISL_CODEC_AV1: {
		int idx_last = run->av1.frame->ref_frame_idx[LAST_BUF_IDX];
		int idx_last2 = run->av1.frame->ref_frame_idx[LAST2_BUF_IDX];
		int idx_last3 = run->av1.frame->ref_frame_idx[LAST3_BUF_IDX];
		int idx_golden = run->av1.frame->ref_frame_idx[GOLDEN_BUF_IDX];
		int idx_bwd = run->av1.frame->ref_frame_idx[BWD_BUF_IDX];
		int idx_alt2 = run->av1.frame->ref_frame_idx[ALT2_BUF_IDX];
		int idx_alt = run->av1.frame->ref_frame_idx[ALT_BUF_IDX];

		const u64 *reference_frame_ts = run->av1.frame->reference_frame_ts;

		struct vb2_buffer *ref_last =
			vb2_find_buffer(cap_q, reference_frame_ts[idx_last]);
		struct vb2_buffer *ref_last2 =
			vb2_find_buffer(cap_q, reference_frame_ts[idx_last2]);
		struct vb2_buffer *ref_last3 =
			vb2_find_buffer(cap_q, reference_frame_ts[idx_last3]);
		struct vb2_buffer *ref_golden =
			vb2_find_buffer(cap_q, reference_frame_ts[idx_golden]);
		struct vb2_buffer *ref_bwd =
			vb2_find_buffer(cap_q, reference_frame_ts[idx_bwd]);
		struct vb2_buffer *ref_alt2 =
			vb2_find_buffer(cap_q, reference_frame_ts[idx_alt2]);
		struct vb2_buffer *ref_alt =
			vb2_find_buffer(cap_q, reference_frame_ts[idx_alt]);

		visl_print_ts_idx(&buf, &buflen, "ref_last_ts",
				  reference_frame_ts[idx_last], ref_last);
		visl_print_ts_idx(&buf, &buflen, "ref_last2_ts",
				  reference_frame_ts[idx_last2], ref_last2);
		visl_print_ts_idx(&buf, &buflen, "ref_last3_ts",
				  reference_frame_ts[idx_last3], ref_last3);
		visl_print_ts_idx(&buf, &buflen, "ref_golden_ts",
				  reference_frame_ts[idx_golden], ref_golden);
		visl_print_ts_idx(&buf, &buflen, "ref_bwd_ts",
				  reference_frame_ts[idx_bwd], ref_bwd);
		visl_print_ts_idx(&buf, &buflen, "ref_alt2_ts",
				  reference_frame_ts[idx_alt2], ref_alt2);
		visl_print_ts_idx(&buf, &buflen, "ref_alt_ts",
				  reference_frame_ts[idx_alt], ref_alt);

		break;
	}
	}
}

static char *visl_get_vb2_state(enum vb2_buffer_state state)
{
	switch (state) {
	case VB2_BUF_STATE_DEQUEUED:
		return "Dequeued";
	case VB2_BUF_STATE_IN_REQUEST:

Annotation

Implementation Notes