-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/vp9/vvp9.c b/drivers/frame_provider/decoder/vp9/vvp9.c index 2e0b5a7..661ff59 100644 --- a/drivers/frame_provider/decoder/vp9/vvp9.c +++ b/drivers/frame_provider/decoder/vp9/vvp9.c @@ -601,6 +601,10 @@ struct PIC_BUFFER_CONFIG_s { /* vdec sync. */ struct fence *fence; + + /* hdr10 plus data */ + u32 hdr10p_data_size; + char *hdr10p_data_buf; } PIC_BUFFER_CONFIG; enum BITSTREAM_PROFILE { @@ -6877,6 +6881,41 @@ static void set_frame_info(struct VP9Decoder_s *pbi, struct vframe_s *vf) vdec_v4l_set_hdr_infos(ctx, &hdr); } + if ((pbi->chunk != NULL) && (pbi->chunk->hdr10p_data_buf != NULL) + && (pbi->chunk->hdr10p_data_size != 0)) { + char *new_buf; + int i = 0; + new_buf = vzalloc(pbi->chunk->hdr10p_data_size); + + if (new_buf) { + memcpy(new_buf, pbi->chunk->hdr10p_data_buf, pbi->chunk->hdr10p_data_size); + if (debug & VP9_DEBUG_BUFMGR_MORE) { + vp9_print(pbi, VP9_DEBUG_BUFMGR_MORE, + "hdr10p data: (size %d)\n", + pbi->chunk->hdr10p_data_size); + for (i = 0; i < pbi->chunk->hdr10p_data_size; i++) { + vp9_print(pbi, VP9_DEBUG_BUFMGR_MORE, + "%02x ", pbi->chunk->hdr10p_data_buf[i]); + if (((i + 1) & 0xf) == 0) + vp9_print(pbi, VP9_DEBUG_BUFMGR_MORE, "\n"); + } + vp9_print(pbi, VP9_DEBUG_BUFMGR_MORE, "\n"); + } + + vf->hdr10p_data_size = pbi->chunk->hdr10p_data_size; + vf->hdr10p_data_buf = new_buf; + } else { + vp9_print(pbi, 0, "%s:hdr10p data vzalloc size(%d) fail\n", + __func__, pbi->chunk->hdr10p_data_size); + vf->hdr10p_data_size = pbi->chunk->hdr10p_data_size; + vf->hdr10p_data_buf = new_buf; + } + + vfree(pbi->chunk->hdr10p_data_buf); + pbi->chunk->hdr10p_data_buf = NULL; + pbi->chunk->hdr10p_data_size = 0; + } + vf->sidebind_type = pbi->sidebind_type; vf->sidebind_channel_id = pbi->sidebind_channel_id; } @@ -6963,6 +7002,12 @@ static void vvp9_vf_put(struct vframe_s *vf, void *op_arg) vf->fence = NULL; } + if (vf->hdr10p_data_buf) { + vfree(vf->hdr10p_data_buf); + vf->hdr10p_data_buf = NULL; + vf->hdr10p_data_size = 0; + } + kfifo_put(&pbi->newframe_q, (const struct vframe_s *)vf); pbi->vf_put_count++; if (index < pbi->used_buf_num) { |