changeset 4387:5c42816e12c6 libavformat

Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This allows these functions to peek back and retrieve values from the demuxer's context (or RTSPState). The ASF/RTP payload parser will use this to be able to parse SDP values (which occur even before the payload ID is given), store them in the RTSPState and then retrieve them while parsing payload data. See "[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet() function pointer (was: transport context)" mailinglist thread.
author rbultje
date Fri, 06 Feb 2009 01:37:19 +0000
parents 3dbd7fa2c2af
children 80f21f72d7d6
files rdt.c rtp.h rtp_h264.c rtpdec.c
diffstat 4 files changed, 10 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/rdt.c	Thu Feb 05 22:34:55 2009 +0000
+++ b/rdt.c	Fri Feb 06 01:37:19 2009 +0000
@@ -295,7 +295,7 @@
 
 /**< return 0 on packet, no more left, 1 on packet, 1 on partial packet... */
 static int
-rdt_parse_packet (PayloadContext *rdt, AVStream *st,
+rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st,
                   AVPacket *pkt, uint32_t *timestamp,
                   const uint8_t *buf, int len, int flags)
 {
@@ -347,7 +347,7 @@
     if (!buf && s->prev_stream_id != -1) {
         /* 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->dynamic_protocol_context,
+        rv= s->parse_packet(s->ic, s->dynamic_protocol_context,
                             s->streams[s->prev_stream_id],
                             pkt, &timestamp, NULL, 0, flags);
         return rv;
@@ -374,7 +374,7 @@
          return -1;
      }
 
-    rv = s->parse_packet(s->dynamic_protocol_context,
+    rv = s->parse_packet(s->ic, s->dynamic_protocol_context,
                          s->streams[s->prev_stream_id],
                          pkt, &timestamp, buf, len, flags);
 
--- a/rtp.h	Thu Feb 05 22:34:55 2009 +0000
+++ b/rtp.h	Fri Feb 06 01:37:19 2009 +0000
@@ -107,6 +107,7 @@
 /**
  * Packet parsing for "private" payloads in the RTP specs.
  *
+ * @param ctx RTSP demuxer context
  * @param s stream context
  * @param st stream that this packet belongs to
  * @param pkt packet in which to write the parsed data
@@ -115,7 +116,8 @@
  * @param len length of buf
  * @param flags flags from the RTP packet header (PKT_FLAG_*)
  */
-typedef int (*DynamicPayloadPacketHandlerProc) (PayloadContext *s,
+typedef int (*DynamicPayloadPacketHandlerProc) (AVFormatContext *ctx,
+                                                PayloadContext *s,
                                                 AVStream *st,
                                                 AVPacket * pkt,
                                                 uint32_t *timestamp,
--- a/rtp_h264.c	Thu Feb 05 22:34:55 2009 +0000
+++ b/rtp_h264.c	Fri Feb 06 01:37:19 2009 +0000
@@ -159,7 +159,8 @@
 }
 
 // return 0 on packet, no more left, 1 on packet, 1 on partial packet...
-static int h264_handle_packet(PayloadContext *data,
+static int h264_handle_packet(AVFormatContext *ctx,
+                              PayloadContext *data,
                               AVStream *st,
                               AVPacket * pkt,
                               uint32_t * timestamp,
--- a/rtpdec.c	Thu Feb 05 22:34:55 2009 +0000
+++ b/rtpdec.c	Fri Feb 06 01:37:19 2009 +0000
@@ -407,7 +407,7 @@
         /* 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->dynamic_protocol_context,
+            rv= s->parse_packet(s->ic, s->dynamic_protocol_context,
                                 s->st, pkt, &timestamp, NULL, 0, flags);
             finalize_packet(s, pkt, timestamp);
             return rv;
@@ -472,7 +472,7 @@
             return 1;
         }
     } else if (s->parse_packet) {
-        rv = s->parse_packet(s->dynamic_protocol_context,
+        rv = s->parse_packet(s->ic, 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.