Commit a6e9652d by xgj

for h264/h265 judge a frame start more safe(h264 is first_mb_in_slice h265 is…

for h264/h265 judge a frame start more safe(h264 is first_mb_in_slice h265 is first_slice_segment_in_pic_flag) and for h265 only idr is key frame
parent 3429690d
...@@ -192,7 +192,7 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{ ...@@ -192,7 +192,7 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{
switch (frame->getCodecId()) { switch (frame->getCodecId()) {
case CodecH264 : { case CodecH264 : {
auto type = H264_TYPE(frame->data()[frame->prefixSize()]); auto type = H264_TYPE(frame->data()[frame->prefixSize()]);
if (frame->data()[frame->prefixSize()+1]&0x80 !=0 && type >=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR ) {// sei aud pps sps 不判断 if ((frame->data()[frame->prefixSize()+1]&0x80) !=0 && type >=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR ) {// sei aud pps sps 不判断
//264 新一帧的开始,刷新输出 //264 新一帧的开始,刷新输出
return true; return true;
}else{ }else{
...@@ -202,9 +202,12 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{ ...@@ -202,9 +202,12 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{
break; break;
} }
case CodecH265 : { case CodecH265 : {
if (H265_TYPE(frame->data()[frame->prefixSize()]) == H265Frame::NAL_TRAIL_R) { auto type = H265_TYPE(frame->data()[frame->prefixSize()]);
//如果是265的TRAIL_R帧,那么也刷新输出 if ((type>=H265Frame::NAL_TRAIL_R &&type<= H265Frame::NAL_RSV_IRAP_VCL23) && ( (frame->data()[frame->prefixSize()+2]>>7 & 0x01) != 0)) {
//first_slice_segment_in_pic_flag is frame start
return true; return true;
}else{
return false;
} }
break; break;
} }
......
...@@ -183,7 +183,7 @@ void H264RtmpEncoder::inputFrame(const Frame::Ptr &frame) { ...@@ -183,7 +183,7 @@ void H264RtmpEncoder::inputFrame(const Frame::Ptr &frame) {
} }
} }
if(_lastPacket && (_lastPacket->time_stamp != frame->dts() || (pcData[1]&0x80 != 0 && type>=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR))) { if(_lastPacket && (_lastPacket->time_stamp != frame->dts() || ((pcData[1]&0x80) != 0 && type>=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR))) {
RtmpCodec::inputRtmp(_lastPacket); RtmpCodec::inputRtmp(_lastPacket);
_lastPacket = nullptr; _lastPacket = nullptr;
} }
......
...@@ -64,10 +64,11 @@ bool H265Frame::configFrame() const { ...@@ -64,10 +64,11 @@ bool H265Frame::configFrame() const {
} }
bool H265Frame::isKeyFrame(int type, const char *ptr) { bool H265Frame::isKeyFrame(int type, const char *ptr) {
if (!ptr || type != NAL_IDR_W_RADL) { if(ptr){
return type >= NAL_BLA_W_LP && type <= NAL_RSV_IRAP_VCL23; return (((*((uint8_t *) ptr + 2)) >> 7) & 0x01) == 1 && (type == NAL_IDR_N_LP || type == NAL_IDR_W_RADL);
} }
return (((*((uint8_t *) ptr + 2)) >> 7) & 0x01) == 1; return false;
} }
H265Frame::H265Frame(){ H265Frame::H265Frame(){
......
...@@ -169,7 +169,7 @@ void H265RtmpEncoder::inputFrame(const Frame::Ptr &frame) { ...@@ -169,7 +169,7 @@ void H265RtmpEncoder::inputFrame(const Frame::Ptr &frame) {
return; return;
} }
if (_lastPacket && (_lastPacket->time_stamp != frame->dts() || type == H265Frame::NAL_TRAIL_R)) { if (_lastPacket && (_lastPacket->time_stamp != frame->dts() || (type >=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR && (pcData[2]>>7 &0x01) !=0))) {
RtmpCodec::inputRtmp(_lastPacket); RtmpCodec::inputRtmp(_lastPacket);
_lastPacket = nullptr; _lastPacket = nullptr;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论