Mercurial > libavformat.hg
annotate mpeg.c @ 546:7c5ec900b38a libavformat
remove wrong 33bit truncation of internal timestamps
author | michael |
---|---|
date | Sun, 03 Oct 2004 12:17:46 +0000 |
parents | afe2c9a33928 |
children | b832a27355ec |
rev | line source |
---|---|
0 | 1 /* |
2 * MPEG1/2 mux/demux | |
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 */ | |
19 #include "avformat.h" | |
20 | |
21 #define MAX_PAYLOAD_SIZE 4096 | |
542 | 22 #define PRELOAD 45000 //0.5sec |
310 | 23 //#define DEBUG_SEEK |
0 | 24 |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
25 #undef NDEBUG |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
26 #include <assert.h> |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
27 |
542 | 28 typedef struct PacketDesc { |
29 int64_t pts; | |
30 int64_t dts; | |
31 int size; | |
32 int unwritten_size; | |
33 int flags; | |
34 struct PacketDesc *next; | |
35 } PacketDesc; | |
36 | |
0 | 37 typedef struct { |
542 | 38 FifoBuffer fifo; |
65 | 39 uint8_t id; |
0 | 40 int max_buffer_size; /* in bytes */ |
542 | 41 int buffer_index; |
42 PacketDesc *predecode_packet; | |
43 PacketDesc *premux_packet; | |
44 PacketDesc **next_packet; | |
0 | 45 int packet_number; |
336 | 46 uint8_t lpcm_header[3]; |
47 int lpcm_align; | |
0 | 48 } StreamInfo; |
49 | |
50 typedef struct { | |
51 int packet_size; /* required packet size */ | |
52 int packet_number; | |
53 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */ | |
54 int system_header_freq; | |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
55 int system_header_size; |
0 | 56 int mux_rate; /* bitrate in units of 50 bytes/s */ |
57 /* stream info */ | |
58 int audio_bound; | |
59 int video_bound; | |
60 int is_mpeg2; | |
61 int is_vcd; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
62 int is_svcd; |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
63 int64_t last_scr; /* current system clock */ |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
64 |
541 | 65 double vcd_padding_bitrate; //FIXME floats |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
66 int64_t vcd_padding_bytes_written; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
67 |
0 | 68 } MpegMuxContext; |
69 | |
70 #define PACK_START_CODE ((unsigned int)0x000001ba) | |
71 #define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb) | |
72 #define SEQUENCE_END_CODE ((unsigned int)0x000001b7) | |
73 #define PACKET_START_CODE_MASK ((unsigned int)0xffffff00) | |
74 #define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100) | |
75 #define ISO_11172_END_CODE ((unsigned int)0x000001b9) | |
76 | |
77 /* mpeg2 */ | |
78 #define PROGRAM_STREAM_MAP 0x1bc | |
79 #define PRIVATE_STREAM_1 0x1bd | |
80 #define PADDING_STREAM 0x1be | |
81 #define PRIVATE_STREAM_2 0x1bf | |
82 | |
83 | |
84 #define AUDIO_ID 0xc0 | |
85 #define VIDEO_ID 0xe0 | |
336 | 86 #define AC3_ID 0x80 |
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
87 #define DTS_ID 0x8a |
336 | 88 #define LPCM_ID 0xa0 |
0 | 89 |
356
72c7cf2f3a7a
CONFIG_ENCODERS fix by (Ronald Bultje <rbultje at ronald dot bitfreak dot net>)
michael
parents:
355
diff
changeset
|
90 static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 }; |
72c7cf2f3a7a
CONFIG_ENCODERS fix by (Ronald Bultje <rbultje at ronald dot bitfreak dot net>)
michael
parents:
355
diff
changeset
|
91 |
277
a313e1080322
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
276
diff
changeset
|
92 #ifdef CONFIG_ENCODERS |
396 | 93 static AVOutputFormat mpeg1system_mux; |
94 static AVOutputFormat mpeg1vcd_mux; | |
95 static AVOutputFormat mpeg2vob_mux; | |
96 static AVOutputFormat mpeg2svcd_mux; | |
0 | 97 |
98 static int put_pack_header(AVFormatContext *ctx, | |
65 | 99 uint8_t *buf, int64_t timestamp) |
0 | 100 { |
101 MpegMuxContext *s = ctx->priv_data; | |
102 PutBitContext pb; | |
103 | |
276 | 104 init_put_bits(&pb, buf, 128); |
0 | 105 |
106 put_bits(&pb, 32, PACK_START_CODE); | |
107 if (s->is_mpeg2) { | |
174
7d56e9f83fdb
Write correct MPEG2-PS streams patch by (mru at users dot sourceforge dot net (Mns Rullgrd))
michaelni
parents:
165
diff
changeset
|
108 put_bits(&pb, 2, 0x1); |
0 | 109 } else { |
110 put_bits(&pb, 4, 0x2); | |
111 } | |
65 | 112 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07)); |
0 | 113 put_bits(&pb, 1, 1); |
65 | 114 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff)); |
0 | 115 put_bits(&pb, 1, 1); |
65 | 116 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff)); |
0 | 117 put_bits(&pb, 1, 1); |
118 if (s->is_mpeg2) { | |
119 /* clock extension */ | |
120 put_bits(&pb, 9, 0); | |
121 } | |
122 put_bits(&pb, 1, 1); | |
123 put_bits(&pb, 22, s->mux_rate); | |
124 put_bits(&pb, 1, 1); | |
125 if (s->is_mpeg2) { | |
357
f4f573c7dc56
Patch for MPEG-2 VOB headers by (Jimmy Blair <blueskyjb at verizon dot net>)
michael
parents:
356
diff
changeset
|
126 put_bits(&pb, 1, 1); |
0 | 127 put_bits(&pb, 5, 0x1f); /* reserved */ |
128 put_bits(&pb, 3, 0); /* stuffing length */ | |
129 } | |
130 flush_put_bits(&pb); | |
131 return pbBufPtr(&pb) - pb.buf; | |
132 } | |
133 | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
134 static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id) |
0 | 135 { |
136 MpegMuxContext *s = ctx->priv_data; | |
542 | 137 int size, i, private_stream_coded, id; |
0 | 138 PutBitContext pb; |
139 | |
276 | 140 init_put_bits(&pb, buf, 128); |
0 | 141 |
142 put_bits(&pb, 32, SYSTEM_HEADER_START_CODE); | |
143 put_bits(&pb, 16, 0); | |
144 put_bits(&pb, 1, 1); | |
145 | |
542 | 146 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */ |
0 | 147 put_bits(&pb, 1, 1); /* marker */ |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
148 if (s->is_vcd && only_for_stream_id==VIDEO_ID) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
149 /* This header applies only to the video stream (see VCD standard p. IV-7)*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
150 put_bits(&pb, 6, 0); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
151 } else |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
152 put_bits(&pb, 6, s->audio_bound); |
0 | 153 |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
154 if (s->is_vcd) { |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
155 /* see VCD standard, p. IV-7*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
156 put_bits(&pb, 1, 0); |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
157 put_bits(&pb, 1, 1); |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
158 } else { |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
159 put_bits(&pb, 1, 0); /* variable bitrate*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
160 put_bits(&pb, 1, 0); /* non constrainted bit stream */ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
161 } |
0 | 162 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
163 if (s->is_vcd) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
164 /* see VCD standard p IV-7 */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
165 put_bits(&pb, 1, 1); /* audio locked */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
166 put_bits(&pb, 1, 1); /* video locked */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
167 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
168 put_bits(&pb, 1, 0); /* audio locked */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
169 put_bits(&pb, 1, 0); /* video locked */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
170 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
171 |
0 | 172 put_bits(&pb, 1, 1); /* marker */ |
173 | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
174 if (s->is_vcd && only_for_stream_id==AUDIO_ID) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
175 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
176 put_bits(&pb, 5, 0); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
177 } else |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
178 put_bits(&pb, 5, s->video_bound); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
179 |
0 | 180 put_bits(&pb, 8, 0xff); /* reserved byte */ |
181 | |
182 /* audio stream info */ | |
183 private_stream_coded = 0; | |
184 for(i=0;i<ctx->nb_streams;i++) { | |
185 StreamInfo *stream = ctx->streams[i]->priv_data; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
186 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
187 /* For VCDs, only include the stream info for the stream |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
188 that the pack which contains this system belongs to. |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
189 (see VCD standard p. IV-7) */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
190 if ( !s->is_vcd || stream->id==only_for_stream_id |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
191 || only_for_stream_id==0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
192 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
193 id = stream->id; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
194 if (id < 0xc0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
195 /* special case for private streams (AC3 use that) */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
196 if (private_stream_coded) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
197 continue; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
198 private_stream_coded = 1; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
199 id = 0xbd; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
200 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
201 put_bits(&pb, 8, id); /* stream ID */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
202 put_bits(&pb, 2, 3); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
203 if (id < 0xe0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
204 /* audio */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
205 put_bits(&pb, 1, 0); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
206 put_bits(&pb, 13, stream->max_buffer_size / 128); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
207 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
208 /* video */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
209 put_bits(&pb, 1, 1); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
210 put_bits(&pb, 13, stream->max_buffer_size / 1024); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
211 } |
0 | 212 } |
213 } | |
214 flush_put_bits(&pb); | |
215 size = pbBufPtr(&pb) - pb.buf; | |
216 /* patch packet size */ | |
217 buf[4] = (size - 6) >> 8; | |
218 buf[5] = (size - 6) & 0xff; | |
219 | |
220 return size; | |
221 } | |
222 | |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
223 static int get_system_header_size(AVFormatContext *ctx) |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
224 { |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
225 int buf_index, i, private_stream_coded; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
226 StreamInfo *stream; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
227 |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
228 buf_index = 12; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
229 private_stream_coded = 0; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
230 for(i=0;i<ctx->nb_streams;i++) { |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
231 stream = ctx->streams[i]->priv_data; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
232 if (stream->id < 0xc0) { |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
233 if (private_stream_coded) |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
234 continue; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
235 private_stream_coded = 1; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
236 } |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
237 buf_index += 3; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
238 } |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
239 return buf_index; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
240 } |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
241 |
0 | 242 static int mpeg_mux_init(AVFormatContext *ctx) |
243 { | |
244 MpegMuxContext *s = ctx->priv_data; | |
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
245 int bitrate, i, mpa_id, mpv_id, ac3_id, dts_id, lpcm_id, j; |
0 | 246 AVStream *st; |
247 StreamInfo *stream; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
248 int audio_bitrate; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
249 int video_bitrate; |
0 | 250 |
251 s->packet_number = 0; | |
252 s->is_vcd = (ctx->oformat == &mpeg1vcd_mux); | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
253 s->is_svcd = (ctx->oformat == &mpeg2svcd_mux); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
254 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux); |
0 | 255 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
256 if (s->is_vcd || s->is_svcd) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
257 s->packet_size = 2324; /* VCD/SVCD packet size */ |
0 | 258 else |
259 s->packet_size = 2048; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
260 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
261 s->vcd_padding_bytes_written = 0; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
262 s->vcd_padding_bitrate=0; |
0 | 263 |
264 s->audio_bound = 0; | |
265 s->video_bound = 0; | |
266 mpa_id = AUDIO_ID; | |
336 | 267 ac3_id = AC3_ID; |
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
268 dts_id = DTS_ID; |
0 | 269 mpv_id = VIDEO_ID; |
336 | 270 lpcm_id = LPCM_ID; |
0 | 271 for(i=0;i<ctx->nb_streams;i++) { |
272 st = ctx->streams[i]; | |
273 stream = av_mallocz(sizeof(StreamInfo)); | |
274 if (!stream) | |
275 goto fail; | |
276 st->priv_data = stream; | |
277 | |
546
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
278 av_set_pts_info(st, 64, 1, 90000); |
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
279 |
0 | 280 switch(st->codec.codec_type) { |
281 case CODEC_TYPE_AUDIO: | |
336 | 282 if (st->codec.codec_id == CODEC_ID_AC3) { |
0 | 283 stream->id = ac3_id++; |
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
284 } else if (st->codec.codec_id == CODEC_ID_DTS) { |
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
285 stream->id = dts_id++; |
336 | 286 } else if (st->codec.codec_id == CODEC_ID_PCM_S16BE) { |
287 stream->id = lpcm_id++; | |
288 for(j = 0; j < 4; j++) { | |
289 if (lpcm_freq_tab[j] == st->codec.sample_rate) | |
290 break; | |
291 } | |
292 if (j == 4) | |
293 goto fail; | |
294 if (st->codec.channels > 8) | |
295 return -1; | |
296 stream->lpcm_header[0] = 0x0c; | |
297 stream->lpcm_header[1] = (st->codec.channels - 1) | (j << 4); | |
298 stream->lpcm_header[2] = 0x80; | |
299 stream->lpcm_align = st->codec.channels * 2; | |
300 } else { | |
0 | 301 stream->id = mpa_id++; |
336 | 302 } |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
303 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
304 /* This value HAS to be used for VCD (see VCD standard, p. IV-7). |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
305 Right now it is also used for everything else.*/ |
0 | 306 stream->max_buffer_size = 4 * 1024; |
307 s->audio_bound++; | |
308 break; | |
309 case CODEC_TYPE_VIDEO: | |
310 stream->id = mpv_id++; | |
544 | 311 if (st->codec.rc_buffer_size) |
312 stream->max_buffer_size = 6*1024 + st->codec.rc_buffer_size/8; | |
313 else | |
314 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default | |
315 #if 0 | |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
316 /* see VCD standard, p. IV-7*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
317 stream->max_buffer_size = 46 * 1024; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
318 else |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
319 /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2). |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
320 Right now it is also used for everything else.*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
321 stream->max_buffer_size = 230 * 1024; |
544 | 322 #endif |
0 | 323 s->video_bound++; |
324 break; | |
325 default: | |
537 | 326 return -1; |
0 | 327 } |
542 | 328 fifo_init(&stream->fifo, 2*stream->max_buffer_size + 100*MAX_PAYLOAD_SIZE); //FIXME think about the size maybe dynamically realloc |
329 stream->next_packet= &stream->premux_packet; | |
0 | 330 } |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
331 bitrate = 0; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
332 audio_bitrate = 0; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
333 video_bitrate = 0; |
0 | 334 for(i=0;i<ctx->nb_streams;i++) { |
542 | 335 int codec_rate; |
0 | 336 st = ctx->streams[i]; |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
337 stream = (StreamInfo*) st->priv_data; |
542 | 338 |
339 if(st->codec.rc_max_rate || stream->id==VIDEO_ID) | |
340 codec_rate= st->codec.rc_max_rate; | |
341 else | |
342 codec_rate= st->codec.bit_rate; | |
343 | |
344 if(!codec_rate) | |
345 codec_rate= (1<<21)*8*50/ctx->nb_streams; | |
346 | |
347 bitrate += codec_rate; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
348 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
349 if (stream->id==AUDIO_ID) |
542 | 350 audio_bitrate += codec_rate; |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
351 else if (stream->id==VIDEO_ID) |
542 | 352 video_bitrate += codec_rate; |
0 | 353 } |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
354 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
355 if (s->is_vcd) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
356 double overhead_rate; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
357 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
358 /* The VCD standard mandates that the mux_rate field is 3528 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
359 (see standard p. IV-6). |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
360 The value is actually "wrong", i.e. if you calculate |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
361 it using the normal formula and the 75 sectors per second transfer |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
362 rate you get a different value because the real pack size is 2324, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
363 not 2352. But the standard explicitly specifies that the mux_rate |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
364 field in the header must have this value.*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
365 s->mux_rate=2352 * 75 / 50; /* = 3528*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
366 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
367 /* The VCD standard states that the muxed stream must be |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
368 exactly 75 packs / second (the data rate of a single speed cdrom). |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
369 Since the video bitrate (probably 1150000 bits/sec) will be below |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
370 the theoretical maximum we have to add some padding packets |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
371 to make up for the lower data rate. |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
372 (cf. VCD standard p. IV-6 )*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
373 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
374 /* Add the header overhead to the data rate. |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
375 2279 data bytes per audio pack, 2294 data bytes per video pack*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
376 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
377 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
378 overhead_rate *= 8; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
379 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
380 /* Add padding so that the full bitrate is 2324*75 bytes/sec */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
381 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
382 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
383 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
384 /* we increase slightly the bitrate to take into account the |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
385 headers. XXX: compute it exactly */ |
542 | 386 bitrate += bitrate*5/100; |
387 bitrate += 10000; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
388 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
389 } |
0 | 390 |
391 if (s->is_vcd || s->is_mpeg2) | |
392 /* every packet */ | |
393 s->pack_header_freq = 1; | |
394 else | |
395 /* every 2 seconds */ | |
396 s->pack_header_freq = 2 * bitrate / s->packet_size / 8; | |
291
b19f70a6d60f
1/0 fix by (Tim Allen <tim at proximity dot com dot au>)
michael
parents:
277
diff
changeset
|
397 |
b19f70a6d60f
1/0 fix by (Tim Allen <tim at proximity dot com dot au>)
michael
parents:
277
diff
changeset
|
398 /* the above seems to make pack_header_freq zero sometimes */ |
b19f70a6d60f
1/0 fix by (Tim Allen <tim at proximity dot com dot au>)
michael
parents:
277
diff
changeset
|
399 if (s->pack_header_freq == 0) |
b19f70a6d60f
1/0 fix by (Tim Allen <tim at proximity dot com dot au>)
michael
parents:
277
diff
changeset
|
400 s->pack_header_freq = 1; |
0 | 401 |
402 if (s->is_mpeg2) | |
403 /* every 200 packets. Need to look at the spec. */ | |
404 s->system_header_freq = s->pack_header_freq * 40; | |
405 else if (s->is_vcd) | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
406 /* the standard mandates that there are only two system headers |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
407 in the whole file: one in the first packet of each stream. |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
408 (see standard p. IV-7 and IV-8) */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
409 s->system_header_freq = 0x7fffffff; |
0 | 410 else |
411 s->system_header_freq = s->pack_header_freq * 5; | |
412 | |
413 for(i=0;i<ctx->nb_streams;i++) { | |
414 stream = ctx->streams[i]->priv_data; | |
415 stream->packet_number = 0; | |
416 } | |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
417 s->system_header_size = get_system_header_size(ctx); |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
418 s->last_scr = 0; |
0 | 419 return 0; |
420 fail: | |
421 for(i=0;i<ctx->nb_streams;i++) { | |
422 av_free(ctx->streams[i]->priv_data); | |
423 } | |
424 return -ENOMEM; | |
425 } | |
426 | |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
427 static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp) |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
428 { |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
429 put_byte(pb, |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
430 (id << 4) | |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
431 (((timestamp >> 30) & 0x07) << 1) | |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
432 1); |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
433 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1)); |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
434 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1)); |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
435 } |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
436 |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
437 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
438 /* return the number of padding bytes that should be inserted into |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
439 the multiplexed stream.*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
440 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
441 { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
442 MpegMuxContext *s = ctx->priv_data; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
443 int pad_bytes = 0; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
444 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
445 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
446 { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
447 int64_t full_pad_bytes; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
448 |
542 | 449 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
450 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
451 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
452 if (pad_bytes<0) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
453 /* might happen if we have already padded to a later timestamp. This |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
454 can occur if another stream has already advanced further.*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
455 pad_bytes=0; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
456 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
457 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
458 return pad_bytes; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
459 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
460 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
461 |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
462 /* return the exact available payload size for the next packet for |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
463 stream 'stream_index'. 'pts' and 'dts' are only used to know if |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
464 timestamps are needed in the packet header. */ |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
465 static int get_packet_payload_size(AVFormatContext *ctx, int stream_index, |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
466 int64_t pts, int64_t dts) |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
467 { |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
468 MpegMuxContext *s = ctx->priv_data; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
469 int buf_index; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
470 StreamInfo *stream; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
471 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
472 stream = ctx->streams[stream_index]->priv_data; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
473 |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
474 buf_index = 0; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
475 if (((s->packet_number % s->pack_header_freq) == 0)) { |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
476 /* pack header size */ |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
477 if (s->is_mpeg2) |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
478 buf_index += 14; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
479 else |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
480 buf_index += 12; |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
481 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
482 if (s->is_vcd) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
483 /* there is exactly one system header for each stream in a VCD MPEG, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
484 One in the very first video packet and one in the very first |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
485 audio packet (see VCD standard p. IV-7 and IV-8).*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
486 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
487 if (stream->packet_number==0) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
488 /* The system headers refer only to the stream they occur in, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
489 so they have a constant size.*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
490 buf_index += 15; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
491 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
492 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
493 if ((s->packet_number % s->system_header_freq) == 0) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
494 buf_index += s->system_header_size; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
495 } |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
496 } |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
497 |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
498 if ((s->is_vcd && stream->packet_number==0) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
499 || (s->is_svcd && s->packet_number==0)) |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
500 /* the first pack of each stream contains only the pack header, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
501 the system header and some padding (see VCD standard p. IV-6) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
502 Add the padding size, so that the actual payload becomes 0.*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
503 buf_index += s->packet_size - buf_index; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
504 else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
505 /* packet header size */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
506 buf_index += 6; |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
507 if (s->is_mpeg2) { |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
508 buf_index += 3; |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
509 if (stream->packet_number==0) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
510 buf_index += 3; /* PES extension */ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
511 buf_index += 1; /* obligatory stuffing byte */ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
512 } |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
513 if (pts != AV_NOPTS_VALUE) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
514 if (dts != pts) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
515 buf_index += 5 + 5; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
516 else |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
517 buf_index += 5; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
518 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
519 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
520 if (!s->is_mpeg2) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
521 buf_index++; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
522 } |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
523 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
524 if (stream->id < 0xc0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
525 /* AC3/LPCM private data header */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
526 buf_index += 4; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
527 if (stream->id >= 0xa0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
528 int n; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
529 buf_index += 3; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
530 /* NOTE: we round the payload size to an integer number of |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
531 LPCM samples */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
532 n = (s->packet_size - buf_index) % stream->lpcm_align; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
533 if (n) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
534 buf_index += (stream->lpcm_align - n); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
535 } |
336 | 536 } |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
537 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
538 if (s->is_vcd && stream->id == AUDIO_ID) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
539 /* The VCD standard demands that 20 zero bytes follow |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
540 each audio packet (see standard p. IV-8).*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
541 buf_index+=20; |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
542 } |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
543 return s->packet_size - buf_index; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
544 } |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
545 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
546 /* Write an MPEG padding packet header. */ |
541 | 547 static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes) |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
548 { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
549 MpegMuxContext *s = ctx->priv_data; |
541 | 550 int i; |
551 | |
552 put_be32(pb, PADDING_STREAM); | |
553 put_be16(pb, packet_bytes - 6); | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
554 if (!s->is_mpeg2) { |
541 | 555 put_byte(pb, 0x0f); |
556 packet_bytes -= 7; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
557 } else |
541 | 558 packet_bytes -= 6; |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
559 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
560 for(i=0;i<packet_bytes;i++) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
561 put_byte(pb, 0xff); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
562 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
563 |
542 | 564 static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){ |
565 int nb_frames=0; | |
566 PacketDesc *pkt_desc= stream->premux_packet; | |
567 | |
568 while(len>0){ | |
569 if(pkt_desc->size == pkt_desc->unwritten_size) | |
570 nb_frames++; | |
571 len -= pkt_desc->unwritten_size; | |
572 pkt_desc= pkt_desc->next; | |
573 } | |
574 | |
575 return nb_frames; | |
576 } | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
577 |
0 | 578 /* flush the packet on stream stream_index */ |
542 | 579 static int flush_packet(AVFormatContext *ctx, int stream_index, |
580 int64_t pts, int64_t dts, int64_t scr, int trailer_size) | |
0 | 581 { |
582 MpegMuxContext *s = ctx->priv_data; | |
583 StreamInfo *stream = ctx->streams[stream_index]->priv_data; | |
65 | 584 uint8_t *buf_ptr; |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
585 int size, payload_size, startcode, id, stuffing_size, i, header_len; |
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
586 int packet_size; |
65 | 587 uint8_t buffer[128]; |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
588 int zero_trail_bytes = 0; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
589 int pad_packet_bytes = 0; |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
590 int pes_flags; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
591 int general_pack = 0; /*"general" pack without data specific to one stream?*/ |
542 | 592 int nb_frames; |
0 | 593 |
594 id = stream->id; | |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
595 |
0 | 596 #if 0 |
597 printf("packet ID=%2x PTS=%0.3f\n", | |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
598 id, pts / 90000.0); |
0 | 599 #endif |
600 | |
601 buf_ptr = buffer; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
602 |
542 | 603 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) { |
0 | 604 /* output pack and systems header if needed */ |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
605 size = put_pack_header(ctx, buf_ptr, scr); |
0 | 606 buf_ptr += size; |
542 | 607 s->last_scr= scr; |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
608 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
609 if (s->is_vcd) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
610 /* there is exactly one system header for each stream in a VCD MPEG, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
611 One in the very first video packet and one in the very first |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
612 audio packet (see VCD standard p. IV-7 and IV-8).*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
613 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
614 if (stream->packet_number==0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
615 size = put_system_header(ctx, buf_ptr, id); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
616 buf_ptr += size; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
617 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
618 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
619 if ((s->packet_number % s->system_header_freq) == 0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
620 size = put_system_header(ctx, buf_ptr, 0); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
621 buf_ptr += size; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
622 } |
0 | 623 } |
624 } | |
625 size = buf_ptr - buffer; | |
626 put_buffer(&ctx->pb, buffer, size); | |
627 | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
628 packet_size = s->packet_size - size; |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
629 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
630 if (s->is_vcd && id == AUDIO_ID) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
631 /* The VCD standard demands that 20 zero bytes follow |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
632 each audio pack (see standard p. IV-8).*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
633 zero_trail_bytes += 20; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
634 |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
635 if ((s->is_vcd && stream->packet_number==0) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
636 || (s->is_svcd && s->packet_number==0)) { |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
637 /* for VCD the first pack of each stream contains only the pack header, |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
638 the system header and lots of padding (see VCD standard p. IV-6). |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
639 In the case of an audio pack, 20 zero bytes are also added at |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
640 the end.*/ |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
641 /* For SVCD we fill the very first pack to increase compatibility with |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
642 some DVD players. Not mandated by the standard.*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
643 if (s->is_svcd) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
644 general_pack = 1; /* the system header refers to both streams and no stream data*/ |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
645 pad_packet_bytes = packet_size - zero_trail_bytes; |
0 | 646 } |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
647 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
648 packet_size -= pad_packet_bytes + zero_trail_bytes; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
649 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
650 if (packet_size > 0) { |
0 | 651 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
652 /* packet header size */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
653 packet_size -= 6; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
654 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
655 /* packet header */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
656 if (s->is_mpeg2) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
657 header_len = 3; |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
658 if (stream->packet_number==0) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
659 header_len += 3; /* PES extension */ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
660 header_len += 1; /* obligatory stuffing byte */ |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
661 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
662 header_len = 0; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
663 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
664 if (pts != AV_NOPTS_VALUE) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
665 if (dts != pts) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
666 header_len += 5 + 5; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
667 else |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
668 header_len += 5; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
669 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
670 if (!s->is_mpeg2) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
671 header_len++; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
672 } |
0 | 673 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
674 payload_size = packet_size - header_len; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
675 if (id < 0xc0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
676 startcode = PRIVATE_STREAM_1; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
677 payload_size -= 4; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
678 if (id >= 0xa0) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
679 payload_size -= 3; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
680 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
681 startcode = 0x100 + id; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
682 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
683 |
542 | 684 stuffing_size = payload_size - fifo_size(&stream->fifo, stream->fifo.rptr); |
685 | |
686 // first byte doesnt fit -> reset pts/dts + stuffing | |
687 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){ | |
688 int timestamp_len=0; | |
689 if(dts != pts) | |
690 timestamp_len += 5; | |
691 if(pts != AV_NOPTS_VALUE) | |
692 timestamp_len += s->is_mpeg2 ? 5 : 4; | |
693 pts=dts= AV_NOPTS_VALUE; | |
694 header_len -= timestamp_len; | |
695 payload_size += timestamp_len; | |
696 stuffing_size += timestamp_len; | |
697 if(payload_size > trailer_size) | |
698 stuffing_size += payload_size - trailer_size; | |
699 } | |
700 | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
701 if (stuffing_size < 0) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
702 stuffing_size = 0; |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
703 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
704 pad_packet_bytes += stuffing_size; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
705 packet_size -= stuffing_size; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
706 payload_size -= stuffing_size; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
707 stuffing_size = 0; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
708 } |
542 | 709 |
710 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size); | |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
711 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
712 put_be32(&ctx->pb, startcode); |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
713 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
714 put_be16(&ctx->pb, packet_size); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
715 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
716 if (!s->is_mpeg2) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
717 for(i=0;i<stuffing_size;i++) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
718 put_byte(&ctx->pb, 0xff); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
719 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
720 if (s->is_mpeg2) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
721 put_byte(&ctx->pb, 0x80); /* mpeg2 id */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
722 |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
723 pes_flags=0; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
724 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
725 if (pts != AV_NOPTS_VALUE) { |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
726 pes_flags |= 0x80; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
727 if (dts != pts) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
728 pes_flags |= 0x40; |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
729 } |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
730 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
731 /* Both the MPEG-2 and the SVCD standards demand that the |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
732 P-STD_buffer_size field be included in the first packet of |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
733 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
734 and MPEG-2 standard 2.7.7) */ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
735 if (stream->packet_number == 0) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
736 pes_flags |= 0x01; |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
737 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
738 put_byte(&ctx->pb, pes_flags); /* flags */ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
739 put_byte(&ctx->pb, header_len - 3 + stuffing_size); |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
740 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
741 if (pes_flags & 0x80) /*write pts*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
742 put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts); |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
743 if (pes_flags & 0x40) /*write dts*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
744 put_timestamp(&ctx->pb, 0x01, dts); |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
745 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
746 if (pes_flags & 0x01) { /*write pes extension*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
747 put_byte(&ctx->pb, 0x10); /* flags */ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
748 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
749 /* P-STD buffer info */ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
750 if (id == AUDIO_ID) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
751 put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128); |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
752 else |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
753 put_be16(&ctx->pb, 0x6000 | stream->max_buffer_size/1024); |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
754 } |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
755 |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
756 } else { |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
757 if (pts != AV_NOPTS_VALUE) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
758 if (dts != pts) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
759 put_timestamp(&ctx->pb, 0x03, pts); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
760 put_timestamp(&ctx->pb, 0x01, dts); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
761 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
762 put_timestamp(&ctx->pb, 0x02, pts); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
763 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
764 } else { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
765 put_byte(&ctx->pb, 0x0f); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
766 } |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
767 } |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
768 |
467
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
769 if (s->is_mpeg2) { |
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
770 /* special stuffing byte that is always written |
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
771 to prevent accidental generation of start codes. */ |
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
772 put_byte(&ctx->pb, 0xff); |
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
773 |
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
774 for(i=0;i<stuffing_size;i++) |
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
775 put_byte(&ctx->pb, 0xff); |
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
776 } |
40069a91d1a0
dont add padding in the middle of the data patch by (Sidik Isani <isani at cfht dot hawaii dot edu>)
michael
parents:
463
diff
changeset
|
777 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
778 if (startcode == PRIVATE_STREAM_1) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
779 put_byte(&ctx->pb, id); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
780 if (id >= 0xa0) { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
781 /* LPCM (XXX: check nb_frames) */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
782 put_byte(&ctx->pb, 7); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
783 put_be16(&ctx->pb, 4); /* skip 3 header bytes */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
784 put_byte(&ctx->pb, stream->lpcm_header[0]); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
785 put_byte(&ctx->pb, stream->lpcm_header[1]); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
786 put_byte(&ctx->pb, stream->lpcm_header[2]); |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
787 } else { |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
788 /* AC3 */ |
542 | 789 put_byte(&ctx->pb, nb_frames); |
790 put_be16(&ctx->pb, trailer_size+1); | |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
791 } |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
792 } |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
793 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
794 /* output data */ |
542 | 795 if(put_fifo(&ctx->pb, &stream->fifo, payload_size - stuffing_size, &stream->fifo.rptr) < 0) |
796 return -1; | |
797 }else{ | |
798 payload_size= | |
799 stuffing_size= 0; | |
0 | 800 } |
801 | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
802 if (pad_packet_bytes > 0) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
803 put_padding_packet(ctx,&ctx->pb, pad_packet_bytes); |
0 | 804 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
805 for(i=0;i<zero_trail_bytes;i++) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
806 put_byte(&ctx->pb, 0x00); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
807 |
0 | 808 put_flush_packet(&ctx->pb); |
809 | |
810 s->packet_number++; | |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
811 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
812 /* only increase the stream packet number if this pack actually contains |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
813 something that is specific to this stream! I.e. a dedicated header |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
814 or some data.*/ |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
815 if (!general_pack) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
816 stream->packet_number++; |
542 | 817 |
818 return payload_size - stuffing_size; | |
0 | 819 } |
820 | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
821 static void put_vcd_padding_sector(AVFormatContext *ctx) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
822 { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
823 /* There are two ways to do this padding: writing a sector/pack |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
824 of 0 values, or writing an MPEG padding pack. Both seem to |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
825 work with most decoders, BUT the VCD standard only allows a 0-sector |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
826 (see standard p. IV-4, IV-5). |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
827 So a 0-sector it is...*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
828 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
829 MpegMuxContext *s = ctx->priv_data; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
830 int i; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
831 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
832 for(i=0;i<s->packet_size;i++) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
833 put_byte(&ctx->pb, 0); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
834 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
835 s->vcd_padding_bytes_written += s->packet_size; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
836 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
837 put_flush_packet(&ctx->pb); |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
838 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
839 /* increasing the packet number is correct. The SCR of the following packs |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
840 is calculated from the packet_number and it has to include the padding |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
841 sector (it represents the sector index, not the MPEG pack index) |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
842 (see VCD standard p. IV-6)*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
843 s->packet_number++; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
844 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
845 |
543 | 846 static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts) |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
847 { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
848 MpegMuxContext *s = ctx->priv_data; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
849 int64_t scr; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
850 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
851 /* Since the data delivery rate is constant, SCR is computed |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
852 using the formula C + i * 1200 where C is the start constant |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
853 and i is the pack index. |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
854 It is recommended that SCR 0 is at the beginning of the VCD front |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
855 margin (a sequence of empty Form 2 sectors on the CD). |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
856 It is recommended that the front margin is 30 sectors long, so |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
857 we use C = 30*1200 = 36000 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
858 (Note that even if the front margin is not 30 sectors the file |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
859 will still be correct according to the standard. It just won't have |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
860 the "recommended" value).*/ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
861 scr = 36000 + s->packet_number * 1200; |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
862 |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
863 return scr; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
864 } |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
865 |
542 | 866 static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){ |
867 // MpegMuxContext *s = ctx->priv_data; | |
868 int i; | |
869 | |
870 for(i=0; i<ctx->nb_streams; i++){ | |
871 AVStream *st = ctx->streams[i]; | |
872 StreamInfo *stream = st->priv_data; | |
873 PacketDesc *pkt_desc= stream->predecode_packet; | |
874 | |
875 while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >= | |
876 if(stream->buffer_index < pkt_desc->size || | |
877 stream->predecode_packet == stream->premux_packet){ | |
878 av_log(ctx, AV_LOG_ERROR, "buffer underflow\n"); | |
879 break; | |
880 } | |
881 stream->buffer_index -= pkt_desc->size; | |
882 | |
883 stream->predecode_packet= pkt_desc->next; | |
884 av_freep(&pkt_desc); | |
885 } | |
886 } | |
887 | |
888 return 0; | |
889 } | |
890 | |
891 static int output_packet(AVFormatContext *ctx, int flush){ | |
892 MpegMuxContext *s = ctx->priv_data; | |
893 AVStream *st; | |
894 StreamInfo *stream; | |
895 int i, avail_space, es_size, trailer_size; | |
896 int best_i= -1; | |
897 int best_score= INT_MIN; | |
898 int ignore_constraints=0; | |
899 int64_t scr= s->last_scr; | |
545 | 900 PacketDesc *timestamp_packet; |
542 | 901 |
902 retry: | |
903 for(i=0; i<ctx->nb_streams; i++){ | |
904 AVStream *st = ctx->streams[i]; | |
905 StreamInfo *stream = st->priv_data; | |
906 const int avail_data= fifo_size(&stream->fifo, stream->fifo.rptr); | |
907 const int space= stream->max_buffer_size - stream->buffer_index; | |
908 int rel_space= 1024*space / stream->max_buffer_size; | |
909 | |
910 if(s->packet_size > avail_data && !flush) | |
911 return 0; | |
912 if(avail_data==0) | |
913 continue; | |
914 assert(avail_data>0); | |
915 | |
916 if(space < s->packet_size && !ignore_constraints) | |
917 continue; | |
918 | |
919 if(rel_space > best_score){ | |
920 best_score= rel_space; | |
921 best_i = i; | |
922 avail_space= space; | |
923 } | |
924 } | |
925 | |
926 if(best_i < 0){ | |
927 int64_t best_dts= INT64_MAX; | |
928 | |
929 for(i=0; i<ctx->nb_streams; i++){ | |
930 AVStream *st = ctx->streams[i]; | |
931 StreamInfo *stream = st->priv_data; | |
932 PacketDesc *pkt_desc= stream->predecode_packet; | |
933 if(pkt_desc && pkt_desc->dts < best_dts) | |
934 best_dts= pkt_desc->dts; | |
935 } | |
936 | |
937 #if 0 | |
938 av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n", | |
939 scr/90000.0, best_dts/90000.0); | |
940 #endif | |
941 if(best_dts == INT64_MAX) | |
942 return 0; | |
943 | |
944 if(scr >= best_dts+1 && !ignore_constraints){ | |
945 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n"); | |
946 ignore_constraints= 1; | |
947 } | |
948 scr= FFMAX(best_dts+1, scr); | |
949 if(remove_decoded_packets(ctx, scr) < 0) | |
950 return -1; | |
951 goto retry; | |
952 } | |
953 | |
954 assert(best_i >= 0); | |
955 | |
956 st = ctx->streams[best_i]; | |
957 stream = st->priv_data; | |
958 | |
959 assert(fifo_size(&stream->fifo, stream->fifo.rptr) > 0); | |
960 | |
961 assert(avail_space >= s->packet_size || ignore_constraints); | |
962 | |
545 | 963 timestamp_packet= stream->premux_packet; |
964 if(timestamp_packet->unwritten_size == timestamp_packet->size){ | |
542 | 965 trailer_size= 0; |
545 | 966 }else{ |
967 trailer_size= timestamp_packet->unwritten_size; | |
968 timestamp_packet= timestamp_packet->next; | |
969 } | |
542 | 970 |
545 | 971 if(timestamp_packet){ |
972 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size); | |
973 }else{ | |
974 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == trailer_size); | |
975 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size); | |
976 } | |
542 | 977 |
978 if (s->is_vcd) { | |
979 /* Write one or more padding sectors, if necessary, to reach | |
980 the constant overall bitrate.*/ | |
981 int vcd_pad_bytes; | |
982 | |
543 | 983 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here |
542 | 984 put_vcd_padding_sector(ctx); |
985 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet | |
986 } | |
987 } | |
988 | |
989 stream->buffer_index += es_size; | |
990 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet | |
991 | |
992 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){ | |
993 es_size -= stream->premux_packet->unwritten_size; | |
994 stream->premux_packet= stream->premux_packet->next; | |
995 } | |
996 if(es_size) | |
997 stream->premux_packet->unwritten_size -= es_size; | |
998 | |
999 if(remove_decoded_packets(ctx, s->last_scr) < 0) | |
1000 return -1; | |
1001 | |
1002 return 1; | |
1003 } | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1004 |
468 | 1005 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt) |
0 | 1006 { |
1007 MpegMuxContext *s = ctx->priv_data; | |
468 | 1008 int stream_index= pkt->stream_index; |
1009 int size= pkt->size; | |
1010 uint8_t *buf= pkt->data; | |
0 | 1011 AVStream *st = ctx->streams[stream_index]; |
1012 StreamInfo *stream = st->priv_data; | |
543 | 1013 int64_t pts, dts; |
542 | 1014 PacketDesc *pkt_desc; |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1015 |
468 | 1016 pts= pkt->pts; |
1017 dts= pkt->dts; | |
337 | 1018 |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1019 if(s->is_svcd) { |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1020 /* offset pts and dts slightly into the future to be able |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1021 to do the compatibility fix below.*/ |
546
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
1022 pts += 2; |
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
1023 dts += 2; |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1024 |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1025 if (stream->packet_number == 0 && dts == pts) |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1026 /* For the very first packet we want to force the DTS to be included. |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1027 This increases compatibility with lots of DVD players. |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1028 Since the MPEG-2 standard mandates that DTS is only written when |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1029 it is different from PTS we have to move it slightly into the past.*/ |
546
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
1030 dts -= 2; |
452
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1031 } |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1032 if(s->is_vcd) { |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1033 /* We have to offset the PTS, so that it is consistent with the SCR. |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1034 SCR starts at 36000, but the first two packs contain only padding |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1035 and the first pack from the other stream, respectively, may also have |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1036 been written before. |
11d07f14b077
mpeg SVCD compatibility, SCR fixes, standard compliance
michael
parents:
447
diff
changeset
|
1037 So the real data starts at SCR 36000+3*1200. */ |
546
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
1038 pts += 36000 + 3600; |
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
1039 dts += 36000 + 3600; |
542 | 1040 }else{ |
546
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
1041 pts += PRELOAD; |
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
1042 dts += PRELOAD; |
542 | 1043 } |
546
7c5ec900b38a
remove wrong 33bit truncation of internal timestamps
michael
parents:
545
diff
changeset
|
1044 //av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f flags:%d stream:%d\n", dts/90000.0, pts/90000.0, pkt->flags, pkt->stream_index); |
542 | 1045 *stream->next_packet= |
1046 pkt_desc= av_mallocz(sizeof(PacketDesc)); | |
1047 pkt_desc->pts= pts; | |
1048 pkt_desc->dts= dts; | |
1049 pkt_desc->unwritten_size= | |
1050 pkt_desc->size= size; | |
1051 if(!stream->predecode_packet) | |
1052 stream->predecode_packet= pkt_desc; | |
1053 stream->next_packet= &pkt_desc->next; | |
1054 | |
1055 if(stream->fifo.end - stream->fifo.buffer - fifo_size(&stream->fifo, stream->fifo.rptr) < size){ | |
1056 av_log(ctx, AV_LOG_ERROR, "fifo overflow\n"); | |
1057 return -1; | |
1058 } | |
1059 fifo_write(&stream->fifo, buf, size, &stream->fifo.wptr); | |
1060 | |
1061 for(;;){ | |
1062 int ret= output_packet(ctx, 0); | |
543 | 1063 if(ret<=0) |
542 | 1064 return ret; |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
1065 } |
0 | 1066 } |
1067 | |
1068 static int mpeg_mux_end(AVFormatContext *ctx) | |
1069 { | |
542 | 1070 // MpegMuxContext *s = ctx->priv_data; |
0 | 1071 StreamInfo *stream; |
1072 int i; | |
542 | 1073 |
1074 for(;;){ | |
1075 int ret= output_packet(ctx, 1); | |
1076 if(ret<0) | |
1077 return ret; | |
1078 else if(ret==0) | |
1079 break; | |
0 | 1080 } |
1081 | |
242 | 1082 /* End header according to MPEG1 systems standard. We do not write |
1083 it as it is usually not needed by decoders and because it | |
1084 complicates MPEG stream concatenation. */ | |
0 | 1085 //put_be32(&ctx->pb, ISO_11172_END_CODE); |
1086 //put_flush_packet(&ctx->pb); | |
237
35231c0be8e5
memleak fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michaelni
parents:
210
diff
changeset
|
1087 |
542 | 1088 for(i=0;i<ctx->nb_streams;i++) { |
1089 stream = ctx->streams[i]->priv_data; | |
1090 | |
1091 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == 0); | |
1092 fifo_free(&stream->fifo); | |
1093 } | |
0 | 1094 return 0; |
1095 } | |
277
a313e1080322
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
276
diff
changeset
|
1096 #endif //CONFIG_ENCODERS |
0 | 1097 |
1098 /*********************************************/ | |
1099 /* demux code */ | |
1100 | |
1101 #define MAX_SYNC_SIZE 100000 | |
1102 | |
1103 static int mpegps_probe(AVProbeData *p) | |
1104 { | |
539 | 1105 int i; |
1106 int size= FFMIN(20, p->buf_size); | |
1107 uint32_t code=0xFF; | |
0 | 1108 |
1109 /* we search the first start code. If it is a packet start code, | |
1110 then we decide it is mpeg ps. We do not send highest value to | |
1111 give a chance to mpegts */ | |
49 | 1112 /* NOTE: the search range was restricted to avoid too many false |
1113 detections */ | |
1114 | |
539 | 1115 for (i = 0; i < size; i++) { |
1116 code = (code << 8) | p->buf[i]; | |
165
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1117 if ((code & 0xffffff00) == 0x100) { |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1118 if (code == PACK_START_CODE || |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1119 code == SYSTEM_HEADER_START_CODE || |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1120 (code >= 0x1e0 && code <= 0x1ef) || |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1121 (code >= 0x1c0 && code <= 0x1df) || |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1122 code == PRIVATE_STREAM_2 || |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1123 code == PROGRAM_STREAM_MAP || |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1124 code == PRIVATE_STREAM_1 || |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1125 code == PADDING_STREAM) |
210 | 1126 return AVPROBE_SCORE_MAX - 2; |
165
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1127 else |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1128 return 0; |
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
1129 } |
0 | 1130 } |
1131 return 0; | |
1132 } | |
1133 | |
1134 | |
1135 typedef struct MpegDemuxContext { | |
1136 int header_state; | |
1137 } MpegDemuxContext; | |
1138 | |
310 | 1139 static int mpegps_read_header(AVFormatContext *s, |
1140 AVFormatParameters *ap) | |
1141 { | |
1142 MpegDemuxContext *m = s->priv_data; | |
1143 m->header_state = 0xff; | |
1144 s->ctx_flags |= AVFMTCTX_NOHEADER; | |
1145 | |
1146 /* no need to do more */ | |
1147 return 0; | |
1148 } | |
1149 | |
1150 static int64_t get_pts(ByteIOContext *pb, int c) | |
1151 { | |
1152 int64_t pts; | |
1153 int val; | |
1154 | |
1155 if (c < 0) | |
1156 c = get_byte(pb); | |
1157 pts = (int64_t)((c >> 1) & 0x07) << 30; | |
1158 val = get_be16(pb); | |
1159 pts |= (int64_t)(val >> 1) << 15; | |
1160 val = get_be16(pb); | |
1161 pts |= (int64_t)(val >> 1); | |
1162 return pts; | |
1163 } | |
1164 | |
1165 static int find_next_start_code(ByteIOContext *pb, int *size_ptr, | |
1166 uint32_t *header_state) | |
0 | 1167 { |
1168 unsigned int state, v; | |
1169 int val, n; | |
1170 | |
1171 state = *header_state; | |
1172 n = *size_ptr; | |
1173 while (n > 0) { | |
1174 if (url_feof(pb)) | |
1175 break; | |
1176 v = get_byte(pb); | |
1177 n--; | |
1178 if (state == 0x000001) { | |
1179 state = ((state << 8) | v) & 0xffffff; | |
1180 val = state; | |
1181 goto found; | |
1182 } | |
1183 state = ((state << 8) | v) & 0xffffff; | |
1184 } | |
1185 val = -1; | |
1186 found: | |
1187 *header_state = state; | |
1188 *size_ptr = n; | |
1189 return val; | |
1190 } | |
1191 | |
310 | 1192 /* XXX: optimize */ |
1193 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr) | |
0 | 1194 { |
310 | 1195 int64_t pos, pos_start; |
1196 int max_size, start_code; | |
1197 | |
1198 max_size = *size_ptr; | |
1199 pos_start = url_ftell(pb); | |
1200 | |
1201 /* in order to go faster, we fill the buffer */ | |
1202 pos = pos_start - 16386; | |
1203 if (pos < 0) | |
1204 pos = 0; | |
1205 url_fseek(pb, pos, SEEK_SET); | |
1206 get_byte(pb); | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
291
diff
changeset
|
1207 |
310 | 1208 pos = pos_start; |
1209 for(;;) { | |
1210 pos--; | |
1211 if (pos < 0 || (pos_start - pos) >= max_size) { | |
1212 start_code = -1; | |
1213 goto the_end; | |
1214 } | |
1215 url_fseek(pb, pos, SEEK_SET); | |
1216 start_code = get_be32(pb); | |
1217 if ((start_code & 0xffffff00) == 0x100) | |
1218 break; | |
1219 } | |
1220 the_end: | |
1221 *size_ptr = pos_start - pos; | |
1222 return start_code; | |
0 | 1223 } |
1224 | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
1225 /* read the next PES header. Return its position in ppos |
310 | 1226 (if not NULL), and its start code, pts and dts. |
1227 */ | |
1228 static int mpegps_read_pes_header(AVFormatContext *s, | |
1229 int64_t *ppos, int *pstart_code, | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
1230 int64_t *ppts, int64_t *pdts) |
0 | 1231 { |
1232 MpegDemuxContext *m = s->priv_data; | |
310 | 1233 int len, size, startcode, c, flags, header_len; |
1234 int64_t pts, dts, last_pos; | |
0 | 1235 |
310 | 1236 last_pos = -1; |
0 | 1237 redo: |
310 | 1238 /* next start code (should be immediately after) */ |
1239 m->header_state = 0xff; | |
1240 size = MAX_SYNC_SIZE; | |
1241 startcode = find_next_start_code(&s->pb, &size, &m->header_state); | |
0 | 1242 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb)); |
1243 if (startcode < 0) | |
482 | 1244 return AVERROR_IO; |
0 | 1245 if (startcode == PACK_START_CODE) |
1246 goto redo; | |
1247 if (startcode == SYSTEM_HEADER_START_CODE) | |
1248 goto redo; | |
1249 if (startcode == PADDING_STREAM || | |
1250 startcode == PRIVATE_STREAM_2) { | |
1251 /* skip them */ | |
1252 len = get_be16(&s->pb); | |
1253 url_fskip(&s->pb, len); | |
1254 goto redo; | |
1255 } | |
1256 /* find matching stream */ | |
1257 if (!((startcode >= 0x1c0 && startcode <= 0x1df) || | |
1258 (startcode >= 0x1e0 && startcode <= 0x1ef) || | |
1259 (startcode == 0x1bd))) | |
1260 goto redo; | |
310 | 1261 if (ppos) { |
1262 *ppos = url_ftell(&s->pb) - 4; | |
1263 } | |
0 | 1264 len = get_be16(&s->pb); |
1265 pts = AV_NOPTS_VALUE; | |
1266 dts = AV_NOPTS_VALUE; | |
1267 /* stuffing */ | |
1268 for(;;) { | |
310 | 1269 if (len < 1) |
1270 goto redo; | |
0 | 1271 c = get_byte(&s->pb); |
1272 len--; | |
1273 /* XXX: for mpeg1, should test only bit 7 */ | |
1274 if (c != 0xff) | |
1275 break; | |
1276 } | |
1277 if ((c & 0xc0) == 0x40) { | |
1278 /* buffer scale & size */ | |
310 | 1279 if (len < 2) |
1280 goto redo; | |
0 | 1281 get_byte(&s->pb); |
1282 c = get_byte(&s->pb); | |
1283 len -= 2; | |
1284 } | |
1285 if ((c & 0xf0) == 0x20) { | |
310 | 1286 if (len < 4) |
1287 goto redo; | |
1288 dts = pts = get_pts(&s->pb, c); | |
0 | 1289 len -= 4; |
1290 } else if ((c & 0xf0) == 0x30) { | |
310 | 1291 if (len < 9) |
1292 goto redo; | |
0 | 1293 pts = get_pts(&s->pb, c); |
1294 dts = get_pts(&s->pb, -1); | |
1295 len -= 9; | |
1296 } else if ((c & 0xc0) == 0x80) { | |
1297 /* mpeg 2 PES */ | |
1298 if ((c & 0x30) != 0) { | |
310 | 1299 /* Encrypted multiplex not handled */ |
1300 goto redo; | |
0 | 1301 } |
1302 flags = get_byte(&s->pb); | |
1303 header_len = get_byte(&s->pb); | |
1304 len -= 2; | |
1305 if (header_len > len) | |
1306 goto redo; | |
1307 if ((flags & 0xc0) == 0x80) { | |
310 | 1308 dts = pts = get_pts(&s->pb, -1); |
1309 if (header_len < 5) | |
1310 goto redo; | |
0 | 1311 header_len -= 5; |
1312 len -= 5; | |
1313 } if ((flags & 0xc0) == 0xc0) { | |
1314 pts = get_pts(&s->pb, -1); | |
1315 dts = get_pts(&s->pb, -1); | |
310 | 1316 if (header_len < 10) |
1317 goto redo; | |
0 | 1318 header_len -= 10; |
1319 len -= 10; | |
1320 } | |
1321 len -= header_len; | |
1322 while (header_len > 0) { | |
1323 get_byte(&s->pb); | |
1324 header_len--; | |
1325 } | |
1326 } | |
447
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
1327 else if( c!= 0xf ) |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
1328 goto redo; |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
1329 |
0 | 1330 if (startcode == 0x1bd) { |
310 | 1331 if (len < 1) |
1332 goto redo; | |
0 | 1333 startcode = get_byte(&s->pb); |
1334 len--; | |
1335 if (startcode >= 0x80 && startcode <= 0xbf) { | |
1336 /* audio: skip header */ | |
310 | 1337 if (len < 3) |
1338 goto redo; | |
0 | 1339 get_byte(&s->pb); |
1340 get_byte(&s->pb); | |
1341 get_byte(&s->pb); | |
1342 len -= 3; | |
1343 } | |
1344 } | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1345 if(dts != AV_NOPTS_VALUE && ppos){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1346 int i; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1347 for(i=0; i<s->nb_streams; i++){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1348 if(startcode == s->streams[i]->id) { |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
452
diff
changeset
|
1349 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0 /* FIXME keyframe? */); |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1350 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1351 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1352 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1353 |
310 | 1354 *pstart_code = startcode; |
1355 *ppts = pts; | |
1356 *pdts = dts; | |
1357 return len; | |
1358 } | |
1359 | |
1360 static int mpegps_read_packet(AVFormatContext *s, | |
1361 AVPacket *pkt) | |
1362 { | |
1363 AVStream *st; | |
482 | 1364 int len, startcode, i, type, codec_id = 0; |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
1365 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work |
310 | 1366 |
1367 redo: | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
1368 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts); |
310 | 1369 if (len < 0) |
1370 return len; | |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
1371 |
0 | 1372 /* now find stream */ |
1373 for(i=0;i<s->nb_streams;i++) { | |
1374 st = s->streams[i]; | |
1375 if (st->id == startcode) | |
1376 goto found; | |
1377 } | |
1378 if (startcode >= 0x1e0 && startcode <= 0x1ef) { | |
1379 type = CODEC_TYPE_VIDEO; | |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
1380 codec_id = CODEC_ID_MPEG2VIDEO; |
0 | 1381 } else if (startcode >= 0x1c0 && startcode <= 0x1df) { |
1382 type = CODEC_TYPE_AUDIO; | |
1383 codec_id = CODEC_ID_MP2; | |
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
1384 } else if (startcode >= 0x80 && startcode <= 0x89) { |
0 | 1385 type = CODEC_TYPE_AUDIO; |
1386 codec_id = CODEC_ID_AC3; | |
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
1387 } else if (startcode >= 0x8a && startcode <= 0x9f) { |
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
1388 type = CODEC_TYPE_AUDIO; |
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
1389 codec_id = CODEC_ID_DTS; |
41 | 1390 } else if (startcode >= 0xa0 && startcode <= 0xbf) { |
1391 type = CODEC_TYPE_AUDIO; | |
1392 codec_id = CODEC_ID_PCM_S16BE; | |
0 | 1393 } else { |
1394 skip: | |
1395 /* skip packet */ | |
1396 url_fskip(&s->pb, len); | |
1397 goto redo; | |
1398 } | |
1399 /* no stream found: add a new stream */ | |
1400 st = av_new_stream(s, startcode); | |
1401 if (!st) | |
1402 goto skip; | |
1403 st->codec.codec_type = type; | |
1404 st->codec.codec_id = codec_id; | |
310 | 1405 if (codec_id != CODEC_ID_PCM_S16BE) |
1406 st->need_parsing = 1; | |
0 | 1407 found: |
41 | 1408 if (startcode >= 0xa0 && startcode <= 0xbf) { |
1409 int b1, freq; | |
1410 | |
1411 /* for LPCM, we just skip the header and consider it is raw | |
1412 audio data */ | |
1413 if (len <= 3) | |
1414 goto skip; | |
1415 get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */ | |
1416 b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */ | |
1417 get_byte(&s->pb); /* dynamic range control (0x80 = off) */ | |
1418 len -= 3; | |
1419 freq = (b1 >> 4) & 3; | |
1420 st->codec.sample_rate = lpcm_freq_tab[freq]; | |
1421 st->codec.channels = 1 + (b1 & 7); | |
1422 st->codec.bit_rate = st->codec.channels * st->codec.sample_rate * 2; | |
1423 } | |
0 | 1424 av_new_packet(pkt, len); |
1425 get_buffer(&s->pb, pkt->data, pkt->size); | |
1426 pkt->pts = pts; | |
310 | 1427 pkt->dts = dts; |
0 | 1428 pkt->stream_index = st->index; |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
1429 #if 0 |
470 | 1430 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f\n", |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
1431 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0); |
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
1432 #endif |
482 | 1433 |
0 | 1434 return 0; |
1435 } | |
1436 | |
1437 static int mpegps_read_close(AVFormatContext *s) | |
1438 { | |
1439 return 0; | |
1440 } | |
1441 | |
310 | 1442 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
1443 int64_t *ppos, int64_t pos_limit) |
310 | 1444 { |
1445 int len, startcode; | |
1446 int64_t pos, pts, dts; | |
1447 | |
1448 pos = *ppos; | |
1449 #ifdef DEBUG_SEEK | |
1450 printf("read_dts: pos=0x%llx next=%d -> ", pos, find_next); | |
1451 #endif | |
1452 url_fseek(&s->pb, pos, SEEK_SET); | |
1453 for(;;) { | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
1454 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); |
310 | 1455 if (len < 0) { |
1456 #ifdef DEBUG_SEEK | |
1457 printf("none (ret=%d)\n", len); | |
1458 #endif | |
1459 return AV_NOPTS_VALUE; | |
1460 } | |
1461 if (startcode == s->streams[stream_index]->id && | |
1462 dts != AV_NOPTS_VALUE) { | |
1463 break; | |
1464 } | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
1465 url_fskip(&s->pb, len); |
310 | 1466 } |
1467 #ifdef DEBUG_SEEK | |
1468 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos, dts, dts / 90000.0); | |
1469 #endif | |
1470 *ppos = pos; | |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
452
diff
changeset
|
1471 return dts; |
310 | 1472 } |
1473 | |
277
a313e1080322
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
276
diff
changeset
|
1474 #ifdef CONFIG_ENCODERS |
0 | 1475 static AVOutputFormat mpeg1system_mux = { |
1476 "mpeg", | |
1477 "MPEG1 System format", | |
14
b167760cd0aa
mimetype fixes patch by (Ryutaroh Matsumoto <ryutaroh at it dot ss dot titech dot ac dot jp>)
michaelni
parents:
0
diff
changeset
|
1478 "video/mpeg", |
0 | 1479 "mpg,mpeg", |
1480 sizeof(MpegMuxContext), | |
1481 CODEC_ID_MP2, | |
1482 CODEC_ID_MPEG1VIDEO, | |
1483 mpeg_mux_init, | |
1484 mpeg_mux_write_packet, | |
1485 mpeg_mux_end, | |
1486 }; | |
1487 | |
1488 static AVOutputFormat mpeg1vcd_mux = { | |
1489 "vcd", | |
1490 "MPEG1 System format (VCD)", | |
14
b167760cd0aa
mimetype fixes patch by (Ryutaroh Matsumoto <ryutaroh at it dot ss dot titech dot ac dot jp>)
michaelni
parents:
0
diff
changeset
|
1491 "video/mpeg", |
0 | 1492 NULL, |
1493 sizeof(MpegMuxContext), | |
1494 CODEC_ID_MP2, | |
1495 CODEC_ID_MPEG1VIDEO, | |
1496 mpeg_mux_init, | |
1497 mpeg_mux_write_packet, | |
1498 mpeg_mux_end, | |
1499 }; | |
1500 | |
1501 static AVOutputFormat mpeg2vob_mux = { | |
1502 "vob", | |
1503 "MPEG2 PS format (VOB)", | |
14
b167760cd0aa
mimetype fixes patch by (Ryutaroh Matsumoto <ryutaroh at it dot ss dot titech dot ac dot jp>)
michaelni
parents:
0
diff
changeset
|
1504 "video/mpeg", |
0 | 1505 "vob", |
1506 sizeof(MpegMuxContext), | |
1507 CODEC_ID_MP2, | |
335
b0ac206f232d
better and simpler logic for MPEG muxing - fixed rare MPEG muxing PTS generation bug (stuffing is added in such rare cases) - fixed AC3 payload size generation - generate correct AC3 frame header (need spec checking)
bellard
parents:
331
diff
changeset
|
1508 CODEC_ID_MPEG2VIDEO, |
0 | 1509 mpeg_mux_init, |
1510 mpeg_mux_write_packet, | |
1511 mpeg_mux_end, | |
1512 }; | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1513 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1514 /* Same as mpeg2vob_mux except that the pack size is 2324 */ |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1515 static AVOutputFormat mpeg2svcd_mux = { |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1516 "svcd", |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1517 "MPEG2 PS format (VOB)", |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1518 "video/mpeg", |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1519 "vob", |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1520 sizeof(MpegMuxContext), |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1521 CODEC_ID_MP2, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1522 CODEC_ID_MPEG2VIDEO, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1523 mpeg_mux_init, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1524 mpeg_mux_write_packet, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1525 mpeg_mux_end, |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1526 }; |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1527 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1528 |
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1529 |
277
a313e1080322
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
276
diff
changeset
|
1530 #endif //CONFIG_ENCODERS |
0 | 1531 |
190 | 1532 AVInputFormat mpegps_demux = { |
0 | 1533 "mpeg", |
1534 "MPEG PS format", | |
1535 sizeof(MpegDemuxContext), | |
1536 mpegps_probe, | |
1537 mpegps_read_header, | |
1538 mpegps_read_packet, | |
1539 mpegps_read_close, | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
1540 NULL, //mpegps_read_seek, |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
1541 mpegps_read_dts, |
0 | 1542 }; |
1543 | |
1544 int mpegps_init(void) | |
1545 { | |
277
a313e1080322
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
276
diff
changeset
|
1546 #ifdef CONFIG_ENCODERS |
0 | 1547 av_register_output_format(&mpeg1system_mux); |
1548 av_register_output_format(&mpeg1vcd_mux); | |
1549 av_register_output_format(&mpeg2vob_mux); | |
366
cbcbaeff1f2c
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
michael
parents:
357
diff
changeset
|
1550 av_register_output_format(&mpeg2svcd_mux); |
277
a313e1080322
disable encoders where appropriate (patch courtesy of BERO
melanson
parents:
276
diff
changeset
|
1551 #endif //CONFIG_ENCODERS |
0 | 1552 av_register_input_format(&mpegps_demux); |
1553 return 0; | |
1554 } |