aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/platform/s5p-mfc/s5p_mfc_enc.c')
-rw-r--r--drivers/media/platform/s5p-mfc/s5p_mfc_enc.c64
1 files changed, 47 insertions, 17 deletions
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
index 4f6b553c4b2d..5e019aa6113b 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
@@ -592,7 +592,7 @@ static int s5p_mfc_ctx_ready(struct s5p_mfc_ctx *ctx)
592 return 1; 592 return 1;
593 /* context is ready to encode a frame */ 593 /* context is ready to encode a frame */
594 if ((ctx->state == MFCINST_RUNNING || 594 if ((ctx->state == MFCINST_RUNNING ||
595 ctx->state == MFCINST_HEAD_PARSED) && 595 ctx->state == MFCINST_HEAD_PRODUCED) &&
596 ctx->src_queue_cnt >= 1 && ctx->dst_queue_cnt >= 1) 596 ctx->src_queue_cnt >= 1 && ctx->dst_queue_cnt >= 1)
597 return 1; 597 return 1;
598 /* context is ready to encode remaining frames */ 598 /* context is ready to encode remaining frames */
@@ -649,6 +649,7 @@ static int enc_post_seq_start(struct s5p_mfc_ctx *ctx)
649 struct s5p_mfc_enc_params *p = &ctx->enc_params; 649 struct s5p_mfc_enc_params *p = &ctx->enc_params;
650 struct s5p_mfc_buf *dst_mb; 650 struct s5p_mfc_buf *dst_mb;
651 unsigned long flags; 651 unsigned long flags;
652 unsigned int enc_pb_count;
652 653
653 if (p->seq_hdr_mode == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) { 654 if (p->seq_hdr_mode == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) {
654 spin_lock_irqsave(&dev->irqlock, flags); 655 spin_lock_irqsave(&dev->irqlock, flags);
@@ -661,18 +662,19 @@ static int enc_post_seq_start(struct s5p_mfc_ctx *ctx)
661 vb2_buffer_done(dst_mb->b, VB2_BUF_STATE_DONE); 662 vb2_buffer_done(dst_mb->b, VB2_BUF_STATE_DONE);
662 spin_unlock_irqrestore(&dev->irqlock, flags); 663 spin_unlock_irqrestore(&dev->irqlock, flags);
663 } 664 }
664 if (IS_MFCV6(dev)) { 665
665 ctx->state = MFCINST_HEAD_PARSED; /* for INIT_BUFFER cmd */ 666 if (!IS_MFCV6(dev)) {
666 } else {
667 ctx->state = MFCINST_RUNNING; 667 ctx->state = MFCINST_RUNNING;
668 if (s5p_mfc_ctx_ready(ctx)) 668 if (s5p_mfc_ctx_ready(ctx))
669 set_work_bit_irqsave(ctx); 669 set_work_bit_irqsave(ctx);
670 s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); 670 s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
671 } 671 } else {
672 672 enc_pb_count = s5p_mfc_hw_call(dev->mfc_ops,
673 if (IS_MFCV6(dev))
674 ctx->dpb_count = s5p_mfc_hw_call(dev->mfc_ops,
675 get_enc_dpb_count, dev); 673 get_enc_dpb_count, dev);
674 if (ctx->pb_count < enc_pb_count)
675 ctx->pb_count = enc_pb_count;
676 ctx->state = MFCINST_HEAD_PRODUCED;
677 }
676 678
677 return 0; 679 return 0;
678} 680}
@@ -1055,15 +1057,13 @@ static int vidioc_reqbufs(struct file *file, void *priv,
1055 } 1057 }
1056 ctx->capture_state = QUEUE_BUFS_REQUESTED; 1058 ctx->capture_state = QUEUE_BUFS_REQUESTED;
1057 1059
1058 if (!IS_MFCV6(dev)) { 1060 ret = s5p_mfc_hw_call(ctx->dev->mfc_ops,
1059 ret = s5p_mfc_hw_call(ctx->dev->mfc_ops, 1061 alloc_codec_buffers, ctx);
1060 alloc_codec_buffers, ctx); 1062 if (ret) {
1061 if (ret) { 1063 mfc_err("Failed to allocate encoding buffers\n");
1062 mfc_err("Failed to allocate encoding buffers\n"); 1064 reqbufs->count = 0;
1063 reqbufs->count = 0; 1065 ret = vb2_reqbufs(&ctx->vq_dst, reqbufs);
1064 ret = vb2_reqbufs(&ctx->vq_dst, reqbufs); 1066 return -ENOMEM;
1065 return -ENOMEM;
1066 }
1067 } 1067 }
1068 } else if (reqbufs->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { 1068 } else if (reqbufs->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
1069 if (ctx->output_state != QUEUE_FREE) { 1069 if (ctx->output_state != QUEUE_FREE) {
@@ -1071,6 +1071,19 @@ static int vidioc_reqbufs(struct file *file, void *priv,
1071 ctx->output_state); 1071 ctx->output_state);
1072 return -EINVAL; 1072 return -EINVAL;
1073 } 1073 }
1074
1075 if (IS_MFCV6(dev)) {
1076 /* Check for min encoder buffers */
1077 if (ctx->pb_count &&
1078 (reqbufs->count < ctx->pb_count)) {
1079 reqbufs->count = ctx->pb_count;
1080 mfc_debug(2, "Minimum %d output buffers needed\n",
1081 ctx->pb_count);
1082 } else {
1083 ctx->pb_count = reqbufs->count;
1084 }
1085 }
1086
1074 ret = vb2_reqbufs(&ctx->vq_src, reqbufs); 1087 ret = vb2_reqbufs(&ctx->vq_src, reqbufs);
1075 if (ret != 0) { 1088 if (ret != 0) {
1076 mfc_err("error in vb2_reqbufs() for E(S)\n"); 1089 mfc_err("error in vb2_reqbufs() for E(S)\n");
@@ -1760,11 +1773,28 @@ static int s5p_mfc_start_streaming(struct vb2_queue *q, unsigned int count)
1760 struct s5p_mfc_ctx *ctx = fh_to_ctx(q->drv_priv); 1773 struct s5p_mfc_ctx *ctx = fh_to_ctx(q->drv_priv);
1761 struct s5p_mfc_dev *dev = ctx->dev; 1774 struct s5p_mfc_dev *dev = ctx->dev;
1762 1775
1776 if (IS_MFCV6(dev) && (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)) {
1777
1778 if ((ctx->state == MFCINST_GOT_INST) &&
1779 (dev->curr_ctx == ctx->num) && dev->hw_lock) {
1780 s5p_mfc_wait_for_done_ctx(ctx,
1781 S5P_MFC_R2H_CMD_SEQ_DONE_RET,
1782 0);
1783 }
1784
1785 if (ctx->src_bufs_cnt < ctx->pb_count) {
1786 mfc_err("Need minimum %d OUTPUT buffers\n",
1787 ctx->pb_count);
1788 return -EINVAL;
1789 }
1790 }
1791
1763 v4l2_ctrl_handler_setup(&ctx->ctrl_handler); 1792 v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
1764 /* If context is ready then dev = work->data;schedule it to run */ 1793 /* If context is ready then dev = work->data;schedule it to run */
1765 if (s5p_mfc_ctx_ready(ctx)) 1794 if (s5p_mfc_ctx_ready(ctx))
1766 set_work_bit_irqsave(ctx); 1795 set_work_bit_irqsave(ctx);
1767 s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); 1796 s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
1797
1768 return 0; 1798 return 0;
1769} 1799}
1770 1800