+static int write_muxed_file(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
+{
+ VideoMuxData *img = s->priv_data;
+ AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
+ AVStream *st;
+ AVPacket pkt2;
+ AVFormatContext *fmt = NULL;
+ int ret;
+
+ /* URL is not used directly as we are overriding the IO context later. */
+ ret = avformat_alloc_output_context2(&fmt, NULL, img->muxer, s->url);
+ if (ret < 0)
+ return ret;
+ st = avformat_new_stream(fmt, NULL);
+ if (!st) {
+ ret = AVERROR(ENOMEM);
+ goto out;
+ }
+ st->id = pkt->stream_index;
+
+ fmt->pb = pb;
+
+ ret = av_packet_ref(&pkt2, pkt);
+ if (ret < 0)
+ goto out;
+ pkt2.stream_index = 0;
+
+ if ((ret = avcodec_parameters_copy(st->codecpar, par)) < 0 ||
+ (ret = avformat_write_header(fmt, NULL)) < 0 ||
+ (ret = av_interleaved_write_frame(fmt, &pkt2)) < 0 ||
+ (ret = av_write_trailer(fmt))) {}
+
+ av_packet_unref(&pkt2);
+out:
+ avformat_free_context(fmt);
+ return ret;
+}
+
+static int write_packet_pipe(AVFormatContext *s, AVPacket *pkt)
+{
+ VideoMuxData *img = s->priv_data;
+ if (img->muxer) {
+ int ret = write_muxed_file(s, s->pb, pkt);
+ if (ret < 0)
+ return ret;
+ } else {
+ avio_write(s->pb, pkt->data, pkt->size);
+ }
+ img->img_number++;
+ return 0;
+}
+