Commit 29f9d82d authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '8633fb47'

* commit '8633fb47':
  rtpdec_hevc: Share the implementation of parsing a=framesize with h264

Conflicts:
	libavformat/rtpdec_h264.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents df388836 8633fb47
...@@ -42,6 +42,7 @@ int ff_h264_handle_aggregated_packet(AVFormatContext *ctx, PayloadContext *data, ...@@ -42,6 +42,7 @@ int ff_h264_handle_aggregated_packet(AVFormatContext *ctx, PayloadContext *data,
const uint8_t *buf, int len, const uint8_t *buf, int len,
int start_skip, int *nal_counters, int start_skip, int *nal_counters,
int nal_mask); int nal_mask);
void ff_h264_parse_framesize(AVCodecContext *codec, const char *p);
extern RTPDynamicProtocolHandler ff_ac3_dynamic_handler; extern RTPDynamicProtocolHandler ff_ac3_dynamic_handler;
extern RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler; extern RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler;
......
...@@ -177,6 +177,28 @@ static int sdp_parse_fmtp_config_h264(AVFormatContext *s, ...@@ -177,6 +177,28 @@ static int sdp_parse_fmtp_config_h264(AVFormatContext *s,
return 0; 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, PayloadContext *data, AVPacket *pkt, int ff_h264_handle_aggregated_packet(AVFormatContext *ctx, PayloadContext *data, AVPacket *pkt,
const uint8_t *buf, int len, const uint8_t *buf, int len,
int skip_between, int *nal_counters, int skip_between, int *nal_counters,
...@@ -361,34 +383,15 @@ static int parse_h264_sdp_line(AVFormatContext *s, int st_index, ...@@ -361,34 +383,15 @@ static int parse_h264_sdp_line(AVFormatContext *s, int st_index,
PayloadContext *h264_data, const char *line) PayloadContext *h264_data, const char *line)
{ {
AVStream *stream; AVStream *stream;
AVCodecContext *codec;
const char *p = line; const char *p = line;
if (st_index < 0) if (st_index < 0)
return 0; return 0;
stream = s->streams[st_index]; stream = s->streams[st_index];
codec = stream->codec;
if (av_strstart(p, "framesize:", &p)) { if (av_strstart(p, "framesize:", &p)) {
char buf1[50]; ff_h264_parse_framesize(stream->codec, p);
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 -
} else if (av_strstart(p, "fmtp:", &p)) { } else if (av_strstart(p, "fmtp:", &p)) {
return ff_parse_fmtp(s, stream, h264_data, p, sdp_parse_fmtp_config_h264); return ff_parse_fmtp(s, stream, h264_data, p, sdp_parse_fmtp_config_h264);
} else if (av_strstart(p, "cliprect:", &p)) { } else if (av_strstart(p, "cliprect:", &p)) {
......
...@@ -142,33 +142,7 @@ static av_cold int hevc_parse_sdp_line(AVFormatContext *ctx, int st_index, ...@@ -142,33 +142,7 @@ static av_cold int hevc_parse_sdp_line(AVFormatContext *ctx, int st_index,
codec = current_stream->codec; codec = current_stream->codec;
if (av_strstart(sdp_line_ptr, "framesize:", &sdp_line_ptr)) { if (av_strstart(sdp_line_ptr, "framesize:", &sdp_line_ptr)) {
char str_video_width[50]; ff_h264_parse_framesize(codec, sdp_line_ptr);
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);
} else if (av_strstart(sdp_line_ptr, "fmtp:", &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, int ret = ff_parse_fmtp(ctx, current_stream, hevc_data, sdp_line_ptr,
hevc_sdp_parse_fmtp_config); hevc_sdp_parse_fmtp_config);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment