Mercurial > libavformat.hg
comparison nutenc.c @ 2331:4d1a56112d92 libavformat
use a dynamic ByteIOContext instead of using the lavf buffer
this makes the code work with big packets, it is also simpler and saves
a byte or 2
author | michael |
---|---|
date | Thu, 09 Aug 2007 12:38:24 +0000 |
parents | c25f63f009a8 |
children | 7dd23262372f |
comparison
equal
deleted
inserted
replaced
2330:c25f63f009a8 | 2331:4d1a56112d92 |
---|---|
175 } | 175 } |
176 #define put_v(bc, v) put_v_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__) | 176 #define put_v(bc, v) put_v_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__) |
177 #define put_s(bc, v) put_s_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__) | 177 #define put_s(bc, v) put_s_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__) |
178 #endif | 178 #endif |
179 | 179 |
180 static int put_packetheader(NUTContext *nut, ByteIOContext *bc, int max_size, int calculate_checksum){ | 180 static void put_packet(NUTContext *nut, ByteIOContext *bc, ByteIOContext *dyn_bc, int calculate_checksum){ |
181 put_flush_packet(bc); | 181 uint8_t *dyn_buf=NULL; |
182 nut->packet_start= url_ftell(bc) - 8; | 182 int dyn_size= url_close_dyn_buf(dyn_bc, &dyn_buf); |
183 nut->written_packet_size = max_size; | 183 |
184 | 184 put_v(bc, dyn_size + 4*calculate_checksum); |
185 /* packet header */ | |
186 put_v(bc, nut->written_packet_size); /* forward ptr */ | |
187 | |
188 if(calculate_checksum) | 185 if(calculate_checksum) |
189 init_checksum(bc, av_crc04C11DB7_update, 0); | 186 init_checksum(bc, av_crc04C11DB7_update, 0); |
190 | 187 put_buffer(bc, dyn_buf, dyn_size); |
191 return 0; | |
192 } | |
193 | |
194 /** | |
195 * | |
196 * must not be called more then once per packet | |
197 */ | |
198 static int update_packetheader(NUTContext *nut, ByteIOContext *bc, int additional_size, int calculate_checksum){ | |
199 int64_t start= nut->packet_start; | |
200 int64_t cur= url_ftell(bc); | |
201 int size= cur - start - get_length(nut->written_packet_size) - 8; | |
202 | |
203 if(calculate_checksum) | 188 if(calculate_checksum) |
204 size += 4; | 189 put_le32(bc, get_checksum(bc)); |
205 | 190 |
206 if(size != nut->written_packet_size){ | 191 av_free(dyn_buf); |
207 int i; | |
208 | |
209 assert( size <= nut->written_packet_size ); | |
210 | |
211 url_fseek(bc, start + 8, SEEK_SET); | |
212 for(i=get_length(size); i < get_length(nut->written_packet_size); i++) | |
213 put_byte(bc, 128); | |
214 put_v(bc, size); | |
215 | |
216 url_fseek(bc, cur, SEEK_SET); | |
217 nut->written_packet_size= size; //FIXME may fail if multiple updates with differing sizes, as get_length may differ | |
218 | |
219 if(calculate_checksum) | |
220 put_le32(bc, get_checksum(bc)); | |
221 } | |
222 | |
223 return 0; | |
224 } | 192 } |
225 | 193 |
226 static void write_mainheader(NUTContext *nut, ByteIOContext *bc){ | 194 static void write_mainheader(NUTContext *nut, ByteIOContext *bc){ |
227 int i, j, tmp_pts, tmp_flags, tmp_stream, tmp_mul, tmp_size, tmp_fields; | 195 int i, j, tmp_pts, tmp_flags, tmp_stream, tmp_mul, tmp_size, tmp_fields; |
228 | 196 |
323 return 0; | 291 return 0; |
324 } | 292 } |
325 | 293 |
326 static int write_header(AVFormatContext *s){ | 294 static int write_header(AVFormatContext *s){ |
327 NUTContext *nut = s->priv_data; | 295 NUTContext *nut = s->priv_data; |
328 ByteIOContext *bc = &s->pb; | 296 ByteIOContext *bc = &s->pb, dyn_bc; |
329 AVCodecContext *codec; | 297 AVCodecContext *codec; |
330 int i, j; | 298 int i, j; |
331 | 299 |
332 nut->avf= s; | 300 nut->avf= s; |
333 | 301 |
365 put_buffer(bc, ID_STRING, strlen(ID_STRING)); | 333 put_buffer(bc, ID_STRING, strlen(ID_STRING)); |
366 put_byte(bc, 0); | 334 put_byte(bc, 0); |
367 | 335 |
368 /* main header */ | 336 /* main header */ |
369 put_be64(bc, MAIN_STARTCODE); | 337 put_be64(bc, MAIN_STARTCODE); |
370 put_packetheader(nut, bc, 120+5*256/*FIXME check*/, 1); | 338 url_open_dyn_buf(&dyn_bc); |
371 write_mainheader(nut, bc); | 339 write_mainheader(nut, &dyn_bc); |
372 update_packetheader(nut, bc, 0, 1); | 340 put_packet(nut, bc, &dyn_bc, 1); |
373 | 341 |
374 for (i=0; i < s->nb_streams; i++){ | 342 for (i=0; i < s->nb_streams; i++){ |
375 codec = s->streams[i]->codec; | 343 codec = s->streams[i]->codec; |
376 | 344 |
377 put_be64(bc, STREAM_STARTCODE); | 345 put_be64(bc, STREAM_STARTCODE); |
378 put_packetheader(nut, bc, 120/*FIXME check*/ + codec->extradata_size, 1); | 346 url_open_dyn_buf(&dyn_bc); |
379 write_streamheader(nut, bc, codec, i); | 347 write_streamheader(nut, &dyn_bc, codec, i); |
380 update_packetheader(nut, bc, 0, 1); | 348 put_packet(nut, bc, &dyn_bc, 1); |
381 } | 349 } |
382 | 350 |
383 put_flush_packet(bc); | 351 put_flush_packet(bc); |
384 | 352 |
385 //FIXME info header, header repeation, header packet CRC, ... | 353 //FIXME info header, header repeation, header packet CRC, ... |