}
-int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
+int avformat_alloc_output_context2(AVFormatContext **avctx, ff_const59 AVOutputFormat *oformat,
const char *format, const char *filename)
{
AVFormatContext *s = avformat_alloc_context();
AVStream *st;
AVDictionary *tmp = NULL;
AVCodecParameters *par = NULL;
- AVOutputFormat *of = s->oformat;
+ const AVOutputFormat *of = s->oformat;
const AVCodecDescriptor *desc;
AVDictionaryEntry *e;
}
}
+static void deinit_muxer(AVFormatContext *s)
+{
+ if (s->oformat && s->oformat->deinit && s->internal->initialized)
+ s->oformat->deinit(s);
+ s->internal->initialized =
+ s->internal->streams_initialized = 0;
+}
+
int avformat_init_output(AVFormatContext *s, AVDictionary **options)
{
int ret = 0;
return streams_already_initialized;
fail:
- if (s->oformat->deinit)
- s->oformat->deinit(s);
+ deinit_muxer(s);
return ret;
}
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
return 0;
av_log(ctx, AV_LOG_ERROR,
- "Failed to send packet to filter %s for stream %d\n",
+ "Failed to receive packet from filter %s for stream %d\n",
ctx->filter->name, pkt->stream_index);
if (s->error_recognition & AV_EF_EXPLODE)
return ret;
#define CHUNK_START 0x1000
int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
- int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
+ int (*compare)(AVFormatContext *, const AVPacket *, const AVPacket *))
{
int ret;
AVPacketList **next_point, *this_pktl;
return 0;
}
-static int interleave_compare_dts(AVFormatContext *s, AVPacket *next,
- AVPacket *pkt)
+static int interleave_compare_dts(AVFormatContext *s, const AVPacket *next,
+ const AVPacket *pkt)
{
AVStream *st = s->streams[pkt->stream_index];
AVStream *st2 = s->streams[next->stream_index];
int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
st->time_base);
- if (s->audio_preload && ((st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) {
- int64_t ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st ->codecpar->codec_type == AVMEDIA_TYPE_AUDIO);
- int64_t ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO);
- if (ts == ts2) {
- ts= ( pkt ->dts* st->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st ->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)* st->time_base.den)*st2->time_base.den
- -( next->dts*st2->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)*st2->time_base.den)* st->time_base.den;
- ts2=0;
+ if (s->audio_preload) {
+ int preload = st ->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
+ int preload2 = st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
+ if (preload != preload2) {
+ int64_t ts, ts2;
+ preload *= s->audio_preload;
+ preload2 *= s->audio_preload;
+ ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - preload;
+ ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - preload2;
+ if (ts == ts2) {
+ ts = ((uint64_t)pkt ->dts*st ->time_base.num*AV_TIME_BASE - (uint64_t)preload *st ->time_base.den)*st2->time_base.den
+ - ((uint64_t)next->dts*st2->time_base.num*AV_TIME_BASE - (uint64_t)preload2*st2->time_base.den)*st ->time_base.den;
+ ts2 = 0;
+ }
+ comp = (ts2 > ts) - (ts2 < ts);
}
- comp= (ts>ts2) - (ts<ts2);
}
if (comp == 0)
}
}
- if (s->oformat->deinit)
- s->oformat->deinit(s);
-
- s->internal->initialized =
- s->internal->streams_initialized = 0;
+ deinit_muxer(s);
if (s->pb)
avio_flush(s->pb);
local_pkt = *pkt;
local_pkt.stream_index = dst_stream;
- if (pkt->pts != AV_NOPTS_VALUE)
- local_pkt.pts = av_rescale_q(pkt->pts,
- src->streams[pkt->stream_index]->time_base,
- dst->streams[dst_stream]->time_base);
- if (pkt->dts != AV_NOPTS_VALUE)
- local_pkt.dts = av_rescale_q(pkt->dts,
- src->streams[pkt->stream_index]->time_base,
- dst->streams[dst_stream]->time_base);
- if (pkt->duration)
- local_pkt.duration = av_rescale_q(pkt->duration,
- src->streams[pkt->stream_index]->time_base,
- dst->streams[dst_stream]->time_base);
+
+ av_packet_rescale_ts(&local_pkt,
+ src->streams[pkt->stream_index]->time_base,
+ dst->streams[dst_stream]->time_base);
if (interleave) ret = av_interleaved_write_frame(dst, &local_pkt);
else ret = av_write_frame(dst, &local_pkt);