Skip to content

Commit ce22b45

Browse files
committed
fix: sdp h265/h266 sprop set parse
1 parent d4cdc84 commit ce22b45

4 files changed

Lines changed: 51 additions & 15 deletions

File tree

librtsp/include/sdp-a-fmtp.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,10 @@ enum {
7272
struct sdp_a_fmtp_h265_t
7373
{
7474
int flags; // test with (1<<SDP_A_FMTP_H265_xxx)
75-
char sprop_vps[1];
76-
char sprop_sps[1];
77-
char sprop_pps[1];
78-
char sprop_sei[1];
75+
char sprop_vps[64];
76+
char sprop_sps[128];
77+
char sprop_pps[256];
78+
char sprop_sei[128];
7979
};
8080

8181
int sdp_a_fmtp_h265(const char* fmtp, int *format, struct sdp_a_fmtp_h265_t *h265);
@@ -91,11 +91,11 @@ enum {
9191
struct sdp_a_fmtp_h266_t
9292
{
9393
int flags; // test with (1<<SDP_A_FMTP_H266_xxx)
94-
char sprop_vps[1];
95-
char sprop_sps[1];
96-
char sprop_pps[1];
97-
char sprop_sei[1];
98-
char sprop_dci[1];
94+
char sprop_dci[64];
95+
char sprop_vps[64];
96+
char sprop_sps[128];
97+
char sprop_pps[256];
98+
char sprop_sei[128];
9999
};
100100

101101
int sdp_a_fmtp_h266(const char* fmtp, int* format, struct sdp_a_fmtp_h266_t* h266);

librtsp/source/sdp-a-fmtp.c

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ int sdp_a_fmtp_h264(const char* fmtp, int *format, struct sdp_a_fmtp_h264_t *h26
231231
// a=fmtp:98 profile-id=1; sprop-vps=<video parameter sets data>
232232
int sdp_a_fmtp_h265(const char* fmtp, int *format, struct sdp_a_fmtp_h265_t *h265)
233233
{
234-
size_t nc;
234+
size_t nc, vc;
235235
const char *p1, *p2;
236236
const char *p = fmtp;
237237

@@ -257,7 +257,7 @@ int sdp_a_fmtp_h265(const char* fmtp, int *format, struct sdp_a_fmtp_h265_t *h26
257257
while (' ' == *p) p++; // skip space
258258

259259
nc = (size_t)(p1 - p); // ptrdiff_t to size_t
260-
//vc = (size_t)(p2 - p1 - 1); // ptrdiff_t to size_t
260+
vc = (size_t)(p2 - p1 - 1); // ptrdiff_t to size_t
261261
switch (*p)
262262
{
263263
case 'i':
@@ -279,15 +279,31 @@ int sdp_a_fmtp_h265(const char* fmtp, int *format, struct sdp_a_fmtp_h265_t *h26
279279
// sprop-sei
280280
if (0 == strncasecmp("sprop-vps", p, nc))
281281
{
282+
if (vc >= sizeof(h265->sprop_vps)) return -1;
283+
h265->flags |= SDP_A_FMTP_H265_SPROP_VPS;
284+
memcpy(h265->sprop_vps, p1 + 1, vc);
285+
h265->sprop_vps[vc] = '\0';
282286
}
283287
else if (0 == strncasecmp("sprop-sps", p, nc))
284288
{
289+
if (vc >= sizeof(h265->sprop_sps)) return -1;
290+
h265->flags |= SDP_A_FMTP_H265_SPROP_SPS;
291+
memcpy(h265->sprop_sps, p1 + 1, vc);
292+
h265->sprop_sps[vc] = '\0';
285293
}
286294
else if (0 == strncasecmp("sprop-pps", p, nc))
287295
{
296+
if (vc >= sizeof(h265->sprop_pps)) return -1;
297+
h265->flags |= SDP_A_FMTP_H265_SPROP_PPS;
298+
memcpy(h265->sprop_pps, p1 + 1, vc);
299+
h265->sprop_pps[vc] = '\0';
288300
}
289301
else if (0 == strncasecmp("sprop-sei", p, nc))
290302
{
303+
if (vc >= sizeof(h265->sprop_sei)) return -1;
304+
h265->flags |= SDP_A_FMTP_H265_SPROP_SEI;
305+
memcpy(h265->sprop_sei, p1 + 1, vc);
306+
h265->sprop_sei[vc] = '\0';
291307
}
292308
break;
293309

@@ -308,7 +324,7 @@ int sdp_a_fmtp_h265(const char* fmtp, int *format, struct sdp_a_fmtp_h265_t *h26
308324
// a=fmtp:98 profile-id=1; sprop-vps=<video parameter sets data>
309325
int sdp_a_fmtp_h266(const char* fmtp, int* format, struct sdp_a_fmtp_h266_t* h266)
310326
{
311-
size_t nc;
327+
size_t nc, vc;
312328
const char* p1, * p2;
313329
const char* p = fmtp;
314330

@@ -334,7 +350,7 @@ int sdp_a_fmtp_h266(const char* fmtp, int* format, struct sdp_a_fmtp_h266_t* h26
334350
while (' ' == *p) p++; // skip space
335351

336352
nc = (size_t)(p1 - p); // ptrdiff_t to size_t
337-
//vc = (size_t)(p2 - p1 - 1); // ptrdiff_t to size_t
353+
vc = (size_t)(p2 - p1 - 1); // ptrdiff_t to size_t
338354
switch (*p)
339355
{
340356
case 'i':
@@ -357,18 +373,38 @@ int sdp_a_fmtp_h266(const char* fmtp, int* format, struct sdp_a_fmtp_h266_t* h26
357373
// sprop-sei
358374
if (0 == strncasecmp("sprop-vps", p, nc))
359375
{
376+
if (vc >= sizeof(h266->sprop_vps)) return -1;
377+
h266->flags |= SDP_A_FMTP_H266_SPROP_VPS;
378+
memcpy(h266->sprop_vps, p1 + 1, vc);
379+
h266->sprop_vps[vc] = '\0';
360380
}
361381
else if (0 == strncasecmp("sprop-sps", p, nc))
362382
{
383+
if (vc >= sizeof(h266->sprop_sps)) return -1;
384+
h266->flags |= SDP_A_FMTP_H266_SPROP_SPS;
385+
memcpy(h266->sprop_sps, p1 + 1, vc);
386+
h266->sprop_sps[vc] = '\0';
363387
}
364388
else if (0 == strncasecmp("sprop-pps", p, nc))
365389
{
390+
if (vc >= sizeof(h266->sprop_pps)) return -1;
391+
h266->flags |= SDP_A_FMTP_H266_SPROP_PPS;
392+
memcpy(h266->sprop_pps, p1 + 1, vc);
393+
h266->sprop_pps[vc] = '\0';
366394
}
367395
else if (0 == strncasecmp("sprop-sei", p, nc))
368396
{
397+
if (vc >= sizeof(h266->sprop_sei)) return -1;
398+
h266->flags |= SDP_A_FMTP_H266_SPROP_SEI;
399+
memcpy(h266->sprop_sei, p1 + 1, vc);
400+
h266->sprop_sei[vc] = '\0';
369401
}
370402
else if (0 == strncasecmp("sprop-dci", p, nc))
371403
{
404+
if (vc >= sizeof(h266->sprop_dci)) return -1;
405+
h266->flags |= SDP_A_FMTP_H266_SPROP_DCI;
406+
memcpy(h266->sprop_dci, p1 + 1, vc);
407+
h266->sprop_dci[vc] = '\0';
372408
}
373409
break;
374410

librtsp/source/sdp/sdp-h265.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,5 @@ int sdp_h265_load(uint8_t* data, int bytes, const char* vps, const char* sps, co
9090
}
9191
}
9292

93-
return 0;
93+
return off;
9494
}

librtsp/source/sdp/sdp-h266.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,5 @@ int sdp_h266_load(uint8_t* data, int bytes, const char* vps, const char* sps, co
9292
}
9393
}
9494

95-
return 0;
95+
return off;
9696
}

0 commit comments

Comments
 (0)