-rw-r--r-- | drivers/frame_provider/decoder/h265/vh265.c | 59 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/utils/vdec.h | 4 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/utils/vdec_input.c | 20 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/utils/vdec_input.h | 2 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/vp9/vvp9.c | 45 | ||||
-rw-r--r-- | drivers/stream_input/amports/amstream.c | 20 |
6 files changed, 149 insertions, 1 deletions
diff --git a/drivers/frame_provider/decoder/h265/vh265.c b/drivers/frame_provider/decoder/h265/vh265.c index 091935d..1ef70dd 100644 --- a/drivers/frame_provider/decoder/h265/vh265.c +++ b/drivers/frame_provider/decoder/h265/vh265.c @@ -1439,6 +1439,8 @@ struct PIC_s { bool vframe_bound; bool ip_mode; u32 stream_frame_size; //for stream base + u32 hdr10p_data_size; + char *hdr10p_data_buf; } /*PIC_t */; #define MAX_TILE_COL_NUM 10 @@ -7937,8 +7939,22 @@ static int parse_sei(struct hevc_state_s *hevc, && p_sei[2] == 0x3C && p_sei[3] == 0x00 && p_sei[4] == 0x01 - && p_sei[5] == 0x04) + && p_sei[5] == 0x04) { + char *new_buf; hevc->sei_present_flag |= SEI_HDR10PLUS_MASK; + new_buf = vzalloc(payload_size); + if (new_buf) { + memcpy(new_buf, p_sei, payload_size); + pic->hdr10p_data_buf = new_buf; + pic->hdr10p_data_size = payload_size; + } else { + hevc_print(hevc, 0, + "%s:hdr10p data vzalloc size(%d) fail\n", + __func__, payload_size); + pic->hdr10p_data_buf = NULL; + pic->hdr10p_data_size = 0; + } + } break; case SEI_MasteringDisplayColorVolume: @@ -8198,6 +8214,41 @@ static void set_frame_info(struct hevc_state_s *hevc, struct vframe_s *vf, vdec_v4l_set_hdr_infos(ctx, &hdr); } + if ((hevc->sei_present_flag & SEI_HDR10PLUS_MASK) && (pic->hdr10p_data_buf != NULL) + && (pic->hdr10p_data_size != 0)) { + char *new_buf; + new_buf = vzalloc(pic->hdr10p_data_size); + + if (new_buf) { + memcpy(new_buf, pic->hdr10p_data_buf, pic->hdr10p_data_size); + if (get_dbg_flag(hevc) & H265_DEBUG_BUFMGR_MORE) { + hevc_print(hevc, 0, + "hdr10p data: (size %d)\n", + pic->hdr10p_data_size); + for (i = 0; i < pic->hdr10p_data_size; i++) { + hevc_print_cont(hevc, 0, + "%02x ", pic->hdr10p_data_buf[i]); + if (((i + 1) & 0xf) == 0) + hevc_print_cont(hevc, 0, "\n"); + } + hevc_print_cont(hevc, 0, "\n"); + } + + vf->hdr10p_data_size = pic->hdr10p_data_size; + vf->hdr10p_data_buf = new_buf; + } else { + hevc_print(hevc, 0, + "%s:hdr10p data vzalloc size(%d) fail\n", + __func__, pic->hdr10p_data_size); + vf->hdr10p_data_buf = NULL; + vf->hdr10p_data_size = 0; + } + + vfree(pic->hdr10p_data_buf); + pic->hdr10p_data_buf = NULL; + pic->hdr10p_data_size = 0; + } + vf->sidebind_type = hevc->sidebind_type; vf->sidebind_channel_id = hevc->sidebind_channel_id; } @@ -8427,6 +8478,12 @@ static void vh265_vf_put(struct vframe_s *vf, void *op_arg) kfifo_put(&hevc->newframe_q, (const struct vframe_s *)vf); spin_lock_irqsave(&lock, flags); + if (vf->hdr10p_data_buf) { + vfree(vf->hdr10p_data_buf); + vf->hdr10p_data_buf = NULL; + vf->hdr10p_data_size = 0; + } + if (index_top != 0xff && index_top < MAX_REF_PIC_NUM && hevc->m_PIC[index_top]) { |