Browse Source

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>
tags/n0.11
Martin Storsjö 13 years ago
parent
commit
e771e6dd63
1 changed files with 13 additions and 2 deletions
  1. +13
    -2
      libavformat/movenc.c

+ 13
- 2
libavformat/movenc.c View File

@@ -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…
Cancel
Save