Similarly to the omit_tfhd_offset flag added in e7bf085b, this
avoids writing absolute byte positions to the file, making them
more easily streamable.
This is a new feature from 14496-12:2012, so application support
isn't necessarily too widespread yet (support for it in libav was
added in 20f95f21f in July 2014).
---
doc/muxers.texi | 7 +++++++
libavformat/movenc.c | 14 +++++++++++---
libavformat/movenc.h | 1 +
libavformat/version.h | 2 +-
4 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/doc/muxers.texi b/doc/muxers.texi
index e00a162..ee3edb9 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -340,6 +340,13 @@ cause failures when the file is reprocessed with
certain tagging programs.
@item -movflags omit_tfhd_offset
Don't write any absolute base_data_offset in tfhd atoms. This avoids
tying fragments to absolute byte positions in the file/streams.
+@item -movflags default_base_moof
+Similarly to the omit_tfhd_offset, this flag avoids writing the
+absolute base_data_offset field in tfhd atoms, but does so by using
+the new default-base-is-moof flag instead. This flag is new from
+14496-12:2012. This may make the fragments easier to parse in certain
+circumstances (avoiding basing track fragment location calculations
+on the implicit end of the previous track fragment).
@end table
Smooth Streaming content can be pushed in real time to a publishing
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 1470ebf..4196cbb 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -58,6 +58,7 @@ static const AVOption options[] = {
{ "faststart", "Run a second pass to put the index (moov atom) at the
beginning of the file", 0, AV_OPT_TYPE_CONST, {.i64 =
FF_MOV_FLAG_FASTSTART}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM,
"movflags" },
{ "omit_tfhd_offset", "Omit the base data offset in tfhd atoms", 0,
AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_OMIT_TFHD_OFFSET}, INT_MIN, INT_MAX,
AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
{ "disable_chpl", "Disable Nero chapter atom", 0, AV_OPT_TYPE_CONST,
{.i64 = FF_MOV_FLAG_DISABLE_CHPL}, INT_MIN, INT_MAX,
AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
+ { "default_base_moof", "Set the default-base-is-moof flag in tfhd
atoms", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_DEFAULT_BASE_MOOF},
INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
FF_RTP_FLAG_OPTS(MOVMuxContext, rtp_flags),
{ "skip_iods", "Skip writing iods atom.", offsetof(MOVMuxContext,
iods_skip), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
{ "iods_audio_profile", "iods audio profile atom.",
offsetof(MOVMuxContext, iods_audio_profile), AV_OPT_TYPE_INT, {.i64 = -1},
-1, 255, AV_OPT_FLAG_ENCODING_PARAM},
@@ -2386,6 +2387,10 @@ static int mov_write_tfhd_tag(AVIOContext *pb,
MOVMuxContext *mov,
}
if (mov->flags & FF_MOV_FLAG_OMIT_TFHD_OFFSET)
flags &= ~MOV_TFHD_BASE_DATA_OFFSET;
+ if (mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF) {
+ flags &= ~MOV_TFHD_BASE_DATA_OFFSET;
+ flags |= MOV_TFHD_DEFAULT_BASE_IS_MOOF;
+ }
/* Don't set a default sample size, the silverlight player refuses
* to play files with that set. Don't set a default sample duration,
@@ -2457,7 +2462,7 @@ static int mov_write_trun_tag(AVIOContext *pb,
MOVMuxContext *mov,
avio_wb32(pb, track->entry); /* sample count */
if (mov->flags & FF_MOV_FLAG_OMIT_TFHD_OFFSET &&
- !(mov->flags & FF_MOV_FLAG_SEPARATE_MOOF) &&
+ !(mov->flags & (FF_MOV_FLAG_SEPARATE_MOOF |
FF_MOV_FLAG_DEFAULT_BASE_MOOF)) &&
!mov->first_trun)
avio_wb32(pb, 0); /* Later tracks follow immediately after the
previous one */
else
@@ -2717,6 +2722,8 @@ static int mov_write_ftyp_tag(AVIOContext *pb,
AVFormatContext *s)
minor = has_h264 ? 0x20000 : 0x10000;
} else if (mov->mode == MODE_PSP)
ffio_wfourcc(pb, "MSNV");
+ else if (mov->mode == MODE_MP4 && mov->flags &
FF_MOV_FLAG_DEFAULT_BASE_MOOF)
+ ffio_wfourcc(pb, "iso5"); // Required when using
default-base-is-moof
else if (mov->mode == MODE_MP4)
ffio_wfourcc(pb, "isom");
else if (mov->mode == MODE_IPOD)
@@ -2734,8 +2741,9 @@ static int mov_write_ftyp_tag(AVIOContext *pb,
AVFormatContext *s)
ffio_wfourcc(pb, "qt ");
else if (mov->mode == MODE_ISM) {
ffio_wfourcc(pb, "piff");
- ffio_wfourcc(pb, "iso2");
- } else {
+ if (!(mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF))
+ ffio_wfourcc(pb, "iso2");
+ } else if (!(mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF)) {
ffio_wfourcc(pb, "isom");
ffio_wfourcc(pb, "iso2");
if (has_h264)
diff --git a/libavformat/movenc.h b/libavformat/movenc.h
index a463a8d..56e2647 100644
--- a/libavformat/movenc.h
+++ b/libavformat/movenc.h
@@ -178,6 +178,7 @@ typedef struct MOVMuxContext {
#define FF_MOV_FLAG_FASTSTART 128
#define FF_MOV_FLAG_OMIT_TFHD_OFFSET 256
#define FF_MOV_FLAG_DISABLE_CHPL 512
+#define FF_MOV_FLAG_DEFAULT_BASE_MOOF 1024
int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt);
diff --git a/libavformat/version.h b/libavformat/version.h
index 8e08311..dfb6089 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 56
#define LIBAVFORMAT_VERSION_MINOR 6
-#define LIBAVFORMAT_VERSION_MICRO 1
+#define LIBAVFORMAT_VERSION_MICRO 2
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR,
\
LIBAVFORMAT_VERSION_MINOR,
\
--
1.9.3 (Apple Git-50)