|
@@ -187,6 +187,20 @@ static int coda_hw_reset(struct coda_ctx *ctx)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static void coda_bit_stream_end_flag(struct coda_ctx *ctx)
|
|
|
+{
|
|
|
+ struct coda_dev *dev = ctx->dev;
|
|
|
+
|
|
|
+ ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
|
|
|
+
|
|
|
+ if ((dev->devtype->product == CODA_960) &&
|
|
|
+ coda_isbusy(dev) &&
|
|
|
+ (ctx->idx == coda_read(dev, CODA_REG_BIT_RUN_INDEX))) {
|
|
|
+ /* If this context is currently running, update the hardware flag */
|
|
|
+ coda_write(dev, ctx->bit_stream_param, CODA_REG_BIT_BIT_STREAM_PARAM);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static struct coda_q_data *get_q_data(struct coda_ctx *ctx,
|
|
|
enum v4l2_buf_type type)
|
|
|
{
|
|
@@ -730,7 +744,6 @@ static int coda_decoder_cmd(struct file *file, void *fh,
|
|
|
struct v4l2_decoder_cmd *dc)
|
|
|
{
|
|
|
struct coda_ctx *ctx = fh_to_ctx(fh);
|
|
|
- struct coda_dev *dev = ctx->dev;
|
|
|
int ret;
|
|
|
|
|
|
ret = coda_try_decoder_cmd(file, fh, dc);
|
|
@@ -741,15 +754,8 @@ static int coda_decoder_cmd(struct file *file, void *fh,
|
|
|
if (ctx->inst_type != CODA_INST_DECODER)
|
|
|
return 0;
|
|
|
|
|
|
- /* Set the strem-end flag on this context */
|
|
|
- ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
|
|
|
-
|
|
|
- if ((dev->devtype->product == CODA_960) &&
|
|
|
- coda_isbusy(dev) &&
|
|
|
- (ctx->idx == coda_read(dev, CODA_REG_BIT_RUN_INDEX))) {
|
|
|
- /* If this context is currently running, update the hardware flag */
|
|
|
- coda_write(dev, ctx->bit_stream_param, CODA_REG_BIT_BIT_STREAM_PARAM);
|
|
|
- }
|
|
|
+ /* Set the stream-end flag on this context */
|
|
|
+ coda_bit_stream_end_flag(ctx);
|
|
|
ctx->hold = false;
|
|
|
v4l2_m2m_try_schedule(ctx->fh.m2m_ctx);
|
|
|
|
|
@@ -1472,7 +1478,6 @@ static int coda_buf_prepare(struct vb2_buffer *vb)
|
|
|
static void coda_buf_queue(struct vb2_buffer *vb)
|
|
|
{
|
|
|
struct coda_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
|
|
- struct coda_dev *dev = ctx->dev;
|
|
|
struct coda_q_data *q_data;
|
|
|
|
|
|
q_data = get_q_data(ctx, vb->vb2_queue->type);
|
|
@@ -1487,15 +1492,8 @@ static void coda_buf_queue(struct vb2_buffer *vb)
|
|
|
* For backwards compatibility, queuing an empty buffer marks
|
|
|
* the stream end
|
|
|
*/
|
|
|
- if (vb2_get_plane_payload(vb, 0) == 0) {
|
|
|
- ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
|
|
|
- if ((dev->devtype->product == CODA_960) &&
|
|
|
- coda_isbusy(dev) &&
|
|
|
- (ctx->idx == coda_read(dev, CODA_REG_BIT_RUN_INDEX))) {
|
|
|
- /* if this decoder instance is running, set the stream end flag */
|
|
|
- coda_write(dev, ctx->bit_stream_param, CODA_REG_BIT_BIT_STREAM_PARAM);
|
|
|
- }
|
|
|
- }
|
|
|
+ if (vb2_get_plane_payload(vb, 0) == 0)
|
|
|
+ coda_bit_stream_end_flag(ctx);
|
|
|
mutex_lock(&ctx->bitstream_mutex);
|
|
|
v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vb);
|
|
|
if (vb2_is_streaming(vb->vb2_queue))
|
|
@@ -2492,19 +2490,7 @@ static void coda_stop_streaming(struct vb2_queue *q)
|
|
|
"%s: output\n", __func__);
|
|
|
ctx->streamon_out = 0;
|
|
|
|
|
|
- if (ctx->inst_type == CODA_INST_DECODER &&
|
|
|
- coda_isbusy(dev) && ctx->idx == coda_read(dev, CODA_REG_BIT_RUN_INDEX)) {
|
|
|
- /* if this decoder instance is running, set the stream end flag */
|
|
|
- if (dev->devtype->product == CODA_960) {
|
|
|
- u32 val = coda_read(dev, CODA_REG_BIT_BIT_STREAM_PARAM);
|
|
|
-
|
|
|
- val |= CODA_BIT_STREAM_END_FLAG;
|
|
|
- coda_write(dev, val, CODA_REG_BIT_BIT_STREAM_PARAM);
|
|
|
- ctx->bit_stream_param = val;
|
|
|
- }
|
|
|
- }
|
|
|
- ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
|
|
|
-
|
|
|
+ coda_bit_stream_end_flag(ctx);
|
|
|
ctx->isequence = 0;
|
|
|
} else {
|
|
|
v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
|