* RTMP input format
* Copyright (c) 2009 Kostya Shishkov
*
- * This file is part of FFmpeg.
+ * This file is part of Libav.
*
- * FFmpeg is free software; you can redistribute it and/or
+ * Libav 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,
+ * Libav 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
+ * License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavcodec/bytestream.h"
#include "libavutil/avstring.h"
+#include "libavutil/intfloat_readwrite.h"
#include "avformat.h"
#include "rtmppkt.h"
#include "flv.h"
+#include "url.h"
void ff_amf_write_bool(uint8_t **dst, int val)
{
enum RTMPPacketType type;
int size = 0;
- if (url_read(h, &hdr, 1) != 1)
+ if (ffurl_read(h, &hdr, 1) != 1)
return AVERROR(EIO);
size++;
channel_id = hdr & 0x3F;
if (channel_id < 2) { //special case for channel number >= 64
buf[1] = 0;
- if (url_read_complete(h, buf, channel_id + 1) != channel_id + 1)
+ if (ffurl_read_complete(h, buf, channel_id + 1) != channel_id + 1)
return AVERROR(EIO);
size += channel_id + 1;
channel_id = AV_RL16(buf) + 64;
if (hdr == RTMP_PS_ONEBYTE) {
timestamp = prev_pkt[channel_id].ts_delta;
} else {
- if (url_read_complete(h, buf, 3) != 3)
+ if (ffurl_read_complete(h, buf, 3) != 3)
return AVERROR(EIO);
size += 3;
timestamp = AV_RB24(buf);
if (hdr != RTMP_PS_FOURBYTES) {
- if (url_read_complete(h, buf, 3) != 3)
+ if (ffurl_read_complete(h, buf, 3) != 3)
return AVERROR(EIO);
size += 3;
data_size = AV_RB24(buf);
- if (url_read_complete(h, buf, 1) != 1)
+ if (ffurl_read_complete(h, buf, 1) != 1)
return AVERROR(EIO);
size++;
type = buf[0];
if (hdr == RTMP_PS_TWELVEBYTES) {
- if (url_read_complete(h, buf, 4) != 4)
+ if (ffurl_read_complete(h, buf, 4) != 4)
return AVERROR(EIO);
size += 4;
extra = AV_RL32(buf);
}
}
if (timestamp == 0xFFFFFF) {
- if (url_read_complete(h, buf, 4) != 4)
+ if (ffurl_read_complete(h, buf, 4) != 4)
return AVERROR(EIO);
timestamp = AV_RB32(buf);
}
prev_pkt[channel_id].extra = extra;
while (data_size > 0) {
int toread = FFMIN(data_size, chunk_size);
- if (url_read_complete(h, p->data + offset, toread) != toread) {
+ if (ffurl_read_complete(h, p->data + offset, toread) != toread) {
ff_rtmp_packet_destroy(p);
return AVERROR(EIO);
}
offset += chunk_size;
size += chunk_size;
if (data_size > 0) {
- url_read_complete(h, &t, 1); //marker
+ ffurl_read_complete(h, &t, 1); //marker
size++;
if (t != (0xC0 + channel_id))
return -1;
}
prev_pkt[pkt->channel_id].extra = pkt->extra;
- url_write(h, pkt_hdr, p-pkt_hdr);
+ ffurl_write(h, pkt_hdr, p-pkt_hdr);
size = p - pkt_hdr + pkt->data_size;
while (off < pkt->data_size) {
int towrite = FFMIN(chunk_size, pkt->data_size - off);
- url_write(h, pkt->data + off, towrite);
+ ffurl_write(h, pkt->data + off, towrite);
off += towrite;
if (off < pkt->data_size) {
uint8_t marker = 0xC0 | pkt->channel_id;
- url_write(h, &marker, 1);
+ ffurl_write(h, &marker, 1);
size++;
}
}
int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type,
int timestamp, int size)
{
- pkt->data = av_malloc(size);
- if (!pkt->data)
- return AVERROR(ENOMEM);
+ if (size) {
+ pkt->data = av_malloc(size);
+ if (!pkt->data)
+ return AVERROR(ENOMEM);
+ }
pkt->data_size = size;
pkt->channel_id = channel_id;
pkt->type = type;
if (data[-1] == AMF_DATA_TYPE_STRING) {
size = bytestream_get_be16(&data);
} else {
- size = bytestream_get_be32(data);
+ size = bytestream_get_be32(&data);
}
size = FFMIN(size, 1023);
memcpy(buf, data, size);