summaryrefslogtreecommitdiff
path: root/libavformat/movenc.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2015-01-20 15:33:12 +0100
committerMartin Storsjö <martin@martin.st>2015-03-10 10:41:06 +0200
commit448c8cfe4c53e9e806effd8505b46d57fa707061 (patch)
treefb30ebffaef0b4419abfee5a284ebfcecd4567ec /libavformat/movenc.c
parent0c5e380c2c266d2e8a13c000cc527529db837f10 (diff)
movenc: Support setting fragment_index before the moov atom is written
This way, the caller doesn't need to coordinate setting the option after the moov atom has been written. The downside is that it is no longer possible to use the option for checking whether the moov atom already has been written, but a caller is able to keep track of that by other means anyway. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r--libavformat/movenc.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 3a9d015d0e..c326999327 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -72,7 +72,7 @@ static const AVOption options[] = {
{ "ism_lookahead", "Number of lookahead entries for ISM files", offsetof(MOVMuxContext, ism_lookahead), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
{ "brand", "Override major brand", offsetof(MOVMuxContext, major_brand), AV_OPT_TYPE_STRING, {.str = NULL}, .flags = AV_OPT_FLAG_ENCODING_PARAM },
{ "use_editlist", "use edit list", offsetof(MOVMuxContext, use_editlist), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, AV_OPT_FLAG_ENCODING_PARAM},
- { "fragment_index", "Fragment number of the next fragment", offsetof(MOVMuxContext, fragments), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
+ { "fragment_index", "Fragment number of the next fragment", offsetof(MOVMuxContext, fragments), AV_OPT_TYPE_INT, {.i64 = 1}, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
{ NULL },
};
@@ -3119,7 +3119,7 @@ static int mov_flush_fragment(AVFormatContext *s)
if (!(mov->flags & FF_MOV_FLAG_FRAGMENT))
return 0;
- if (mov->fragments == 0) {
+ if (!mov->moov_written) {
int64_t pos = avio_tell(s->pb);
int ret;
AVIOContext *moov_buf;
@@ -3148,7 +3148,7 @@ static int mov_flush_fragment(AVFormatContext *s)
if (mov->flags & FF_MOV_FLAG_FASTSTART)
mov->reserved_moov_pos = avio_tell(s->pb);
avio_flush(s->pb);
- mov->fragments++;
+ mov->moov_written = 1;
return 0;
}
@@ -3159,7 +3159,7 @@ static int mov_flush_fragment(AVFormatContext *s)
avio_write(s->pb, buf, buf_size);
av_free(buf);
- mov->fragments++;
+ mov->moov_written = 1;
mov->mdat_size = 0;
for (i = 0; i < mov->nb_streams; i++) {
if (mov->tracks[i].entry)
@@ -3237,12 +3237,13 @@ static int mov_flush_fragment(AVFormatContext *s)
static int mov_auto_flush_fragment(AVFormatContext *s)
{
MOVMuxContext *mov = s->priv_data;
+ int had_moov = mov->moov_written;
int ret = mov_flush_fragment(s);
if (ret < 0)
return ret;
// If using delay_moov, the first flush only wrote the moov,
// not the actual moof+mdat pair, thus flush once again.
- if (mov->fragments == 1 && mov->flags & FF_MOV_FLAG_DELAY_MOOV)
+ if (!had_moov && mov->flags & FF_MOV_FLAG_DELAY_MOOV)
ret = mov_flush_fragment(s);
return ret;
}
@@ -3259,7 +3260,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
if (mov->flags & FF_MOV_FLAG_FRAGMENT) {
int ret;
- if (mov->fragments > 0 || mov->flags & FF_MOV_FLAG_EMPTY_MOOV) {
+ if (mov->moov_written || mov->flags & FF_MOV_FLAG_EMPTY_MOOV) {
if (!trk->mdat_buf) {
if ((ret = avio_open_dyn_buf(&trk->mdat_buf)) < 0)
return ret;
@@ -3391,7 +3392,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
trk->frag_start = pkt->dts;
trk->start_dts = 0;
trk->frag_discont = 0;
- } else if (pkt->dts && mov->fragments >= 1)
+ } else if (pkt->dts && mov->moov_written)
av_log(s, AV_LOG_WARNING,
"Track %d starts with a nonzero dts %"PRId64", while the moov "
"already has been written. Set the delay_moov flag to handle "
@@ -3898,7 +3899,7 @@ static int mov_write_header(AVFormatContext *s)
if (mov->flags & FF_MOV_FLAG_EMPTY_MOOV &&
!(mov->flags & FF_MOV_FLAG_DELAY_MOOV)) {
mov_write_moov_tag(pb, mov, s);
- mov->fragments++;
+ mov->moov_written = 1;
if (mov->flags & FF_MOV_FLAG_FASTSTART)
mov->reserved_moov_pos = avio_tell(pb);
}