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 = {