Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(322)

Side by Side Diff: source/patched-ffmpeg-mt/libavformat/rtpdec.c

Issue 4533003: patched ffmpeg nov 2 (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * RTP input format 2 * RTP input format
3 * Copyright (c) 2002 Fabrice Bellard 3 * Copyright (c) 2002 Fabrice Bellard
4 * 4 *
5 * This file is part of FFmpeg. 5 * This file is part of FFmpeg.
6 * 6 *
7 * FFmpeg is free software; you can redistribute it and/or 7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public 8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version. 10 * version 2.1 of the License, or (at your option) any later version.
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 if (len < ext) 464 if (len < ext)
465 return -1; 465 return -1;
466 // skip past RTP header extension 466 // skip past RTP header extension
467 len -= ext; 467 len -= ext;
468 buf += ext; 468 buf += ext;
469 } 469 }
470 470
471 if (!st) { 471 if (!st) {
472 /* specific MPEG2TS demux support */ 472 /* specific MPEG2TS demux support */
473 ret = ff_mpegts_parse_packet(s->ts, pkt, buf, len); 473 ret = ff_mpegts_parse_packet(s->ts, pkt, buf, len);
474 if (ret < 0) { 474 /* The only error that can be returned from ff_mpegts_parse_packet
475 s->prev_ret = -1; 475 * is "no more data to return from the provided buffer", so return
476 return -1; 476 * AVERROR(EAGAIN) for all errors */
477 } 477 if (ret < 0)
478 return AVERROR(EAGAIN);
478 if (ret < len) { 479 if (ret < len) {
479 s->read_buf_size = len - ret; 480 s->read_buf_size = len - ret;
480 memcpy(s->buf, buf + ret, s->read_buf_size); 481 memcpy(s->buf, buf + ret, s->read_buf_size);
481 s->read_buf_index = 0; 482 s->read_buf_index = 0;
482 s->prev_ret = 1;
483 return 1; 483 return 1;
484 } 484 }
485 s->prev_ret = 0;
486 return 0; 485 return 0;
487 } else if (s->parse_packet) { 486 } else if (s->parse_packet) {
488 rv = s->parse_packet(s->ic, s->dynamic_protocol_context, 487 rv = s->parse_packet(s->ic, s->dynamic_protocol_context,
489 s->st, pkt, &timestamp, buf, len, flags); 488 s->st, pkt, &timestamp, buf, len, flags);
490 } else { 489 } else {
491 // at this point, the RTP header has been stripped; This is ASSUMING th at there is only 1 CSRC, which in't wise. 490 // at this point, the RTP header has been stripped; This is ASSUMING th at there is only 1 CSRC, which in't wise.
492 switch(st->codec->codec_id) { 491 switch(st->codec->codec_id) {
493 case CODEC_ID_MP2: 492 case CODEC_ID_MP2:
494 case CODEC_ID_MP3: 493 case CODEC_ID_MP3:
495 /* better than nothing: skip mpeg audio RTP header */ 494 /* better than nothing: skip mpeg audio RTP header */
(...skipping 28 matching lines...) Expand all
524 memcpy(pkt->data, buf, len); 523 memcpy(pkt->data, buf, len);
525 break; 524 break;
526 } 525 }
527 526
528 pkt->stream_index = st->index; 527 pkt->stream_index = st->index;
529 } 528 }
530 529
531 // now perform timestamp things.... 530 // now perform timestamp things....
532 finalize_packet(s, pkt, timestamp); 531 finalize_packet(s, pkt, timestamp);
533 532
534 s->prev_ret = rv;
535 return rv; 533 return rv;
536 } 534 }
537 535
538 void ff_rtp_reset_packet_queue(RTPDemuxContext *s) 536 void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
539 { 537 {
540 while (s->queue) { 538 while (s->queue) {
541 RTPPacket *next = s->queue->next; 539 RTPPacket *next = s->queue->next;
542 av_free(s->queue->buf); 540 av_free(s->queue->buf);
543 av_free(s->queue); 541 av_free(s->queue);
544 s->queue = next; 542 s->queue = next;
(...skipping 27 matching lines...) Expand all
572 packet->next = cur; 570 packet->next = cur;
573 if (prev) 571 if (prev)
574 prev->next = packet; 572 prev->next = packet;
575 else 573 else
576 s->queue = packet; 574 s->queue = packet;
577 s->queue_len++; 575 s->queue_len++;
578 } 576 }
579 577
580 static int has_next_packet(RTPDemuxContext *s) 578 static int has_next_packet(RTPDemuxContext *s)
581 { 579 {
582 return s->queue && s->queue->seq == s->seq + 1; 580 return s->queue && s->queue->seq == (uint16_t) (s->seq + 1);
583 } 581 }
584 582
585 int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s) 583 int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
586 { 584 {
587 return s->queue ? s->queue->recvtime : 0; 585 return s->queue ? s->queue->recvtime : 0;
588 } 586 }
589 587
590 static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt) 588 static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
591 { 589 {
592 int rv; 590 int rv;
593 RTPPacket *next; 591 RTPPacket *next;
594 592
595 if (s->queue_len <= 0) 593 if (s->queue_len <= 0)
596 return -1; 594 return -1;
597 595
598 if (!has_next_packet(s)) 596 if (!has_next_packet(s))
599 av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING, 597 av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
600 "RTP: missed %d packets\n", s->queue->seq - s->seq - 1); 598 "RTP: missed %d packets\n", s->queue->seq - s->seq - 1);
601 599
602 /* Parse the first packet in the queue, and dequeue it */ 600 /* Parse the first packet in the queue, and dequeue it */
603 rv = rtp_parse_packet_internal(s, pkt, s->queue->buf, s->queue->len); 601 rv = rtp_parse_packet_internal(s, pkt, s->queue->buf, s->queue->len);
604 next = s->queue->next; 602 next = s->queue->next;
605 av_free(s->queue->buf); 603 av_free(s->queue->buf);
606 av_free(s->queue); 604 av_free(s->queue);
607 s->queue = next; 605 s->queue = next;
608 s->queue_len--; 606 s->queue_len--;
609 return rv ? rv : has_next_packet(s); 607 return rv;
610 } 608 }
611 609
612 /** 610 static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt,
613 * Parse an RTP or RTCP packet directly sent as a buffer.
614 * @param s RTP parse context.
615 * @param pkt returned packet
616 * @param bufptr pointer to the input buffer or NULL to read the next packets
617 * @param len buffer len
618 * @return 0 if a packet is returned, 1 if a packet is returned and more can fol low
619 * (use buf as NULL to read the next). -1 if no packet (error or no more packet) .
620 */
621 int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
622 uint8_t **bufptr, int len) 611 uint8_t **bufptr, int len)
623 { 612 {
624 uint8_t* buf = bufptr ? *bufptr : NULL; 613 uint8_t* buf = bufptr ? *bufptr : NULL;
625 int ret, flags = 0; 614 int ret, flags = 0;
626 uint32_t timestamp; 615 uint32_t timestamp;
627 int rv= 0; 616 int rv= 0;
628 617
629 if (!buf) { 618 if (!buf) {
630 /* If parsing of the previous packet actually returned 0, there's 619 /* If parsing of the previous packet actually returned 0 or an error,
631 * nothing more to be parsed from that packet, but we may have 620 * there's nothing more to be parsed from that packet, but we may have
632 * indicated that we can return the next enqueued packet. */ 621 * indicated that we can return the next enqueued packet. */
633 if (!s->prev_ret) 622 if (s->prev_ret <= 0)
634 return rtp_parse_queued_packet(s, pkt); 623 return rtp_parse_queued_packet(s, pkt);
635 /* return the next packets, if any */ 624 /* return the next packets, if any */
636 if(s->st && s->parse_packet) { 625 if(s->st && s->parse_packet) {
637 /* timestamp should be overwritten by parse_packet, if not, 626 /* timestamp should be overwritten by parse_packet, if not,
638 * the packet is left with pts == AV_NOPTS_VALUE */ 627 * the packet is left with pts == AV_NOPTS_VALUE */
639 timestamp = RTP_NOTS_VALUE; 628 timestamp = RTP_NOTS_VALUE;
640 rv= s->parse_packet(s->ic, s->dynamic_protocol_context, 629 rv= s->parse_packet(s->ic, s->dynamic_protocol_context,
641 s->st, pkt, &timestamp, NULL, 0, flags); 630 s->st, pkt, &timestamp, NULL, 0, flags);
642 finalize_packet(s, pkt, timestamp); 631 finalize_packet(s, pkt, timestamp);
643 s->prev_ret = rv; 632 return rv;
644 return rv ? rv : has_next_packet(s);
645 } else { 633 } else {
646 // TODO: Move to a dynamic packet handler (like above) 634 // TODO: Move to a dynamic packet handler (like above)
647 if (s->read_buf_index >= s->read_buf_size) { 635 if (s->read_buf_index >= s->read_buf_size)
648 s->prev_ret = -1; 636 return AVERROR(EAGAIN);
649 return -1;
650 }
651 ret = ff_mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index, 637 ret = ff_mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index,
652 s->read_buf_size - s->read_buf_index); 638 s->read_buf_size - s->read_buf_index);
653 if (ret < 0) { 639 if (ret < 0)
654 s->prev_ret = -1; 640 return AVERROR(EAGAIN);
655 return -1;
656 }
657 s->read_buf_index += ret; 641 s->read_buf_index += ret;
658 if (s->read_buf_index < s->read_buf_size) 642 if (s->read_buf_index < s->read_buf_size)
659 return 1; 643 return 1;
660 else { 644 else
661 s->prev_ret = 0; 645 return 0;
662 return has_next_packet(s);
663 }
664 } 646 }
665 } 647 }
666 648
667 if (len < 12) 649 if (len < 12)
668 return -1; 650 return -1;
669 651
670 if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) 652 if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
671 return -1; 653 return -1;
672 if (buf[1] >= RTCP_SR && buf[1] <= RTCP_APP) { 654 if (buf[1] >= RTCP_SR && buf[1] <= RTCP_APP) {
673 return rtcp_parse_packet(s, buf, len); 655 return rtcp_parse_packet(s, buf, len);
674 } 656 }
675 657
676 if (s->seq == 0 || s->queue_size <= 1) { 658 if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) {
677 /* First packet, or no reordering */ 659 /* First packet, or no reordering */
678 return rtp_parse_packet_internal(s, pkt, buf, len); 660 return rtp_parse_packet_internal(s, pkt, buf, len);
679 } else { 661 } else {
680 uint16_t seq = AV_RB16(buf + 2); 662 uint16_t seq = AV_RB16(buf + 2);
681 int16_t diff = seq - s->seq; 663 int16_t diff = seq - s->seq;
682 if (diff < 0) { 664 if (diff < 0) {
683 /* Packet older than the previously emitted one, drop */ 665 /* Packet older than the previously emitted one, drop */
684 av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING, 666 av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
685 "RTP: dropping old packet received too late\n"); 667 "RTP: dropping old packet received too late\n");
686 return -1; 668 return -1;
687 } else if (diff <= 1) { 669 } else if (diff <= 1) {
688 /* Correct packet */ 670 /* Correct packet */
689 rv = rtp_parse_packet_internal(s, pkt, buf, len); 671 rv = rtp_parse_packet_internal(s, pkt, buf, len);
690 return rv ? rv : has_next_packet(s); 672 return rv;
691 } else { 673 } else {
692 /* Still missing some packet, enqueue this one. */ 674 /* Still missing some packet, enqueue this one. */
693 enqueue_packet(s, buf, len); 675 enqueue_packet(s, buf, len);
694 *bufptr = NULL; 676 *bufptr = NULL;
695 /* Return the first enqueued packet if the queue is full, 677 /* Return the first enqueued packet if the queue is full,
696 * even if we're missing something */ 678 * even if we're missing something */
697 if (s->queue_len >= s->queue_size) 679 if (s->queue_len >= s->queue_size)
698 return rtp_parse_queued_packet(s, pkt); 680 return rtp_parse_queued_packet(s, pkt);
699 return -1; 681 return -1;
700 } 682 }
701 } 683 }
702 } 684 }
703 685
686 /**
687 * Parse an RTP or RTCP packet directly sent as a buffer.
688 * @param s RTP parse context.
689 * @param pkt returned packet
690 * @param bufptr pointer to the input buffer or NULL to read the next packets
691 * @param len buffer len
692 * @return 0 if a packet is returned, 1 if a packet is returned and more can fol low
693 * (use buf as NULL to read the next). -1 if no packet (error or no more packet) .
694 */
695 int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
696 uint8_t **bufptr, int len)
697 {
698 int rv = rtp_parse_one_packet(s, pkt, bufptr, len);
699 s->prev_ret = rv;
700 while (rv == AVERROR(EAGAIN) && has_next_packet(s))
701 rv = rtp_parse_queued_packet(s, pkt);
702 return rv ? rv : has_next_packet(s);
703 }
704
704 void rtp_parse_close(RTPDemuxContext *s) 705 void rtp_parse_close(RTPDemuxContext *s)
705 { 706 {
706 ff_rtp_reset_packet_queue(s); 707 ff_rtp_reset_packet_queue(s);
707 if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) { 708 if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) {
708 ff_mpegts_parse_close(s->ts); 709 ff_mpegts_parse_close(s->ts);
709 } 710 }
710 av_free(s); 711 av_free(s);
711 } 712 }
712 713
713 int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, 714 int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p,
(...skipping 22 matching lines...) Expand all
736 737
737 res = parse_fmtp(stream, data, attr, value); 738 res = parse_fmtp(stream, data, attr, value);
738 if (res < 0 && res != AVERROR_PATCHWELCOME) { 739 if (res < 0 && res != AVERROR_PATCHWELCOME) {
739 av_free(value); 740 av_free(value);
740 return res; 741 return res;
741 } 742 }
742 } 743 }
743 av_free(value); 744 av_free(value);
744 return 0; 745 return 0;
745 } 746 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698