forked from FFmpeg/FFmpeg
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
This commit is contained in:
parent
e2ee11e868
commit
56e29bf2c9
1 changed files with 22 additions and 2 deletions
|
@ -651,6 +651,10 @@ static int get_packet(URLContext *s, int for_header)
|
||||||
{
|
{
|
||||||
RTMPContext *rt = s->priv_data;
|
RTMPContext *rt = s->priv_data;
|
||||||
int ret;
|
int ret;
|
||||||
|
uint8_t *p;
|
||||||
|
const uint8_t *next;
|
||||||
|
uint32_t data_size;
|
||||||
|
uint32_t ts, cts, pts=0;
|
||||||
|
|
||||||
if (rt->state == STATE_STOPPED)
|
if (rt->state == STATE_STOPPED)
|
||||||
return AVERROR_EOF;
|
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 ||
|
if (rpkt.type == RTMP_PT_VIDEO || rpkt.type == RTMP_PT_AUDIO ||
|
||||||
(rpkt.type == RTMP_PT_NOTIFY && !memcmp("\002\000\012onMetaData", rpkt.data, 13))) {
|
(rpkt.type == RTMP_PT_NOTIFY && !memcmp("\002\000\012onMetaData", rpkt.data, 13))) {
|
||||||
uint8_t *p;
|
ts = rpkt.timestamp;
|
||||||
uint32_t ts = rpkt.timestamp;
|
|
||||||
|
|
||||||
// generate packet header and put data into buffer for FLV demuxer
|
// generate packet header and put data into buffer for FLV demuxer
|
||||||
rt->flv_off = 0;
|
rt->flv_off = 0;
|
||||||
|
@ -706,6 +709,23 @@ static int get_packet(URLContext *s, int for_header)
|
||||||
rt->flv_off = 0;
|
rt->flv_off = 0;
|
||||||
rt->flv_size = rpkt.data_size;
|
rt->flv_size = rpkt.data_size;
|
||||||
rt->flv_data = av_realloc(rt->flv_data, rt->flv_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);
|
memcpy(rt->flv_data, rpkt.data, rpkt.data_size);
|
||||||
ff_rtmp_packet_destroy(&rpkt);
|
ff_rtmp_packet_destroy(&rpkt);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue