71 lines
1.8 KiB
C
71 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Cedrus VPU driver
|
|
*
|
|
* Copyright (C) 2016 Florent Revest <florent.revest@free-electrons.com>
|
|
* Copyright (C) 2018 Paul Kocialkowski <paul.kocialkowski@bootlin.com>
|
|
* Copyright (C) 2018 Bootlin
|
|
*
|
|
* Based on the vim2m driver, that is:
|
|
*
|
|
* Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
|
|
* Pawel Osciak, <pawel@osciak.com>
|
|
* Marek Szyprowski, <m.szyprowski@samsung.com>
|
|
*/
|
|
|
|
#include <media/v4l2-device.h>
|
|
#include <media/v4l2-ioctl.h>
|
|
#include <media/v4l2-event.h>
|
|
#include <media/v4l2-mem2mem.h>
|
|
|
|
#include "cedrus.h"
|
|
#include "cedrus_dec.h"
|
|
#include "cedrus_hw.h"
|
|
|
|
void cedrus_device_run(void *priv)
|
|
{
|
|
struct cedrus_ctx *ctx = priv;
|
|
struct cedrus_dev *dev = ctx->dev;
|
|
struct cedrus_run run = { 0 };
|
|
struct media_request *src_req;
|
|
unsigned long flags;
|
|
|
|
run.src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
run.dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
|
|
|
/* Apply request(s) controls if needed. */
|
|
src_req = run.src->vb2_buf.req_obj.req;
|
|
|
|
if (src_req)
|
|
v4l2_ctrl_request_setup(src_req, &ctx->hdl);
|
|
|
|
spin_lock_irqsave(&ctx->dev->irq_lock, flags);
|
|
|
|
switch (ctx->src_fmt.pixelformat) {
|
|
case V4L2_PIX_FMT_MPEG2_SLICE:
|
|
run.mpeg2.slice_params = cedrus_find_control_data(ctx,
|
|
V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS);
|
|
run.mpeg2.quantization = cedrus_find_control_data(ctx,
|
|
V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
dev->dec_ops[ctx->current_codec]->setup(ctx, &run);
|
|
|
|
spin_unlock_irqrestore(&ctx->dev->irq_lock, flags);
|
|
|
|
/* Complete request(s) controls if needed. */
|
|
|
|
if (src_req)
|
|
v4l2_ctrl_request_complete(src_req, &ctx->hdl);
|
|
|
|
spin_lock_irqsave(&ctx->dev->irq_lock, flags);
|
|
|
|
dev->dec_ops[ctx->current_codec]->trigger(ctx);
|
|
|
|
spin_unlock_irqrestore(&ctx->dev->irq_lock, flags);
|
|
}
|