summaryrefslogtreecommitdiff
path: root/libavformat/rtmpproto.c
diff options
context:
space:
mode:
authorSergiy <piratfm@gmail.com>2010-01-12 07:10:47 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2010-01-12 07:10:47 +0000
commit56e29bf2c9eacf077708e0304ea1592933f95b76 (patch)
tree9510b06c249ac22d50f4dba50ebbbda13ed794b2 /libavformat/rtmpproto.c
parente2ee11e868249f6cea9f9b26deea639f65da8396 (diff)
Correct timestamps inside FLV data received by RTMP.
Patch by Sergiy (gmail(piratfm)) Originally committed as revision 21161 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtmpproto.c')
-rw-r--r--libavformat/rtmpproto.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index dcb055535a..6787e0b48e 100644
--- a/libavformat/rtmpproto.c
+++ b/libavformat/rtmpproto.c
@@ -651,6 +651,10 @@ static int get_packet(URLContext *s, int for_header)
{
RTMPContext *rt = s->priv_data;
int ret;
+ uint8_t *p;
+ const uint8_t *next;
+ uint32_t data_size;
+ uint32_t ts, cts, pts=0;
if (rt->state == STATE_STOPPED)
return AVERROR_EOF;
@@ -685,8 +689,7 @@ static int get_packet(URLContext *s, int for_header)
}
if (rpkt.type == RTMP_PT_VIDEO || rpkt.type == RTMP_PT_AUDIO ||
(rpkt.type == RTMP_PT_NOTIFY && !memcmp("\002\000\012onMetaData", rpkt.data, 13))) {
- uint8_t *p;
- uint32_t ts = rpkt.timestamp;
+ ts = rpkt.timestamp;
// generate packet header and put data into buffer for FLV demuxer
rt->flv_off = 0;
@@ -706,6 +709,23 @@ static int get_packet(URLContext *s, int for_header)
rt->flv_off = 0;
rt->flv_size = rpkt.data_size;
rt->flv_data = av_realloc(rt->flv_data, rt->flv_size);
+ /* rewrite timestamps */
+ next = rpkt.data;
+ ts = rpkt.timestamp;
+ while (next - rpkt.data < rpkt.data_size - 11) {
+ next++;
+ data_size = bytestream_get_be24(&next);
+ p=next;
+ cts = bytestream_get_be24(&next);
+ cts |= bytestream_get_byte(&next);
+ if (pts==0)
+ pts=cts;
+ ts += cts - pts;
+ pts = cts;
+ bytestream_put_be24(&p, ts);
+ bytestream_put_byte(&p, ts >> 24);
+ next += data_size + 3 + 4;
+ }
memcpy(rt->flv_data, rpkt.data, rpkt.data_size);
ff_rtmp_packet_destroy(&rpkt);
return 0;