rtpdec_hevc: Share the implementation of parsing a=framesize with h264

Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
Martin Storsjö 2015-02-23 20:59:41 +02:00
parent 5956f489d0
commit 8633fb47db
3 changed files with 25 additions and 47 deletions

View File

@ -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;

View File

@ -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)) {

View File

@ -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);