From b45d8b16cb47b97c1bc7f0dc6c7592e6dc2ceeea Mon Sep 17 00:00:00 2001 From: Johnson Ding Date: Fri, 14 Apr 2023 17:16:38 +0800 Subject: [PATCH] [h264d]: Skip decoding special encoder stream Change-Id: I9bdd32bc3b00b9a038d9429295b045a8b6bd97ef Signed-off-by: Johnson Ding --- mpp/codec/dec/h264/CMakeLists.txt | 3 ++- mpp/codec/dec/h264/h264d_global.h | 2 +- mpp/codec/dec/h264/h264d_parse.c | 11 +++++++++++ mpp/codec/dec/h264/h264d_sei.c | 7 +++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/mpp/codec/dec/h264/CMakeLists.txt b/mpp/codec/dec/h264/CMakeLists.txt index c5a4d85d..1cec94b8 100644 --- a/mpp/codec/dec/h264/CMakeLists.txt +++ b/mpp/codec/dec/h264/CMakeLists.txt @@ -1,5 +1,6 @@ # vim: syntax=cmake include_directories(.) +include_directories(../common) # h264 decoder api set(H264D_API @@ -44,6 +45,6 @@ add_library(${CODEC_H264D} STATIC ${H264D_SRC} ) -target_link_libraries(${CODEC_H264D} mpp_base) +target_link_libraries(${CODEC_H264D} dec_common mpp_base) set_target_properties(${CODEC_H264D} PROPERTIES FOLDER "mpp/codec") diff --git a/mpp/codec/dec/h264/h264d_global.h b/mpp/codec/dec/h264/h264d_global.h index 67202b8d..b768eda7 100644 --- a/mpp/codec/dec/h264/h264d_global.h +++ b/mpp/codec/dec/h264/h264d_global.h @@ -740,7 +740,6 @@ typedef struct h264_sei_t { //-- for adding } scalable_nesting; - RK_U32 user_data_DivX_flag; // Placeholder; in future more supported types will contribute to more //---- follow is used in other parts RK_S32 mvc_scalable_nesting_flag; @@ -1050,6 +1049,7 @@ typedef struct h264d_video_ctx_t { RK_U32 dpb_fast_out; RK_U32 dpb_first_fast_played; RK_U32 last_ref_frame_num; + RK_U32 deny_flag; } H264dVideoCtx_t; typedef struct h264d_mem_t { diff --git a/mpp/codec/dec/h264/h264d_parse.c b/mpp/codec/dec/h264/h264d_parse.c index 42d150e5..10108d00 100644 --- a/mpp/codec/dec/h264/h264d_parse.c +++ b/mpp/codec/dec/h264/h264d_parse.c @@ -226,6 +226,13 @@ static MPP_RET parser_one_nalu(H264_SLICE_t *currSlice) MPP_RET ret = MPP_ERR_UNKNOW; FUN_CHECK(ret = parser_nalu_header(currSlice)); + + if (currSlice->p_Vid->deny_flag && + currSlice->p_Cur->nalu.nalu_type != H264_NALU_TYPE_SPS) { + currSlice->p_Dec->nalu_ret = NaluNotSupport; + return MPP_OK; + } + //!< nalu_parse switch (currSlice->p_Cur->nalu.nalu_type) { case H264_NALU_TYPE_SLICE: @@ -240,6 +247,7 @@ static MPP_RET parser_one_nalu(H264_SLICE_t *currSlice) H264D_DBG(H264D_DBG_PARSE_NALU, "nalu_type=SPS"); FUN_CHECK(ret = process_sps(currSlice)); currSlice->p_Dec->nalu_ret = NALU_SPS; + currSlice->p_Vid->deny_flag = 0; break; case H264_NALU_TYPE_PPS: H264D_DBG(H264D_DBG_PARSE_NALU, "nalu_type=PPS"); @@ -923,6 +931,9 @@ MPP_RET parse_loop(H264_DecCtx_t *p_Dec) } else if (p_Dec->nalu_ret == MvcDisAble) { H264D_LOG("xxxxxxxx MVC disable"); goto __FAILED; + } else if (p_Dec->nalu_ret == NaluNotSupport) { + H264D_LOG("NALU not support, abort decoding"); + goto __FAILED; } else { p_Dec->next_state = SliceSTATE_ReadNalu; } diff --git a/mpp/codec/dec/h264/h264d_sei.c b/mpp/codec/dec/h264/h264d_sei.c index 6a9b9ec4..59bf84b3 100644 --- a/mpp/codec/dec/h264/h264d_sei.c +++ b/mpp/codec/dec/h264/h264d_sei.c @@ -23,6 +23,7 @@ #include "h264d_global.h" #include "h264d_sps.h" #include "h264d_sei.h" +#include "h2645d_sei.h" static MPP_RET interpret_picture_timing_info( BitReadCtx_t *p_bitctx, @@ -249,6 +250,12 @@ MPP_RET process_sei(H264_SLICE_t *currSlice) case H264_SEI_PIC_TIMING: FUN_CHECK(interpret_picture_timing_info(&payload_bitctx, sei_msg, currSlice->p_Vid)); break; + case H264_SEI_USER_DATA_UNREGISTERED: + FUN_CHECK(check_encoder_sei_info(&payload_bitctx, sei_msg->payload_size, &currSlice->p_Vid->deny_flag)); + + if (currSlice->p_Vid->deny_flag) + H264D_DBG(H264D_DBG_SEI, "Bitstream is encoded by special encoder."); + break; default: H264D_DBG(H264D_DBG_SEI, "Skip parsing SEI type %d\n", sei_msg->type); break;