MLK-21589-2 VPU Decoder: implement insert decoder header of
authorShijie Qin <shijie.qin@nxp.com>
Mon, 6 May 2019 05:28:49 +0000 (13:28 +0800)
committerShijie Qin <shijie.qin@nxp.com>
Mon, 6 May 2019 10:32:02 +0000 (18:32 +0800)
    RV format for Amphion decoder

    Not add picture header and slice header for RV format if
    it is raw-data

Signed-off-by: Shijie Qin <shijie.qin@nxp.com>
drivers/mxc/vpu_malone/vpu_b0.c

index 9e8ede9..a762c48 100644 (file)
@@ -2441,47 +2441,51 @@ static int update_stream_addr(struct vpu_ctx *ctx, void *input_buffer, uint32_t
 
        nfreespace = got_free_space(wptr, rptr, start, end);
 
-       if (!ctx->start_code_bypass)
-               header_length = insert_scode_4_pic(ctx, payload_header, input_buffer, q_data->vdec_std, buffer_size);
-       else
-               header_length = 0;
-
-       if (q_data->vdec_std != VPU_VIDEO_RV) {
-               if (nfreespace < (buffer_size + header_length + MIN_SPACE)) {
+       if (ctx->start_code_bypass) {
+               if (nfreespace < (buffer_size + MIN_SPACE)) {
                        vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
                        return 0;
                }
-
-               copy_length += copy_buffer_to_stream(ctx, payload_header, header_length);
                copy_length += copy_buffer_to_stream(ctx, input_buffer, buffer_size);
        } else {
-               arv_frame = get_arv_info(ctx, input_buffer);
-               if (!arv_frame) {
-                       vpu_dbg(LVL_ERR, "error: %s() get arv frame info failed\n", __func__);
-                       return 0;
-               }
-               if (nfreespace < (buffer_size + header_length + arv_frame->slice_num * 16 + MIN_SPACE)) {
-                       vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
-                       return 0;
-               }
+               header_length = insert_scode_4_pic(ctx, payload_header, input_buffer, q_data->vdec_std, buffer_size);
+               if (q_data->vdec_std != VPU_VIDEO_RV) {
+                       if (nfreespace < (buffer_size + header_length + MIN_SPACE)) {
+                               vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
+                               return 0;
+                       }
+
+                       copy_length += copy_buffer_to_stream(ctx, payload_header, header_length);
+                       copy_length += copy_buffer_to_stream(ctx, input_buffer, buffer_size);
+               } else {
+                       arv_frame = get_arv_info(ctx, input_buffer);
+                       if (!arv_frame) {
+                               vpu_dbg(LVL_ERR, "error: %s() get arv frame info failed\n", __func__);
+                               return 0;
+                       }
+                       if (nfreespace < (buffer_size + header_length + arv_frame->slice_num * 16 + MIN_SPACE)) {
+                               vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
+                               return 0;
+                       }
 
-               copy_length += copy_buffer_to_stream(ctx, payload_header, header_length);
-               arv_frame->packlen = 20 + 8 * arv_frame->slice_num;
-               copy_length += copy_buffer_to_stream(ctx, input_buffer, arv_frame->packlen);
-               input_offset += arv_frame->packlen;
-               for (i = 0; i < arv_frame->slice_num; i++) {
-                       if (i == arv_frame->slice_num - 1)
-                               arv_frame->packlen = arv_frame->data_len - arv_frame->slice_offset[i];
-                       else
-                               arv_frame->packlen = arv_frame->slice_offset[i+1] - arv_frame->slice_offset[i];
-                       header_length = insert_scode_4_arv_slice(ctx, payload_header, arv_frame, arv_frame->packlen + 12);
                        copy_length += copy_buffer_to_stream(ctx, payload_header, header_length);
-                       copy_length += copy_buffer_to_stream(ctx, input_buffer + input_offset, arv_frame->packlen);
+                       arv_frame->packlen = 20 + 8 * arv_frame->slice_num;
+                       copy_length += copy_buffer_to_stream(ctx, input_buffer, arv_frame->packlen);
                        input_offset += arv_frame->packlen;
-               }
+                       for (i = 0; i < arv_frame->slice_num; i++) {
+                               if (i == arv_frame->slice_num - 1)
+                                       arv_frame->packlen = arv_frame->data_len - arv_frame->slice_offset[i];
+                               else
+                                       arv_frame->packlen = arv_frame->slice_offset[i+1] - arv_frame->slice_offset[i];
+                               header_length = insert_scode_4_arv_slice(ctx, payload_header, arv_frame, arv_frame->packlen + 12);
+                               copy_length += copy_buffer_to_stream(ctx, payload_header, header_length);
+                               copy_length += copy_buffer_to_stream(ctx, input_buffer + input_offset, arv_frame->packlen);
+                               input_offset += arv_frame->packlen;
+                       }
 
-               put_arv_info(arv_frame);
-               arv_frame = NULL;
+                       put_arv_info(arv_frame);
+                       arv_frame = NULL;
+               }
        }
 
        dev->shared_mem.pSharedInterface->pStreamBuffDesc[index][uStrBufIdx] =