- if (strlen(value) == 6) {
- char buffer[3];
- // 6 characters=3 bytes, in hex.
- uint8_t profile_idc;
- uint8_t profile_iop;
- uint8_t level_idc;
-
- buffer[0] = value[0]; buffer[1] = value[1]; buffer[2] = '\0';
- profile_idc = strtol(buffer, NULL, 16);
- buffer[0] = value[2]; buffer[1] = value[3];
- profile_iop = strtol(buffer, NULL, 16);
- buffer[0] = value[4]; buffer[1] = value[5];
- level_idc = strtol(buffer, NULL, 16);
-
- av_log(codec, AV_LOG_DEBUG,
- "RTP Profile IDC: %x Profile IOP: %x Level: %x\n",
- profile_idc, profile_iop, level_idc);
- h264_data->profile_idc = profile_idc;
- h264_data->profile_iop = profile_iop;
- h264_data->level_idc = level_idc;
- }
- } else if (!strcmp(attr, "sprop-parameter-sets")) {
- uint8_t start_sequence[] = { 0, 0, 0, 1 };
- codec->extradata_size= 0;
- codec->extradata= NULL;
-
- 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)
- {
- 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;
+ if (strlen(value) == 6)
+ parse_profile_level_id(s, h264_data, value);
+ } else if (!strcmp(attr, "sprop-parameter-sets")) {
+ int ret;
+ par->extradata_size = 0;
+ av_freep(&par->extradata);
+ ret = ff_h264_parse_sprop_parameter_sets(s, &par->extradata,
+ &par->extradata_size, value);
+ av_log(s, AV_LOG_DEBUG, "Extradata set to %p (size: %d)\n",
+ par->extradata, par->extradata_size);
+ return ret;
+ }
+ return 0;
+}
+
+void ff_h264_parse_framesize(AVCodecParameters *par, 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
+ par->width = atoi(buf1);
+ par->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,
+ int nal_mask)
+{
+ int pass = 0;
+ int total_length = 0;
+ uint8_t *dst = NULL;
+ int ret;
+
+ // first we are going to figure out the total size
+ for (pass = 0; pass < 2; pass++) {
+ const uint8_t *src = buf;
+ int src_len = len;
+
+ while (src_len > 2) {
+ uint16_t nal_size = AV_RB16(src);
+
+ // consume the length of the aggregate
+ src += 2;
+ src_len -= 2;
+
+ if (nal_size <= src_len) {
+ if (pass == 0) {
+ // counting
+ total_length += sizeof(start_sequence) + nal_size;