Mercurial > libavformat.hg
comparison nutenc.c @ 2329:57a352c5b051 libavformat
move main header writing into its own function
author | michael |
---|---|
date | Thu, 09 Aug 2007 12:22:02 +0000 |
parents | 3569ee98f2e2 |
children | c25f63f009a8 |
comparison
equal
deleted
inserted
replaced
2328:3569ee98f2e2 | 2329:57a352c5b051 |
---|---|
221 } | 221 } |
222 | 222 |
223 return 0; | 223 return 0; |
224 } | 224 } |
225 | 225 |
226 static int write_header(AVFormatContext *s){ | 226 static void write_mainheader(NUTContext *nut, ByteIOContext *bc){ |
227 NUTContext *nut = s->priv_data; | |
228 ByteIOContext *bc = &s->pb; | |
229 AVCodecContext *codec; | |
230 int i, j, tmp_pts, tmp_flags, tmp_stream, tmp_mul, tmp_size, tmp_fields; | 227 int i, j, tmp_pts, tmp_flags, tmp_stream, tmp_mul, tmp_size, tmp_fields; |
231 | 228 |
232 nut->avf= s; | |
233 | |
234 nut->stream = av_mallocz(sizeof(StreamContext)*s->nb_streams); | |
235 nut->time_base= av_mallocz(sizeof(AVRational )*s->nb_streams); | |
236 | |
237 for(i=0; i<s->nb_streams; i++){ | |
238 AVStream *st= s->streams[i]; | |
239 int ssize; | |
240 AVRational time_base; | |
241 ff_parse_specific_params(st->codec, &time_base.den, &ssize, &time_base.num); | |
242 | |
243 av_set_pts_info(st, 64, time_base.num, time_base.den); | |
244 | |
245 for(j=0; j<nut->time_base_count; j++){ | |
246 if(!memcmp(&time_base, &nut->time_base[j], sizeof(AVRational))){ | |
247 break; | |
248 } | |
249 } | |
250 nut->time_base[j]= time_base; | |
251 nut->stream[i].time_base= &nut->time_base[j]; | |
252 if(j==nut->time_base_count) | |
253 nut->time_base_count++; | |
254 | |
255 if(av_q2d(time_base) >= 0.001) | |
256 nut->stream[i].msb_pts_shift = 7; | |
257 else | |
258 nut->stream[i].msb_pts_shift = 14; | |
259 nut->stream[i].max_pts_distance= FFMAX(1/av_q2d(time_base), 1); | |
260 } | |
261 | |
262 put_buffer(bc, ID_STRING, strlen(ID_STRING)); | |
263 put_byte(bc, 0); | |
264 | |
265 /* main header */ | |
266 put_be64(bc, MAIN_STARTCODE); | |
267 put_packetheader(nut, bc, 120+5*256/*FIXME check*/, 1); | |
268 | |
269 put_v(bc, 2); /* version */ | 229 put_v(bc, 2); /* version */ |
270 put_v(bc, s->nb_streams); | 230 put_v(bc, nut->avf->nb_streams); |
271 put_v(bc, MAX_DISTANCE); | 231 put_v(bc, MAX_DISTANCE); |
272 put_v(bc, nut->time_base_count); | 232 put_v(bc, nut->time_base_count); |
273 | 233 |
274 for(i=0; i<nut->time_base_count; i++){ | 234 for(i=0; i<nut->time_base_count; i++){ |
275 put_v(bc, nut->time_base[i].num); | 235 put_v(bc, nut->time_base[i].num); |
276 put_v(bc, nut->time_base[i].den); | 236 put_v(bc, nut->time_base[i].den); |
277 } | 237 } |
278 | |
279 build_frame_code(s); | |
280 assert(nut->frame_code['N'].flags == FLAG_INVALID); | |
281 | 238 |
282 tmp_pts=0; | 239 tmp_pts=0; |
283 tmp_mul=1; | 240 tmp_mul=1; |
284 tmp_stream=0; | 241 tmp_stream=0; |
285 for(i=0; i<256;){ | 242 for(i=0; i<256;){ |
320 if(tmp_fields>2) put_v(bc, tmp_stream); | 277 if(tmp_fields>2) put_v(bc, tmp_stream); |
321 if(tmp_fields>3) put_v(bc, tmp_size); | 278 if(tmp_fields>3) put_v(bc, tmp_size); |
322 if(tmp_fields>4) put_v(bc, 0 /*tmp_res*/); | 279 if(tmp_fields>4) put_v(bc, 0 /*tmp_res*/); |
323 if(tmp_fields>5) put_v(bc, j); | 280 if(tmp_fields>5) put_v(bc, j); |
324 } | 281 } |
325 | 282 } |
283 | |
284 static int write_header(AVFormatContext *s){ | |
285 NUTContext *nut = s->priv_data; | |
286 ByteIOContext *bc = &s->pb; | |
287 AVCodecContext *codec; | |
288 int i, j; | |
289 | |
290 nut->avf= s; | |
291 | |
292 nut->stream = av_mallocz(sizeof(StreamContext)*s->nb_streams); | |
293 nut->time_base= av_mallocz(sizeof(AVRational )*s->nb_streams); | |
294 | |
295 for(i=0; i<s->nb_streams; i++){ | |
296 AVStream *st= s->streams[i]; | |
297 int ssize; | |
298 AVRational time_base; | |
299 ff_parse_specific_params(st->codec, &time_base.den, &ssize, &time_base.num); | |
300 | |
301 av_set_pts_info(st, 64, time_base.num, time_base.den); | |
302 | |
303 for(j=0; j<nut->time_base_count; j++){ | |
304 if(!memcmp(&time_base, &nut->time_base[j], sizeof(AVRational))){ | |
305 break; | |
306 } | |
307 } | |
308 nut->time_base[j]= time_base; | |
309 nut->stream[i].time_base= &nut->time_base[j]; | |
310 if(j==nut->time_base_count) | |
311 nut->time_base_count++; | |
312 | |
313 if(av_q2d(time_base) >= 0.001) | |
314 nut->stream[i].msb_pts_shift = 7; | |
315 else | |
316 nut->stream[i].msb_pts_shift = 14; | |
317 nut->stream[i].max_pts_distance= FFMAX(1/av_q2d(time_base), 1); | |
318 } | |
319 | |
320 build_frame_code(s); | |
321 assert(nut->frame_code['N'].flags == FLAG_INVALID); | |
322 | |
323 put_buffer(bc, ID_STRING, strlen(ID_STRING)); | |
324 put_byte(bc, 0); | |
325 | |
326 /* main header */ | |
327 put_be64(bc, MAIN_STARTCODE); | |
328 put_packetheader(nut, bc, 120+5*256/*FIXME check*/, 1); | |
329 write_mainheader(nut, bc); | |
326 update_packetheader(nut, bc, 0, 1); | 330 update_packetheader(nut, bc, 0, 1); |
327 | 331 |
328 for (i=0; i < s->nb_streams; i++){ | 332 for (i=0; i < s->nb_streams; i++){ |
329 codec = s->streams[i]->codec; | 333 codec = s->streams[i]->codec; |
330 | 334 |