const AVClass *class;
URLContext* stream; ///< TCP stream used in interactions with RTMP server
RTMPPacket prev_pkt[2][RTMP_CHANNELS]; ///< packet history used when reading and sending packets
- int chunk_size; ///< size of the chunks RTMP packets are divided into
+ int in_chunk_size; ///< size of the chunks incoming RTMP packets are divided into
+ int out_chunk_size; ///< size of the chunks outgoing RTMP packets are divided into
int is_input; ///< input/output flag
char *playpath; ///< stream identifier to play (with possible "mp4:" prefix)
int live; ///< 0: recorded, -1: live, -2: both
goto fail;
}
- ret = ff_rtmp_packet_write(rt->stream, pkt, rt->chunk_size,
+ ret = ff_rtmp_packet_write(rt->stream, pkt, rt->out_chunk_size,
rt->prev_pkt[1]);
fail:
ff_rtmp_packet_destroy(pkt);
}
if (!rt->is_input) {
- if ((ret = ff_rtmp_packet_write(rt->stream, pkt, rt->chunk_size,
+ /* Send the same chunk size change packet back to the server,
+ * setting the outgoing chunk size to the same as the incoming one. */
+ if ((ret = ff_rtmp_packet_write(rt->stream, pkt, rt->out_chunk_size,
rt->prev_pkt[1])) < 0)
return ret;
+ rt->out_chunk_size = AV_RB32(pkt->data);
}
- rt->chunk_size = AV_RB32(pkt->data);
- if (rt->chunk_size <= 0) {
- av_log(s, AV_LOG_ERROR, "Incorrect chunk size %d\n", rt->chunk_size);
+ rt->in_chunk_size = AV_RB32(pkt->data);
+ if (rt->in_chunk_size <= 0) {
+ av_log(s, AV_LOG_ERROR, "Incorrect chunk size %d\n",
+ rt->in_chunk_size);
return AVERROR_INVALIDDATA;
}
- av_log(s, AV_LOG_DEBUG, "New chunk size = %d\n", rt->chunk_size);
+ av_log(s, AV_LOG_DEBUG, "New incoming chunk size = %d\n",
+ rt->in_chunk_size);
return 0;
}
for (;;) {
RTMPPacket rpkt = { 0 };
if ((ret = ff_rtmp_packet_read(rt->stream, &rpkt,
- rt->chunk_size, rt->prev_pkt[0])) <= 0) {
+ rt->in_chunk_size, rt->prev_pkt[0])) <= 0) {
if (ret == 0) {
return AVERROR(EAGAIN);
} else {
if ((ret = rtmp_handshake(s, rt)) < 0)
goto fail;
- rt->chunk_size = 128;
+ rt->out_chunk_size = 128;
+ rt->in_chunk_size = 128; // Probably overwritten later
rt->state = STATE_HANDSHAKED;
// Keep the application name when it has been defined by the user.
RTMPPacket rpkt = { 0 };
if ((ret = ff_rtmp_packet_read_internal(rt->stream, &rpkt,
- rt->chunk_size,
+ rt->in_chunk_size,
rt->prev_pkt[0], c)) <= 0)
return ret;