From 351b22caae65ad5c5d2deb3815d79d032eb04385 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 24 Jul 2014 22:39:22 +0200 Subject: [PATCH] avformat/mux: support re-interleaving packets in ff_write_chained() Signed-off-by: Michael Niedermayer --- libavformat/hdsenc.c | 2 +- libavformat/hlsenc.c | 2 +- libavformat/internal.h | 3 ++- libavformat/movenchint.c | 2 +- libavformat/mux.c | 5 +++-- libavformat/rtspenc.c | 2 +- libavformat/sapenc.c | 2 +- libavformat/segment.c | 2 +- libavformat/smoothstreamingenc.c | 2 +- 9 files changed, 12 insertions(+), 10 deletions(-) diff --git a/libavformat/hdsenc.c b/libavformat/hdsenc.c index 20b4b12139..fac5bcf417 100644 --- a/libavformat/hdsenc.c +++ b/libavformat/hdsenc.c @@ -549,7 +549,7 @@ static int hds_write_packet(AVFormatContext *s, AVPacket *pkt) os->last_ts = pkt->dts; os->packets_written++; - return ff_write_chained(os->ctx, pkt->stream_index - os->first_stream, pkt, s); + return ff_write_chained(os->ctx, pkt->stream_index - os->first_stream, pkt, s, 0); } static int hds_write_trailer(AVFormatContext *s) diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 388a23a18b..ca42b444b1 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -302,7 +302,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) return ret; } - ret = ff_write_chained(oc, pkt->stream_index, pkt, s); + ret = ff_write_chained(oc, pkt->stream_index, pkt, s, 0); return ret; } diff --git a/libavformat/internal.h b/libavformat/internal.h index 467e25d830..08987c76be 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -134,10 +134,11 @@ void ff_sdp_write_media(char *buff, int size, AVStream *st, int idx, * @param dst_stream the stream index within dst to write the packet to * @param pkt the packet to be written * @param src the muxer the packet originally was intended for + * @param interleave 0->use av_write_frame, 1->av_write_interleaved_frame * @return the value av_write_frame returned */ int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt, - AVFormatContext *src); + AVFormatContext *src, int interleave); /** * Get the length in bytes which is needed to store val as v. diff --git a/libavformat/movenchint.c b/libavformat/movenchint.c index 9d6a66e8ce..2602254be9 100644 --- a/libavformat/movenchint.c +++ b/libavformat/movenchint.c @@ -422,7 +422,7 @@ int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt, sample_queue_push(&trk->sample_queue, pkt->data, pkt->size, sample); /* Feed the packet to the RTP muxer */ - ff_write_chained(rtp_ctx, 0, pkt, s); + ff_write_chained(rtp_ctx, 0, pkt, s, 0); /* Fetch the output from the RTP muxer, open a new output buffer * for next time. */ diff --git a/libavformat/mux.c b/libavformat/mux.c index 3abeccfaa0..bd9f7e5dcc 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -960,7 +960,7 @@ int av_get_output_timestamp(struct AVFormatContext *s, int stream, } int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt, - AVFormatContext *src) + AVFormatContext *src, int interleave) { AVPacket local_pkt; int ret; @@ -980,7 +980,8 @@ int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt, src->streams[pkt->stream_index]->time_base, dst->streams[dst_stream]->time_base); - ret = av_write_frame(dst, &local_pkt); + if (interleave) ret = av_interleaved_write_frame(dst, &local_pkt); + else ret = av_write_frame(dst, &local_pkt); pkt->buf = local_pkt.buf; pkt->destruct = local_pkt.destruct; return ret; diff --git a/libavformat/rtspenc.c b/libavformat/rtspenc.c index cc6e729e8c..af6f7996dc 100644 --- a/libavformat/rtspenc.c +++ b/libavformat/rtspenc.c @@ -212,7 +212,7 @@ static int rtsp_write_packet(AVFormatContext *s, AVPacket *pkt) rtsp_st = rt->rtsp_streams[pkt->stream_index]; rtpctx = rtsp_st->transport_priv; - ret = ff_write_chained(rtpctx, 0, pkt, s); + ret = ff_write_chained(rtpctx, 0, pkt, s, 0); /* ff_write_chained does all the RTP packetization. If using TCP as * transport, rtpctx->pb is only a dyn_packet_buf that queues up the * packets, so we need to send them out on the TCP connection separately. diff --git a/libavformat/sapenc.c b/libavformat/sapenc.c index c725ce3544..f90955790d 100644 --- a/libavformat/sapenc.c +++ b/libavformat/sapenc.c @@ -256,7 +256,7 @@ static int sap_write_packet(AVFormatContext *s, AVPacket *pkt) sap->last_time = now; } rtpctx = s->streams[pkt->stream_index]->priv_data; - return ff_write_chained(rtpctx, 0, pkt, s); + return ff_write_chained(rtpctx, 0, pkt, s, 0); } AVOutputFormat ff_sap_muxer = { diff --git a/libavformat/segment.c b/libavformat/segment.c index 135def226b..cae0f114a5 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -766,7 +766,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt) av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &st->time_base), av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &st->time_base)); - ret = ff_write_chained(seg->avf, pkt->stream_index, pkt, s); + ret = ff_write_chained(seg->avf, pkt->stream_index, pkt, s, 0); fail: if (pkt->stream_index == seg->reference_stream_index) { diff --git a/libavformat/smoothstreamingenc.c b/libavformat/smoothstreamingenc.c index 5a77ec3f74..9491005422 100644 --- a/libavformat/smoothstreamingenc.c +++ b/libavformat/smoothstreamingenc.c @@ -593,7 +593,7 @@ static int ism_write_packet(AVFormatContext *s, AVPacket *pkt) } os->packets_written++; - return ff_write_chained(os->ctx, 0, pkt, s); + return ff_write_chained(os->ctx, 0, pkt, s, 0); } static int ism_write_trailer(AVFormatContext *s)