From 9a761250699dc179c8e31caa55b1a785a5601e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Fri, 21 May 2010 07:07:57 +0000 Subject: [PATCH] Add a libavformat internal function ff_write_chained Originally committed as revision 23207 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/internal.h | 14 ++++++++++++++ libavformat/utils.c | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/libavformat/internal.h b/libavformat/internal.h index a395c2f24b..db2a7c20d3 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -154,4 +154,18 @@ int ff_url_join(char *str, int size, const char *proto, void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, int port, int ttl); +/** + * Write a packet to another muxer than the one the user originally + * intended. Useful when chaining muxers, where one muxer internally + * writes a received packet to another muxer. + * + * @param dst the muxer to write the packet to + * @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 + * @return the value av_write_frame returned + */ +int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt, + AVFormatContext *src); + #endif /* AVFORMAT_INTERNAL_H */ diff --git a/libavformat/utils.c b/libavformat/utils.c index 9b5ae5dffa..435720f4a4 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -3591,3 +3591,22 @@ int ff_url_join(char *str, int size, const char *proto, } return strlen(str); } + +int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt, + AVFormatContext *src) +{ + AVPacket local_pkt; + + 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); + return av_write_frame(dst, &local_pkt); +} +