2 * FFM (ffserver live feed) muxer
3 * Copyright (c) 2001 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/intreadwrite.h"
23 #include "libavutil/intfloat.h"
24 #include "libavutil/avassert.h"
25 #include "libavutil/parseutils.h"
30 static void flush_packet(AVFormatContext
*s
)
32 FFMContext
*ffm
= s
->priv_data
;
34 AVIOContext
*pb
= s
->pb
;
36 fill_size
= ffm
->packet_end
- ffm
->packet_ptr
;
37 memset(ffm
->packet_ptr
, 0, fill_size
);
39 av_assert1(avio_tell(pb
) % ffm
->packet_size
== 0);
42 avio_wb16(pb
, PACKET_ID
);
43 avio_wb16(pb
, fill_size
);
44 avio_wb64(pb
, ffm
->dts
);
45 h
= ffm
->frame_offset
;
46 if (ffm
->first_packet
)
49 avio_write(pb
, ffm
->packet
, ffm
->packet_end
- ffm
->packet
);
52 /* prepare next packet */
53 ffm
->frame_offset
= 0; /* no key frame */
54 ffm
->packet_ptr
= ffm
->packet
;
55 ffm
->first_packet
= 0;
58 /* 'first' is true if first data of a frame */
59 static void ffm_write_data(AVFormatContext
*s
,
60 const uint8_t *buf
, int size
,
61 int64_t dts
, int header
)
63 FFMContext
*ffm
= s
->priv_data
;
66 if (header
&& ffm
->frame_offset
== 0) {
67 ffm
->frame_offset
= ffm
->packet_ptr
- ffm
->packet
+ FFM_HEADER_SIZE
;
71 /* write as many packets as needed */
73 len
= ffm
->packet_end
- ffm
->packet_ptr
;
76 memcpy(ffm
->packet_ptr
, buf
, len
);
78 ffm
->packet_ptr
+= len
;
81 if (ffm
->packet_ptr
>= ffm
->packet_end
)
86 static void write_header_chunk(AVIOContext
*pb
, AVIOContext
*dpb
, unsigned id
)
89 int dyn_size
= avio_close_dyn_buf(dpb
, &dyn_buf
);
91 avio_wb32(pb
, dyn_size
);
92 avio_write(pb
, dyn_buf
, dyn_size
);
96 static int ffm_write_header(AVFormatContext
*s
)
98 FFMContext
*ffm
= s
->priv_data
;
101 AVIOContext
*pb
= s
->pb
;
102 AVCodecContext
*codec
;
105 if (t
= av_dict_get(s
->metadata
, "creation_time", NULL
, 0)) {
106 int ret
= av_parse_time(&ffm
->start_time
, t
->value
, 0);
111 ffm
->packet_size
= FFM_PACKET_SIZE
;
114 avio_wl32(pb
, MKTAG('F', 'F', 'M', '2'));
115 avio_wb32(pb
, ffm
->packet_size
);
116 avio_wb64(pb
, 0); /* current write position */
118 if(avio_open_dyn_buf(&pb
) < 0)
119 return AVERROR(ENOMEM
);
121 avio_wb32(pb
, s
->nb_streams
);
123 for(i
=0;i
<s
->nb_streams
;i
++) {
125 bit_rate
+= st
->codec
->bit_rate
;
127 avio_wb32(pb
, bit_rate
);
129 write_header_chunk(s
->pb
, pb
, MKBETAG('M', 'A', 'I', 'N'));
131 /* list of streams */
132 for(i
=0;i
<s
->nb_streams
;i
++) {
134 avpriv_set_pts_info(st
, 64, 1, 1000000);
135 if(avio_open_dyn_buf(&pb
) < 0)
136 return AVERROR(ENOMEM
);
140 avio_wb32(pb
, codec
->codec_id
);
141 avio_w8(pb
, codec
->codec_type
);
142 avio_wb32(pb
, codec
->bit_rate
);
143 avio_wb32(pb
, codec
->flags
);
144 avio_wb32(pb
, codec
->flags2
);
145 avio_wb32(pb
, codec
->debug
);
146 if (codec
->flags
& CODEC_FLAG_GLOBAL_HEADER
) {
147 avio_wb32(pb
, codec
->extradata_size
);
148 avio_write(pb
, codec
->extradata
, codec
->extradata_size
);
150 write_header_chunk(s
->pb
, pb
, MKBETAG('C', 'O', 'M', 'M'));
151 if(avio_open_dyn_buf(&pb
) < 0)
152 return AVERROR(ENOMEM
);
154 switch(codec
->codec_type
) {
155 case AVMEDIA_TYPE_VIDEO
:
156 avio_wb32(pb
, codec
->time_base
.num
);
157 avio_wb32(pb
, codec
->time_base
.den
);
158 avio_wb16(pb
, codec
->width
);
159 avio_wb16(pb
, codec
->height
);
160 avio_wb16(pb
, codec
->gop_size
);
161 avio_wb32(pb
, codec
->pix_fmt
);
162 avio_w8(pb
, codec
->qmin
);
163 avio_w8(pb
, codec
->qmax
);
164 avio_w8(pb
, codec
->max_qdiff
);
165 avio_wb16(pb
, (int) (codec
->qcompress
* 10000.0));
166 avio_wb16(pb
, (int) (codec
->qblur
* 10000.0));
167 avio_wb32(pb
, codec
->bit_rate_tolerance
);
168 avio_put_str(pb
, codec
->rc_eq
? codec
->rc_eq
: "tex^qComp");
169 avio_wb32(pb
, codec
->rc_max_rate
);
170 avio_wb32(pb
, codec
->rc_min_rate
);
171 avio_wb32(pb
, codec
->rc_buffer_size
);
172 avio_wb64(pb
, av_double2int(codec
->i_quant_factor
));
173 avio_wb64(pb
, av_double2int(codec
->b_quant_factor
));
174 avio_wb64(pb
, av_double2int(codec
->i_quant_offset
));
175 avio_wb64(pb
, av_double2int(codec
->b_quant_offset
));
176 avio_wb32(pb
, codec
->dct_algo
);
177 avio_wb32(pb
, codec
->strict_std_compliance
);
178 avio_wb32(pb
, codec
->max_b_frames
);
179 avio_wb32(pb
, codec
->mpeg_quant
);
180 avio_wb32(pb
, codec
->intra_dc_precision
);
181 avio_wb32(pb
, codec
->me_method
);
182 avio_wb32(pb
, codec
->mb_decision
);
183 avio_wb32(pb
, codec
->nsse_weight
);
184 avio_wb32(pb
, codec
->frame_skip_cmp
);
185 avio_wb64(pb
, av_double2int(codec
->rc_buffer_aggressivity
));
186 avio_wb32(pb
, codec
->codec_tag
);
187 avio_w8(pb
, codec
->thread_count
);
188 avio_wb32(pb
, codec
->coder_type
);
189 avio_wb32(pb
, codec
->me_cmp
);
190 avio_wb32(pb
, codec
->me_subpel_quality
);
191 avio_wb32(pb
, codec
->me_range
);
192 avio_wb32(pb
, codec
->keyint_min
);
193 avio_wb32(pb
, codec
->scenechange_threshold
);
194 avio_wb32(pb
, codec
->b_frame_strategy
);
195 avio_wb64(pb
, av_double2int(codec
->qcompress
));
196 avio_wb64(pb
, av_double2int(codec
->qblur
));
197 avio_wb32(pb
, codec
->max_qdiff
);
198 avio_wb32(pb
, codec
->refs
);
199 write_header_chunk(s
->pb
, pb
, MKBETAG('S', 'T', 'V', 'I'));
201 case AVMEDIA_TYPE_AUDIO
:
202 avio_wb32(pb
, codec
->sample_rate
);
203 avio_wl16(pb
, codec
->channels
);
204 avio_wl16(pb
, codec
->frame_size
);
205 write_header_chunk(s
->pb
, pb
, MKBETAG('S', 'T', 'A', 'U'));
213 avio_wb64(pb
, 0); // end of header
215 /* flush until end of block reached */
216 while ((avio_tell(pb
) % ffm
->packet_size
) != 0)
221 /* init packet mux */
222 ffm
->packet_ptr
= ffm
->packet
;
223 ffm
->packet_end
= ffm
->packet
+ ffm
->packet_size
- FFM_HEADER_SIZE
;
224 av_assert0(ffm
->packet_end
>= ffm
->packet
);
225 ffm
->frame_offset
= 0;
227 ffm
->first_packet
= 1;
232 static int ffm_write_packet(AVFormatContext
*s
, AVPacket
*pkt
)
234 FFMContext
*ffm
= s
->priv_data
;
236 uint8_t header
[FRAME_HEADER_SIZE
+4];
237 int header_size
= FRAME_HEADER_SIZE
;
239 dts
= ffm
->start_time
+ pkt
->dts
;
240 /* packet size & key_frame */
241 header
[0] = pkt
->stream_index
;
243 if (pkt
->flags
& AV_PKT_FLAG_KEY
)
244 header
[1] |= FLAG_KEY_FRAME
;
245 AV_WB24(header
+2, pkt
->size
);
246 AV_WB24(header
+5, pkt
->duration
);
247 AV_WB64(header
+8, ffm
->start_time
+ pkt
->pts
);
248 if (pkt
->pts
!= pkt
->dts
) {
249 header
[1] |= FLAG_DTS
;
250 AV_WB32(header
+16, pkt
->pts
- pkt
->dts
);
253 ffm_write_data(s
, header
, header_size
, dts
, 1);
254 ffm_write_data(s
, pkt
->data
, pkt
->size
, dts
, 0);
259 static int ffm_write_trailer(AVFormatContext
*s
)
261 FFMContext
*ffm
= s
->priv_data
;
264 if (ffm
->packet_ptr
> ffm
->packet
)
270 AVOutputFormat ff_ffm_muxer
= {
272 .long_name
= NULL_IF_CONFIG_SMALL("FFM (FFserver live feed)"),
274 .priv_data_size
= sizeof(FFMContext
),
275 .audio_codec
= AV_CODEC_ID_MP2
,
276 .video_codec
= AV_CODEC_ID_MPEG1VIDEO
,
277 .write_header
= ffm_write_header
,
278 .write_packet
= ffm_write_packet
,
279 .write_trailer
= ffm_write_trailer
,
280 .flags
= AVFMT_TS_NEGATIVE
,