experimental mpeg4 video support (currently no slice/timestamp handling)
authorFabrice Bellard <fabrice@bellard.org>
Wed, 20 Nov 2002 20:53:32 +0000 (20:53 +0000)
committerFabrice Bellard <fabrice@bellard.org>
Wed, 20 Nov 2002 20:53:32 +0000 (20:53 +0000)
Originally committed as revision 1264 to svn://svn.ffmpeg.org/ffmpeg/trunk

libav/rtp.c

index 714787c..f36da6d 100644 (file)
@@ -85,6 +85,7 @@ enum RTPPayloadType {
     RTP_PT_MPEGVIDEO = 32,
     RTP_PT_MPEG2TS = 33,
     RTP_PT_H263 = 34, /* old H263 encapsulation */
     RTP_PT_MPEGVIDEO = 32,
     RTP_PT_MPEG2TS = 33,
     RTP_PT_H263 = 34, /* old H263 encapsulation */
+    RTP_PT_PRIVATE = 96,
 };
 
 typedef struct RTPContext {
 };
 
 typedef struct RTPContext {
@@ -358,7 +359,7 @@ static int rtp_write_header(AVFormatContext *s1)
 
     payload_type = rtp_get_payload_type(&st->codec);
     if (payload_type < 0)
 
     payload_type = rtp_get_payload_type(&st->codec);
     if (payload_type < 0)
-        return -1;
+        payload_type = RTP_PT_PRIVATE; /* private payload type */
     s->payload_type = payload_type;
 
     s->base_timestamp = random();
     s->payload_type = payload_type;
 
     s->base_timestamp = random();
@@ -570,6 +571,32 @@ static void rtp_send_mpegvideo(AVFormatContext *s1,
     s->cur_timestamp++;
 }
 
     s->cur_timestamp++;
 }
 
+static void rtp_send_raw(AVFormatContext *s1,
+                         UINT8 *buf1, int size)
+{
+    RTPContext *s = s1->priv_data;
+    AVStream *st = s1->streams[0];
+    int len, max_packet_size;
+
+    max_packet_size = s->max_payload_size;
+
+    while (size > 0) {
+        len = max_packet_size;
+        if (len > size)
+            len = size;
+
+        /* 90 KHz time stamp */
+        /* XXX: overflow */
+        s->timestamp = s->base_timestamp + 
+            (s->cur_timestamp * 90000LL * FRAME_RATE_BASE) / st->codec.frame_rate;
+        rtp_send_data(s1, buf1, len);
+
+        buf1 += len;
+        size -= len;
+    }
+    s->cur_timestamp++;
+}
+
 /* write an RTP packet. 'buf1' must contain a single specific frame. */
 static int rtp_write_packet(AVFormatContext *s1, int stream_index,
                             UINT8 *buf1, int size, int force_pts)
 /* write an RTP packet. 'buf1' must contain a single specific frame. */
 static int rtp_write_packet(AVFormatContext *s1, int stream_index,
                             UINT8 *buf1, int size, int force_pts)
@@ -615,7 +642,9 @@ static int rtp_write_packet(AVFormatContext *s1, int stream_index,
         rtp_send_mpegvideo(s1, buf1, size);
         break;
     default:
         rtp_send_mpegvideo(s1, buf1, size);
         break;
     default:
-        return AVERROR_IO;
+        /* better than nothing : send the codec raw data */
+        rtp_send_raw(s1, buf1, size);
+        break;
     }
     return 0;
 }
     }
     return 0;
 }