|
|
|
@ -199,7 +199,8 @@ static int validate_codec_tag(AVFormatContext *s, AVStream *st) |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int avformat_write_header(AVFormatContext *s, AVDictionary **options) |
|
|
|
|
|
|
|
|
|
static int init_muxer(AVFormatContext *s, AVDictionary **options) |
|
|
|
|
{ |
|
|
|
|
int ret = 0, i; |
|
|
|
|
AVStream *st; |
|
|
|
@ -317,14 +318,23 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options) |
|
|
|
|
av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->oformat->write_header) { |
|
|
|
|
ret = s->oformat->write_header(s); |
|
|
|
|
if (ret >= 0 && s->pb && s->pb->error < 0) |
|
|
|
|
ret = s->pb->error; |
|
|
|
|
if (ret < 0) |
|
|
|
|
goto fail; |
|
|
|
|
if (options) { |
|
|
|
|
av_dict_free(options); |
|
|
|
|
*options = tmp; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
fail: |
|
|
|
|
av_dict_free(&tmp); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int init_pts(AVFormatContext *s) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
AVStream *st; |
|
|
|
|
|
|
|
|
|
/* init PTS generation */ |
|
|
|
|
for (i = 0; i < s->nb_streams; i++) { |
|
|
|
|
int64_t den = AV_NOPTS_VALUE; |
|
|
|
@ -341,22 +351,35 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (den != AV_NOPTS_VALUE) { |
|
|
|
|
if (den <= 0) { |
|
|
|
|
ret = AVERROR_INVALIDDATA; |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
if (den <= 0) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
|
|
frac_init(&st->pts, 0, 0, den); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (options) { |
|
|
|
|
av_dict_free(options); |
|
|
|
|
*options = tmp; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int avformat_write_header(AVFormatContext *s, AVDictionary **options) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
if (ret = init_muxer(s, options)) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
if (s->oformat->write_header) { |
|
|
|
|
ret = s->oformat->write_header(s); |
|
|
|
|
if (ret >= 0 && s->pb && s->pb->error < 0) |
|
|
|
|
ret = s->pb->error; |
|
|
|
|
if (ret < 0) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((ret = init_pts(s) < 0)) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
fail: |
|
|
|
|
av_dict_free(&tmp); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//FIXME merge with compute_pkt_fields
|
|
|
|
|