Browse code

Make RTMP send/receive packet functions report number of bytes read or sent.

Originally committed as revision 21533 to svn://svn.ffmpeg.org/ffmpeg/trunk

Kostya Shishkov authored on 2010/01/30 18:24:52
Showing 2 changed files
... ...
@@ -76,15 +76,18 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
76 76
     int channel_id, timestamp, data_size, offset = 0;
77 77
     uint32_t extra = 0;
78 78
     enum RTMPPacketType type;
79
+    int size = 0;
79 80
 
80 81
     if (url_read(h, &hdr, 1) != 1)
81 82
         return AVERROR(EIO);
83
+    size++;
82 84
     channel_id = hdr & 0x3F;
83 85
 
84 86
     if (channel_id < 2) { //special case for channel number >= 64
85 87
         buf[1] = 0;
86 88
         if (url_read_complete(h, buf, channel_id + 1) != channel_id + 1)
87 89
             return AVERROR(EIO);
90
+        size += channel_id + 1;
88 91
         channel_id = AV_RL16(buf) + 64;
89 92
     }
90 93
     data_size = prev_pkt[channel_id].data_size;
... ...
@@ -97,17 +100,21 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
97 97
     } else {
98 98
         if (url_read_complete(h, buf, 3) != 3)
99 99
             return AVERROR(EIO);
100
+        size += 3;
100 101
         timestamp = AV_RB24(buf);
101 102
         if (hdr != RTMP_PS_FOURBYTES) {
102 103
             if (url_read_complete(h, buf, 3) != 3)
103 104
                 return AVERROR(EIO);
105
+            size += 3;
104 106
             data_size = AV_RB24(buf);
105 107
             if (url_read_complete(h, buf, 1) != 1)
106 108
                 return AVERROR(EIO);
109
+            size++;
107 110
             type = buf[0];
108 111
             if (hdr == RTMP_PS_TWELVEBYTES) {
109 112
                 if (url_read_complete(h, buf, 4) != 4)
110 113
                     return AVERROR(EIO);
114
+                size += 4;
111 115
                 extra = AV_RL32(buf);
112 116
             }
113 117
         }
... ...
@@ -138,13 +145,15 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
138 138
         }
139 139
         data_size -= chunk_size;
140 140
         offset    += chunk_size;
141
+        size      += chunk_size;
141 142
         if (data_size > 0) {
142 143
             url_read_complete(h, &t, 1); //marker
144
+            size++;
143 145
             if (t != (0xC0 + channel_id))
144 146
                 return -1;
145 147
         }
146 148
     }
147
-    return 0;
149
+    return size;
148 150
 }
149 151
 
150 152
 int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
... ...
@@ -153,6 +162,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
153 153
     uint8_t pkt_hdr[16], *p = pkt_hdr;
154 154
     int mode = RTMP_PS_TWELVEBYTES;
155 155
     int off = 0;
156
+    int size = 0;
156 157
 
157 158
     pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp;
158 159
 
... ...
@@ -205,6 +215,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
205 205
     prev_pkt[pkt->channel_id].extra      = pkt->extra;
206 206
 
207 207
     url_write(h, pkt_hdr, p-pkt_hdr);
208
+    size = p - pkt_hdr + pkt->data_size;
208 209
     while (off < pkt->data_size) {
209 210
         int towrite = FFMIN(chunk_size, pkt->data_size - off);
210 211
         url_write(h, pkt->data + off, towrite);
... ...
@@ -212,9 +223,10 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
212 212
         if (off < pkt->data_size) {
213 213
             uint8_t marker = 0xC0 | pkt->channel_id;
214 214
             url_write(h, &marker, 1);
215
+            size++;
215 216
         }
216 217
     }
217
-    return 0;
218
+    return size;
218 219
 }
219 220
 
220 221
 int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type,
... ...
@@ -110,7 +110,7 @@ void ff_rtmp_packet_destroy(RTMPPacket *pkt);
110 110
  * @param chunk_size current chunk size
111 111
  * @param prev_pkt   previously read packet headers for all channels
112 112
  *                   (may be needed for restoring incomplete packet header)
113
- * @return zero on success, negative value otherwise
113
+ * @return number of bytes read on success, negative value otherwise
114 114
  */
115 115
 int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
116 116
                         int chunk_size, RTMPPacket *prev_pkt);
... ...
@@ -123,7 +123,7 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
123 123
  * @param chunk_size current chunk size
124 124
  * @param prev_pkt   previously sent packet headers for all channels
125 125
  *                   (may be used for packet header compressing)
126
- * @return zero on success, negative value otherwise
126
+ * @return number of bytes written on success, negative value otherwise
127 127
  */
128 128
 int ff_rtmp_packet_write(URLContext *h, RTMPPacket *p,
129 129
                          int chunk_size, RTMPPacket *prev_pkt);