summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Carlsson <johannes.carlsson.x@sonymobile.com>2012-03-08 11:06:13 +0100
committerJohan Redestig <johan.redestig@sonymobile.com>2012-07-30 14:52:08 +0200
commitefcdf187baab9ec29e12adcf85e63fe3e6d5aa4d (patch)
treed85166122a684b6020e166d4e3bb005c5285db13
parentffb829430ff20ccd6c13e6ed894f2373b2d93939 (diff)
downloadframeworks_av-efcdf187baab9ec29e12adcf85e63fe3e6d5aa4d.zip
frameworks_av-efcdf187baab9ec29e12adcf85e63fe3e6d5aa4d.tar.gz
frameworks_av-efcdf187baab9ec29e12adcf85e63fe3e6d5aa4d.tar.bz2
Store correct time stamps in recorded mp4 files
According to the specification (ISO_IEC_14496-12_2008 page 17, 19 and 21) the time is "in seconds since midnight, Jan. 1, 1904, in UTC time" which is not the same as Unix epoch time. This is already correctly handled in MPEG4Extractor.cpp when reading files. The specification also supports 64 bit timestamps which would make it a bit more future proof, but unfortunately it seems like support for this in players are poor (tested both Windows media player and Quicktime player). Change-Id: I102d728f098b8b0a21013956f017b0c4f2d69112
-rw-r--r--include/media/stagefright/MPEG4Writer.h2
-rwxr-xr-xmedia/libstagefright/MPEG4Writer.cpp21
2 files changed, 17 insertions, 6 deletions
diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h
index cd4e129..3596b38 100644
--- a/include/media/stagefright/MPEG4Writer.h
+++ b/include/media/stagefright/MPEG4Writer.h
@@ -186,6 +186,8 @@ private:
void release();
status_t reset();
+ static uint32_t getMpeg4Time();
+
MPEG4Writer(const MPEG4Writer &);
MPEG4Writer &operator=(const MPEG4Writer &);
};
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 755b502..6108298 100755
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -236,11 +236,11 @@ private:
void writeDrefBox();
void writeDinfBox();
void writeDamrBox();
- void writeMdhdBox(time_t now);
+ void writeMdhdBox(uint32_t now);
void writeSmhdBox();
void writeVmhdBox();
void writeHdlrBox();
- void writeTkhdBox(time_t now);
+ void writeTkhdBox(uint32_t now);
void writeMp4aEsdsBox();
void writeMp4vEsdsBox();
void writeAudioFourCCBox();
@@ -723,8 +723,17 @@ status_t MPEG4Writer::reset() {
return err;
}
-void MPEG4Writer::writeMvhdBox(int64_t durationUs) {
+uint32_t MPEG4Writer::getMpeg4Time() {
time_t now = time(NULL);
+ // MP4 file uses time counting seconds since midnight, Jan. 1, 1904
+ // while time function returns Unix epoch values which starts
+ // at 1970-01-01. Lets add the number of seconds between them
+ uint32_t mpeg4Time = now + (66 * 365 + 17) * (24 * 60 * 60);
+ return mpeg4Time;
+}
+
+void MPEG4Writer::writeMvhdBox(int64_t durationUs) {
+ uint32_t now = getMpeg4Time();
beginBox("mvhd");
writeInt32(0); // version=0, flags=0
writeInt32(now); // creation time
@@ -2357,7 +2366,7 @@ void MPEG4Writer::Track::writeTrackHeader(bool use32BitOffset) {
ALOGV("%s track time scale: %d",
mIsAudio? "Audio": "Video", mTimeScale);
- time_t now = time(NULL);
+ uint32_t now = getMpeg4Time();
mOwner->beginBox("trak");
writeTkhdBox(now);
mOwner->beginBox("mdia");
@@ -2570,7 +2579,7 @@ void MPEG4Writer::Track::writeMp4vEsdsBox() {
mOwner->endBox(); // esds
}
-void MPEG4Writer::Track::writeTkhdBox(time_t now) {
+void MPEG4Writer::Track::writeTkhdBox(uint32_t now) {
mOwner->beginBox("tkhd");
// Flags = 7 to indicate that the track is enabled, and
// part of the presentation
@@ -2639,7 +2648,7 @@ void MPEG4Writer::Track::writeHdlrBox() {
mOwner->endBox();
}
-void MPEG4Writer::Track::writeMdhdBox(time_t now) {
+void MPEG4Writer::Track::writeMdhdBox(uint32_t now) {
int64_t trakDurationUs = getDurationUs();
mOwner->beginBox("mdhd");
mOwner->writeInt32(0); // version=0, flags=0