Mercurial > libavformat.hg
comparison nut.c @ 328:137b4ce31b0f libavformat
msb pts support
author | alex |
---|---|
date | Mon, 08 Dec 2003 17:54:40 +0000 |
parents | a864d92bf6b8 |
children | 845f9de2c883 |
comparison
equal
deleted
inserted
replaced
327:741c56c608bb | 328:137b4ce31b0f |
---|---|
48 | 48 |
49 typedef struct { | 49 typedef struct { |
50 int curr_frame_start; | 50 int curr_frame_start; |
51 int last_frame_size; | 51 int last_frame_size; |
52 int curr_frame_size; | 52 int curr_frame_size; |
53 int *msb_timestamp_shift; | |
54 int64_t *last_msb_timestamp; | |
53 } NUTContext; | 55 } NUTContext; |
54 | 56 |
55 static int bytes_left(ByteIOContext *bc) | 57 static int bytes_left(ByteIOContext *bc) |
56 { | 58 { |
57 return bc->buf_end - bc->buf_ptr; | 59 return bc->buf_end - bc->buf_ptr; |
231 put_v(bc, 0); /* version */ | 233 put_v(bc, 0); /* version */ |
232 put_v(bc, s->nb_streams); | 234 put_v(bc, s->nb_streams); |
233 put_be32(bc, 0); /* FIXME: checksum */ | 235 put_be32(bc, 0); /* FIXME: checksum */ |
234 | 236 |
235 update_packetheader(nut, bc, 0); | 237 update_packetheader(nut, bc, 0); |
238 | |
239 nut->msb_timestamp_shift = | |
240 av_mallocz(sizeof(nut->msb_timestamp_shift)*s->nb_streams); | |
241 nut->last_msb_timestamp = | |
242 av_mallocz(sizeof(nut->last_msb_timestamp)*s->nb_streams); | |
236 | 243 |
237 /* stream headers */ | 244 /* stream headers */ |
238 for (i = 0; i < s->nb_streams; i++) | 245 for (i = 0; i < s->nb_streams; i++) |
239 { | 246 { |
240 int nom, denom; | 247 int nom, denom; |
270 } | 277 } |
271 put_v(bc, codec->bit_rate); | 278 put_v(bc, codec->bit_rate); |
272 put_v(bc, 0); /* no language code */ | 279 put_v(bc, 0); /* no language code */ |
273 put_v(bc, nom); | 280 put_v(bc, nom); |
274 put_v(bc, denom); | 281 put_v(bc, denom); |
275 put_v(bc, 0); /* msb timestamp_shift */ | 282 nut->msb_timestamp_shift[i] = 0; |
283 put_v(bc, nut->msb_timestamp_shift[i]); | |
276 put_v(bc, 0); /* shuffle type */ | 284 put_v(bc, 0); /* shuffle type */ |
277 put_byte(bc, 0); /* flags: 0x1 - fixed_fps, 0x2 - index_present */ | 285 put_byte(bc, 0); /* flags: 0x1 - fixed_fps, 0x2 - index_present */ |
278 | 286 |
279 put_v(bc, 0); /* no codec specific headers */ | 287 put_v(bc, 0); /* no codec specific headers */ |
280 | 288 |
342 static int nut_write_packet(AVFormatContext *s, int stream_index, | 350 static int nut_write_packet(AVFormatContext *s, int stream_index, |
343 const uint8_t *buf, int size, int64_t pts) | 351 const uint8_t *buf, int size, int64_t pts) |
344 { | 352 { |
345 NUTContext *nut = s->priv_data; | 353 NUTContext *nut = s->priv_data; |
346 ByteIOContext *bc = &s->pb; | 354 ByteIOContext *bc = &s->pb; |
347 int key_frame = 0; | 355 int key_frame = 0, flags, msb_pts = 0; |
348 int flags; | |
349 AVCodecContext *enc; | 356 AVCodecContext *enc; |
357 int64_t lsb_pts; | |
350 | 358 |
351 if (stream_index > s->nb_streams) | 359 if (stream_index > s->nb_streams) |
352 return 1; | 360 return 1; |
353 | 361 |
354 enc = &s->streams[stream_index]->codec; | 362 enc = &s->streams[stream_index]->codec; |
355 key_frame = enc->coded_frame->key_frame; | 363 // FIXME, lavc reports always keyframes for audio, which will make |
356 | 364 // _huge_ overhead |
357 if (key_frame) | 365 if (enc->codec_type == CODEC_TYPE_VIDEO) |
358 put_be64(bc, KEYFRAME_STARTCODE); | 366 key_frame = enc->coded_frame->key_frame; |
367 | |
368 if (key_frame /*|| | |
369 ((pts - (nut->last_msb_timestamp[stream_index] << | |
370 nut->msb_timestamp_shift[stream_index])) > 1024)*/) | |
371 { | |
372 msb_pts = 1; | |
373 nut->last_msb_timestamp[stream_index] = pts >> nut->msb_timestamp_shift[stream_index]; | |
374 } | |
375 | |
376 lsb_pts = pts - (nut->last_msb_timestamp[stream_index] << nut->msb_timestamp_shift[stream_index]); | |
359 | 377 |
360 flags=0; | 378 flags=0; |
361 flags<<=2; flags|=1; //priority | 379 flags<<=2; flags|=1; //priority |
362 flags<<=1; flags|=0; //checksum | 380 flags<<=1; flags|=0; //checksum |
363 flags<<=1; flags|=0; //msb_timestamp_flag | 381 flags<<=1; flags|=msb_pts; //msb_timestamp_flag |
364 flags<<=2; flags|=1; //subpacket_type | 382 flags<<=2; flags|=1; //subpacket_type |
365 flags<<=1; flags|=0; //reserved | 383 flags<<=1; flags|=0; //reserved |
366 | 384 |
385 if (key_frame) | |
386 put_be64(bc, KEYFRAME_STARTCODE); | |
367 put_byte(bc, flags); | 387 put_byte(bc, flags); |
368 | 388 |
369 put_packetheader(nut, bc, size+20); | 389 put_packetheader(nut, bc, size+20); |
370 put_v(bc, stream_index); | 390 put_v(bc, stream_index); |
371 put_s(bc, pts); /* lsb_timestamp */ | 391 if (msb_pts) |
392 put_v(bc, nut->last_msb_timestamp[stream_index]); | |
393 put_v(bc, lsb_pts); /* lsb_timestamp */ | |
372 update_packetheader(nut, bc, size); | 394 update_packetheader(nut, bc, size); |
373 | 395 |
374 put_buffer(bc, buf, size); | 396 put_buffer(bc, buf, size); |
375 | 397 |
376 put_flush_packet(bc); | 398 put_flush_packet(bc); |
378 return 0; | 400 return 0; |
379 } | 401 } |
380 | 402 |
381 static int nut_write_trailer(AVFormatContext *s) | 403 static int nut_write_trailer(AVFormatContext *s) |
382 { | 404 { |
405 NUTContext *nut = s->priv_data; | |
383 ByteIOContext *bc = &s->pb; | 406 ByteIOContext *bc = &s->pb; |
384 #if 0 | 407 #if 0 |
385 int i; | 408 int i; |
386 | 409 |
387 /* WRITE INDEX */ | 410 /* WRITE INDEX */ |
396 update_packetheader(nut, bc, 0); | 419 update_packetheader(nut, bc, 0); |
397 } | 420 } |
398 #endif | 421 #endif |
399 | 422 |
400 put_flush_packet(bc); | 423 put_flush_packet(bc); |
424 | |
425 if (nut->last_msb_timestamp) | |
426 av_free(nut->last_msb_timestamp); | |
427 if (nut->msb_timestamp_shift) | |
428 av_free(nut->msb_timestamp_shift); | |
401 | 429 |
402 return 0; | 430 return 0; |
403 } | 431 } |
404 #endif //CONFIG_ENCODERS | 432 #endif //CONFIG_ENCODERS |
405 | 433 |
437 | 465 |
438 nb_streams = get_v(bc); | 466 nb_streams = get_v(bc); |
439 get_be32(bc); /* checkusm */ | 467 get_be32(bc); /* checkusm */ |
440 | 468 |
441 s->bit_rate = 0; | 469 s->bit_rate = 0; |
470 | |
471 nut->msb_timestamp_shift = | |
472 av_malloc(sizeof(nut->msb_timestamp_shift)*s->nb_streams); | |
473 nut->last_msb_timestamp = | |
474 av_malloc(sizeof(nut->last_msb_timestamp)*s->nb_streams); | |
442 | 475 |
443 /* stream header */ | 476 /* stream header */ |
444 for (cur_stream = 0; cur_stream < nb_streams; cur_stream++) | 477 for (cur_stream = 0; cur_stream < nb_streams; cur_stream++) |
445 { | 478 { |
446 int class, nom, denom; | 479 int class, nom, denom; |
475 } | 508 } |
476 s->bit_rate += get_v(bc); | 509 s->bit_rate += get_v(bc); |
477 get_b(bc, NULL, 0); /* language code */ | 510 get_b(bc, NULL, 0); /* language code */ |
478 nom = get_v(bc); | 511 nom = get_v(bc); |
479 denom = get_v(bc); | 512 denom = get_v(bc); |
480 get_v(bc); /* FIXME: msb timestamp base */ | 513 nut->msb_timestamp_shift[cur_stream] = get_v(bc); |
481 get_v(bc); /* shuffle type */ | 514 get_v(bc); /* shuffle type */ |
482 get_byte(bc); /* flags */ | 515 get_byte(bc); /* flags */ |
483 | 516 |
484 /* codec specific data headers */ | 517 /* codec specific data headers */ |
485 while(get_v(bc) != 0) | 518 while(get_v(bc) != 0) |
510 | 543 |
511 static int nut_read_packet(AVFormatContext *s, AVPacket *pkt) | 544 static int nut_read_packet(AVFormatContext *s, AVPacket *pkt) |
512 { | 545 { |
513 NUTContext *nut = s->priv_data; | 546 NUTContext *nut = s->priv_data; |
514 ByteIOContext *bc = &s->pb; | 547 ByteIOContext *bc = &s->pb; |
515 int id, timestamp, size; | 548 int id, size; |
516 int key_frame = 0; | 549 int key_frame = 0; |
517 uint64_t tmp; | 550 uint64_t tmp; |
518 | 551 int64_t pts = 0; |
519 | 552 |
520 if (url_feof(bc)) | 553 if (url_feof(bc)) |
521 return -1; | 554 return -1; |
522 | 555 |
523 tmp = get_byte(bc); | 556 tmp = get_byte(bc); |
538 #if 0 | 571 #if 0 |
539 if (((tmp & 0x60)>>5) > 3) /* priority <= 3 */ | 572 if (((tmp & 0x60)>>5) > 3) /* priority <= 3 */ |
540 fprintf(stderr, "sanity check failed!\n"); | 573 fprintf(stderr, "sanity check failed!\n"); |
541 #endif | 574 #endif |
542 id = get_v(bc); | 575 id = get_v(bc); |
543 timestamp = get_s(bc); | 576 if ((tmp & 0x8) >> 3) |
577 pts = get_v(bc) << nut->msb_timestamp_shift[id]; | |
578 pts += get_v(bc); | |
544 | 579 |
545 size = (nut->curr_frame_size - (url_ftell(bc)-nut->curr_frame_start)); | 580 size = (nut->curr_frame_size - (url_ftell(bc)-nut->curr_frame_start)); |
546 dprintf("flags: 0x%Lx, timestamp: %d, packet size: %d\n", tmp, timestamp, size); | 581 dprintf("flags: 0x%llx, timestamp: %llx, packet size: %d\n", tmp, pts, size); |
547 | 582 |
548 if (size < 0) | 583 if (size < 0) |
549 return -1; | 584 return -1; |
550 | 585 |
551 av_new_packet(pkt, size); | 586 av_new_packet(pkt, size); |
552 get_buffer(bc, pkt->data, size); | 587 get_buffer(bc, pkt->data, size); |
553 pkt->stream_index = id; | 588 pkt->stream_index = id; |
554 if (key_frame) | 589 if (key_frame) |
555 pkt->flags |= PKT_FLAG_KEY; | 590 pkt->flags |= PKT_FLAG_KEY; |
556 pkt->pts = timestamp; | 591 pkt->pts = pts; |
557 | 592 |
558 return 0; | 593 return 0; |
559 } | 594 } |
560 | 595 |
561 static AVInputFormat nut_iformat = { | 596 static AVInputFormat nut_iformat = { |