mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-07 01:52:46 +08:00
[h264d]: Skip decoding special encoder stream
Change-Id: I9bdd32bc3b00b9a038d9429295b045a8b6bd97ef Signed-off-by: Johnson Ding <johnson.ding@rock-chips.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
# vim: syntax=cmake
|
# vim: syntax=cmake
|
||||||
include_directories(.)
|
include_directories(.)
|
||||||
|
include_directories(../common)
|
||||||
|
|
||||||
# h264 decoder api
|
# h264 decoder api
|
||||||
set(H264D_API
|
set(H264D_API
|
||||||
@@ -44,6 +45,6 @@ add_library(${CODEC_H264D} STATIC
|
|||||||
${H264D_SRC}
|
${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")
|
set_target_properties(${CODEC_H264D} PROPERTIES FOLDER "mpp/codec")
|
||||||
|
|
||||||
|
@@ -740,7 +740,6 @@ typedef struct h264_sei_t {
|
|||||||
//-- for adding
|
//-- for adding
|
||||||
} scalable_nesting;
|
} scalable_nesting;
|
||||||
|
|
||||||
RK_U32 user_data_DivX_flag;
|
|
||||||
// Placeholder; in future more supported types will contribute to more
|
// Placeholder; in future more supported types will contribute to more
|
||||||
//---- follow is used in other parts
|
//---- follow is used in other parts
|
||||||
RK_S32 mvc_scalable_nesting_flag;
|
RK_S32 mvc_scalable_nesting_flag;
|
||||||
@@ -1050,6 +1049,7 @@ typedef struct h264d_video_ctx_t {
|
|||||||
RK_U32 dpb_fast_out;
|
RK_U32 dpb_fast_out;
|
||||||
RK_U32 dpb_first_fast_played;
|
RK_U32 dpb_first_fast_played;
|
||||||
RK_U32 last_ref_frame_num;
|
RK_U32 last_ref_frame_num;
|
||||||
|
RK_U32 deny_flag;
|
||||||
} H264dVideoCtx_t;
|
} H264dVideoCtx_t;
|
||||||
|
|
||||||
typedef struct h264d_mem_t {
|
typedef struct h264d_mem_t {
|
||||||
|
@@ -226,6 +226,13 @@ static MPP_RET parser_one_nalu(H264_SLICE_t *currSlice)
|
|||||||
MPP_RET ret = MPP_ERR_UNKNOW;
|
MPP_RET ret = MPP_ERR_UNKNOW;
|
||||||
|
|
||||||
FUN_CHECK(ret = parser_nalu_header(currSlice));
|
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
|
//!< nalu_parse
|
||||||
switch (currSlice->p_Cur->nalu.nalu_type) {
|
switch (currSlice->p_Cur->nalu.nalu_type) {
|
||||||
case H264_NALU_TYPE_SLICE:
|
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");
|
H264D_DBG(H264D_DBG_PARSE_NALU, "nalu_type=SPS");
|
||||||
FUN_CHECK(ret = process_sps(currSlice));
|
FUN_CHECK(ret = process_sps(currSlice));
|
||||||
currSlice->p_Dec->nalu_ret = NALU_SPS;
|
currSlice->p_Dec->nalu_ret = NALU_SPS;
|
||||||
|
currSlice->p_Vid->deny_flag = 0;
|
||||||
break;
|
break;
|
||||||
case H264_NALU_TYPE_PPS:
|
case H264_NALU_TYPE_PPS:
|
||||||
H264D_DBG(H264D_DBG_PARSE_NALU, "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) {
|
} else if (p_Dec->nalu_ret == MvcDisAble) {
|
||||||
H264D_LOG("xxxxxxxx MVC disable");
|
H264D_LOG("xxxxxxxx MVC disable");
|
||||||
goto __FAILED;
|
goto __FAILED;
|
||||||
|
} else if (p_Dec->nalu_ret == NaluNotSupport) {
|
||||||
|
H264D_LOG("NALU not support, abort decoding");
|
||||||
|
goto __FAILED;
|
||||||
} else {
|
} else {
|
||||||
p_Dec->next_state = SliceSTATE_ReadNalu;
|
p_Dec->next_state = SliceSTATE_ReadNalu;
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
#include "h264d_global.h"
|
#include "h264d_global.h"
|
||||||
#include "h264d_sps.h"
|
#include "h264d_sps.h"
|
||||||
#include "h264d_sei.h"
|
#include "h264d_sei.h"
|
||||||
|
#include "h2645d_sei.h"
|
||||||
|
|
||||||
static MPP_RET interpret_picture_timing_info(
|
static MPP_RET interpret_picture_timing_info(
|
||||||
BitReadCtx_t *p_bitctx,
|
BitReadCtx_t *p_bitctx,
|
||||||
@@ -249,6 +250,12 @@ MPP_RET process_sei(H264_SLICE_t *currSlice)
|
|||||||
case H264_SEI_PIC_TIMING:
|
case H264_SEI_PIC_TIMING:
|
||||||
FUN_CHECK(interpret_picture_timing_info(&payload_bitctx, sei_msg, currSlice->p_Vid));
|
FUN_CHECK(interpret_picture_timing_info(&payload_bitctx, sei_msg, currSlice->p_Vid));
|
||||||
break;
|
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:
|
default:
|
||||||
H264D_DBG(H264D_DBG_SEI, "Skip parsing SEI type %d\n", sei_msg->type);
|
H264D_DBG(H264D_DBG_SEI, "Skip parsing SEI type %d\n", sei_msg->type);
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user