From 9b932b8ac0c63cf52642dbe4e3953a312e6cf900 Mon Sep 17 00:00:00 2001
From: "Ronald S. Bultje" <rsbultje@gmail.com>
Date: Sat, 4 Oct 2008 04:15:06 +0000
Subject: [PATCH] Change function prototype of
 RTPDynamicPayloadHandler.parse_packet() to not use RTPDemuxContext, but
 rather take a pointer to the payload context directly. This allows using
 payload handlers regardless over the transport over which they were sent, and
 prepares for the introduction of a future RDTDemuxContext. See discussion in
 "RDT/Realmedia patches #2" thread on ML.

Originally committed as revision 15541 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavformat/rdt.c          | 11 ++++++-----
 libavformat/rtp_h264.c     |  6 ++----
 libavformat/rtp_internal.h |  4 +++-
 libavformat/rtpdec.c       |  6 ++++--
 4 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/libavformat/rdt.c b/libavformat/rdt.c
index 1fa36df04dc..cce8a8bf8a0 100644
--- a/libavformat/rdt.c
+++ b/libavformat/rdt.c
@@ -163,14 +163,13 @@ ff_rdt_parse_header(const uint8_t *buf, int len,
 
 /**< return 0 on packet, no more left, 1 on packet, 1 on partial packet... */
 static int
-rdt_parse_packet (RTPDemuxContext *s, AVPacket *pkt, uint32_t *timestamp,
+rdt_parse_packet (PayloadContext *rdt, AVStream *st,
+                  AVPacket *pkt, uint32_t *timestamp,
                   const uint8_t *buf, int len, int flags)
 {
-    PayloadContext *rdt = s->dynamic_protocol_context;
     int seq = 1, res;
     ByteIOContext *pb = rdt->rmctx->pb;
     RMContext *rm = rdt->rmctx->priv_data;
-    AVStream *st = s->st;
 
     if (rm->audio_pkt_cnt == 0) {
         int pos;
@@ -217,7 +216,8 @@ ff_rdt_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
     if (!buf) {
         /* return the next packets, if any */
         timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned....
-        rv= s->parse_packet(s, pkt, &timestamp, NULL, 0, flags);
+        rv= s->parse_packet(s->dynamic_protocol_context,
+                            s->st, pkt, &timestamp, NULL, 0, flags);
         return rv;
     }
 
@@ -235,7 +235,8 @@ ff_rdt_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
     len -= rv;
     s->seq = seq;
 
-    rv = s->parse_packet(s, pkt, &timestamp, buf, len, flags);
+    rv = s->parse_packet(s->dynamic_protocol_context,
+                         s->st, pkt, &timestamp, buf, len, flags);
 
     return rv;
 }
diff --git a/libavformat/rtp_h264.c b/libavformat/rtp_h264.c
index 861798bcb16..bc298527ec3 100644
--- a/libavformat/rtp_h264.c
+++ b/libavformat/rtp_h264.c
@@ -159,15 +159,13 @@ static void sdp_parse_fmtp_config_h264(AVStream * stream,
 }
 
 // return 0 on packet, no more left, 1 on packet, 1 on partial packet...
-static int h264_handle_packet(RTPDemuxContext * s,
+static int h264_handle_packet(PayloadContext *data,
+                              AVStream *st,
                               AVPacket * pkt,
                               uint32_t * timestamp,
                               const uint8_t * buf,
                               int len, int flags)
 {
-#ifdef DEBUG
-    PayloadContext *data = s->dynamic_protocol_context;
-#endif
     uint8_t nal = buf[0];
     uint8_t type = (nal & 0x1f);
     int result= 0;
diff --git a/libavformat/rtp_internal.h b/libavformat/rtp_internal.h
index c1d9001a17b..448d1fabe9f 100644
--- a/libavformat/rtp_internal.h
+++ b/libavformat/rtp_internal.h
@@ -46,13 +46,15 @@ typedef struct PayloadContext PayloadContext;
  * Packet parsing for "private" payloads in the RTP specs.
  *
  * @param s stream context
+ * @param st stream that this packet belongs to
  * @param pkt packet in which to write the parsed data
  * @param timestamp pointer in which to write the timestamp of this RTP packet
  * @param buf pointer to raw RTP packet data
  * @param len length of buf
  * @param flags flags from the RTP packet header (PKT_FLAG_*)
  */
-typedef int (*DynamicPayloadPacketHandlerProc) (struct RTPDemuxContext * s,
+typedef int (*DynamicPayloadPacketHandlerProc) (PayloadContext *s,
+                                                AVStream *st,
                                                 AVPacket * pkt,
                                                 uint32_t *timestamp,
                                                 const uint8_t * buf,
diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index 119682041d5..4c33544afb1 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -399,7 +399,8 @@ int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
         /* return the next packets, if any */
         if(s->st && s->parse_packet) {
             timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned....
-            rv= s->parse_packet(s, pkt, &timestamp, NULL, 0, flags);
+            rv= s->parse_packet(s->dynamic_protocol_context,
+                                s->st, pkt, &timestamp, NULL, 0, flags);
             finalize_packet(s, pkt, timestamp);
             return rv;
         } else {
@@ -463,7 +464,8 @@ int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
             return 1;
         }
     } else if (s->parse_packet) {
-        rv = s->parse_packet(s, pkt, &timestamp, buf, len, flags);
+        rv = s->parse_packet(s->dynamic_protocol_context,
+                             s->st, pkt, &timestamp, buf, len, flags);
     } else {
         // at this point, the RTP header has been stripped;  This is ASSUMING that there is only 1 CSRC, which in't wise.
         switch(st->codec->codec_id) {
-- 
GitLab