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, ...