Mercurial > mplayer.hg
view libmpdemux/rtp.c @ 15205:19243f85e164
nico partially fixed the bug i reported; here's the rest of the fix.
basically demux_audio was mixing data in its header buffer in a bogus
manner, whereby it could sometimes "make up" valid mpeg headers where
no such header actually occurred in the file. it should be correct now.
btw these changes also fix the bug where mplayer reports huge initial
cpu usage for sound when playing mp3 files.
author | rfelker |
---|---|
date | Sun, 17 Apr 2005 17:17:52 +0000 |
parents | 8dd7a656eaf8 |
children | 281d155fb37f |
line wrap: on
line source
/* Imported from the dvbstream-0.2 project * * Modified for use with MPlayer, for details see the CVS changelog at * http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ * $Id$ */ #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include "config.h" #ifndef HAVE_WINSOCK2 #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #else #include <winsock2.h> #include <ws2tcpip.h> #endif /* MPEG-2 TS RTP stack */ #define DEBUG 1 #include "rtp.h" int getrtp2(int fd, struct rtpheader *rh, char** data, int* lengthData) { static char buf[1600]; unsigned int intP; char* charP = (char*) &intP; int headerSize; int lengthPacket; lengthPacket=recv(fd,buf,1590,0); if (lengthPacket==0) exit(1); if (lengthPacket<0) { fprintf(stderr,"socket read error\n"); exit(2); } if (lengthPacket<12) { fprintf(stderr,"packet too small (%d) to be an rtp frame (>12bytes)\n", lengthPacket); exit(3); } rh->b.v = (unsigned int) ((buf[0]>>6)&0x03); rh->b.p = (unsigned int) ((buf[0]>>5)&0x01); rh->b.x = (unsigned int) ((buf[0]>>4)&0x01); rh->b.cc = (unsigned int) ((buf[0]>>0)&0x0f); rh->b.m = (unsigned int) ((buf[1]>>7)&0x01); rh->b.pt = (unsigned int) ((buf[1]>>0)&0x7f); intP = 0; memcpy(charP+2,&buf[2],2); rh->b.sequence = ntohl(intP); intP = 0; memcpy(charP,&buf[4],4); rh->timestamp = ntohl(intP); headerSize = 12 + 4*rh->b.cc; /* in bytes */ *lengthData = lengthPacket - headerSize; *data = (char*) buf + headerSize; // fprintf(stderr,"Reading rtp: v=%x p=%x x=%x cc=%x m=%x pt=%x seq=%x ts=%x lgth=%d\n",rh->b.v,rh->b.p,rh->b.x,rh->b.cc,rh->b.m,rh->b.pt,rh->b.sequence,rh->timestamp,lengthPacket); return(0); }