Skip to content

Commit

Permalink
[demuxers/Mp4] Fix video duration calculation, with B-frames the last…
Browse files Browse the repository at this point in the history
… frame is not necessarily the one with max PTS
  • Loading branch information
eumagga0x2a committed Jan 17, 2018
1 parent aace1b1 commit b61b057
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions avidemux_plugins/ADM_demuxers/Mp4/ADM_mp4.cpp
Expand Up @@ -513,18 +513,30 @@ uint8_t MP4Header::open(const char *name)
fseeko(_fd,0,SEEK_SET);
refineFps();
uint64_t duration1=_movieDuration*1000LL;
uint64_t duration2=_tracks[0].index[nb-1].pts;

uint64_t duration2=0;
uint32_t lastFrame=0;
for(int i=nb-32;i<nb;i++)
{
if(i<0) continue;
if(_tracks[0].index[i].pts==ADM_NO_PTS) continue;
if(duration2<_tracks[0].index[i].pts)
{
duration2=_tracks[0].index[i].pts;
lastFrame=i;
}
}
ADM_info("3gp/mov file successfully read..\n");
if(duration2!=ADM_NO_PTS && duration2>duration1)
{
ADM_warning("Last PTS is after movie duration, increasing movie duration\n");
_movieDuration=(_tracks[0].index[nb-1].pts/1000)+1;
_movieDuration=(duration2/1000)+1;
}
ADM_info("Nb images : %d\n",nb);
ADM_info("Movie duration : %s\n",ADM_us2plain(_movieDuration*1000LL));
ADM_info("Last video PTS : %s\n",ADM_us2plain(_tracks[0].index[nb-1].pts));
ADM_info("Last video DTS : %s\n",ADM_us2plain(_tracks[0].index[nb-1].dts));
if(nb>1 && !lastFrame)
lastFrame=nb-1;
ADM_info("Nb images : %d\n",nb);
ADM_info("Movie duration : %s\n",ADM_us2plain(_movieDuration*1000LL));
ADM_info("Last video PTS : %s\n",ADM_us2plain(_tracks[0].index[lastFrame].pts));
ADM_info("Last video DTS : %s\n",ADM_us2plain(_tracks[0].index[nb-1].dts));

checkDuplicatedPts();

Expand Down

0 comments on commit b61b057

Please sign in to comment.