Skip to content

Commit

Permalink
[mkv/h264 info] Optionnaly keep the recovery time in case it is not d…
Browse files Browse the repository at this point in the history
…uplicated every time. It helps finding IDR frame masquerading as NON IDR frame + recovery=0
  • Loading branch information
mean committed Jun 6, 2017
1 parent 5467c40 commit c2d1f9c
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ ADM_COREUTILS6_EXPORT bool ADM_SPSannexBToMP4(uint32_t dataLen,uint8_t *incom
ADM_COREUTILS6_EXPORT bool extractSPSInfo(uint8_t *data, uint32_t len,ADM_SPSInfo *info);
ADM_COREUTILS6_EXPORT bool extractSPSInfo_mp4Header(uint8_t *data, uint32_t len,ADM_SPSInfo *info);

ADM_COREUTILS6_EXPORT uint8_t extractH264FrameType(uint32_t nalSize,uint8_t *buffer,uint32_t len,uint32_t *flags);
ADM_COREUTILS6_EXPORT uint8_t extractH264FrameType(uint32_t nalSize,uint8_t *buffer,uint32_t len,uint32_t *flags,uint32_t *recovery=NULL);
ADM_COREUTILS6_EXPORT uint8_t extractH265FrameType(uint32_t nalSize,uint8_t *buffer,uint32_t len,uint32_t *flags);
ADM_COREUTILS6_EXPORT uint8_t extractH264FrameType_startCode(uint32_t nalSize,uint8_t *buffer,uint32_t len,uint32_t *flags);
ADM_COREUTILS6_EXPORT bool ADM_getH264SpsPpsFromExtraData(uint32_t extraLen,uint8_t *extra,
Expand Down
16 changes: 14 additions & 2 deletions avidemux_core/ADM_coreUtils/src/ADM_infoExtractorH264.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@ static bool getNalType (uint8_t * head, uint8_t * tail, uint32_t * flags,int rec
but 4 bytes NALU
*/
uint8_t extractH264FrameType (uint32_t nalSize, uint8_t * buffer, uint32_t len, uint32_t * flags)
uint8_t extractH264FrameType (uint32_t nalSize, uint8_t * buffer, uint32_t len, uint32_t * flags,uint32_t *extRecovery)
{
uint8_t *head = buffer, *tail = buffer + len;
uint8_t stream;
Expand All @@ -586,6 +586,8 @@ uint8_t extractH264FrameType (uint32_t nalSize, uint8_t * buffer, uint32_t len,
if(length>len) nalSize=3;
}
uint32_t recovery=0xff;


*flags=0;
while (head + nalSize < tail)
{
Expand All @@ -606,7 +608,17 @@ uint8_t extractH264FrameType (uint32_t nalSize, uint8_t * buffer, uint32_t len,
switch (stream)
{
case NAL_SEI:
getRecoveryFromSei(length-1, head+1,&recovery);
{

bool sei=getRecoveryFromSei(length-1, head+1,&recovery);
if(extRecovery)
{
if(sei)
*extRecovery=recovery;
else
recovery=*extRecovery;
}
}
break;
case NAL_SPS:
case NAL_PPS:
Expand Down
1 change: 1 addition & 0 deletions avidemux_plugins/ADM_demuxers/Matroska/ADM_mkv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -798,6 +798,7 @@ uint8_t mkvHeader::close(void)
_cuePosition=0;
_segmentPosition=0;
_trackPosition=0;
_H264Recovery=16;
}
/**
\fn ~mkvHeader
Expand Down
1 change: 1 addition & 0 deletions avidemux_plugins/ADM_demuxers/Matroska/ADM_mkv.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ class mkvHeader :public vidHeader
uint64_t _segmentPosition;
uint64_t _cuePosition;
uint64_t _trackPosition;
uint32_t _H264Recovery;

uint8_t checkHeader(void *head,uint32_t headlen);
bool analyzeTracks(ADM_ebml_file *parser);
Expand Down
2 changes: 1 addition & 1 deletion avidemux_plugins/ADM_demuxers/Matroska/ADM_mkvIndexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ uint8_t mkvHeader::addIndexEntry(uint32_t track,ADM_ebml_file *parser,uint64_t w
if(rpt)
memcpy(readBuffer,_tracks[0].headerRepeat,rpt);
parser->readBin(readBuffer+rpt,size-3);
extractH264FrameType(2,readBuffer,rpt+size-3,&flags); // Nal size is not used in that case
extractH264FrameType(2,readBuffer,rpt+size-3,&flags,&_H264Recovery); // Nal size is not used in that case
if(flags & AVI_KEY_FRAME)
{
printf("[MKV/H264] Frame %" PRIu32" is a keyframe\n",(uint32_t)Track->index.size());
Expand Down

0 comments on commit c2d1f9c

Please sign in to comment.