MLK-22164-2 VPU Decoder: check input frame type before update to ring buffer
authorShijie Qin <shijie.qin@nxp.com>
Thu, 1 Aug 2019 11:52:51 +0000 (19:52 +0800)
committerShijie Qin <shijie.qin@nxp.com>
Mon, 5 Aug 2019 02:46:04 +0000 (10:46 +0800)
Previously, only process for RV format, other formats should also
be treated in the same way.

Signed-off-by: Shijie Qin <shijie.qin@nxp.com>
Reviewed-by: ming_qian <ming.qian@nxp.com>
drivers/mxc/vpu_malone/insert_startcode.c
drivers/mxc/vpu_malone/insert_startcode.h
drivers/mxc/vpu_malone/vpu_b0.c
drivers/mxc/vpu_malone/vpu_b0.h

index 1998685..8911585 100644 (file)
@@ -456,102 +456,188 @@ u_int32 single_seq_info_format(struct queue_data *q_data)
        return ret;
 }
 
-u_int32 insert_scode_4_seq(struct vpu_ctx *ctx, u_int8 *src, u_int8 *dst, u_int32 vdec_std, u_int32 uPayloadSize)
+bool check_free_size_4_seq(struct vpu_ctx *ctx, u_int32 uPayloadSize)
 {
        struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+       pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+       u_int32 nfreespace = 0;
        u_int32 length = 0;
 
-       switch (vdec_std) {
+       switch (q_data->vdec_std) {
+       case VPU_VIDEO_VC1:
+               length = VC1_MAX_SEQ_HEADER_SIZE + 16;
+               break;
+       case  VPU_VIDEO_VP6:
+               length = uPayloadSize + 32;
+               break;
+       case VPU_VIDEO_VP8:
+               length = uPayloadSize + 72;
+               break;
+       case VPU_VIDEO_ASP:
+               length = uPayloadSize + 16;
+               break;
+       case VPU_VIDEO_SPK:
+               length = uPayloadSize + 32;
+               break;
+       case VPU_VIDEO_RV:
+               length = uPayloadSize + 16;
+               break;
+       case VPU_VIDEO_AVC:
+       case VPU_VIDEO_MPEG2:
+       case VPU_VIDEO_AVS:
+       case VPU_VIDEO_JPEG:
+       case VPU_VIDEO_AVC_MVC:
+       case VPU_VIDEO_HEVC:
+       case VPU_VIDEO_UNDEFINED:
+               length = uPayloadSize;
+               break;
+       default:
+               break;
+       }
+
+       pStrBufDesc = get_str_buffer_desc(ctx);
+       nfreespace = got_free_space(pStrBufDesc->wptr, pStrBufDesc->rptr,
+                                   pStrBufDesc->start, pStrBufDesc->end);
+       if (nfreespace < (length + MIN_SPACE)) {
+               vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
+               return false;
+       }
+
+       return true;
+}
+
+u_int32 insert_scode_4_seq(struct vpu_ctx *ctx, u_int8 *src, u_int32 uPayloadSize)
+{
+       struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+       u_int32 length = 0;
+
+       if (!check_free_size_4_seq(ctx, uPayloadSize))
+               return 0;
+
+       switch (q_data->vdec_std) {
        case VPU_VIDEO_VC1: {
                if (q_data->fourcc == V4L2_PIX_FMT_VC1_ANNEX_G) {
-                       u_int8 Header[VC1_MAX_SEQ_HEADER_SIZE];
+                       u_int8 payload_header[32] = {0};
+                       u_int8 Header[VC1_MAX_SEQ_HEADER_SIZE] = {0};
                        u_int32 uWidth = q_data->width;
                        u_int32 uHeight = q_data->height; //Width & Height in the generic payload header are ignored
                        u_int32 FrameSize = 0x60;
                        u_int32 HeaderLen, NoError = 1;
+
                        //insert startcode for vc1
-                       insert_payload_header_vc1(dst, SCODE_NEW_SEQUENCE, 20, uWidth, uHeight);
+                       insert_payload_header_vc1(payload_header, SCODE_NEW_SEQUENCE, 20, uWidth, uHeight);
+                       copy_buffer_to_stream(ctx, payload_header, 16);
                        length = 16;
                        //insert RCV sequence header for vc1 v1, length=20
                        insert_RCV_seqhdr(Header, &HeaderLen, src, FrameSize, uWidth, uHeight, &NoError);
                        HeaderLen = RCV_HEADER_LEN - 4;
-                       memcpy(dst + 16, Header, HeaderLen);
+                       copy_buffer_to_stream(ctx, Header, HeaderLen);
                        length += HeaderLen;
                } else {
-                       u_int8 Header[VC1_MAX_SEQ_HEADER_SIZE];
+                       u_int8 Header[VC1_MAX_SEQ_HEADER_SIZE] = {0};
                        u_int32 HeaderLen;
-
                        VC1CreateNALSeqHeader(Header, &HeaderLen, src, uPayloadSize,
                                        (unsigned int *)src, VC1_MAX_SEQ_HEADER_SIZE);
                        if (VC1_IS_NOT_NAL(((unsigned int *)src)[0]))
                                HeaderLen -= 4;
-                       memcpy(dst, Header, HeaderLen);
+                       copy_buffer_to_stream(ctx, Header, HeaderLen);
                        length += HeaderLen;
                }
        }
-
        break;
        case VPU_VIDEO_VP6: {
-               vp6_scd_sequence_header(dst, q_data->width, q_data->height);
+               u_int8 seq_header[16] = {0};
+               u_int8 frame_header[16] = {0};
+
+               vp6_scd_sequence_header(seq_header, q_data->width, q_data->height);
+               copy_buffer_to_stream(ctx, seq_header, 16);
                length = 16;
-               vp6_scd_frame_header(dst + length, q_data->width, q_data->height, uPayloadSize);
+               vp6_scd_frame_header(frame_header, q_data->width, q_data->height, uPayloadSize);
+               copy_buffer_to_stream(ctx, frame_header, 16);
                length += 16;
-               memcpy(dst + length, src, uPayloadSize);
+               copy_buffer_to_stream(ctx, src, uPayloadSize);
                length += uPayloadSize;
        }
        break;
        case VPU_VIDEO_VP8: {
-               u_int8 seq_header[32] = {0};
-               u_int8 frame_header[8] = {0};
+               u_int8 scd_seq_header[16] = {0};
+               u_int8 ivf_seq_header[32] = {0};
+               u_int8 scd_frame_header[16] = {0};
+               u_int8 ivf_frame_header[8] = {0};
 
-               vp8_scd_sequence_header(dst, q_data->width, q_data->height);
+               vp8_scd_sequence_header(scd_seq_header, q_data->width, q_data->height);
+               copy_buffer_to_stream(ctx, scd_seq_header, 16);
                length = 16;
-               vp8_ivf_sequence_header(seq_header, q_data->width, q_data->height);
-               memcpy(dst+length, seq_header, 32);
+               vp8_ivf_sequence_header(ivf_seq_header, q_data->width, q_data->height);
+               copy_buffer_to_stream(ctx, ivf_seq_header, 32);
                length += 32;
-               vp8_scd_frame_header(dst + length, q_data->width, q_data->height, uPayloadSize + 8);
+               vp8_scd_frame_header(scd_frame_header, q_data->width, q_data->height, uPayloadSize + 8);
+               copy_buffer_to_stream(ctx, scd_frame_header, 16);
                length += 16;
-               vp8_ivf_frame_header(frame_header, uPayloadSize);
-               memcpy(dst+length, frame_header, 8);
+               vp8_ivf_frame_header(ivf_frame_header, uPayloadSize);
+               copy_buffer_to_stream(ctx, ivf_frame_header, 8);
                length += 8;
-               memcpy(dst+length, src, uPayloadSize);
+               copy_buffer_to_stream(ctx, src, uPayloadSize);
                length += uPayloadSize;
        }
        break;
        case VPU_VIDEO_ASP: {
                if (q_data->fourcc == VPU_PIX_FMT_DIV3) {
-                       insert_payload_header_divx(dst, uPayloadSize, q_data->width, q_data->height);
+                       u_int8 seq_header[16] = {0};
+
+                       insert_payload_header_divx(seq_header, uPayloadSize, q_data->width, q_data->height);
+                       copy_buffer_to_stream(ctx, seq_header, 16);
                        length = 16;
-                       memcpy(dst+length, src, uPayloadSize);
+                       copy_buffer_to_stream(ctx, src, uPayloadSize);
                        length += uPayloadSize;
+               } else {
+                       copy_buffer_to_stream(ctx, src, uPayloadSize);
+                       length = uPayloadSize;
                }
        }
        break;
        case VPU_VIDEO_SPK: {
+               u_int8 seq_header[16] = {0};
                u_int8 frame_header[16] = {0};
-               insert_seq_header_spk(dst, 0, q_data->width, q_data->height);
+
+               insert_seq_header_spk(seq_header, 0, q_data->width, q_data->height);
+               copy_buffer_to_stream(ctx, seq_header, 16);
                length = 16;
                insert_frame_header_spk(frame_header, uPayloadSize, q_data->width, q_data->height);
-               memcpy(dst+length, frame_header, 16);
+               copy_buffer_to_stream(ctx, frame_header, 16);
                length += 16;
-               memcpy(dst+length, src, uPayloadSize);
+               copy_buffer_to_stream(ctx, src, uPayloadSize);
                length += uPayloadSize;
        }
        break;
        case VPU_VIDEO_RV: {
+               u_int8 seq_header[16] = {0};
+
                if (strncmp((const char *)(src+8), "RV30", 4) == 0)
                        ctx->arv_type = ARV_8;
                else
                        ctx->arv_type = ARV_9;
 
-               insert_payload_header_arv(dst, SCODE_NEW_SEQUENCE, ctx->arv_type, uPayloadSize + 12, q_data->width, q_data->height);
+               insert_payload_header_arv(seq_header, SCODE_NEW_SEQUENCE, ctx->arv_type, uPayloadSize + 12, q_data->width, q_data->height);
+               copy_buffer_to_stream(ctx, seq_header, 16);
                length = 16;
-               memcpy(dst+length, src, uPayloadSize);
+               copy_buffer_to_stream(ctx, src, uPayloadSize);
                length += uPayloadSize;
        }
        break;
-       default:
+       case VPU_VIDEO_AVC:
+       case VPU_VIDEO_MPEG2:
+       case VPU_VIDEO_AVS:
+       case VPU_VIDEO_JPEG:
+       case VPU_VIDEO_AVC_MVC:
+       case VPU_VIDEO_HEVC:
+       case VPU_VIDEO_UNDEFINED: {
+               copy_buffer_to_stream(ctx, src, uPayloadSize);
+               length = uPayloadSize;
+       }
        break;
+       default:
+               break;
        }
        return length;
 }
index 80c096c..66a3013 100644 (file)
@@ -33,7 +33,7 @@
 #define VC1_MAX_SEQ_HEADER_SIZE 256
 
 u_int32 insert_scode_4_pic(struct vpu_ctx *ctx, u_int8 *dst, u_int8 *src, u_int32 vdec_std, u_int32 uPayloadSize);
-u_int32 insert_scode_4_seq(struct vpu_ctx *ctx, u_int8 *src, u_int8 *dst, u_int32 vdec_std, u_int32 uPayloadSize);
+u_int32 insert_scode_4_seq(struct vpu_ctx *ctx, u_int8 *src, u_int32 uPayloadSize);
 u_int32 insert_scode_4_arv_slice(struct vpu_ctx *ctx, u_int8 *dst, struct VPU_FMT_INFO_ARV *arv_frame, u_int32 uPayloadSize);
 struct VPU_FMT_INFO_ARV *get_arv_info(struct vpu_ctx *ctx, u_int8 *src, u_int32 size);
 void put_arv_info(struct VPU_FMT_INFO_ARV *arv_frame);
index e23ee99..c2c1fb5 100644 (file)
@@ -91,7 +91,6 @@ static void reset_mbi_dcp_count(struct vpu_ctx *ctx);
 static bool verify_frame_buffer_size(struct queue_data *q_data,
                                                        struct vb2_data_req *p_data_req);
 static void add_buffer_to_queue(struct queue_data *q_data, struct vb2_data_req *data_req);
-static int copy_buffer_to_stream(struct vpu_ctx *ctx, void *buffer, uint32_t length);
 static int send_abort_cmd(struct vpu_ctx *ctx);
 static int send_stop_cmd(struct vpu_ctx *ctx);
 static int vpu_dec_cmd_reset(struct vpu_ctx *ctx);
@@ -469,7 +468,7 @@ static u32 get_str_buffer_desc_offset(struct vpu_ctx *ctx)
        return DEC_MFD_XREG_SLV_BASE + MFD_MCX + MFD_MCX_OFF * ctx->str_index;
 }
 
-static pSTREAM_BUFFER_DESCRIPTOR_TYPE get_str_buffer_desc(struct vpu_ctx *ctx)
+pSTREAM_BUFFER_DESCRIPTOR_TYPE get_str_buffer_desc(struct vpu_ctx *ctx)
 {
        pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
 
@@ -2810,7 +2809,7 @@ static void v4l2_vpu_send_cmd(struct vpu_ctx *ctx,
        vpu_dec_request_cmd(ctx, idx, cmdid, cmdnum, local_cmddata);
 }
 
-static void dump_input_data_to_local(struct vpu_ctx *ctx, void *src, u_int32 len, u_int32 first_flag)
+static void dump_input_data_to_local(struct vpu_ctx *ctx, void *src, u_int32 len)
 {
        struct file *fp;
        mm_segment_t fs;
@@ -2823,10 +2822,12 @@ static void dump_input_data_to_local(struct vpu_ctx *ctx, void *src, u_int32 len
        scnprintf(input_file, sizeof(input_file) - 1,
                        "/tmp/vpu_input_data_%d.bin", ctx->str_index);
 
-       if (first_flag)
+       if (ctx->first_dump_data_flag) {
                fp = filp_open(input_file, O_RDWR | O_TRUNC | O_CREAT, 0644);
-       else
+               ctx->first_dump_data_flag = false;
+       } else {
                fp = filp_open(input_file, O_RDWR | O_APPEND | O_CREAT, 0644);
+       }
        if (IS_ERR(fp)) {
                vpu_dbg(LVL_WARN, "warning: open file(%s) fail\n", input_file);
                return;
@@ -2841,8 +2842,7 @@ static void dump_input_data_to_local(struct vpu_ctx *ctx, void *src, u_int32 len
 }
 
 static u32 transfer_buffer_to_firmware(struct vpu_ctx *ctx,
-                                       void *input_buffer,
-                                       uint32_t buffer_size,
+                                       struct vb2_buffer *vb,
                                        uint32_t vdec_std)
 {
        pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
@@ -2854,6 +2854,9 @@ static u32 transfer_buffer_to_firmware(struct vpu_ctx *ctx,
        u_int32 length;
        MediaIPFW_Video_CodecParams *pCodecPara;
        struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+       void *input_buffer = (void *)vb2_plane_vaddr(vb, 0);
+       uint32_t buffer_size = vb->planes[0].bytesused;
+       struct vb2_v4l2_buffer *vbuf;
 
        vpu_dbg(LVL_BIT_FUNC, "enter %s, start_flag %d, index=%d, firmware_started=%d\n",
                        __func__, ctx->start_flag, ctx->str_index, ctx->dev->firmware_started);
@@ -2863,22 +2866,6 @@ static u32 transfer_buffer_to_firmware(struct vpu_ctx *ctx,
                        (pSharedInterface->FWVersion & 0x0000ff00) >> 8,
                        pSharedInterface->FWVersion & 0x000000ff);
 
-       if (ctx->stream_buffer.dma_size < buffer_size + MIN_SPACE) {
-               vpu_err("circular buffer size is set too small\n");
-               return 0;
-       }
-       if (!ctx->start_code_bypass)
-               length = insert_scode_4_seq(ctx, input_buffer, ctx->stream_buffer.dma_virt, vdec_std, buffer_size);
-       else
-               length = 0;
-       if (length == 0) {
-               memcpy(ctx->stream_buffer.dma_virt, input_buffer, buffer_size);
-               length = buffer_size;
-       }
-       vpu_dbg(LVL_INFO, "transfer data from virt 0x%p: size:%d\n",
-                       ctx->stream_buffer.dma_virt, buffer_size);
-       dump_input_data_to_local(ctx, ctx->stream_buffer.dma_virt, length, 1);
-       mb();
        pStrBufDesc = get_str_buffer_desc(ctx);
        pStrBufDesc->wptr = ctx->stream_buffer.dma_phy;
        pStrBufDesc->rptr = ctx->stream_buffer.dma_phy;
@@ -2888,7 +2875,23 @@ static u32 transfer_buffer_to_firmware(struct vpu_ctx *ctx,
        ctx->pre_pic_end_addr = pStrBufDesc->start;
        ctx->beginning = pStrBufDesc->start;
 
-       update_wptr(ctx, pStrBufDesc, ctx->stream_buffer.dma_phy + length);
+       if (!ctx->start_code_bypass) {
+               length = insert_scode_4_seq(ctx, input_buffer, buffer_size);
+               if (length == 0) {
+                       vpu_err("circular buffer size is set too small\n");
+                       return 0;
+               }
+       } else {
+               if (ctx->stream_buffer.dma_size < buffer_size + MIN_SPACE) {
+                       vpu_err("circular buffer size is set too small\n");
+                       return 0;
+               }
+               copy_buffer_to_stream(ctx, input_buffer, buffer_size);
+               length = buffer_size;
+       }
+       vpu_dbg(LVL_INFO, "transfer data from virt 0x%p: size:%d\n",
+                       ctx->stream_buffer.dma_virt, buffer_size);
+
        ctx->dev->shared_mem.pSharedInterface->pStreamBuffDesc[ctx->str_index][uStrBufIdx] =
                (VPU_REG_BASE + get_str_buffer_desc_offset(ctx));
 
@@ -2919,7 +2922,9 @@ static u32 transfer_buffer_to_firmware(struct vpu_ctx *ctx,
        ctx->dev->shared_mem.pSharedInterface->DbgLogDesc.uDecStatusLogLevel = vpu_frmdbg_level;
 
        /*initialize frame count*/
-       if (single_seq_info_format(q_data)) {
+       vbuf = to_vb2_v4l2_buffer(vb);
+       if (single_seq_info_format(q_data)
+           || vbuf->flags & V4L2_NXP_BUF_FLAG_CODECCONFIG) {
                ctx->frm_dis_delay = 0;
                ctx->frm_dec_delay = 0;
                ctx->frm_total_num = 0;
@@ -2937,13 +2942,9 @@ static void v4l2_transfer_buffer_to_firmware(struct queue_data *This, struct vb2
 {
        struct vpu_ctx *ctx = container_of(This, struct vpu_ctx, q_data[V4L2_SRC]);
        struct vb2_data_req *p_data_req;
-       void *data_mapped;
-       uint32_t buffer_size = vb->planes[0].bytesused;
        u32 frame_bytes;
        int ret;
 
-       data_mapped = (void *)vb2_plane_vaddr(vb, 0);
-
        if (ctx->start_flag == true) {
                ret = alloc_vpu_buffer(ctx);
                if (ret) {
@@ -2952,8 +2953,7 @@ static void v4l2_transfer_buffer_to_firmware(struct queue_data *This, struct vb2
                }
 
                frame_bytes = transfer_buffer_to_firmware(ctx,
-                                                         data_mapped,
-                                                         buffer_size,
+                                                         vb,
                                                          This->vdec_std);
 #ifdef HANDLE_EOS
                if (vb->planes[0].bytesused < vb->planes[0].length)
@@ -2975,7 +2975,7 @@ static void v4l2_transfer_buffer_to_firmware(struct queue_data *This, struct vb2
        }
 }
 
-static u_int32 got_free_space(u_int32 wptr, u_int32 rptr, u_int32 start, u_int32 end)
+u_int32 got_free_space(u_int32 wptr, u_int32 rptr, u_int32 start, u_int32 end)
 {
        u_int32 freespace = 0;
 
@@ -3003,7 +3003,7 @@ static u32 got_used_space(u32 wptr, u32 rptr, u32 start, u32 end)
 }
 
 
-static int copy_buffer_to_stream(struct vpu_ctx *ctx, void *buffer, uint32_t length)
+int copy_buffer_to_stream(struct vpu_ctx *ctx, void *buffer, uint32_t length)
 {
        pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
        void *wptr_virt;
@@ -3054,7 +3054,7 @@ static int copy_buffer_to_stream(struct vpu_ctx *ctx, void *buffer, uint32_t len
                memcpy(wptr_virt, buffer, length);
                wptr += length;
        }
-       dump_input_data_to_local(ctx, buffer, length, 0);
+       dump_input_data_to_local(ctx, buffer, length);
        mb();
        update_wptr(ctx, pStrBufDesc, wptr);
        return length;
@@ -3364,44 +3364,6 @@ static bool vpu_dec_stream_is_ready(struct vpu_ctx *ctx)
        return true;
 }
 
-static uint32_t insert_scode_4_seq_4_arv(struct vpu_ctx *ctx, u_int8 *input_buffer,
-       u_int32 buffer_size, uint32_t uStrBufIdx)
-{
-       struct vpu_dev *dev = ctx->dev;
-       uint32_t index = ctx->str_index;
-       pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
-       uint32_t nfreespace = 0;
-       u_int8 seq_header[256] = {0};
-       uint32_t length = 0;
-       struct queue_data *This = &ctx->q_data[V4L2_SRC];
-
-       pStrBufDesc = get_str_buffer_desc(ctx);
-       nfreespace = got_free_space(pStrBufDesc->wptr, pStrBufDesc->rptr,
-               pStrBufDesc->start, pStrBufDesc->end);
-
-       if (nfreespace < (buffer_size + 16 + MIN_SPACE)) {
-               vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
-               return 0;
-       }
-
-       insert_payload_header_arv(seq_header, SCODE_NEW_SEQUENCE, ctx->arv_type,
-               buffer_size + 12, This->width, This->height);
-       length = copy_buffer_to_stream(ctx, seq_header, 16);
-       length += copy_buffer_to_stream(ctx, input_buffer, buffer_size);
-
-       dev->shared_mem.pSharedInterface->pStreamBuffDesc[index][uStrBufIdx] =
-               (VPU_REG_BASE + get_str_buffer_desc_offset(ctx));
-
-       return length;
-}
-
-static u_int32 check_single_seq_info(struct vb2_v4l2_buffer *vbuf, struct queue_data *q_data)
-{
-       if (!(vbuf->flags & V4L2_NXP_BUF_FLAG_CODECCONFIG))
-               return 0;
-       return single_seq_info_format(q_data);
-}
-
 static bool verify_decoded_frames(struct vpu_ctx *ctx)
 {
        pDEC_RPC_HOST_IFACE pSharedInterface = ctx->dev->shared_mem.pSharedInterface;
@@ -3446,9 +3408,8 @@ static void enqueue_stream_data(struct vpu_ctx *ctx, uint32_t uStrBufIdx)
                input_buffer = (void *)vb2_plane_vaddr(p_data_req->vb2_buf, 0);
 
                vbuf = to_vb2_v4l2_buffer(p_data_req->vb2_buf);
-               if (vbuf->flags & V4L2_NXP_BUF_FLAG_CODECCONFIG
-                       && This->vdec_std == VPU_VIDEO_RV)
-                       frame_bytes = insert_scode_4_seq_4_arv(ctx, input_buffer, buffer_size, uStrBufIdx);
+               if (vbuf->flags & V4L2_NXP_BUF_FLAG_CODECCONFIG)
+                       frame_bytes = insert_scode_4_seq(ctx, input_buffer, buffer_size);
                else
                        frame_bytes = update_stream_addr_vpu(ctx, input_buffer, buffer_size, uStrBufIdx);
 
@@ -3468,7 +3429,7 @@ static void enqueue_stream_data(struct vpu_ctx *ctx, uint32_t uStrBufIdx)
                                record_log_info(ctx, LOG_PADDING, 0, 0);
                        }
 
-                       if (!check_single_seq_info(vbuf, This)) {
+                       if (!(vbuf->flags & V4L2_NXP_BUF_FLAG_CODECCONFIG)) {
                                ctx->frm_dec_delay++;
                                ctx->frm_dis_delay++;
                                ctx->frm_total_num++;
@@ -5715,6 +5676,7 @@ static int v4l2_open(struct file *filp)
        ctx->b_dis_reorder = false;
        ctx->start_code_bypass = false;
        ctx->hang_status = false;
+       ctx->first_dump_data_flag = true;
        INIT_LIST_HEAD(&ctx->cmd_q);
        ctx->tsm = createTSManager(tsm_buffer_size);
        if (!ctx->tsm)
index c75ba6b..4804dda 100644 (file)
@@ -361,6 +361,7 @@ struct vpu_ctx {
        bool hang_status;
        bool fifo_low;
        bool frame_decoded;
+       bool first_dump_data_flag;
        u32 req_frame_count;
        u_int32 mbi_count;
        u_int32 mbi_size;
@@ -439,4 +440,8 @@ struct vpu_ctx {
 #define VPU_DECODED_EVENT_PERF_MASK            (1 << 0)
 #define VPU_READY_EVENT_PERF_MASK              (1 << 1)
 
+pSTREAM_BUFFER_DESCRIPTOR_TYPE get_str_buffer_desc(struct vpu_ctx *ctx);
+u_int32 got_free_space(u_int32 wptr, u_int32 rptr, u_int32 start, u_int32 end);
+int copy_buffer_to_stream(struct vpu_ctx *ctx, void *buffer, uint32_t length);
+
 #endif