Commit 7b18d94c authored by Josh Allmann's avatar Josh Allmann Committed by Martin Storsjö

Add RTP packetization of VP8

Patch by Josh Allmann, joshua dot allmann at gmail

Originally committed as revision 24797 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 63638a3c
......@@ -219,6 +219,7 @@ OBJS-$(CONFIG_RTP_MUXER) += rtp.o \
rtpenc_mpv.o \
rtpenc.o \
rtpenc_h264.o \
rtpenc_vp8.o \
rtpenc_xiph.o \
avc.o
OBJS-$(CONFIG_RTSP_DEMUXER) += rtsp.o httpauth.o
......
......@@ -55,6 +55,7 @@ static int is_supported(enum CodecID id)
case CODEC_ID_AMR_WB:
case CODEC_ID_VORBIS:
case CODEC_ID_THEORA:
case CODEC_ID_VP8:
return 1;
default:
return 0;
......@@ -144,6 +145,9 @@ static int rtp_write_header(AVFormatContext *s1)
s->max_payload_size -= 6; // ident+frag+tdt/vdt+pkt_num+pkt_length
s->num_frames = 0;
goto defaultcase;
case CODEC_ID_VP8:
av_log(s1, AV_LOG_WARNING, "RTP VP8 payload is still experimental\n");
break;
case CODEC_ID_AMR_NB:
case CODEC_ID_AMR_WB:
if (!s->max_frames_per_packet)
......@@ -407,6 +411,9 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
case CODEC_ID_THEORA:
ff_rtp_send_xiph(s1, pkt->data, size);
break;
case CODEC_ID_VP8:
ff_rtp_send_vp8(s1, pkt->data, size);
break;
default:
/* better than nothing : send the codec raw data */
rtp_send_raw(s1, pkt->data, size);
......
......@@ -68,5 +68,6 @@ void ff_rtp_send_aac(AVFormatContext *s1, const uint8_t *buff, int size);
void ff_rtp_send_amr(AVFormatContext *s1, const uint8_t *buff, int size);
void ff_rtp_send_mpegvideo(AVFormatContext *s1, const uint8_t *buf1, int size);
void ff_rtp_send_xiph(AVFormatContext *s1, const uint8_t *buff, int size);
void ff_rtp_send_vp8(AVFormatContext *s1, const uint8_t *buff, int size);
#endif /* AVFORMAT_RTPENC_H */
/*
* RTP VP8 Packetizer
* Copyright (c) 2010 Josh Allmann
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "rtpenc.h"
/* Based on a draft spec for VP8 RTP.
* ( http://www.webmproject.org/code/specs/rtp/ ) */
void ff_rtp_send_vp8(AVFormatContext *s1, const uint8_t *buf, int size)
{
RTPMuxContext *s = s1->priv_data;
int len, max_packet_size;
s->buf_ptr = s->buf;
s->timestamp = s->cur_timestamp;
max_packet_size = s->max_payload_size - 1; // minus one for header byte
*s->buf_ptr++ = 1; // 0b1 indicates start of frame
while (size > 0) {
len = FFMIN(size, max_packet_size);
memcpy(s->buf_ptr, buf, len);
ff_rtp_send_data(s1, s->buf, len+1, size == len); // marker bit is last packet in frame
size -= len;
buf += len;
s->buf_ptr = s->buf;
*s->buf_ptr++ = 0; // payload descriptor
}
}
......@@ -412,6 +412,10 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
c->width, c->height, pix_fmt, config);
break;
}
case CODEC_ID_VP8:
av_strlcatf(buff, size, "a=rtpmap:%d VP8/90000\r\n",
payload_type);
break;
default:
/* Nothing special to do here... */
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment