annotate ffmenc.c @ 6142:bd851edc58ac libavformat

RTMP: Return from rtmp_read as soon as some data is available Earlier, the function only returned when the enough data to fill the requested buffer was available. This lead to high latency when receiving low-bandwidth streams.
author mstorsjo
date Fri, 18 Jun 2010 12:02:51 +0000
parents 11bb10c37225
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
3348
4d492fccf79b split ffm de/muxer
bcoudurier
parents: 3347
diff changeset
2 * FFM (ffserver live feed) muxer
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4201
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
3348
4d492fccf79b split ffm de/muxer
bcoudurier
parents: 3347
diff changeset
21
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3731
diff changeset
22 #include "libavutil/intreadwrite.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #include "avformat.h"
3348
4d492fccf79b split ffm de/muxer
bcoudurier
parents: 3347
diff changeset
24 #include "ffm.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 static void flush_packet(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 int fill_size, h;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2222
diff changeset
30 ByteIOContext *pb = s->pb;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 fill_size = ffm->packet_end - ffm->packet_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 memset(ffm->packet_ptr, 0, fill_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 862
diff changeset
35 if (url_ftell(pb) % ffm->packet_size)
318
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
36 av_abort();
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
37
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 /* put header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 put_be16(pb, PACKET_ID);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 put_be16(pb, fill_size);
3492
6facc89bece8 cosmetics, pts->dts
bcoudurier
parents: 3491
diff changeset
41 put_be64(pb, ffm->dts);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 h = ffm->frame_offset;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 if (ffm->first_packet)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 h |= 0x8000;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 put_be16(pb, h);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 put_buffer(pb, ffm->packet, ffm->packet_end - ffm->packet);
751
dcb459ca11eb Flush the ffm packet to the wire (or file) whenever we flush the ffm packet.
philipjsg
parents: 744
diff changeset
47 put_flush_packet(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 /* prepare next packet */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 ffm->frame_offset = 0; /* no key frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 ffm->packet_ptr = ffm->packet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 ffm->first_packet = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 /* 'first' is true if first data of a frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56 static void ffm_write_data(AVFormatContext *s,
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 187
diff changeset
57 const uint8_t *buf, int size,
3492
6facc89bece8 cosmetics, pts->dts
bcoudurier
parents: 3491
diff changeset
58 int64_t dts, int header)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 int len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62
3488
222810cefa11 do not reset ffm pts, this avoids setting last pts to 0 and screwing up seeking
bcoudurier
parents: 3443
diff changeset
63 if (header && ffm->frame_offset == 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 ffm->frame_offset = ffm->packet_ptr - ffm->packet + FFM_HEADER_SIZE;
3492
6facc89bece8 cosmetics, pts->dts
bcoudurier
parents: 3491
diff changeset
65 ffm->dts = dts;
3488
222810cefa11 do not reset ffm pts, this avoids setting last pts to 0 and screwing up seeking
bcoudurier
parents: 3443
diff changeset
66 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 /* write as many packets as needed */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 while (size > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70 len = ffm->packet_end - ffm->packet_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 if (len > size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 len = size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 memcpy(ffm->packet_ptr, buf, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 ffm->packet_ptr += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 buf += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 size -= len;
3490
e410c33e60f6 remove pts set hack, this is no more correct
bcoudurier
parents: 3489
diff changeset
78 if (ffm->packet_ptr >= ffm->packet_end)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 flush_packet(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 static int ffm_write_header(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 AVStream *st;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2222
diff changeset
87 ByteIOContext *pb = s->pb;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 AVCodecContext *codec;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 int bit_rate, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 ffm->packet_size = FFM_PACKET_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 /* header */
862
aa0abab5e320 fix feed read_header, avoid using put_tag in write_header, to be consistent with read_header, also some minor cosmetics
alex
parents: 858
diff changeset
94 put_le32(pb, MKTAG('F', 'F', 'M', '1'));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 put_be32(pb, ffm->packet_size);
4756
d426504e401b do not write ffm write index by default, detect if file is being written and return EOF
bcoudurier
parents: 4251
diff changeset
96 put_be64(pb, 0); /* current write position */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 put_be32(pb, s->nb_streams);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 bit_rate = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 st = s->streams[i];
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
102 bit_rate += st->codec->bit_rate;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 put_be32(pb, bit_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 /* list of streams */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 st = s->streams[i];
502
813b0119a98e ffserver fixes by (Koos Vriezen <koos.vriezen at xs4all dot nl>)
michael
parents: 468
diff changeset
109 av_set_pts_info(st, 64, 1, 1000000);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
111 codec = st->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 /* generic info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 put_be32(pb, codec->codec_id);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 put_byte(pb, codec->codec_type);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 put_be32(pb, codec->bit_rate);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
116 put_be32(pb, st->quality);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 put_be32(pb, codec->flags);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
118 put_be32(pb, codec->flags2);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
119 put_be32(pb, codec->debug);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 /* specific info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 switch(codec->codec_type) {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5463
diff changeset
122 case AVMEDIA_TYPE_VIDEO:
743
af4e24d6310c switch to native time bases
michael
parents: 683
diff changeset
123 put_be32(pb, codec->time_base.num);
af4e24d6310c switch to native time bases
michael
parents: 683
diff changeset
124 put_be32(pb, codec->time_base.den);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 put_be16(pb, codec->width);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 put_be16(pb, codec->height);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 put_be16(pb, codec->gop_size);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
128 put_be32(pb, codec->pix_fmt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 put_byte(pb, codec->qmin);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 put_byte(pb, codec->qmax);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 put_byte(pb, codec->max_qdiff);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 put_be16(pb, (int) (codec->qcompress * 10000.0));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 put_be16(pb, (int) (codec->qblur * 10000.0));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 put_be32(pb, codec->bit_rate_tolerance);
3731
d8d0fc55a7b8 Fix rc_eq mem leak.
michael
parents: 3603
diff changeset
135 put_strz(pb, codec->rc_eq ? codec->rc_eq : "tex^qComp");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 put_be32(pb, codec->rc_max_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 put_be32(pb, codec->rc_min_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 put_be32(pb, codec->rc_buffer_size);
823
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
139 put_be64(pb, av_dbl2int(codec->i_quant_factor));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
140 put_be64(pb, av_dbl2int(codec->b_quant_factor));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
141 put_be64(pb, av_dbl2int(codec->i_quant_offset));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
142 put_be64(pb, av_dbl2int(codec->b_quant_offset));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 put_be32(pb, codec->dct_algo);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
144 put_be32(pb, codec->strict_std_compliance);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
145 put_be32(pb, codec->max_b_frames);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
146 put_be32(pb, codec->luma_elim_threshold);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
147 put_be32(pb, codec->chroma_elim_threshold);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
148 put_be32(pb, codec->mpeg_quant);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
149 put_be32(pb, codec->intra_dc_precision);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
150 put_be32(pb, codec->me_method);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
151 put_be32(pb, codec->mb_decision);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
152 put_be32(pb, codec->nsse_weight);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
153 put_be32(pb, codec->frame_skip_cmp);
823
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
154 put_be64(pb, av_dbl2int(codec->rc_buffer_aggressivity));
1809
491581a2b9a7 codec_tag settable via VideoTag, and transmit codec_tag in ffm
alex
parents: 1787
diff changeset
155 put_be32(pb, codec->codec_tag);
3489
e9876fb1c84f enable feeder threads
bcoudurier
parents: 3488
diff changeset
156 put_byte(pb, codec->thread_count);
5385
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
157 put_be32(pb, codec->coder_type);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
158 put_be32(pb, codec->me_cmp);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
159 put_be32(pb, codec->partitions);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
160 put_be32(pb, codec->me_subpel_quality);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
161 put_be32(pb, codec->me_range);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
162 put_be32(pb, codec->keyint_min);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
163 put_be32(pb, codec->scenechange_threshold);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
164 put_be32(pb, codec->b_frame_strategy);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
165 put_be64(pb, av_dbl2int(codec->qcompress));
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
166 put_be64(pb, av_dbl2int(codec->qblur));
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
167 put_be32(pb, codec->max_qdiff);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
168 put_be32(pb, codec->refs);
de6eb16c2b5b Update ffserver to include all basic x264 parameters in .ffm files.
darkshikari
parents: 4756
diff changeset
169 put_be32(pb, codec->directpred);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
170 break;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5463
diff changeset
171 case AVMEDIA_TYPE_AUDIO:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 put_be32(pb, codec->sample_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 put_le16(pb, codec->channels);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174 put_le16(pb, codec->frame_size);
5463
08abadf5350b Fix breakage introduced by setting the sample_fmt to SAMPLE_FMT_NONE (r20623). This makes
banan
parents: 5385
diff changeset
175 put_le16(pb, codec->sample_fmt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 default:
537
558a093b04db do not call (av_)abort()
michael
parents: 502
diff changeset
178 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 }
3441
2d52ccde8f86 pass extradata through ffm
bcoudurier
parents: 3440
diff changeset
180 if (codec->flags & CODEC_FLAG_GLOBAL_HEADER) {
2d52ccde8f86 pass extradata through ffm
bcoudurier
parents: 3440
diff changeset
181 put_be32(pb, codec->extradata_size);
2d52ccde8f86 pass extradata through ffm
bcoudurier
parents: 3440
diff changeset
182 put_buffer(pb, codec->extradata, codec->extradata_size);
2d52ccde8f86 pass extradata through ffm
bcoudurier
parents: 3440
diff changeset
183 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
186 /* flush until end of block reached */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 while ((url_ftell(pb) % ffm->packet_size) != 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
188 put_byte(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192 /* init packet mux */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 ffm->packet_ptr = ffm->packet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 ffm->packet_end = ffm->packet + ffm->packet_size - FFM_HEADER_SIZE;
537
558a093b04db do not call (av_)abort()
michael
parents: 502
diff changeset
195 assert(ffm->packet_end >= ffm->packet);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 ffm->frame_offset = 0;
3492
6facc89bece8 cosmetics, pts->dts
bcoudurier
parents: 3491
diff changeset
197 ffm->dts = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 ffm->first_packet = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
203 static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 {
3491
31aa7b51c13b store dts in ffm headers
bcoudurier
parents: 3490
diff changeset
205 int64_t dts;
3527
32840cdd83b3 fix size of header data
stefang
parents: 3492
diff changeset
206 uint8_t header[FRAME_HEADER_SIZE+4];
3442
a6f4d53b738d pass dts and pts through ffm, should fix streaming b frames
bcoudurier
parents: 3441
diff changeset
207 int header_size = FRAME_HEADER_SIZE;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208
3491
31aa7b51c13b store dts in ffm headers
bcoudurier
parents: 3490
diff changeset
209 dts = s->timestamp + pkt->dts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 /* packet size & key_frame */
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
211 header[0] = pkt->stream_index;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 header[1] = 0;
5913
11bb10c37225 Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents: 5910
diff changeset
213 if (pkt->flags & AV_PKT_FLAG_KEY)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 header[1] |= FLAG_KEY_FRAME;
3312
20ea7e918398 remove useless var
bcoudurier
parents: 3311
diff changeset
215 AV_WB24(header+2, pkt->size);
3310
66d5e19f7b77 use duration from pkt
bcoudurier
parents: 3309
diff changeset
216 AV_WB24(header+5, pkt->duration);
3491
31aa7b51c13b store dts in ffm headers
bcoudurier
parents: 3490
diff changeset
217 AV_WB64(header+8, s->timestamp + pkt->pts);
3442
a6f4d53b738d pass dts and pts through ffm, should fix streaming b frames
bcoudurier
parents: 3441
diff changeset
218 if (pkt->pts != pkt->dts) {
a6f4d53b738d pass dts and pts through ffm, should fix streaming b frames
bcoudurier
parents: 3441
diff changeset
219 header[1] |= FLAG_DTS;
a6f4d53b738d pass dts and pts through ffm, should fix streaming b frames
bcoudurier
parents: 3441
diff changeset
220 AV_WB32(header+16, pkt->pts - pkt->dts);
a6f4d53b738d pass dts and pts through ffm, should fix streaming b frames
bcoudurier
parents: 3441
diff changeset
221 header_size += 4;
a6f4d53b738d pass dts and pts through ffm, should fix streaming b frames
bcoudurier
parents: 3441
diff changeset
222 }
3491
31aa7b51c13b store dts in ffm headers
bcoudurier
parents: 3490
diff changeset
223 ffm_write_data(s, header, header_size, dts, 1);
31aa7b51c13b store dts in ffm headers
bcoudurier
parents: 3490
diff changeset
224 ffm_write_data(s, pkt->data, pkt->size, dts, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229 static int ffm_write_trailer(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2222
diff changeset
231 ByteIOContext *pb = s->pb;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 /* flush packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 if (ffm->packet_ptr > ffm->packet)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 flush_packet(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
238 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
241 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
243 AVOutputFormat ffm_muxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 "ffm",
3603
255a1b73b4e3 Improve long names for FFM muxer and demuxer:
stefano
parents: 3527
diff changeset
245 NULL_IF_CONFIG_SMALL("FFM (FFserver live feed) format"),
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 "",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 "ffm",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 sizeof(FFMContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 /* not really used */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 CODEC_ID_MP2,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 CODEC_ID_MPEG1VIDEO,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 ffm_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 ffm_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 ffm_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 };