*/
/*
- * The code contained herein is licensed under the GNU Lesser General
- * Public License. You may obtain a copy of the GNU Lesser General
- * Public License Version 2.1 or later at the following locations:
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
*
- * http://www.opensource.org/licenses/lgpl-license.html
- * http://www.gnu.org/copyleft/lgpl.html
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
*/
/*!
#define LVL_BIT_FLOW (1 << 13)
#define LVL_BIT_FRAME_COUNT (1 << 14)
-#define vpu_err(fmt, arg...) pr_info("[VPU Decoder]\t " fmt, ## arg)
+#define vpu_err(fmt, arg...) pr_info("[VPU Decoder] " fmt, ## arg)
#define vpu_dbg(level, fmt, arg...) \
do { \
if (vpu_dbg_level_decoder & (level)) \
- pr_info("[VPU Decoder]\t " fmt, ## arg); \
+ pr_info("[VPU Decoder] " fmt, ## arg); \
} while (0)
#define V4L2_NXP_BUF_FLAG_CODECCONFIG 0x00200000
static void dec_frame(struct vpu_frame_info *frame);
static int submit_input_and_encode(struct vpu_ctx *ctx);
static int process_stream_output(struct vpu_ctx *ctx);
+static u32 get_ptr(u32 ptr);
static char *get_event_str(u32 event)
{
return NULL;
}
+static void update_stream_desc_rptr(struct vpu_ctx *ctx, u32 rptr)
+{
+ pBUFFER_DESCRIPTOR_TYPE stream_buffer_desc;
+
+ stream_buffer_desc = get_rpc_stream_buffer_desc(ctx);
+ stream_buffer_desc->rptr = rptr;
+}
+
static int do_configure_codec(struct vpu_ctx *ctx)
{
pBUFFER_DESCRIPTOR_TYPE pEncStrBuffDesc = NULL;
clear_bit(flag, &queue->rw_flag);
}
+u32 get_free_space(struct vpu_ctx *ctx)
+{
+ pBUFFER_DESCRIPTOR_TYPE desc = get_rpc_stream_buffer_desc(ctx);
+ u32 start = get_ptr(desc->start);
+ u32 end = get_ptr(desc->end);
+ u32 wptr = get_ptr(desc->wptr);
+ u32 rptr = get_ptr(desc->rptr);
+
+ if (rptr > wptr)
+ return (rptr - wptr);
+ else if (rptr < wptr)
+ return (end - start + rptr - wptr);
+ else
+ return (end - start);
+
+}
+
+bool check_stream_buffer_for_coded_picture(struct vpu_ctx *ctx)
+{
+ if (get_free_space(ctx) < ctx->cpb_size)
+ return false;
+
+ return true;
+}
+
static int submit_input_and_encode(struct vpu_ctx *ctx)
{
struct queue_data *queue;
if (list_empty(&queue->drv_q))
goto exit;
+ if (!check_stream_buffer_for_coded_picture(ctx))
+ goto exit;
+
if (test_bit(VPU_ENC_STATUS_STOP_SEND, &ctx->status))
goto exit;
if (!test_bit(VPU_ENC_STATUS_START_DONE, &ctx->status))
frame->rptr = get_ptr(stream_buffer_desc->rptr);
if (precheck_frame(ctx, frame)) {
- stream_buffer_desc->rptr = frame->rptr;
+ update_stream_desc_rptr(ctx, frame->rptr);
put_frame_idle(frame);
frame = NULL;
return true;
else
transfer_stream_output(ctx, frame, p_data_req);
- stream_buffer_desc->rptr = frame->rptr;
+ update_stream_desc_rptr(ctx, frame->rptr);
if (!frame->eos) {
fill_vb_sequence(p_data_req->vb2_buf, frame->info.uFrameID);
p_data_req->vb2_buf->timestamp = frame->timestamp;
}
up(&queue->drv_q_lock);
+ submit_input_and_encode(ctx);
+
return 0;
}
return 0;
}
+static bool check_stream_buffer_desc(struct vpu_ctx *ctx,
+ pBUFFER_DESCRIPTOR_TYPE stream_buffer_desc)
+{
+ u32 start;
+ u32 end;
+ u32 rptr;
+ u32 wptr;
+
+ if (!stream_buffer_desc)
+ return false;
+ start = get_ptr(stream_buffer_desc->start);
+ end = get_ptr(stream_buffer_desc->end);
+ rptr = get_ptr(stream_buffer_desc->rptr);
+ wptr = get_ptr(stream_buffer_desc->wptr);
+
+ if (rptr < start || rptr > end ||
+ wptr < start || wptr > end ||
+ end <= start ||
+ end - start != ctx->encoder_stream.size) {
+ vpu_err("stream buffer desc is invalid, s:%x,e:%x,r:%x,w:%x\n",
+ start, end, rptr, wptr);
+ return false;
+ }
+
+ return true;
+}
+
static int handle_event_frame_done(struct vpu_ctx *ctx,
MEDIAIP_ENC_PIC_INFO *pEncPicInfo)
{
}
stream_buffer_desc = get_rpc_stream_buffer_desc(ctx);
- if (stream_buffer_desc->rptr < stream_buffer_desc->start ||
- stream_buffer_desc->rptr > stream_buffer_desc->end ||
- stream_buffer_desc->wptr < stream_buffer_desc->start ||
- stream_buffer_desc->wptr > stream_buffer_desc->end ||
- stream_buffer_desc->end - stream_buffer_desc->start !=
- ctx->encoder_stream.size) {
- vpu_err("stream buffer desc is invalid, s:%x,e:%x,r:%x,w:%x\n",
- stream_buffer_desc->start,
- stream_buffer_desc->end,
- stream_buffer_desc->rptr,
- stream_buffer_desc->wptr);
+ if (!check_stream_buffer_desc(ctx, stream_buffer_desc))
return -EINVAL;
- }
show_enc_pic_info(pEncPicInfo);
record_start_time(ctx, V4L2_DST);
return num;
}
+static int show_instance_stream_buffer_desc(struct vpu_ctx *ctx,
+ char *buf, u32 size)
+{
+ pBUFFER_DESCRIPTOR_TYPE stream_buffer_desc;
+ int num = 0;
+
+ stream_buffer_desc = get_rpc_stream_buffer_desc(ctx);
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%x\n", "start",
+ get_ptr(stream_buffer_desc->start));
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%x\n", "end",
+ get_ptr(stream_buffer_desc->end));
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%x\n", "rptr",
+ get_ptr(stream_buffer_desc->rptr));
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%x\n", "wptr",
+ get_ptr(stream_buffer_desc->wptr));
+ return num;
+}
+
static int show_instance_others(struct vpu_attr *attr, char *buf, u32 size)
{
int num = 0;
if (ctx) {
num += show_v4l2_buf_status(ctx, buf + num, PAGE_SIZE - num);
num += show_instance_status(ctx, buf + num, PAGE_SIZE - num);
+ num += show_instance_stream_buffer_desc(ctx,
+ buf + num,
+ PAGE_SIZE - num);
}
mutex_unlock(&vpudev->dev_mutex);