drivers/media/platform/qcom/iris/iris_vdec.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/qcom/iris/iris_vdec.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/qcom/iris/iris_vdec.c- Extension
.c- Size
- 15268 bytes
- Lines
- 543
- 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.
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
media/v4l2-event.hmedia/v4l2-mem2mem.hiris_buffer.hiris_common.hiris_ctrls.hiris_instance.hiris_power.hiris_vdec.hiris_vpu_buffer.h
Detected Declarations
function Copyrightfunction check_formatfunction find_format_by_indexfunction iris_vdec_enum_fmtfunction iris_vdec_try_fmtfunction iris_vdec_s_fmtfunction iris_vdec_validate_formatfunction iris_vdec_subscribe_eventfunction iris_vdec_src_changefunction iris_vdec_streamon_inputfunction iris_vdec_streamon_outputfunction iris_vdec_qbuffunction iris_vdec_start_cmdfunction iris_vdec_stop_cmd
Annotated Snippet
if (!supported) {
f_inst = inst->fmt_src;
f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
f->fmt.pix_mp.height = f_inst->fmt.pix_mp.height;
f->fmt.pix_mp.pixelformat = f_inst->fmt.pix_mp.pixelformat;
}
break;
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
if (!supported) {
f_inst = inst->fmt_dst;
f->fmt.pix_mp.pixelformat = f_inst->fmt.pix_mp.pixelformat;
f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
f->fmt.pix_mp.height = f_inst->fmt.pix_mp.height;
}
src_q = v4l2_m2m_get_src_vq(m2m_ctx);
if (vb2_is_streaming(src_q)) {
f_inst = inst->fmt_src;
f->fmt.pix_mp.height = f_inst->fmt.pix_mp.height;
f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
}
break;
default:
return -EINVAL;
}
if (pixmp->field == V4L2_FIELD_ANY)
pixmp->field = V4L2_FIELD_NONE;
pixmp->num_planes = 1;
return 0;
}
int iris_vdec_s_fmt(struct iris_inst *inst, struct v4l2_format *f)
{
struct v4l2_format *fmt, *output_fmt;
struct vb2_queue *q;
u32 codec_align;
q = v4l2_m2m_get_vq(inst->m2m_ctx, f->type);
if (vb2_is_busy(q))
return -EBUSY;
/* Width and height are optional, so fall back to a valid placeholder
* resolution until the real one is decoded from the bitstream.
*/
if (f->fmt.pix_mp.width == 0 && f->fmt.pix_mp.height == 0) {
f->fmt.pix_mp.width = DEFAULT_WIDTH;
f->fmt.pix_mp.height = DEFAULT_HEIGHT;
}
iris_vdec_try_fmt(inst, f);
switch (f->type) {
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
if (!check_format(inst, f->fmt.pix_mp.pixelformat, f->type))
return -EINVAL;
fmt = inst->fmt_src;
fmt->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
fmt->fmt.pix_mp.pixelformat = f->fmt.pix_mp.pixelformat;
inst->codec = fmt->fmt.pix_mp.pixelformat;
codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, codec_align);
fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, codec_align);
fmt->fmt.pix_mp.num_planes = 1;
fmt->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
fmt->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_INPUT);
inst->buffers[BUF_INPUT].min_count = iris_vpu_buf_count(inst, BUF_INPUT);
inst->buffers[BUF_INPUT].size = fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
fmt->fmt.pix_mp.colorspace = f->fmt.pix_mp.colorspace;
fmt->fmt.pix_mp.xfer_func = f->fmt.pix_mp.xfer_func;
fmt->fmt.pix_mp.ycbcr_enc = f->fmt.pix_mp.ycbcr_enc;
fmt->fmt.pix_mp.quantization = f->fmt.pix_mp.quantization;
output_fmt = inst->fmt_dst;
output_fmt->fmt.pix_mp.colorspace = f->fmt.pix_mp.colorspace;
output_fmt->fmt.pix_mp.xfer_func = f->fmt.pix_mp.xfer_func;
output_fmt->fmt.pix_mp.ycbcr_enc = f->fmt.pix_mp.ycbcr_enc;
output_fmt->fmt.pix_mp.quantization = f->fmt.pix_mp.quantization;
/* Update capture format based on new ip w/h */
output_fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, 128);
output_fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, 32);
inst->buffers[BUF_OUTPUT].min_count = iris_vpu_buf_count(inst, BUF_OUTPUT);
inst->buffers[BUF_OUTPUT].size = iris_get_buffer_size(inst, BUF_OUTPUT);
Annotation
- Immediate include surface: `media/v4l2-event.h`, `media/v4l2-mem2mem.h`, `iris_buffer.h`, `iris_common.h`, `iris_ctrls.h`, `iris_instance.h`, `iris_power.h`, `iris_vdec.h`.
- Detected declarations: `function Copyright`, `function check_format`, `function find_format_by_index`, `function iris_vdec_enum_fmt`, `function iris_vdec_try_fmt`, `function iris_vdec_s_fmt`, `function iris_vdec_validate_format`, `function iris_vdec_subscribe_event`, `function iris_vdec_src_change`, `function iris_vdec_streamon_input`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.