[Ffmpeg-devel] RTP patches & RFC
Mon Oct 9 16:55:04 CEST 2006
I'm finalizing my h264/rtp patch, and had some questions about what
would be the "best" way (or accepted) to do things:
1) All of my h264 specific stuff is in a separate file, currently
called rtp_h264.c. It has 4 functions that aren't static:
void sdp_parse_fmtp_config_h264(struct AVCodecContext *codec, struct
h264_rtp_extra_data *h264_data, char *attr, char *value);
struct h264_rtp_extra_data *new_h264_extradata();
void free_h264_extra_data(struct h264_rtp_extra_data *data);
int handle_h264_rtp_packet(struct RTPDemuxContext *s, AVPacket *pkt,
uint32_t timestamp, const uint8_t *buf, int len);
I think what I would like to do is extend AVRtpPayloadType_s to
include function pointers for the above, and make the sdp_parse
function more generic (return a boolean and be called first for any
sdp line). That way, if we added more rtp payload types that
required different processing, we could just add more function
pointers to that table, and create another file. In fact, we could
break out the mpeg_ts and AAC stuff that is special now into separate
files. (This would also facilitate #ifdef'ing out various RTP
functionality, if needed).
2) Because I am using the RTPDemuxContext * in my handle function, I
have to have that structure visible. (It is currently private to
rtp.c) So I moved it into rtp.h. Is this okay? If we were to go
with more of a function pointer/plugin structure, should I create a
file called rtp_private.h (or something) to hold things that are
shared among the rtp code, but nowhere else?
3) My sdp parsing code uses a few functions from rtsp.c:
redir_isspace, skip_spaces, and get_word_sep. These are all small
functions, but I hate duplicating code. What's the best solution for
this? Make those functions non-static in rtsp.c?
4) The AAC stuff in rtp doesn't compute the pkts, or use the
timestamp field of the rtp packet. I assume this is because timing
information is inherent in the frequency of the audio, but I'm not
sure. What do I need to do to make the AAC audio sync to the video?
(I am using ffplay as a test harness).
5) My code in rtp_h264 uses linked lists. It creates packets, copies
stuff into them, resizes them, etc. It means at best 2 copies per
packet (from the UDP buffer, to my packet, to the AVPacket), and at
worst it could be many copies (I have to aggregate all of the packets
for a given timestamp together). My philosophy is "get it working,
then make it fast.". Are these acceptable issues? I could keep a
pool of packets around, but the payloads are various sizes.
Alternatively could set it up the way tcp handles it's streams, but
that's a lot of pointer overhead and room for error.
6) Finally, I have a Base64 decoding routine for the sdp/pps packets
that are sent in the sdp stream. Does this exist elsewhere in the
Thanks for any pointers and solutions!
More information about the ffmpeg-devel