AVFormatContext *avf;
char *format; ///< format to use for output segment files
char *list; ///< filename for the segment list file
- int list_count; ///< list counter
int list_flags; ///< flags affecting list generation
int list_size; ///< number of entries for the segment list file
double list_max_segment_time; ///< max segment time in the current list
for (i = 0; i < s->nb_streams; i++) {
AVStream *st;
+ AVCodecContext *icodec, *ocodec;
+
if (!(st = avformat_new_stream(oc, NULL)))
return AVERROR(ENOMEM);
- avcodec_copy_context(st->codec, s->streams[i]->codec);
+ icodec = s->streams[i]->codec;
+ ocodec = st->codec;
+ avcodec_copy_context(ocodec, icodec);
+ if (!oc->oformat->codec_tag ||
+ av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == ocodec->codec_id ||
+ av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0) {
+ ocodec->codec_tag = icodec->codec_tag;
+ } else {
+ ocodec->codec_tag = 0;
+ }
st->sample_aspect_ratio = s->streams[i]->sample_aspect_ratio;
}
static int segment_start(AVFormatContext *s, int write_header)
{
- SegmentContext *c = s->priv_data;
- AVFormatContext *oc = c->avf;
+ SegmentContext *seg = s->priv_data;
+ AVFormatContext *oc = seg->avf;
int err = 0;
if (write_header) {
avformat_free_context(oc);
- c->avf = NULL;
+ seg->avf = NULL;
if ((err = segment_mux_init(s)) < 0)
return err;
- oc = c->avf;
+ oc = seg->avf;
}
- if (c->segment_idx_wrap)
- c->segment_idx %= c->segment_idx_wrap;
+ seg->segment_idx++;
+ if (seg->segment_idx_wrap)
+ seg->segment_idx %= seg->segment_idx_wrap;
if (av_get_frame_filename(oc->filename, sizeof(oc->filename),
- s->filename, c->segment_idx++) < 0) {
+ s->filename, seg->segment_idx) < 0) {
av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", s->filename);
return AVERROR(EINVAL);
}
- c->segment_count++;
+ seg->segment_count++;
if ((err = avio_open2(&oc->pb, oc->filename, AVIO_FLAG_WRITE,
&s->interrupt_callback, NULL)) < 0)
if (seg->list_type == LIST_TYPE_M3U8) {
avio_printf(seg->list_pb, "#EXTM3U\n");
avio_printf(seg->list_pb, "#EXT-X-VERSION:3\n");
- avio_printf(seg->list_pb, "#EXT-X-MEDIA-SEQUENCE:%d\n", seg->list_count);
+ avio_printf(seg->list_pb, "#EXT-X-MEDIA-SEQUENCE:%d\n", seg->segment_idx);
avio_printf(seg->list_pb, "#EXT-X-ALLOWCACHE:%d\n",
!!(seg->list_flags & SEGMENT_LIST_FLAG_CACHE));
if (seg->list_flags & SEGMENT_LIST_FLAG_LIVE)
(int)ceil(seg->list_max_segment_time));
avio_printf(seg->list_pb, "#EXT-X-ENDLIST\n");
}
- seg->list_count++;
avio_close(seg->list_pb);
}
}
if (seg->oformat->flags & AVFMT_NOFILE) {
av_log(s, AV_LOG_ERROR, "format %s not supported.\n",
- oc->oformat->name);
+ seg->oformat->name);
ret = AVERROR(EINVAL);
goto fail;
}
oc = seg->avf;
if (av_get_frame_filename(oc->filename, sizeof(oc->filename),
- s->filename, seg->segment_idx++) < 0) {
+ s->filename, seg->segment_idx) < 0) {
ret = AVERROR(EINVAL);
goto fail;
}
.name = "segment",
.long_name = NULL_IF_CONFIG_SMALL("segment"),
.priv_data_size = sizeof(SegmentContext),
- .flags = AVFMT_NOFILE,
+ .flags = AVFMT_NOFILE|AVFMT_GLOBALHEADER,
.write_header = seg_write_header,
.write_packet = seg_write_packet,
.write_trailer = seg_write_trailer,