mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-23 11:39:49 +00:00
rtpdec_hevc: Share the implementation of parsing a=framesize with h264
Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
5956f489d0
commit
8633fb47db
@ -42,6 +42,7 @@ int ff_h264_handle_aggregated_packet(AVFormatContext *ctx, AVPacket *pkt,
|
||||
const uint8_t *buf, int len,
|
||||
int start_skip, int *nal_counters,
|
||||
int nal_mask);
|
||||
void ff_h264_parse_framesize(AVCodecContext *codec, const char *p);
|
||||
|
||||
extern RTPDynamicProtocolHandler ff_ac3_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler;
|
||||
|
@ -177,6 +177,28 @@ static int sdp_parse_fmtp_config_h264(AVFormatContext *s,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ff_h264_parse_framesize(AVCodecContext *codec, const char *p)
|
||||
{
|
||||
char buf1[50];
|
||||
char *dst = buf1;
|
||||
|
||||
// remove the protocol identifier
|
||||
while (*p && *p == ' ')
|
||||
p++; // strip spaces.
|
||||
while (*p && *p != ' ')
|
||||
p++; // eat protocol identifier
|
||||
while (*p && *p == ' ')
|
||||
p++; // strip trailing spaces.
|
||||
while (*p && *p != '-' && (dst - buf1) < sizeof(buf1) - 1)
|
||||
*dst++ = *p++;
|
||||
*dst = '\0';
|
||||
|
||||
// a='framesize:96 320-240'
|
||||
// set our parameters
|
||||
codec->width = atoi(buf1);
|
||||
codec->height = atoi(p + 1); // skip the -
|
||||
}
|
||||
|
||||
int ff_h264_handle_aggregated_packet(AVFormatContext *ctx, AVPacket *pkt,
|
||||
const uint8_t *buf, int len,
|
||||
int skip_between, int *nal_counters,
|
||||
@ -361,34 +383,15 @@ static int parse_h264_sdp_line(AVFormatContext *s, int st_index,
|
||||
PayloadContext *h264_data, const char *line)
|
||||
{
|
||||
AVStream *stream;
|
||||
AVCodecContext *codec;
|
||||
const char *p = line;
|
||||
|
||||
if (st_index < 0)
|
||||
return 0;
|
||||
|
||||
stream = s->streams[st_index];
|
||||
codec = stream->codec;
|
||||
|
||||
if (av_strstart(p, "framesize:", &p)) {
|
||||
char buf1[50];
|
||||
char *dst = buf1;
|
||||
|
||||
// remove the protocol identifier
|
||||
while (*p && *p == ' ')
|
||||
p++; // strip spaces.
|
||||
while (*p && *p != ' ')
|
||||
p++; // eat protocol identifier
|
||||
while (*p && *p == ' ')
|
||||
p++; // strip trailing spaces.
|
||||
while (*p && *p != '-' && (dst - buf1) < sizeof(buf1) - 1)
|
||||
*dst++ = *p++;
|
||||
*dst = '\0';
|
||||
|
||||
// a='framesize:96 320-240'
|
||||
// set our parameters
|
||||
codec->width = atoi(buf1);
|
||||
codec->height = atoi(p + 1); // skip the -
|
||||
ff_h264_parse_framesize(stream->codec, p);
|
||||
} else if (av_strstart(p, "fmtp:", &p)) {
|
||||
return ff_parse_fmtp(s, stream, h264_data, p, sdp_parse_fmtp_config_h264);
|
||||
} else if (av_strstart(p, "cliprect:", &p)) {
|
||||
|
@ -138,33 +138,7 @@ static av_cold int hevc_parse_sdp_line(AVFormatContext *ctx, int st_index,
|
||||
codec = current_stream->codec;
|
||||
|
||||
if (av_strstart(sdp_line_ptr, "framesize:", &sdp_line_ptr)) {
|
||||
char str_video_width[50];
|
||||
char *str_video_width_ptr = str_video_width;
|
||||
|
||||
/*
|
||||
* parse "a=framesize:96 320-240"
|
||||
*/
|
||||
|
||||
/* ignore spaces */
|
||||
while (*sdp_line_ptr && *sdp_line_ptr == ' ')
|
||||
sdp_line_ptr++;
|
||||
/* ignore RTP payload ID */
|
||||
while (*sdp_line_ptr && *sdp_line_ptr != ' ')
|
||||
sdp_line_ptr++;
|
||||
/* ignore spaces */
|
||||
while (*sdp_line_ptr && *sdp_line_ptr == ' ')
|
||||
sdp_line_ptr++;
|
||||
/* extract the actual video resolution description */
|
||||
while (*sdp_line_ptr && *sdp_line_ptr != '-' &&
|
||||
(str_video_width_ptr - str_video_width) < sizeof(str_video_width) - 1)
|
||||
*str_video_width_ptr++ = *sdp_line_ptr++;
|
||||
/* add trailing zero byte */
|
||||
*str_video_width_ptr = '\0';
|
||||
|
||||
/* determine the width value */
|
||||
codec->width = atoi(str_video_width);
|
||||
/* jump beyond the "-" and determine the height value */
|
||||
codec->height = atoi(sdp_line_ptr + 1);
|
||||
ff_h264_parse_framesize(codec, sdp_line_ptr);
|
||||
} else if (av_strstart(sdp_line_ptr, "fmtp:", &sdp_line_ptr)) {
|
||||
int ret = ff_parse_fmtp(ctx, current_stream, hevc_data, sdp_line_ptr,
|
||||
hevc_sdp_parse_fmtp_config);
|
||||
|
Loading…
Reference in New Issue
Block a user