Skip to content

Commit

Permalink
[demuxers/Mp4] Fix track delay calculation, media time is in track ti…
Browse files Browse the repository at this point in the history
…mescale units, not in movie timescale
  • Loading branch information
eumagga0x2a committed Oct 3, 2018
1 parent 425d03a commit 0dea470
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 10 deletions.
6 changes: 3 additions & 3 deletions avidemux_plugins/ADM_demuxers/Mp4/ADM_mp4.h
Expand Up @@ -186,14 +186,14 @@ class MP4Header :public vidHeader
uint8_t lookupMainAtoms(void *tom);
void parseMvhd(void *tom);
uint8_t parseTrack(void *ztom);
int64_t parseElst(void *tom);
int64_t parseElst(void *tom,bool *inTrackTimescale);
bool parseMoof(adm_atom &son);
bool parseTraf(adm_atom &son,uint64_t moofStart);
int lookupIndex(int desc) ;
bool parseTrun(int trackNo,adm_atom &son,const mp4TrafInfo &info);
uint8_t decodeVideoAtom(void *ztom);
uint8_t parseMdia(void *ztom,uint32_t *trackType,uint32_t w, uint32_t h);
uint8_t parseEdts(void *ztom,uint32_t trackType);
uint8_t parseMdia(void *ztom,uint32_t *trackType,uint32_t w, uint32_t h,bool delayInTrackTimescale);
uint8_t parseEdts(void *ztom,uint32_t trackType,bool *delayInTrackTimescale);
uint8_t parseStbl(void *ztom,uint32_t trackType,uint32_t w,uint32_t h,uint32_t trackScale);
uint8_t decodeEsds(void *ztom,uint32_t trackType);
uint8_t updateCtts(MPsampleinfo *info );
Expand Down
34 changes: 27 additions & 7 deletions avidemux_plugins/ADM_demuxers/Mp4/ADM_mp4Analyzer.cpp
Expand Up @@ -208,6 +208,7 @@ uint8_t MP4Header::parseTrack(void *ztom)
uint32_t w,h;
uint32_t trackType=TRACK_OTHER;
_currentDelay=0;
bool delayInTrackTimescale=false;
ADM_info("Parsing Track\n");
while(!tom->isDone())
{
Expand Down Expand Up @@ -250,14 +251,14 @@ uint8_t MP4Header::parseTrack(void *ztom)
}
case ADM_MP4_MDIA:
{
if(!parseMdia(&son,&trackType,w,h))
if(!parseMdia(&son,&trackType,w,h,delayInTrackTimescale))
return false;
break;
}
case ADM_MP4_EDTS:
{
ADM_info("EDTS atom found\n");
parseEdts(&son,trackType);
parseEdts(&son,trackType,&delayInTrackTimescale);
break;
}
default:
Expand All @@ -271,7 +272,7 @@ uint8_t MP4Header::parseTrack(void *ztom)
\fn parseMdia
\brief Parse mdia header
*/
uint8_t MP4Header::parseMdia(void *ztom,uint32_t *trackType,uint32_t w, uint32_t h)
uint8_t MP4Header::parseMdia(void *ztom,uint32_t *trackType,uint32_t w, uint32_t h,bool delayInTrackTimescale)
{
adm_atom *tom=(adm_atom *)ztom;
ADMAtoms id;
Expand Down Expand Up @@ -337,13 +338,27 @@ uint8_t MP4Header::parseMdia(void *ztom,uint32_t *trackType,uint32_t w, uint32_t
case MKFCCR('v','i','d','e')://'vide':
*trackType=TRACK_VIDEO;
_tracks[0].delay=_currentDelay;
if(delayInTrackTimescale)
{
double d=(double)_tracks[0].delay;
d*=_movieScale;
d/=trackScale;
_tracks[0].delay=(int64_t)d;
}
ADM_info("hdlr video found \n ");
_movieDuration=trackDuration;
_videoScale=trackScale;
_tracks[0].scale=_videoScale;
break;
case MKFCCR('s','o','u','n'): //'soun':
_tracks[1+nbAudioTrack].delay=_currentDelay;
if(delayInTrackTimescale)
{
double d=(double)_tracks[1+nbAudioTrack].delay;
d*=_movieScale;
d/=trackScale;
_tracks[1+nbAudioTrack].delay=(int64_t)d;
}
*trackType=TRACK_AUDIO;
ADM_info("hdlr audio found \n ");
break;
Expand Down Expand Up @@ -406,7 +421,7 @@ uint8_t MP4Header::parseMdia(void *ztom,uint32_t *trackType,uint32_t w, uint32_t
* @param tom
* @return
*/
int64_t MP4Header::parseElst(void *ztom)
int64_t MP4Header::parseElst(void *ztom,bool *inTrackTimescale)
{
uint32_t playbackSpeed;
adm_atom *tom=(adm_atom *)ztom;
Expand All @@ -416,6 +431,7 @@ int64_t MP4Header::parseElst(void *ztom)
int64_t *editDuration=new int64_t[nb];
int64_t *mediaTime=new int64_t[nb];
int64_t delay=0;
*inTrackTimescale=false;

ADM_info("[ELST] Found %" PRIu32" entries in list, version=%d\n",nb,version);
for(int i=0;i<nb;i++)
Expand All @@ -437,7 +453,10 @@ int64_t MP4Header::parseElst(void *ztom)
{
case 1:
if(mediaTime[0]>0)
{
*inTrackTimescale=true;
delay=mediaTime[0];
}
break;
case 2:
if(mediaTime[0]==-1)
Expand All @@ -448,7 +467,7 @@ int64_t MP4Header::parseElst(void *ztom)
default:
break;
}
// Nb : The unit is movie timescale
// Nb : The unit is either movie timescale OR track (media) timescale
ADM_info("** Computed delay =%d\n",delay);

delete [] editDuration;
Expand All @@ -459,11 +478,12 @@ int64_t MP4Header::parseElst(void *ztom)
\fn parseEdts
\brief parse sample table. this is the most important function.
*/
uint8_t MP4Header::parseEdts(void *ztom,uint32_t trackType)
uint8_t MP4Header::parseEdts(void *ztom,uint32_t trackType,bool *delayInTrackTimescale)
{
adm_atom *tom=(adm_atom *)ztom;
ADMAtoms id;
uint32_t container;
*delayInTrackTimescale=false;

ADM_info("Parsing Edts, trackType=%d\n",trackType);
while(!tom->isDone())
Expand All @@ -480,7 +500,7 @@ uint8_t MP4Header::parseEdts(void *ztom,uint32_t trackType)
case ADM_MP4_ELST:
{
ADM_info("ELST atom found\n");
_currentDelay=parseElst(&son);
_currentDelay=parseElst(&son,delayInTrackTimescale);
son.skipAtom();
break;

Expand Down

0 comments on commit 0dea470

Please sign in to comment.