|
|
|
@ -30,10 +30,6 @@ |
|
|
|
|
* Single Nal Unit Mode (0), or |
|
|
|
|
* Non-Interleaved Mode (1). It currently does not support |
|
|
|
|
* Interleaved Mode (2). (This requires implementing STAP-B, MTAP16, MTAP24, FU-B packet types) |
|
|
|
|
* |
|
|
|
|
* @note TODO: |
|
|
|
|
* 1) RTCP sender reports for udp streams are required.. |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include "libavutil/base64.h" |
|
|
|
@ -49,21 +45,17 @@ |
|
|
|
|
#include "rtpdec.h" |
|
|
|
|
#include "rtpdec_formats.h" |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
RTP/H264 specific private data. |
|
|
|
|
*/ |
|
|
|
|
struct PayloadContext { |
|
|
|
|
//sdp setup parameters
|
|
|
|
|
uint8_t profile_idc; ///< from the sdp setup parameters.
|
|
|
|
|
uint8_t profile_iop; ///< from the sdp setup parameters.
|
|
|
|
|
uint8_t level_idc; ///< from the sdp setup parameters.
|
|
|
|
|
int packetization_mode; ///< from the sdp setup parameters.
|
|
|
|
|
uint8_t profile_idc; |
|
|
|
|
uint8_t profile_iop; |
|
|
|
|
uint8_t level_idc; |
|
|
|
|
int packetization_mode; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
int packet_types_received[32]; |
|
|
|
|
#endif |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* ---------------- private code */ |
|
|
|
|
static int sdp_parse_fmtp_config_h264(AVStream * stream, |
|
|
|
|
PayloadContext * h264_data, |
|
|
|
|
char *attr, char *value) |
|
|
|
@ -99,7 +91,6 @@ static int sdp_parse_fmtp_config_h264(AVStream * stream, |
|
|
|
|
buffer[0] = value[4]; buffer[1] = value[5]; |
|
|
|
|
level_idc = strtol(buffer, NULL, 16); |
|
|
|
|
|
|
|
|
|
// set the parameters...
|
|
|
|
|
av_log(codec, AV_LOG_DEBUG, |
|
|
|
|
"RTP Profile IDC: %x Profile IOP: %x Level: %x\n", |
|
|
|
|
profile_idc, profile_iop, level_idc); |
|
|
|
@ -136,7 +127,6 @@ static int sdp_parse_fmtp_config_h264(AVStream * stream, |
|
|
|
|
{ |
|
|
|
|
if(codec->extradata_size) |
|
|
|
|
{ |
|
|
|
|
// av_realloc?
|
|
|
|
|
memcpy(dest, codec->extradata, codec->extradata_size); |
|
|
|
|
av_free(codec->extradata); |
|
|
|
|
} |
|
|
|
@ -213,7 +203,7 @@ static int h264_handle_packet(AVFormatContext *ctx, |
|
|
|
|
int src_len= len; |
|
|
|
|
|
|
|
|
|
while (src_len > 2) { |
|
|
|
|
uint16_t nal_size = AV_RB16(src); // this going to be a problem if unaligned (can it be?)
|
|
|
|
|
uint16_t nal_size = AV_RB16(src); |
|
|
|
|
|
|
|
|
|
// consume the length of the aggregate...
|
|
|
|
|
src += 2; |
|
|
|
@ -275,7 +265,7 @@ static int h264_handle_packet(AVFormatContext *ctx, |
|
|
|
|
if (len > 1) { |
|
|
|
|
// these are the same as above, we just redo them here for clarity...
|
|
|
|
|
uint8_t fu_indicator = nal; |
|
|
|
|
uint8_t fu_header = *buf; // read the fu_header.
|
|
|
|
|
uint8_t fu_header = *buf; |
|
|
|
|
uint8_t start_bit = fu_header >> 7; |
|
|
|
|
// uint8_t end_bit = (fu_header & 0x40) >> 6;
|
|
|
|
|
uint8_t nal_type = (fu_header & 0x1f); |
|
|
|
@ -322,7 +312,6 @@ static int h264_handle_packet(AVFormatContext *ctx, |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ---------------- public code */ |
|
|
|
|
static PayloadContext *h264_new_context(void) |
|
|
|
|
{ |
|
|
|
|
return av_mallocz(sizeof(PayloadContext) + FF_INPUT_BUFFER_PADDING_SIZE); |
|
|
|
@ -380,12 +369,9 @@ static int parse_h264_sdp_line(AVFormatContext *s, int st_index, |
|
|
|
|
// could use this if we wanted.
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; // keep processing it the normal way...
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This is the structure for expanding on the dynamic rtp protocols (makes everything static. yay!) |
|
|
|
|
*/ |
|
|
|
|
RTPDynamicProtocolHandler ff_h264_dynamic_handler = { |
|
|
|
|
.enc_name = "H264", |
|
|
|
|
.codec_type = AVMEDIA_TYPE_VIDEO, |
|
|
|
|