[FFmpeg-cvslog] rtp: h264: Move parse_sprop_parameter_sets parsing to a function
Luca Barbato
git at videolan.org
Sun Feb 15 21:03:50 CET 2015
ffmpeg | branch: master | Luca Barbato <lu_zero at gentoo.org> | Fri Feb 13 23:38:14 2015 +0100| [a9a0b8d6c14ece1b4698c6ede9227aca980f6c5b] | committer: Luca Barbato
rtp: h264: Move parse_sprop_parameter_sets parsing to a function
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a9a0b8d6c14ece1b4698c6ede9227aca980f6c5b
---
libavformat/rtpdec_h264.c | 100 +++++++++++++++++++++++++--------------------
1 file changed, 55 insertions(+), 45 deletions(-)
diff --git a/libavformat/rtpdec_h264.c b/libavformat/rtpdec_h264.c
index fa53304..75013cf 100644
--- a/libavformat/rtpdec_h264.c
+++ b/libavformat/rtpdec_h264.c
@@ -93,6 +93,60 @@ static void parse_profile_level_id(AVFormatContext *s,
h264_data->level_idc = level_idc;
}
+static int parse_sprop_parameter_sets(AVFormatContext *s,
+ AVCodecContext *codec,
+ char *value)
+{
+ char base64packet[1024];
+ uint8_t decoded_packet[1024];
+ int packet_size;
+
+ while (*value) {
+ char *dst = base64packet;
+
+ while (*value && *value != ','
+ && (dst - base64packet) < sizeof(base64packet) - 1) {
+ *dst++ = *value++;
+ }
+ *dst++ = '\0';
+
+ if (*value == ',')
+ value++;
+
+ packet_size = av_base64_decode(decoded_packet, base64packet,
+ sizeof(decoded_packet));
+ if (packet_size > 0) {
+ uint8_t *dest = av_malloc(packet_size + sizeof(start_sequence) +
+ codec->extradata_size +
+ FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!dest) {
+ av_log(s, AV_LOG_ERROR,
+ "Unable to allocate memory for extradata!\n");
+ return AVERROR(ENOMEM);
+ }
+ if (codec->extradata_size) {
+ memcpy(dest, codec->extradata, codec->extradata_size);
+ av_free(codec->extradata);
+ }
+
+ memcpy(dest + codec->extradata_size, start_sequence,
+ sizeof(start_sequence));
+ memcpy(dest + codec->extradata_size + sizeof(start_sequence),
+ decoded_packet, packet_size);
+ memset(dest + codec->extradata_size + sizeof(start_sequence) +
+ packet_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+
+ codec->extradata = dest;
+ codec->extradata_size += 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;
+}
+
static int sdp_parse_fmtp_config_h264(AVFormatContext *s,
AVStream *stream,
PayloadContext *h264_data,
@@ -121,51 +175,7 @@ static int sdp_parse_fmtp_config_h264(AVFormatContext *s,
} else if (!strcmp(attr, "sprop-parameter-sets")) {
codec->extradata_size = 0;
av_freep(&codec->extradata);
-
- while (*value) {
- char base64packet[1024];
- uint8_t decoded_packet[1024];
- int packet_size;
- char *dst = base64packet;
-
- while (*value && *value != ','
- && (dst - base64packet) < sizeof(base64packet) - 1) {
- *dst++ = *value++;
- }
- *dst++ = '\0';
-
- if (*value == ',')
- value++;
-
- packet_size = av_base64_decode(decoded_packet, base64packet,
- sizeof(decoded_packet));
- if (packet_size > 0) {
- uint8_t *dest = av_malloc(packet_size + sizeof(start_sequence) +
- codec->extradata_size +
- FF_INPUT_BUFFER_PADDING_SIZE);
- if (!dest) {
- av_log(s, AV_LOG_ERROR,
- "Unable to allocate memory for extradata!\n");
- return AVERROR(ENOMEM);
- }
- if (codec->extradata_size) {
- memcpy(dest, codec->extradata, codec->extradata_size);
- av_free(codec->extradata);
- }
-
- memcpy(dest + codec->extradata_size, start_sequence,
- sizeof(start_sequence));
- memcpy(dest + codec->extradata_size + sizeof(start_sequence),
- decoded_packet, packet_size);
- memset(dest + codec->extradata_size + sizeof(start_sequence) +
- packet_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
-
- codec->extradata = dest;
- codec->extradata_size += sizeof(start_sequence) + packet_size;
- }
- }
- av_log(s, AV_LOG_DEBUG, "Extradata set to %p (size: %d)!\n",
- codec->extradata, codec->extradata_size);
+ return parse_sprop_parameter_sets(s, codec, value);
}
return 0;
}
More information about the ffmpeg-cvslog
mailing list