LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: rickxbx

精华区分类索引

[复制链接]
发表于 2005-11-5 17:13:40 | 显示全部楼层

求救: 用TCP/IP进行网际互联 第三卷 rtp实现实例问题 undefined reference to bpfre

我正在学习"用TCP/IP进行网际互联 第三卷"
rtp实现实例中编译时遇到问题: undefined reference to bpfree
                            undefined reference to bpinit
                            undefined reference to bpget
头文件util.h中有bpfree,bpinit,bpget的说明,
我也下载了作者的原程序,到底是该增加哪一个.h 文件,还是其他什么问题,请高手帮忙.
----------------
文件util.h中如下:
/* util.h - tv2lin */
#include "common.h"
#define tv2lin(t, clkrt) ((t.tv_sec * clkrt) + ((int) ((double)        t.tv_usec * .000001 * (double) clkrt)))
struct bufpool {
        char        *bp_next;        /* pointer to next free buffer */
        sem_t        bp_sem;                /* counting semaphore        */
        pthread_mutex_t bp_mutex;        /* lock for list manipulation */
};
void        bpinit(void);
char         *bpget(void);
void        bpfree(void *);
extern struct bufpool bp;

-------------------------
文件common.h如下:
/* common.h */

#ifndef COMMON_H
#define COMMON_H
#include <arpa/inet.h>
#include <fcntl.h>
#include <linux/soundcard.h>
#include <math.h>
#include <netinet/in.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

typedef char        bool;
#define TRUE        1
#define FALSE        0
#define OK        0
#define ERROR        -1
#define min(a, b) (a < b ? a : b)
#define max(a, b) (a > b ? a : b)
#endif
----------------------------------
文件rtp.h 如下:
/* rtp.h - rtptsgt, rtptsmax, rtphdrlen, rtpdata */

#include "common.h"
#include "util.h"

typedef unsigned int        ssrc_t;
typedef unsigned int        mediatime_t;
typedef unsigned short        seq_t;

#define RTP_TSWINDOW                (1 << 31)
#define RTP_CURRVERS                2        /* RTP current version */
#define RTP_MINHDRLEN                12        /* RTP minimum header length */
#define RTP_MINSEQUENTIAL        2        /* sequential packets required   */
#define RTP_JITTHRESH   8000        /* jitter buffer `K' (in 1/8000 sec)    */
#define RTP_BPBUFSZ                2048        /* buffer pool buffer size        */
#define RTP_BPBUFCNT                64        /* buffers in buffer pool        */
#define RTP_LEEWAY                400        /* playback leeway (in 1/8000 sec) */
#define RTP_INACTTHRESH                5        /* number of cycles until timeout  */
#define PCMMU_ID                0        /* RTP ID for PCM mu-law        */
#define PCMMU_CLKRT                8000        /* PCM clockrate        */
#define PCMMU_BW                64000        /* PCM bandwidth (bits/sec)        */
#define rtptsgt(x, y)        (x>y? (x-y<RTP_TSWINDOW?TRUE: FALSE) :  \
                        (y-x< RTP_TSWINDOW ? FALSE : TRUE))
#define rtptsmax(x, y)        (rtptsgt(x, y) ? x : y)
#define rtphdrlen(prtp)        (RTP_MINHDRLEN + (prtp->rtp_cc * 4))
#define rtpdata(prtp)        ((char *) prtp + rtphdrlen(prtp) )
# define TIMEVAL_TO_TIMESPEC(tv, ts) { \ (ts)->tv_sec = (tv)->tv_sec; \
(ts)->tv_nsec = (tv)->tv_usec * 1000; \ }
struct rtp {
        unsigned int         rtp_cc:4;                /* source count */
        unsigned int         rtp_ext:1;                /* extension flag */
        unsigned int         rtp_pad:1;        /* padding flag */
        unsigned int         rtp_ver:2;                /* version        */
        unsigned int         rtp_payload:7;        /* payload type        */
        unsigned int         rtp_mark:1;        /* marker flag        */
        seq_t                  rtp_seq;        /* sequence number */
        mediatime_t         rtp_time;        /* timestamp        */
        ssrc_t              rtp_ssrc;        /* synchronization source identifier*/
        char                  rtp_data[1];        /* beginning of RTP data        */
};

struct rtpln {
        int                rln_len;        /* total length of packet        */
        unsigned int        rln_seq;        /* extended sequence number */
        struct rtpln        *rln_next;        /* pkt with next lower sequence number*/
        struct rtpln        *rln_prev;        /* pkt with next greater seq number */
        struct rtp        rln_rtp;                /* RTP packet        */
};

struct stream {
        ssrc_t                stm_ssrc;        /* synchronization source identifier  */
        struct rtpln        *stm_qhead;        /* pointer to pkt with lowest seq num */
  struct rtpln   *stm_qtail;        /* pointer to pkt with highest seq num */
        pthread_mutex_t        stm_qmutex;        /* mutex to lock queue */
        pthread_cond_t        stm_rcond;        /* cond var for blocking read */
        pthread_mutex_t        stm_rmutex;        /* mutex associated read cond var */
        pthread_mutex_t        stm_smutex;        /* mutex for locking stream structure */
        bool                stm_buffering;        /* TRUE when stream is still buffering*/
        struct timeval        stm_clkx;        /* local time stamp        */
        mediatime_t        stm_clky;        /* equivalent media time stamp */
        double                stm_jitter;        /* jitter measure        */
        int                stm_inactive;        /* number of inactive cycles or status*/
        int                 stm_packets;        /* cumulative packets received */
        int                stm_probation;        /* sequential pkts to validate stream */
  seq_t                     stm_firstseq;        /* first sequence number received */
        seq_t                stm_hiseq;        /* greatest seq number recently recvd */
        int                stm_badseq;        /* bad sequence number */
  int                    stm_roll;        /* sequence space ``roll-overs''         */
        int                stm_recprior;        /* packets recv'd in last RTCP cycle */
        int                 stm_expprior;        /* packets expected in last RTCP cycle*/
        mediatime_t        stm_lastts;        /* last ts for jitter compuataion */
        struct timeval        stm_lastrec;        /* time last pkt rcvd for jitter comp */
  unsigned int           stm_ntp[2];        /* NTP timestamp of last SR (frac,int )                */
        struct timeval        stm_lastsr;        /* local time last SR received        */
};
struct session {
        unsigned int        sn_ssrc;        /* local SSRC */
        int                sn_rtpfd;        /* file descriptor for RTP */
        int                 sn_rtcpfd;        /* file descriptor for RTCP */
        struct sockaddr_in        sn_rtcpto; /* destination for RTCP packets */
        struct stream        sn_stream;        /* single stream being received */
        bool                sn_detected;        /* TRUE once stream detected */
        int                sn_avgrtcp;        /* RTCP len for interval computation */
};
void                        rtpinit(unsigned int, int);
void                        rtprecv(void);
int                        rtpupdate(struct rtp *);
void                        rtpinitseq(seq_t);
int                        rtpupdateseq(seq_t);
void                        rtpnewdata(void);
bool                        rtpqinsert(struct rtpln *);
struct rtpln                *rtpqdequeue(void);
void                        playaudio(void);

extern struct session        sn;
extern struct stream        stm;
----------------------------
文件rtcp.h如下:

/* rtcp.h - hton24 */
#include "rtp.h"
#define RTCP_HEADERLEN                4        /* RTCP header length (octest)        */
#define RTCP_BWFRAC                .05        /* fraction of b/w for RTCP        */
#define RTCP_TTL                        16        /* TTL for our RTCP packets        */
#define RTCP_MAXPACKETSZ        1024        /* RTCP receive buffer size                */
#define RTCP_SR                        200        /* RTCP value for sender report         */
#define RTCP_RR                        201        /* RTCP value for receive report        */
#define RTCP_BYE                203        /* RTCP value for bye message        */
#define hton24(v)                        (((v&0xff) << 16) | (v&0xff00) | ((v&0xff0000) >>16))
struct rtcp {
        unsigned int rtcp_count:5;        /* object count */
        unsigned int rtcp_pad:1;        /* padding present flag        */
        unsigned int rtcp_ver:2;        /* version        */
        unsigned char rtcp_type;        /* message type        */
        unsigned short rtcp_length;        /* message length /4 -1        */
        char        rtcp_data[1];        /* message data        */
};
struct rblock {
        ssrc_t                rb_ssrc;        /* SSRC to which this rblock refers        */
        unsigned int        rb_fraclost:8;        /* fraction lost since prev report         */
        int                rb_cumlost:24;        /* cumullative packets lost        */
        unsigned int        rb_hiseq;                /* extended highest seq received        */
        unsigned int         rb_jitter;                /* jitter measure        */
        unsigned int         rb_lastsrts;        /* middle 32 bits of last SR's NTP        */
        unsigned int         rb_delay;                /* delay since last SR        */
};
struct rr {
        ssrc_t                rr_ssrc;                /* SSRC of sender        */
        char                rr_rblock[1];        /* pointer to first report block */
};
struct sr {
        ssrc_t                sr_ssrc;                /* SSRC of sender        */
        unsigned int        sr_intts;                /* NTP timestamp (high 32 bits)        */
        unsigned int        sr_fracts;                /* NTP timestamp (low 32 bits)        */
        unsigned int        sr_rtpts;                /* RTP media timestamp        */
        unsigned int        sr_packets;        /* sender's sent packet count         */
        unsigned int        sr_octets;                /* sender's sent octet count */
        char                sr_rblock[1];        /* pointer to first report block */
};
void        rtcpsendbye(void);
void        rtcpheader(struct rtcp *, int, unsigned char, int);
double        rtcpinterval(int, int, double, int, int, int *, int);
void        rtcpcycle(void);
void        rtcprecv(void);
回复 支持 反对

使用道具 举报

发表于 2006-1-24 22:56:52 | 显示全部楼层
说不上来什么,只是选定了一个目标坚持下去。
没有人带,自己要学习的东西很多,现在遇到一个很好的版主rickxbx!
我需要:勇气+时间+毅力!
回复 支持 反对

使用道具 举报

发表于 2006-5-10 16:48:08 | 显示全部楼层
我一点都不懂liunx,这个好多东西哦
回复 支持 反对

使用道具 举报

发表于 2006-6-19 14:58:37 | 显示全部楼层
好多内容啊,有时间就来看看。
还是要多谢楼主。
回复 支持 反对

使用道具 举报

发表于 2006-6-29 10:03:28 | 显示全部楼层
有v4l视频采集的 源码吗?
我 找很久都 找不到。
先谢谢 了 。
回复 支持 反对

使用道具 举报

发表于 2006-7-16 18:38:44 | 显示全部楼层
版主资料索引的功夫相当到家啊, 这下方便了 :)
回复 支持 反对

使用道具 举报

发表于 2006-10-10 10:05:00 | 显示全部楼层
我想说:太乱。
不过还要谢谢你。
回复 支持 反对

使用道具 举报

发表于 2006-10-11 11:52:28 | 显示全部楼层
Gooooooooooood
Jooooooooooob!
回复 支持 反对

使用道具 举报

发表于 2006-10-28 17:47:58 | 显示全部楼层
东西太多了
我都看不完啊
呵呵
回复 支持 反对

使用道具 举报

发表于 2006-11-3 18:54:35 | 显示全部楼层
非常感谢,辛苦了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表