annotate ffmpeg/libavformat/rtpenc_aac.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * copyright (c) 2007 Luca Abeni
yading@11 3 *
yading@11 4 * This file is part of FFmpeg.
yading@11 5 *
yading@11 6 * FFmpeg is free software; you can redistribute it and/or
yading@11 7 * modify it under the terms of the GNU Lesser General Public
yading@11 8 * License as published by the Free Software Foundation; either
yading@11 9 * version 2.1 of the License, or (at your option) any later version.
yading@11 10 *
yading@11 11 * FFmpeg is distributed in the hope that it will be useful,
yading@11 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 14 * Lesser General Public License for more details.
yading@11 15 *
yading@11 16 * You should have received a copy of the GNU Lesser General Public
yading@11 17 * License along with FFmpeg; if not, write to the Free Software
yading@11 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 19 */
yading@11 20
yading@11 21 #include "avformat.h"
yading@11 22 #include "rtpenc.h"
yading@11 23
yading@11 24
yading@11 25 void ff_rtp_send_aac(AVFormatContext *s1, const uint8_t *buff, int size)
yading@11 26 {
yading@11 27 RTPMuxContext *s = s1->priv_data;
yading@11 28 int len, max_packet_size;
yading@11 29 uint8_t *p;
yading@11 30 const int max_frames_per_packet = s->max_frames_per_packet ? s->max_frames_per_packet : 5;
yading@11 31 const int max_au_headers_size = 2 + 2 * max_frames_per_packet;
yading@11 32
yading@11 33 /* skip ADTS header, if present */
yading@11 34 if ((s1->streams[0]->codec->extradata_size) == 0) {
yading@11 35 size -= 7;
yading@11 36 buff += 7;
yading@11 37 }
yading@11 38 max_packet_size = s->max_payload_size - max_au_headers_size;
yading@11 39
yading@11 40 /* test if the packet must be sent */
yading@11 41 len = (s->buf_ptr - s->buf);
yading@11 42 if ((s->num_frames == max_frames_per_packet) || (len && (len + size) > s->max_payload_size)) {
yading@11 43 int au_size = s->num_frames * 2;
yading@11 44
yading@11 45 p = s->buf + max_au_headers_size - au_size - 2;
yading@11 46 if (p != s->buf) {
yading@11 47 memmove(p + 2, s->buf + 2, au_size);
yading@11 48 }
yading@11 49 /* Write the AU header size */
yading@11 50 p[0] = au_size >> 5;
yading@11 51 p[1] = (au_size & 0x1F) << 3;
yading@11 52
yading@11 53 ff_rtp_send_data(s1, p, s->buf_ptr - p, 1);
yading@11 54
yading@11 55 s->num_frames = 0;
yading@11 56 }
yading@11 57 if (s->num_frames == 0) {
yading@11 58 s->buf_ptr = s->buf + max_au_headers_size;
yading@11 59 s->timestamp = s->cur_timestamp;
yading@11 60 }
yading@11 61
yading@11 62 if (size <= max_packet_size) {
yading@11 63 p = s->buf + s->num_frames++ * 2 + 2;
yading@11 64 *p++ = size >> 5;
yading@11 65 *p = (size & 0x1F) << 3;
yading@11 66 memcpy(s->buf_ptr, buff, size);
yading@11 67 s->buf_ptr += size;
yading@11 68 } else {
yading@11 69 int au_size = size;
yading@11 70
yading@11 71 max_packet_size = s->max_payload_size - 4;
yading@11 72 p = s->buf;
yading@11 73 p[0] = 0;
yading@11 74 p[1] = 16;
yading@11 75 while (size > 0) {
yading@11 76 len = FFMIN(size, max_packet_size);
yading@11 77 p[2] = au_size >> 5;
yading@11 78 p[3] = (au_size & 0x1F) << 3;
yading@11 79 memcpy(p + 4, buff, len);
yading@11 80 ff_rtp_send_data(s1, p, len + 4, len == size);
yading@11 81 size -= len;
yading@11 82 buff += len;
yading@11 83 }
yading@11 84 }
yading@11 85 }