基类:

//.h

typedef int (*TELE_SEND_CB)(char *pdata, int len);

//函数表结构
typedef struct tele_pro_base_vtbl
{
int (*trans_data)(int chun,enum rtsp_frame_type type, char *pdata, unsigned int len,unsigned int ts);
int (*send_cmd)(int cmd,char *para,unsigned int len);
int (*parse_cmd)(char *data_in, int size_in, void *data_out);
}tele_pro_base_vtbl_t; //基类
typedef struct tele_pro_base
{
/*virtual table*/
tele_pro_base_vtbl_t *vptr;
TELE_SEND_CB send_cb;
}tele_pro_base_t; int akp_tele_pro_low_send(tele_pro_base_t *this,char *pdata,unsigned int len);
tele_pro_base_t * akp_tele_pro_base_ctor(TELE_SEND_CB send_cb); int akp_tele_pro_send_cmd(tele_pro_base_t *this,int cmd,char *pdata,unsigned int len); int akp_tele_pro_trans_data(tele_pro_base_t *this,int chun,enum rtsp_frame_type type, char *pdata, unsigned int len,unsigned int ts); int akp_tele_pro_parse_cmd(tele_pro_base_t *this, char *data_in, int size_in, void *data_out);

// .c

/******************************************************
* Constant
******************************************************/ /******************************************************
* Macro
******************************************************/ /******************************************************
* Type Definitions
******************************************************/ /******************************************************
* Global Variables
******************************************************/
static tele_pro_base_t *ptele_pro_base = NULL; /******************************************************
* Function interface
******************************************************/
static int __send(char *pdata,unsigned int len)
{
int ret = ;;
if(NULL != ptele_pro_base->send_cb) {
ret = ptele_pro_base->send_cb(pdata,len);
}
return ret;
} static int anyka_trans_data(int chun,enum rtsp_frame_type type, \
char *pdata, unsigned int len,unsigned int ts)
{
int ret = -; ret = ak_rtsp_send_stream(chun,type,pdata,len,ts); return ret;
} static int anyka_send_cmd(int cmd,char *pdata,unsigned int len)
{
int ret = ; unsigned int len_out = ;
char *pout = malloc(len+TEL_CTRLPRO_FRAME_SIZE_MIN); akp_tel_ctrlpro_pack(cmd, pdata, len, pout, &len_out);
if(len_out > len+TEL_CTRLPRO_FRAME_SIZE_MIN) {
ak_print_error("akp_tel_ctrlpro_pack error\n");
ret = -;
}
ret = __send(pout, len_out);
free(pout);
return ret;
} /**
* akp_tel_ctrlpro_parse-report net state to observer
* @data_in[IN]: recv data.
* @size_in[IN]: recv data lenght.
* @data_out[IN]: out frame data.
* eg: akp_tel_ctrlpro_parse(recv_buf, len,parse_buf);
* tel_video_set_t video_para = (tel_video_set_t)parse_buf;
* return: > 0 command, -1 error, -2 continue recv
* notes: if have data,pl ensure length > TEL_CTRLPRO_FRAME_SIZE_MAX
*/
static int anyka_parse_cmd(char *data_in, int size_in, void *data_out)
{
return akp_tel_ctrlpro_parse(data_in, size_in,data_out);
} /* 可多态的函数表 */
static tele_pro_base_vtbl_t base_table =
{
anyka_trans_data,
anyka_send_cmd,
anyka_parse_cmd
}; //基类的构造函数
tele_pro_base_t * akp_tele_pro_base_ctor(TELE_SEND_CB send_cb)
{
tele_pro_base_t *temp = (tele_pro_base_t *)malloc(sizeof(tele_pro_base_t));
temp->vptr = &base_table;
temp->send_cb = send_cb;
ptele_pro_base = temp;
return temp;
} //基类方法
int akp_tele_pro_low_send(tele_pro_base_t *this,char *pdata,unsigned int len)
{
int ret = ;; if(NULL != this->send_cb) {
ret = this->send_cb(pdata,len);
}
return ret;
} int akp_tele_pro_send_cmd(tele_pro_base_t *this,int cmd,char *pdata,unsigned int len)
{
int ret = ;
if(NULL != this->vptr->send_cmd) {
ret = this->vptr->send_cmd(cmd,pdata,len);
} else {
ak_print_warning_ex("tele pro send cmd fun is null\n");
ret = -;
}
return ret;
} int akp_tele_pro_trans_data(tele_pro_base_t *this,int chun,enum rtsp_frame_type type, char *pdata, unsigned int len,unsigned int ts)
{
int ret = ;
if(NULL != this->vptr->trans_data) {
ret = this->vptr->trans_data(chun,type,pdata,len ,ts);
} else {
ak_print_warning_ex("tele pro trans data fun is null\n");
ret = -;
}
return ret;
} int akp_tele_pro_parse_cmd(tele_pro_base_t *this, char *data_in, int size_in, void *data_out)
{
int ret = ;
if(NULL != this->vptr->parse_cmd) {
ret = this->vptr->parse_cmd(data_in,size_in,data_out);
} else {
ak_print_warning_ex("tele pro parse cmd fun is null\n");
ret = -;
} return ret;
}

派生类:

// .h

#define JUAN_TXBUF_SIZE            1024
#define JUAN_PARSE_BUF_SIZE 2048 typedef struct tele_pro_juan {
tele_pro_base_t base; unsigned int ssrc;
unsigned short seqNumber;
int fw_type;
unsigned int fw_size;
unsigned int fw_seq; int buf_len;
char parse_buf[JUAN_PARSE_BUF_SIZE]; int tx_buf_length;
char tx_buf[JUAN_TXBUF_SIZE];
ak_mutex_t mutex_tx;
}tele_pro_juan_t; int akp_telepro_juan_post_describe(int chun); tele_pro_juan_t* akp_tele_pro_juan_data_chun_ctor(TELE_SEND_CB send_cb);

// .c

//------------------基类函数的多态实现---------------------
static int juan_trans_data(int chun,enum rtsp_frame_type type, char *pdata, unsigned int len,unsigned int ts_ms)
{
int ret = -; static unsigned long bit_len = ;
static unsigned long t1 = ;
unsigned long t2; ak_thread_mutex_lock(&ptele_pro->mutex_tx);
// calculate bsp
if( == bit_len) {
t1 = ak_get_tick_count_ms();
}
bit_len += len;
t2 = ak_get_tick_count_ms();
if(t2-t1 >= ) {
ak_print_notice("[juan rtsp]: bps=%d\n",bit_len*);
bit_len = ;
} unsigned int ts = ts_ms*;
if(RTSP_AFRAME == type) {
ret = __juan_data_chun_send_data(HICHIP_FRAME_TYPE_UNUSE,HICHIP_MD_TYPE_G711,pdata,len,ts);
} else if(RTSP_IFRAME == type){
ret = __juan_data_chun_send_data(HICHIP_FRAME_TYPE_BASE_IDRSLICE,HICHIP_MD_TYPE_H264,pdata,len,ts);
} else if(RTSP_PFRAME == type) {
ret = __juan_data_chun_send_data(HICHIP_FRAME_TYPE_UNUSE,HICHIP_MD_TYPE_H264,pdata,len,ts);
} else {
ak_print_error("[tele]: donot support this frame type=%d\n",type);
}
ak_thread_mutex_unlock(&ptele_pro->mutex_tx); return ret;
} static int juan_data_chun_send_cmd(int cmd,char *para,unsigned int len)
{
int ret = ; ak_thread_mutex_lock(&ptele_pro->mutex_tx);
switch(cmd) {
case TELE_MSG_SEND_LOGIN:
ak_print_normal("[anyka]: UL_WAKEUP_IND_MSG\n");
__juan_data_chun_post_describe();
__juan_data_chun_login();
break; case TELE_MSG_SEND_DEVINFO: {
ring_dev_info_t *dev_info = (ring_dev_info_t *)para;
unsigned int event = ;
unsigned int io = ;
if(WAKEUP_EVENT_PIR == dev_info->wake_event) {
event |= NK_HICHIP_EVENT_IO;
io |= NK_HICHIP_IO_PIR;
}
if(dev_info->md) {
event |= NK_HICHIP_EVENT_MD;
}
ak_print_normal_ex("stream chun: event=%d io=%d\n",event,io);
__juan_data_chun_send_cmd(event,io);
}break; default:
//ak_print_warning_ex("[tele]: donot support this cmd=%d\n",cmd);
break;
}
ak_thread_mutex_unlock(&ptele_pro->mutex_tx); return ret;
} /**
* akp_tel_ctrlpro_parse-report net state to observer
* @data_in[IN]: recv data.
* @size_in[IN]: recv data lenght.
* @data_out[IN]: out frame data.
* eg: akp_tel_ctrlpro_parse(recv_buf, len,parse_buf);
* tel_video_set_t video_para = (tel_video_set_t)parse_buf;
* return: > 0 command, -1 error, -2 continue recv
* notes: if have data,pl ensure length > TEL_CTRLPRO_FRAME_SIZE_MAX
*/
static int juan_data_chun_parse_cmd(char* data_in, int size_in, void *data_out)
{
char *recv_buf = ptele_pro->parse_buf;
int cmd_len;
int ret = -;
int i; for(i = ; i< size_in; i++) {
juan_debug_log("%c",data_in[i]);
}
juan_debug_log("\n"); #if 1
/* join data */
memcpy(recv_buf+ptele_pro->buf_len,data_in, size_in);
ptele_pro->buf_len += size_in; cmd_len = find_string(recv_buf,ptele_pro->buf_len,"\r\n");
juan_debug_log("cmd_len=%d\n",cmd_len);
if(cmd_len > )
{
ret = __juan_data_chun_do_cmd(recv_buf,cmd_len+,data_out);
//ak_print_normal("cmd ret = %d DL_START_VIDEO_MSG=%d\n",ret,DL_START_VIDEO_MSG); memcpy(recv_buf, recv_buf+cmd_len, ptele_pro->buf_len-cmd_len);
ptele_pro->buf_len -= cmd_len;
memset(recv_buf + ptele_pro->buf_len, , cmd_len);
} if(ptele_pro->buf_len > JUAN_PARSE_BUF_SIZE-) {
ak_print_warning_ex(" ptele_pro->parse_buf have too many data\n");
}
return ret;
#else
if(strstr(data_in,"HTTP/1.1 100") != NULL)
{
ret = DL_START_VIDEO_MSG;
}
return ret;
#endif } /*函数表 */
static tele_pro_base_vtbl_t vir_table =
{
juan_trans_data,
juan_data_chun_send_cmd,
juan_data_chun_parse_cmd
}; //派生类的构造函数
tele_pro_juan_t* akp_tele_pro_juan_data_chun_ctor(TELE_SEND_CB send_cb)
{
tele_pro_juan_t *temp= (tele_pro_juan_t*)malloc(sizeof(tele_pro_juan_t));
temp->base.vptr = &vir_table;
temp->base.send_cb = send_cb;
ptele_pro = temp; memset(ptele_pro->parse_buf,,sizeof(ptele_pro->parse_buf));
ptele_pro->buf_len = ; ak_thread_mutex_init(&ptele_pro->mutex_tx,NULL);
return temp;
}

一种C语言实现面向对象特性的继承,多态的更多相关文章

  1. .NET面向对象特性之“继承”

    整体简介 1.理解继承——继承关系图 2.实现继承与接口多继承 3.new. virtual.override方法 4.抽象方法和抽象类的继承 5.继承的本质 6.继承的复用性.扩展性和安全性 7.多 ...

  2. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  3. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  4. Objective-C语言的面向对象特性

    Objective-C作为一种面向对象的编程语言,具有面向对象的基本特征,即:封装.继承和多态.主要介绍Objective-C中有关面向对象基本概念:类.对象.方法和属性等. 类是Objective- ...

  5. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  6. OC面向对象特性: 继承

    基础知识 1.标识符是有字母,数字,下划线组成的. 2.首字母只能是字母,下划线,不能为数字. 3.标识符要做到见名之意. 4.标识符不能使用已定义的关键字和预定义标识符. 继承 继承:子类可以直接访 ...

  7. (2)用C语言实现面向对象---封装、继承和多态

    封装:struct中封装成员变量和函数指针. 继承:结构体中嵌套结构体. 多态:子类对象动态指向父类的现象叫多态. void  pFunction2(void) { printf(“函数2”): } ...

  8. C# 面向对象基础&封装&继承&多态&加深一下冒泡排序写法

    (一)面向对象是什么? 面向对象是一种编程思想 (二)为什么要用面向对象? 1.结构清晰 2.易于维护 3.方便扩展 (三)new一个对象是什么过程? 实例化构造函数创建对象的过程就是将类实例化的过程 ...

  9. C++三大特性 封装 继承 多态

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

随机推荐

  1. 新手学习之浅析一下c/c++中的指针

    一.我们先来回忆一下指针的概念吧,方便下面的介绍 指针是存放地址值的变量或者常量.例如:int a=1;&a就表示指针常量(“&”表示取地址运算符,也即引用).int *b,b表示的是 ...

  2. makefile笔记8 - make的运行

    一般来说,最简单的就是直接在命令行下输入 make 命令, make 命令会找当前目录的makefile 来执行,一切都是自动的.但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有 ...

  3. oracle数据库实例启动与关闭

    区分数据库与实例:实例是指各种内存结构和服务进程,数据库是指基于磁盘存储的数据文件.控制文件.参数文件.日志文件和归档日志文件组成的物里文件集合. 数据库实例启动: startup [nomount ...

  4. IIC时序和24C02读写字节时序

    一年前刚学51单片机时,接触到了IIC时序和用IIC通信读写AT24C02的学习历程.那时刚刚大一,对数据线时钟线等概念不是很清楚,也没有分清IIC通信的底层时序和写24c02的时序为什么不同. 借着 ...

  5. Element-ui 更新tableData 中 row的某一个属性时,没有更新视图的问题

    在一个报警音管理的页面中,每次点击试听的时候,需要把‘试听’ 更新为 ‘停止’, 起初我们给row.play=0时,显示为 试听,row.play=1时显示为停止, 但是在代码中每次为row.play ...

  6. OO第三次博客总结

    一. 规格发展历史 从20世纪60年代开始,就存在着许多不同的形式规格说明语言和软件开发方法.在形式规格说明领域一些最主要的发展过程列举如下: 1969-1972 C.A.R Hoare撰写了&quo ...

  7. JAVA日常之一

    一.JDK安装及环境变量设置 下载jdk安装包,如jdk-8u65-windows-x64.exe,点击安装,记住安装路径如E:\Program Files\Java\jdk1.8.0_65: 打开环 ...

  8. Python全栈之路----常用模块----序列化(json&pickle&shelve)模块详解

    把内存数据转成字符,叫序列化:把字符转成内存数据类型,叫反序列化. Json模块 Json模块提供了四个功能:序列化:dumps.dump:反序列化:loads.load. import json d ...

  9. python基本使用事项

    1.绝对不能使用word及Windows自带的记事本编写代码,本人使用Notepad++, 2.python交互模式 命令符下输入python显示“ >>>“,表示进入了交互模式 在 ...

  10. Mac 10.13.6 安装 cocoapods

    卸载pod sudo rm -fr ~/Library/Caches/CocoaPods/ sudo rm -fr ~/.cocoapods/repos/master/ sudo rm -fr Pod ...