summaryrefslogtreecommitdiff
path: root/libavformat/rtpdec_h264.c
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2015-02-13 23:38:14 +0100
committerLuca Barbato <lu_zero@gentoo.org>2015-02-15 18:20:54 +0100
commita9a0b8d6c14ece1b4698c6ede9227aca980f6c5b (patch)
tree68167b2d838a1bfe715c3736dd7ae7638caeea59 /libavformat/rtpdec_h264.c
parentb8df0b71c525e9fc9fbee790d093bae3aa62035c (diff)
rtp: h264: Move parse_sprop_parameter_sets parsing to a function
Diffstat (limited to 'libavformat/rtpdec_h264.c')
-rw-r--r--libavformat/rtpdec_h264.c100
1 files changed, 55 insertions, 45 deletions
diff --git a/libavformat/rtpdec_h264.c b/libavformat/rtpdec_h264.c
index fa53304d74..75013cff5d 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;
}