Skip to content

Commit 20e7f95

Browse files
committed
refactor: replace tcp_buffer with response_buffer in RTSP session handling
1 parent 7a27020 commit 20e7f95

File tree

4 files changed

+435
-449
lines changed

4 files changed

+435
-449
lines changed

src/rtsp.c

Lines changed: 23 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ void rtsp_session_init(rtsp_session_t *session)
136136
session->transport_protocol = RTSP_PROTOCOL_RTP; /* Default protocol */
137137
session->rtp_channel = 0;
138138
session->rtcp_channel = 1;
139-
session->tcp_buffer_pos = 0;
140139

141140
/* Initialize RTP packet tracking */
142141
session->current_seqn = 0;
@@ -1148,17 +1147,9 @@ static int rtsp_try_receive_response(rtsp_session_t *session)
11481147
/* For TCP interleaved mode, preserve any RTP data that came after PLAY response */
11491148
if (session->transport_mode == RTSP_TRANSPORT_TCP && extra_data_len > 0)
11501149
{
1151-
/* Move extra data to tcp_buffer for processing */
1152-
if (extra_data_len <= BUFFER_POOL_BUFFER_SIZE)
1153-
{
1154-
memcpy(session->tcp_buffer, end_of_headers + 4, extra_data_len);
1155-
session->tcp_buffer_pos = extra_data_len;
1156-
logger(LOG_DEBUG, "RTSP: Preserved %zu bytes of RTP data after PLAY response", extra_data_len);
1157-
}
1158-
else
1159-
{
1160-
logger(LOG_ERROR, "RTSP: Extra data after PLAY response too large (%zu bytes), discarding", extra_data_len);
1161-
}
1150+
memmove(session->response_buffer, end_of_headers + 4, extra_data_len);
1151+
session->response_buffer_pos = extra_data_len;
1152+
logger(LOG_DEBUG, "RTSP: Preserved %zu bytes of RTP data after PLAY response", extra_data_len);
11621153
}
11631154
session->response_buffer_pos = 0;
11641155
}
@@ -1305,12 +1296,12 @@ int rtsp_handle_tcp_interleaved_data(rtsp_session_t *session, connection_t *conn
13051296
{
13061297
int bytes_received;
13071298

1308-
if (session->tcp_buffer_pos < BUFFER_POOL_BUFFER_SIZE)
1299+
if (session->response_buffer_pos < RTSP_RESPONSE_BUFFER_SIZE)
13091300
{
13101301
/* Read data into local buffer (will be copied to zero-copy buffers later) */
13111302
bytes_received = recv(session->socket,
1312-
session->tcp_buffer + session->tcp_buffer_pos,
1313-
BUFFER_POOL_BUFFER_SIZE - session->tcp_buffer_pos, 0);
1303+
session->response_buffer + session->response_buffer_pos,
1304+
RTSP_RESPONSE_BUFFER_SIZE - session->response_buffer_pos, 0);
13141305
if (bytes_received < 0)
13151306
{
13161307
/* Check if it's a non-blocking would-block error */
@@ -1322,48 +1313,48 @@ int rtsp_handle_tcp_interleaved_data(rtsp_session_t *session, connection_t *conn
13221313
return -1;
13231314
}
13241315

1325-
session->tcp_buffer_pos += bytes_received;
1316+
session->response_buffer_pos += bytes_received;
13261317
}
13271318

13281319
/* Process interleaved data packets */
13291320
int bytes_forwarded = 0;
1330-
while (session->tcp_buffer_pos >= 4)
1321+
while (session->response_buffer_pos >= 4)
13311322
{
13321323
/* Check for interleaved data packet: $ + channel + length(2 bytes) + data */
1333-
if (session->tcp_buffer[0] != '$')
1324+
if (session->response_buffer[0] != '$')
13341325
{
13351326
/* Not interleaved data, might be RTSP response */
13361327
logger(LOG_DEBUG, "RTSP: Received non-interleaved data on TCP connection");
13371328
break;
13381329
}
13391330

1340-
uint8_t channel = session->tcp_buffer[1];
1341-
uint16_t packet_length = (session->tcp_buffer[2] << 8) | session->tcp_buffer[3];
1331+
uint8_t channel = session->response_buffer[1];
1332+
uint16_t packet_length = (session->response_buffer[2] << 8) | session->response_buffer[3];
13421333

13431334
/* Check if we have the complete packet and prevent buffer overflow */
1344-
if (session->tcp_buffer_pos < 4 + (size_t)packet_length)
1335+
if (session->response_buffer_pos < 4 + (size_t)packet_length)
13451336
{
13461337
break; /* Wait for more data */
13471338
}
13481339

13491340
/* Sanity check: prevent processing packets that are too large */
1350-
if (packet_length > BUFFER_POOL_BUFFER_SIZE - 4)
1341+
if (packet_length > RTSP_RESPONSE_BUFFER_SIZE - 4)
13511342
{
13521343
logger(LOG_ERROR, "RTSP: Received packet too large (%d bytes, max %zu), attempting resync",
1353-
packet_length, BUFFER_POOL_BUFFER_SIZE - 4);
1344+
packet_length, RTSP_RESPONSE_BUFFER_SIZE - 4);
13541345
/* Try to find next '$' marker to resync stream */
1355-
uint8_t *next_marker = memchr(session->tcp_buffer + 1, '$', session->tcp_buffer_pos - 1);
1346+
uint8_t *next_marker = memchr(session->response_buffer + 1, '$', session->response_buffer_pos - 1);
13561347
if (next_marker)
13571348
{
1358-
size_t skip = next_marker - session->tcp_buffer;
1359-
memmove(session->tcp_buffer, next_marker, session->tcp_buffer_pos - skip);
1360-
session->tcp_buffer_pos -= skip;
1349+
size_t skip = next_marker - session->response_buffer;
1350+
memmove(session->response_buffer, next_marker, session->response_buffer_pos - skip);
1351+
session->response_buffer_pos -= skip;
13611352
logger(LOG_DEBUG, "RTSP: Resynced stream, skipped %zu bytes", skip);
13621353
}
13631354
else
13641355
{
13651356
/* No marker found, reset buffer */
1366-
session->tcp_buffer_pos = 0;
1357+
session->response_buffer_pos = 0;
13671358
logger(LOG_DEBUG, "RTSP: No sync marker found, buffer reset");
13681359
}
13691360
break;
@@ -1375,7 +1366,7 @@ int rtsp_handle_tcp_interleaved_data(rtsp_session_t *session, connection_t *conn
13751366
buffer_ref_t *packet_buf = buffer_pool_alloc();
13761367
if (packet_buf)
13771368
{
1378-
memcpy(packet_buf->data, &session->tcp_buffer[4], packet_length);
1369+
memcpy(packet_buf->data, &session->response_buffer[4], packet_length);
13791370
packet_buf->data_size = (size_t)packet_length;
13801371
int pb = stream_process_rtp_payload(&conn->stream, packet_buf, &session->current_seqn, &session->not_first_packet);
13811372
if (pb > 0)
@@ -1397,9 +1388,9 @@ int rtsp_handle_tcp_interleaved_data(rtsp_session_t *session, connection_t *conn
13971388

13981389
/* Remove processed packet from buffer */
13991390
int total_packet_size = 4 + packet_length;
1400-
memmove(session->tcp_buffer, &session->tcp_buffer[total_packet_size],
1401-
session->tcp_buffer_pos - total_packet_size);
1402-
session->tcp_buffer_pos -= total_packet_size;
1391+
memmove(session->response_buffer, &session->response_buffer[total_packet_size],
1392+
session->response_buffer_pos - total_packet_size);
1393+
session->response_buffer_pos -= total_packet_size;
14031394
}
14041395

14051396
return bytes_forwarded;
@@ -1494,9 +1485,6 @@ static void rtsp_force_cleanup(rtsp_session_t *session)
14941485
/* Close and remove UDP sockets from epoll */
14951486
rtsp_close_udp_sockets(session, "cleanup");
14961487

1497-
/* Reset TCP buffer position */
1498-
session->tcp_buffer_pos = 0;
1499-
15001488
/* Reset response buffer position */
15011489
session->response_buffer_pos = 0;
15021490

src/rtsp.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,6 @@ typedef struct
166166

167167
/* Buffering */
168168
uint8_t response_buffer[RTSP_RESPONSE_BUFFER_SIZE]; /* Buffer for RTSP responses (control plane, not media) */
169-
uint8_t tcp_buffer[4 * BUFFER_POOL_BUFFER_SIZE]; /* Local buffer for TCP interleaved data (data will be copied to zero-copy buffers for send) */
170-
size_t tcp_buffer_pos; /* Current position in TCP buffer */
171169
} rtsp_session_t;
172170

173171
/* Function prototypes */

0 commit comments

Comments
 (0)