changeset 2406:18e94e5989d8 libavformat

Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
author lucabe
date Fri, 24 Aug 2007 07:13:34 +0000
parents 1c57f2391cf9
children 358bf36d580e
files Makefile rtp.c rtp_internal.h rtp_mpv.c rtp_mpv.h
diffstat 5 files changed, 109 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Fri Aug 24 00:49:46 2007 +0000
+++ b/Makefile	Fri Aug 24 07:13:34 2007 +0000
@@ -119,7 +119,7 @@
 OBJS-$(CONFIG_RM_MUXER)                  += rmenc.o
 OBJS-$(CONFIG_ROQ_DEMUXER)               += idroq.o
 OBJS-$(CONFIG_ROQ_MUXER)                 += raw.o
-OBJS-$(CONFIG_RTP_MUXER)                 += rtp.o rtp_h264.o
+OBJS-$(CONFIG_RTP_MUXER)                 += rtp.o rtp_h264.o rtp_mpv.o
 OBJS-$(CONFIG_RTSP_DEMUXER)              += rtsp.o
 OBJS-$(CONFIG_SDP_DEMUXER)               += rtsp.o
 OBJS-$(CONFIG_SEGAFILM_DEMUXER)          += segafilm.o
--- a/rtp.c	Fri Aug 24 00:49:46 2007 +0000
+++ b/rtp.c	Fri Aug 24 07:13:34 2007 +0000
@@ -27,6 +27,7 @@
 
 #include "rtp_internal.h"
 #include "rtp_h264.h"
+#include "rtp_mpv.h"
 
 //#define DEBUG
 
@@ -788,7 +789,7 @@
 
 /* send an rtp packet. sequence number is incremented, but the caller
    must update the timestamp itself */
-static void rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
+void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
 {
     RTPDemuxContext *s = s1->priv_data;
 
@@ -836,7 +837,7 @@
         n = (s->buf_ptr - s->buf);
         /* if buffer full, then send it */
         if (n >= max_packet_size) {
-            rtp_send_data(s1, s->buf, n, 0);
+            ff_rtp_send_data(s1, s->buf, n, 0);
             s->buf_ptr = s->buf;
             /* update timestamp */
             s->timestamp += n / sample_size;
@@ -859,7 +860,7 @@
     len = (s->buf_ptr - s->buf);
     if ((len + size) > max_packet_size) {
         if (len > 4) {
-            rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
+            ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
             s->buf_ptr = s->buf + 4;
             /* 90 KHz time stamp */
             s->timestamp = s->base_timestamp +
@@ -881,7 +882,7 @@
             s->buf[2] = count >> 8;
             s->buf[3] = count;
             memcpy(s->buf + 4, buf1, len);
-            rtp_send_data(s1, s->buf, len + 4, 0);
+            ff_rtp_send_data(s1, s->buf, len + 4, 0);
             size -= len;
             buf1 += len;
             count += len;
@@ -900,55 +901,6 @@
     s->cur_timestamp += st->codec->frame_size;
 }
 
-/* NOTE: a single frame must be passed with sequence header if
-   needed. XXX: use slices. */
-static void rtp_send_mpegvideo(AVFormatContext *s1,
-                               const uint8_t *buf1, int size)
-{
-    RTPDemuxContext *s = s1->priv_data;
-    AVStream *st = s1->streams[0];
-    int len, h, max_packet_size;
-    uint8_t *q;
-
-    max_packet_size = s->max_payload_size;
-
-    while (size > 0) {
-        /* XXX: more correct headers */
-        h = 0;
-        if (st->codec->sub_id == 2)
-            h |= 1 << 26; /* mpeg 2 indicator */
-        q = s->buf;
-        *q++ = h >> 24;
-        *q++ = h >> 16;
-        *q++ = h >> 8;
-        *q++ = h;
-
-        if (st->codec->sub_id == 2) {
-            h = 0;
-            *q++ = h >> 24;
-            *q++ = h >> 16;
-            *q++ = h >> 8;
-            *q++ = h;
-        }
-
-        len = max_packet_size - (q - s->buf);
-        if (len > size)
-            len = size;
-
-        memcpy(q, buf1, len);
-        q += len;
-
-        /* 90 KHz time stamp */
-        s->timestamp = s->base_timestamp +
-            av_rescale((int64_t)s->cur_timestamp * st->codec->time_base.num, 90000, st->codec->time_base.den); //FIXME pass timestamps
-        rtp_send_data(s1, s->buf, q - s->buf, (len == size));
-
-        buf1 += len;
-        size -= len;
-    }
-    s->cur_timestamp++;
-}
-
 static void rtp_send_raw(AVFormatContext *s1,
                          const uint8_t *buf1, int size)
 {
@@ -966,7 +918,7 @@
         /* 90 KHz time stamp */
         s->timestamp = s->base_timestamp +
             av_rescale((int64_t)s->cur_timestamp * st->codec->time_base.num, 90000, st->codec->time_base.den); //FIXME pass timestamps
-        rtp_send_data(s1, buf1, len, (len == size));
+        ff_rtp_send_data(s1, buf1, len, (len == size));
 
         buf1 += len;
         size -= len;
@@ -992,7 +944,7 @@
 
         out_len = s->buf_ptr - s->buf;
         if (out_len >= s->max_payload_size) {
-            rtp_send_data(s1, s->buf, out_len, 0);
+            ff_rtp_send_data(s1, s->buf, out_len, 0);
             s->buf_ptr = s->buf;
         }
     }
@@ -1042,7 +994,7 @@
         rtp_send_mpegaudio(s1, buf1, size);
         break;
     case CODEC_ID_MPEG1VIDEO:
-        rtp_send_mpegvideo(s1, buf1, size);
+        ff_rtp_send_mpegvideo(s1, buf1, size);
         break;
     case CODEC_ID_MPEG2TS:
         rtp_send_mpegts_raw(s1, buf1, size);
--- a/rtp_internal.h	Fri Aug 24 00:49:46 2007 +0000
+++ b/rtp_internal.h	Fri Aug 24 07:13:34 2007 +0000
@@ -110,5 +110,7 @@
 extern RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler;
 
 int rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size); ///< from rtsp.c, but used by rtp dynamic protocol handlers.
+
+void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m);
 #endif /* RTP_INTERNAL_H */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rtp_mpv.c	Fri Aug 24 07:13:34 2007 +0000
@@ -0,0 +1,72 @@
+/*
+ * RTP packetization for MPEG video
+ * Copyright (c) 2002 Fabrice Bellard.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "avformat.h"
+#include "rtp_internal.h"
+
+/* NOTE: a single frame must be passed with sequence header if
+   needed. XXX: use slices. */
+void ff_rtp_send_mpegvideo(AVFormatContext *s1, const uint8_t *buf1, int size)
+{
+    RTPDemuxContext *s = s1->priv_data;
+    AVStream *st = s1->streams[0];
+    int len, h, max_packet_size;
+    uint8_t *q;
+
+    max_packet_size = s->max_payload_size;
+
+    while (size > 0) {
+        /* XXX: more correct headers */
+        h = 0;
+        if (st->codec->sub_id == 2)
+            h |= 1 << 26; /* mpeg 2 indicator */
+        q = s->buf;
+        *q++ = h >> 24;
+        *q++ = h >> 16;
+        *q++ = h >> 8;
+        *q++ = h;
+
+        if (st->codec->sub_id == 2) {
+            h = 0;
+            *q++ = h >> 24;
+            *q++ = h >> 16;
+            *q++ = h >> 8;
+            *q++ = h;
+        }
+
+        len = max_packet_size - (q - s->buf);
+        if (len > size)
+            len = size;
+
+        memcpy(q, buf1, len);
+        q += len;
+
+        /* 90 KHz time stamp */
+        s->timestamp = s->base_timestamp +
+            av_rescale((int64_t)s->cur_timestamp * st->codec->time_base.num, 90000, st->codec->time_base.den); //FIXME pass timestamps
+        ff_rtp_send_data(s1, s->buf, q - s->buf, (len == size));
+
+        buf1 += len;
+        size -= len;
+    }
+    s->cur_timestamp++;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rtp_mpv.h	Fri Aug 24 07:13:34 2007 +0000
@@ -0,0 +1,26 @@
+/*
+ * RTP definitions
+ * Copyright (c) 2002 Fabrice Bellard.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef RTP_MPV_H
+#define RTP_MPV_H
+
+void ff_rtp_send_mpegvideo(AVFormatContext *s1, const uint8_t *buf1, int size);
+
+#endif /* RTP_MPV_H */