diff options
author | Martin Storsjö <martin@martin.st> | 2015-02-19 21:19:29 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2015-02-21 11:32:31 +0200 |
commit | 48183b3ad45c95e386a4cb02e1a68b53e6835ac5 (patch) | |
tree | 1d7c6782637561c0849875d0fb84bc51d56a401b | |
parent | a982c5d74fbc7ff5bd2f2f73af61ae48e9b1bcc6 (diff) | |
download | ffmpeg-48183b3ad45c95e386a4cb02e1a68b53e6835ac5.tar.gz |
rtpdec_h264: Generalize parse_sprop_parameter_sets
Don't write directly into an AVCodecContext, write into given
pointers.
Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r-- | libavformat/rtpdec_h264.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/libavformat/rtpdec_h264.c b/libavformat/rtpdec_h264.c index 277b3cdedd..bc563f2138 100644 --- a/libavformat/rtpdec_h264.c +++ b/libavformat/rtpdec_h264.c @@ -93,7 +93,7 @@ static void parse_profile_level_id(AVFormatContext *s, } static int parse_sprop_parameter_sets(AVFormatContext *s, - AVCodecContext *codec, + uint8_t **data_ptr, int *size_ptr, const char *value) { char base64packet[1024]; @@ -115,31 +115,28 @@ static int parse_sprop_parameter_sets(AVFormatContext *s, packet_size = av_base64_decode(decoded_packet, base64packet, sizeof(decoded_packet)); if (packet_size > 0) { - uint8_t *dest = av_realloc(codec->extradata, + uint8_t *dest = av_realloc(*data_ptr, packet_size + sizeof(start_sequence) + - codec->extradata_size + + *size_ptr + FF_INPUT_BUFFER_PADDING_SIZE); if (!dest) { av_log(s, AV_LOG_ERROR, "Unable to allocate memory for extradata!\n"); return AVERROR(ENOMEM); } - codec->extradata = dest; + *data_ptr = dest; - memcpy(dest + codec->extradata_size, start_sequence, + memcpy(dest + *size_ptr, start_sequence, sizeof(start_sequence)); - memcpy(dest + codec->extradata_size + sizeof(start_sequence), + memcpy(dest + *size_ptr + sizeof(start_sequence), decoded_packet, packet_size); - memset(dest + codec->extradata_size + sizeof(start_sequence) + + memset(dest + *size_ptr + sizeof(start_sequence) + packet_size, 0, FF_INPUT_BUFFER_PADDING_SIZE); - codec->extradata_size += sizeof(start_sequence) + packet_size; + *size_ptr += sizeof(start_sequence) + packet_size; } } - av_log(s, AV_LOG_DEBUG, "Extradata set to %p (size: %d)\n", - codec->extradata, codec->extradata_size); - return 0; } @@ -167,9 +164,14 @@ static int sdp_parse_fmtp_config_h264(AVFormatContext *s, if (strlen(value) == 6) parse_profile_level_id(s, h264_data, value); } else if (!strcmp(attr, "sprop-parameter-sets")) { + int ret; codec->extradata_size = 0; av_freep(&codec->extradata); - return parse_sprop_parameter_sets(s, codec, value); + ret = parse_sprop_parameter_sets(s, &codec->extradata, + &codec->extradata_size, value); + av_log(s, AV_LOG_DEBUG, "Extradata set to %p (size: %d)\n", + codec->extradata, codec->extradata_size); + return ret; } return 0; } |