diff options
author | Yusuke Nakamura <muken.the.vfrmaniac@gmail.com> | 2014-07-01 14:17:56 +0900 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2014-07-01 14:36:06 +0300 |
commit | 20f95f21f9b9595608ba668a6eca78f2d508be67 (patch) | |
tree | ad1636052808bfce2143b5c4a7625891291b3002 /libavformat | |
parent | 79793f833784121d574454af4871866576c0749d (diff) | |
download | ffmpeg-streaming-20f95f21f9b9595608ba668a6eca78f2d508be67.zip ffmpeg-streaming-20f95f21f9b9595608ba668a6eca78f2d508be67.tar.gz |
mov: Support default-base-is-moof.
default-base-is-moof shall be set to track fragments compatible with DASH
Media Segments. So, this is a fundamental support for ISOBMFF ver. DASH.
This is meaningful only when base-data-offset-present is absent and two or
more track fragments are present in a movie fragment.
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/isom.h | 2 | ||||
-rw-r--r-- | libavformat/mov.c | 7 |
2 files changed, 6 insertions, 3 deletions
diff --git a/libavformat/isom.h b/libavformat/isom.h index b2d5574..70064bc 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -73,6 +73,7 @@ typedef struct MOVFragment { unsigned track_id; uint64_t base_data_offset; uint64_t moof_offset; + uint64_t implicit_offset; unsigned stsd_id; unsigned duration; unsigned size; @@ -174,6 +175,7 @@ void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id); #define MOV_TFHD_DEFAULT_SIZE 0x10 #define MOV_TFHD_DEFAULT_FLAGS 0x20 #define MOV_TFHD_DURATION_IS_EMPTY 0x010000 +#define MOV_TFHD_DEFAULT_BASE_IS_MOOF 0x020000 #define MOV_TRUN_DATA_OFFSET 0x01 #define MOV_TRUN_FIRST_SAMPLE_FLAGS 0x04 diff --git a/libavformat/mov.c b/libavformat/mov.c index 4832623..4a2d265 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -725,7 +725,7 @@ static int mov_read_moov(MOVContext *c, AVIOContext *pb, MOVAtom atom) static int mov_read_moof(MOVContext *c, AVIOContext *pb, MOVAtom atom) { - c->fragment.moof_offset = avio_tell(pb) - 8; + c->fragment.moof_offset = c->fragment.implicit_offset = avio_tell(pb) - 8; av_dlog(c->fc, "moof offset %"PRIx64"\n", c->fragment.moof_offset); return mov_read_default(c, pb, atom); } @@ -2502,7 +2502,8 @@ static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom) } frag->base_data_offset = flags & MOV_TFHD_BASE_DATA_OFFSET ? - avio_rb64(pb) : frag->moof_offset; + avio_rb64(pb) : flags & MOV_TFHD_DEFAULT_BASE_IS_MOOF ? + frag->moof_offset : frag->implicit_offset; frag->stsd_id = flags & MOV_TFHD_STSD_ID ? avio_rb32(pb) : trex->stsd_id; frag->duration = flags & MOV_TFHD_DEFAULT_DURATION ? @@ -2638,7 +2639,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) if (pb->eof_reached) return AVERROR_EOF; - frag->moof_offset = offset; + frag->implicit_offset = offset; st->duration = sc->track_end = dts + sc->time_offset; return 0; } |