Lines Matching refs:sess

80 static int canvas_alloc(struct amvdec_session *sess, u8 *canvas_id)  in canvas_alloc()  argument
84 if (sess->canvas_num >= MAX_CANVAS) { in canvas_alloc()
85 dev_err(sess->core->dev, "Reached max number of canvas\n"); in canvas_alloc()
89 ret = meson_canvas_alloc(sess->core->canvas, canvas_id); in canvas_alloc()
93 sess->canvas_alloc[sess->canvas_num++] = *canvas_id; in canvas_alloc()
97 static int set_canvas_yuv420m(struct amvdec_session *sess, in set_canvas_yuv420m() argument
101 struct amvdec_core *core = sess->core; in set_canvas_yuv420m()
107 ret = canvas_alloc(sess, &canvas_id[i]); in set_canvas_yuv420m()
141 static int set_canvas_nv12m(struct amvdec_session *sess, in set_canvas_nv12m() argument
145 struct amvdec_core *core = sess->core; in set_canvas_nv12m()
151 ret = canvas_alloc(sess, &canvas_id[i]); in set_canvas_nv12m()
179 int amvdec_set_canvases(struct amvdec_session *sess, in amvdec_set_canvases() argument
183 u32 pixfmt = sess->pixfmt_cap; in amvdec_set_canvases()
184 u32 width = ALIGN(sess->width, 32); in amvdec_set_canvases()
185 u32 height = ALIGN(sess->height, 32); in amvdec_set_canvases()
192 v4l2_m2m_for_each_dst_buf(sess->m2m_ctx, buf) { in amvdec_set_canvases()
200 ret = set_canvas_nv12m(sess, &buf->vb.vb2_buf, width, in amvdec_set_canvases()
206 ret = set_canvas_yuv420m(sess, &buf->vb.vb2_buf, width, in amvdec_set_canvases()
212 dev_err(sess->core->dev, "Unsupported pixfmt %08X\n", in amvdec_set_canvases()
223 sess->fw_idx_to_vb2_idx[i++] = buf->vb.vb2_buf.index; in amvdec_set_canvases()
230 int amvdec_add_ts(struct amvdec_session *sess, u64 ts, in amvdec_add_ts() argument
245 spin_lock_irqsave(&sess->ts_spinlock, flags); in amvdec_add_ts()
246 list_add_tail(&new_ts->list, &sess->timestamps); in amvdec_add_ts()
247 spin_unlock_irqrestore(&sess->ts_spinlock, flags); in amvdec_add_ts()
252 void amvdec_remove_ts(struct amvdec_session *sess, u64 ts) in amvdec_remove_ts() argument
257 spin_lock_irqsave(&sess->ts_spinlock, flags); in amvdec_remove_ts()
258 list_for_each_entry(tmp, &sess->timestamps, list) { in amvdec_remove_ts()
265 dev_warn(sess->core->dev_dec, in amvdec_remove_ts()
269 spin_unlock_irqrestore(&sess->ts_spinlock, flags); in amvdec_remove_ts()
273 static void dst_buf_done(struct amvdec_session *sess, in dst_buf_done() argument
278 struct device *dev = sess->core->dev_dec; in dst_buf_done()
279 u32 output_size = amvdec_get_output_size(sess); in dst_buf_done()
281 switch (sess->pixfmt_cap) { in dst_buf_done()
294 vbuf->sequence = sess->sequence_cap++; in dst_buf_done()
298 if (sess->should_stop && in dst_buf_done()
299 atomic_read(&sess->esparser_queued_bufs) <= 1) { in dst_buf_done()
303 sess->sequence_cap - 1); in dst_buf_done()
304 v4l2_event_queue_fh(&sess->fh, &ev); in dst_buf_done()
306 } else if (sess->status == STATUS_NEEDS_RESUME) { in dst_buf_done()
309 sess->sequence_cap = 0; in dst_buf_done()
310 } else if (sess->should_stop) in dst_buf_done()
312 atomic_read(&sess->esparser_queued_bufs)); in dst_buf_done()
320 schedule_work(&sess->esparser_queue_work); in dst_buf_done()
323 void amvdec_dst_buf_done(struct amvdec_session *sess, in amvdec_dst_buf_done() argument
326 struct device *dev = sess->core->dev_dec; in amvdec_dst_buf_done()
328 struct list_head *timestamps = &sess->timestamps; in amvdec_dst_buf_done()
334 spin_lock_irqsave(&sess->ts_spinlock, flags); in amvdec_dst_buf_done()
340 spin_unlock_irqrestore(&sess->ts_spinlock, flags); in amvdec_dst_buf_done()
350 spin_unlock_irqrestore(&sess->ts_spinlock, flags); in amvdec_dst_buf_done()
352 dst_buf_done(sess, vbuf, field, timestamp, timecode, vbuf_flags); in amvdec_dst_buf_done()
353 atomic_dec(&sess->esparser_queued_bufs); in amvdec_dst_buf_done()
357 void amvdec_dst_buf_done_offset(struct amvdec_session *sess, in amvdec_dst_buf_done_offset() argument
361 struct device *dev = sess->core->dev_dec; in amvdec_dst_buf_done_offset()
369 spin_lock_irqsave(&sess->ts_spinlock, flags); in amvdec_dst_buf_done_offset()
372 list_for_each_entry_safe(tmp, n, &sess->timestamps, list) { in amvdec_dst_buf_done_offset()
398 spin_unlock_irqrestore(&sess->ts_spinlock, flags); in amvdec_dst_buf_done_offset()
400 dst_buf_done(sess, vbuf, field, timestamp, timecode, vbuf_flags); in amvdec_dst_buf_done_offset()
402 atomic_dec(&sess->esparser_queued_bufs); in amvdec_dst_buf_done_offset()
406 void amvdec_dst_buf_done_idx(struct amvdec_session *sess, in amvdec_dst_buf_done_idx() argument
410 struct device *dev = sess->core->dev_dec; in amvdec_dst_buf_done_idx()
412 vbuf = v4l2_m2m_dst_buf_remove_by_idx(sess->m2m_ctx, in amvdec_dst_buf_done_idx()
413 sess->fw_idx_to_vb2_idx[buf_idx]); in amvdec_dst_buf_done_idx()
423 amvdec_dst_buf_done_offset(sess, vbuf, offset, field, true); in amvdec_dst_buf_done_idx()
425 amvdec_dst_buf_done(sess, vbuf, field); in amvdec_dst_buf_done_idx()
429 void amvdec_set_par_from_dar(struct amvdec_session *sess, in amvdec_set_par_from_dar() argument
434 sess->pixelaspect.numerator = sess->height * dar_num; in amvdec_set_par_from_dar()
435 sess->pixelaspect.denominator = sess->width * dar_den; in amvdec_set_par_from_dar()
436 div = gcd(sess->pixelaspect.numerator, sess->pixelaspect.denominator); in amvdec_set_par_from_dar()
437 sess->pixelaspect.numerator /= div; in amvdec_set_par_from_dar()
438 sess->pixelaspect.denominator /= div; in amvdec_set_par_from_dar()
442 void amvdec_src_change(struct amvdec_session *sess, u32 width, in amvdec_src_change() argument
449 v4l2_ctrl_s_ctrl(sess->ctrl_min_buf_capture, dpb_size); in amvdec_src_change()
455 if (sess->streamon_cap && in amvdec_src_change()
456 sess->width == width && in amvdec_src_change()
457 sess->height == height && in amvdec_src_change()
458 dpb_size <= sess->num_dst_bufs) { in amvdec_src_change()
459 sess->fmt_out->codec_ops->resume(sess); in amvdec_src_change()
463 sess->changed_format = 0; in amvdec_src_change()
464 sess->width = width; in amvdec_src_change()
465 sess->height = height; in amvdec_src_change()
466 sess->status = STATUS_NEEDS_RESUME; in amvdec_src_change()
468 dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB size %u\n", in amvdec_src_change()
470 v4l2_event_queue_fh(&sess->fh, &ev); in amvdec_src_change()
474 void amvdec_abort(struct amvdec_session *sess) in amvdec_abort() argument
476 dev_info(sess->core->dev, "Aborting decoding session!\n"); in amvdec_abort()
477 vb2_queue_error(&sess->m2m_ctx->cap_q_ctx.q); in amvdec_abort()
478 vb2_queue_error(&sess->m2m_ctx->out_q_ctx.q); in amvdec_abort()