movenc: Allow writing to a non-seekable output if using empty moov
In this mode, no seeks will be done except for within moov/moof fragments, which should fit within the AVIOContext buffer. This allows pushing live smooth streaming format data to a live publishing point on IIS over http. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
f532210499
commit
e771e6dd63
@ -2518,6 +2518,7 @@ static int mov_flush_fragment(AVFormatContext *s)
|
|||||||
mov->tracks[i].cluster[0].dts;
|
mov->tracks[i].cluster[0].dts;
|
||||||
mov->tracks[i].entry = 0;
|
mov->tracks[i].entry = 0;
|
||||||
}
|
}
|
||||||
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2557,6 +2558,7 @@ static int mov_flush_fragment(AVFormatContext *s)
|
|||||||
|
|
||||||
if (write_moof) {
|
if (write_moof) {
|
||||||
MOVFragmentInfo *info;
|
MOVFragmentInfo *info;
|
||||||
|
avio_flush(s->pb);
|
||||||
track->nb_frag_info++;
|
track->nb_frag_info++;
|
||||||
track->frag_info = av_realloc(track->frag_info,
|
track->frag_info = av_realloc(track->frag_info,
|
||||||
sizeof(*track->frag_info) *
|
sizeof(*track->frag_info) *
|
||||||
@ -2589,6 +2591,7 @@ static int mov_flush_fragment(AVFormatContext *s)
|
|||||||
|
|
||||||
mov->mdat_size = 0;
|
mov->mdat_size = 0;
|
||||||
|
|
||||||
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2602,7 +2605,9 @@ static int mov_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
|
|||||||
int size= pkt->size;
|
int size= pkt->size;
|
||||||
uint8_t *reformatted_data = NULL;
|
uint8_t *reformatted_data = NULL;
|
||||||
|
|
||||||
if (!s->pb->seekable) return 0; /* Can't handle that */
|
if (!s->pb->seekable && !(mov->flags & FF_MOV_FLAG_EMPTY_MOOV))
|
||||||
|
return 0; /* Can't handle that */
|
||||||
|
|
||||||
if (!size) return 0; /* Discard 0 sized packets */
|
if (!size) return 0; /* Discard 0 sized packets */
|
||||||
|
|
||||||
if ((mov->max_fragment_duration && trk->entry &&
|
if ((mov->max_fragment_duration && trk->entry &&
|
||||||
@ -2782,7 +2787,13 @@ static int mov_write_header(AVFormatContext *s)
|
|||||||
AVDictionaryEntry *t;
|
AVDictionaryEntry *t;
|
||||||
int i, hint_track = 0;
|
int i, hint_track = 0;
|
||||||
|
|
||||||
if (!s->pb->seekable) {
|
/* Non-seekable output is ok if EMPTY_MOOV is set, or if using the ismv
|
||||||
|
* format (which sets EMPTY_MOOV later in this function). If ism_lookahead
|
||||||
|
* is enabled, we don't support non-seekable output at all. */
|
||||||
|
if (!s->pb->seekable &&
|
||||||
|
((!(mov->flags & FF_MOV_FLAG_EMPTY_MOOV) &&
|
||||||
|
!(s->oformat && !strcmp(s->oformat->name, "ismv")))
|
||||||
|
|| mov->ism_lookahead)) {
|
||||||
av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n");
|
av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user