基类:

//.h

  1. typedef int (*TELE_SEND_CB)(char *pdata, int len);
  2.  
  3. //函数表结构
  4. typedef struct tele_pro_base_vtbl
  5. {
  6. int (*trans_data)(int chun,enum rtsp_frame_type type, char *pdata, unsigned int len,unsigned int ts);
  7. int (*send_cmd)(int cmd,char *para,unsigned int len);
  8. int (*parse_cmd)(char *data_in, int size_in, void *data_out);
  9. }tele_pro_base_vtbl_t;
  10.  
  11. //基类
  12. typedef struct tele_pro_base
  13. {
  14. /*virtual table*/
  15. tele_pro_base_vtbl_t *vptr;
  16. TELE_SEND_CB send_cb;
  17. }tele_pro_base_t;
  18.  
  19. int akp_tele_pro_low_send(tele_pro_base_t *this,char *pdata,unsigned int len);
  20. tele_pro_base_t * akp_tele_pro_base_ctor(TELE_SEND_CB send_cb);
  21.  
  22. int akp_tele_pro_send_cmd(tele_pro_base_t *this,int cmd,char *pdata,unsigned int len);
  23.  
  24. 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);
  25.  
  26. int akp_tele_pro_parse_cmd(tele_pro_base_t *this, char *data_in, int size_in, void *data_out);

// .c

  1. /******************************************************
  2. * Constant
  3. ******************************************************/
  4.  
  5. /******************************************************
  6. * Macro
  7. ******************************************************/
  8.  
  9. /******************************************************
  10. * Type Definitions
  11. ******************************************************/
  12.  
  13. /******************************************************
  14. * Global Variables
  15. ******************************************************/
  16. static tele_pro_base_t *ptele_pro_base = NULL;
  17.  
  18. /******************************************************
  19. * Function interface
  20. ******************************************************/
  21. static int __send(char *pdata,unsigned int len)
  22. {
  23. int ret = ;;
  24. if(NULL != ptele_pro_base->send_cb) {
  25. ret = ptele_pro_base->send_cb(pdata,len);
  26. }
  27. return ret;
  28. }
  29.  
  30. static int anyka_trans_data(int chun,enum rtsp_frame_type type, \
  31. char *pdata, unsigned int len,unsigned int ts)
  32. {
  33. int ret = -;
  34.  
  35. ret = ak_rtsp_send_stream(chun,type,pdata,len,ts);
  36.  
  37. return ret;
  38. }
  39.  
  40. static int anyka_send_cmd(int cmd,char *pdata,unsigned int len)
  41. {
  42. int ret = ;
  43.  
  44. unsigned int len_out = ;
  45. char *pout = malloc(len+TEL_CTRLPRO_FRAME_SIZE_MIN);
  46.  
  47. akp_tel_ctrlpro_pack(cmd, pdata, len, pout, &len_out);
  48. if(len_out > len+TEL_CTRLPRO_FRAME_SIZE_MIN) {
  49. ak_print_error("akp_tel_ctrlpro_pack error\n");
  50. ret = -;
  51. }
  52. ret = __send(pout, len_out);
  53. free(pout);
  54. return ret;
  55. }
  56.  
  57. /**
  58. * akp_tel_ctrlpro_parse-report net state to observer
  59. * @data_in[IN]: recv data.
  60. * @size_in[IN]: recv data lenght.
  61. * @data_out[IN]: out frame data.
  62. * eg: akp_tel_ctrlpro_parse(recv_buf, len,parse_buf);
  63. * tel_video_set_t video_para = (tel_video_set_t)parse_buf;
  64. * return: > 0 command, -1 error, -2 continue recv
  65. * notes: if have data,pl ensure length > TEL_CTRLPRO_FRAME_SIZE_MAX
  66. */
  67. static int anyka_parse_cmd(char *data_in, int size_in, void *data_out)
  68. {
  69. return akp_tel_ctrlpro_parse(data_in, size_in,data_out);
  70. }
  71.  
  72. /* 可多态的函数表 */
  73. static tele_pro_base_vtbl_t base_table =
  74. {
  75. anyka_trans_data,
  76. anyka_send_cmd,
  77. anyka_parse_cmd
  78. };
  79.  
  80. //基类的构造函数
  81. tele_pro_base_t * akp_tele_pro_base_ctor(TELE_SEND_CB send_cb)
  82. {
  83. tele_pro_base_t *temp = (tele_pro_base_t *)malloc(sizeof(tele_pro_base_t));
  84. temp->vptr = &base_table;
  85. temp->send_cb = send_cb;
  86. ptele_pro_base = temp;
  87. return temp;
  88. }
  89.  
  90. //基类方法
  91. int akp_tele_pro_low_send(tele_pro_base_t *this,char *pdata,unsigned int len)
  92. {
  93. int ret = ;;
  94.  
  95. if(NULL != this->send_cb) {
  96. ret = this->send_cb(pdata,len);
  97. }
  98. return ret;
  99. }
  100.  
  101. int akp_tele_pro_send_cmd(tele_pro_base_t *this,int cmd,char *pdata,unsigned int len)
  102. {
  103. int ret = ;
  104. if(NULL != this->vptr->send_cmd) {
  105. ret = this->vptr->send_cmd(cmd,pdata,len);
  106. } else {
  107. ak_print_warning_ex("tele pro send cmd fun is null\n");
  108. ret = -;
  109. }
  110. return ret;
  111. }
  112.  
  113. 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)
  114. {
  115. int ret = ;
  116. if(NULL != this->vptr->trans_data) {
  117. ret = this->vptr->trans_data(chun,type,pdata,len ,ts);
  118. } else {
  119. ak_print_warning_ex("tele pro trans data fun is null\n");
  120. ret = -;
  121. }
  122. return ret;
  123. }
  124.  
  125. int akp_tele_pro_parse_cmd(tele_pro_base_t *this, char *data_in, int size_in, void *data_out)
  126. {
  127. int ret = ;
  128. if(NULL != this->vptr->parse_cmd) {
  129. ret = this->vptr->parse_cmd(data_in,size_in,data_out);
  130. } else {
  131. ak_print_warning_ex("tele pro parse cmd fun is null\n");
  132. ret = -;
  133. }
  134.  
  135. return ret;
  136. }

派生类:

// .h

  1. #define JUAN_TXBUF_SIZE 1024
  2. #define JUAN_PARSE_BUF_SIZE 2048
  3.  
  4. typedef struct tele_pro_juan {
  5. tele_pro_base_t base;
  6.  
  7. unsigned int ssrc;
  8. unsigned short seqNumber;
  9. int fw_type;
  10. unsigned int fw_size;
  11. unsigned int fw_seq;
  12.  
  13. int buf_len;
  14. char parse_buf[JUAN_PARSE_BUF_SIZE];
  15.  
  16. int tx_buf_length;
  17. char tx_buf[JUAN_TXBUF_SIZE];
  18. ak_mutex_t mutex_tx;
  19. }tele_pro_juan_t;
  20.  
  21. int akp_telepro_juan_post_describe(int chun);
  22.  
  23. tele_pro_juan_t* akp_tele_pro_juan_data_chun_ctor(TELE_SEND_CB send_cb);

// .c

  1. //------------------基类函数的多态实现---------------------
  2. static int juan_trans_data(int chun,enum rtsp_frame_type type, char *pdata, unsigned int len,unsigned int ts_ms)
  3. {
  4. int ret = -;
  5.  
  6. static unsigned long bit_len = ;
  7. static unsigned long t1 = ;
  8. unsigned long t2;
  9.  
  10. ak_thread_mutex_lock(&ptele_pro->mutex_tx);
  11. // calculate bsp
  12. if( == bit_len) {
  13. t1 = ak_get_tick_count_ms();
  14. }
  15. bit_len += len;
  16. t2 = ak_get_tick_count_ms();
  17. if(t2-t1 >= ) {
  18. ak_print_notice("[juan rtsp]: bps=%d\n",bit_len*);
  19. bit_len = ;
  20. }
  21.  
  22. unsigned int ts = ts_ms*;
  23. if(RTSP_AFRAME == type) {
  24. ret = __juan_data_chun_send_data(HICHIP_FRAME_TYPE_UNUSE,HICHIP_MD_TYPE_G711,pdata,len,ts);
  25. } else if(RTSP_IFRAME == type){
  26. ret = __juan_data_chun_send_data(HICHIP_FRAME_TYPE_BASE_IDRSLICE,HICHIP_MD_TYPE_H264,pdata,len,ts);
  27. } else if(RTSP_PFRAME == type) {
  28. ret = __juan_data_chun_send_data(HICHIP_FRAME_TYPE_UNUSE,HICHIP_MD_TYPE_H264,pdata,len,ts);
  29. } else {
  30. ak_print_error("[tele]: donot support this frame type=%d\n",type);
  31. }
  32. ak_thread_mutex_unlock(&ptele_pro->mutex_tx);
  33.  
  34. return ret;
  35. }
  36.  
  37. static int juan_data_chun_send_cmd(int cmd,char *para,unsigned int len)
  38. {
  39. int ret = ;
  40.  
  41. ak_thread_mutex_lock(&ptele_pro->mutex_tx);
  42. switch(cmd) {
  43. case TELE_MSG_SEND_LOGIN:
  44. ak_print_normal("[anyka]: UL_WAKEUP_IND_MSG\n");
  45. __juan_data_chun_post_describe();
  46. __juan_data_chun_login();
  47. break;
  48.  
  49. case TELE_MSG_SEND_DEVINFO: {
  50. ring_dev_info_t *dev_info = (ring_dev_info_t *)para;
  51. unsigned int event = ;
  52. unsigned int io = ;
  53. if(WAKEUP_EVENT_PIR == dev_info->wake_event) {
  54. event |= NK_HICHIP_EVENT_IO;
  55. io |= NK_HICHIP_IO_PIR;
  56. }
  57. if(dev_info->md) {
  58. event |= NK_HICHIP_EVENT_MD;
  59. }
  60. ak_print_normal_ex("stream chun: event=%d io=%d\n",event,io);
  61. __juan_data_chun_send_cmd(event,io);
  62. }break;
  63.  
  64. default:
  65. //ak_print_warning_ex("[tele]: donot support this cmd=%d\n",cmd);
  66. break;
  67. }
  68. ak_thread_mutex_unlock(&ptele_pro->mutex_tx);
  69.  
  70. return ret;
  71. }
  72.  
  73. /**
  74. * akp_tel_ctrlpro_parse-report net state to observer
  75. * @data_in[IN]: recv data.
  76. * @size_in[IN]: recv data lenght.
  77. * @data_out[IN]: out frame data.
  78. * eg: akp_tel_ctrlpro_parse(recv_buf, len,parse_buf);
  79. * tel_video_set_t video_para = (tel_video_set_t)parse_buf;
  80. * return: > 0 command, -1 error, -2 continue recv
  81. * notes: if have data,pl ensure length > TEL_CTRLPRO_FRAME_SIZE_MAX
  82. */
  83. static int juan_data_chun_parse_cmd(char* data_in, int size_in, void *data_out)
  84. {
  85. char *recv_buf = ptele_pro->parse_buf;
  86. int cmd_len;
  87. int ret = -;
  88. int i;
  89.  
  90. for(i = ; i< size_in; i++) {
  91. juan_debug_log("%c",data_in[i]);
  92. }
  93. juan_debug_log("\n");
  94.  
  95. #if 1
  96. /* join data */
  97. memcpy(recv_buf+ptele_pro->buf_len,data_in, size_in);
  98. ptele_pro->buf_len += size_in;
  99.  
  100. cmd_len = find_string(recv_buf,ptele_pro->buf_len,"\r\n");
  101. juan_debug_log("cmd_len=%d\n",cmd_len);
  102. if(cmd_len > )
  103. {
  104. ret = __juan_data_chun_do_cmd(recv_buf,cmd_len+,data_out);
  105. //ak_print_normal("cmd ret = %d DL_START_VIDEO_MSG=%d\n",ret,DL_START_VIDEO_MSG);
  106.  
  107. memcpy(recv_buf, recv_buf+cmd_len, ptele_pro->buf_len-cmd_len);
  108. ptele_pro->buf_len -= cmd_len;
  109. memset(recv_buf + ptele_pro->buf_len, , cmd_len);
  110. }
  111.  
  112. if(ptele_pro->buf_len > JUAN_PARSE_BUF_SIZE-) {
  113. ak_print_warning_ex(" ptele_pro->parse_buf have too many data\n");
  114. }
  115. return ret;
  116. #else
  117. if(strstr(data_in,"HTTP/1.1 100") != NULL)
  118. {
  119. ret = DL_START_VIDEO_MSG;
  120. }
  121. return ret;
  122. #endif
  123.  
  124. }
  125.  
  126. /*函数表 */
  127. static tele_pro_base_vtbl_t vir_table =
  128. {
  129. juan_trans_data,
  130. juan_data_chun_send_cmd,
  131. juan_data_chun_parse_cmd
  132. };
  133.  
  134. //派生类的构造函数
  135. tele_pro_juan_t* akp_tele_pro_juan_data_chun_ctor(TELE_SEND_CB send_cb)
  136. {
  137. tele_pro_juan_t *temp= (tele_pro_juan_t*)malloc(sizeof(tele_pro_juan_t));
  138. temp->base.vptr = &vir_table;
  139. temp->base.send_cb = send_cb;
  140. ptele_pro = temp;
  141.  
  142. memset(ptele_pro->parse_buf,,sizeof(ptele_pro->parse_buf));
  143. ptele_pro->buf_len = ;
  144.  
  145. ak_thread_mutex_init(&ptele_pro->mutex_tx,NULL);
  146. return temp;
  147. }

一种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. ip代理简单方法

    requests.post(url-url,headers=headers,data=data,proxies={'https':'192.165.1.56:8000'}

  2. Java学习笔记(4)

    比较两个String时,用==比较两个String是否引用同一个对象,s1.equals(s2)比较两个对象的内容是否相同,也可以用s1.compareTo(s2)来确定两个String的内容是否相同 ...

  3. ChIP-seq基本流程及工具

    ChIP-seq数据分析整理 1.Alignment 2.Peak detection 3.Peak annotation 1. GO analysis 2. Pathway analysis 4.D ...

  4. IDEA 自动生成Hibernate实体类和Mapping文件

    一.新建工程Demo(如果选的时候勾选了hibernate,IDEA会自动下载Hibernate包,不需要手动导入) 二.导入相关包 Mysql && Hibernate 三.添加Hi ...

  5. 数据t转换

    #!/usr/bin/perl use strict; use warnings;    open my $fh,"a.out"; open OUT,">a_t.o ...

  6. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  7. 小程序cover-view踩过的坑

    1.前段时间开发一个小程序,里边用到cover-view,发现cover-view其实很多都是不支持的,比如动画,如果你想要在cover-view上边加动画你会发现没有效果,虽然在模拟器里边可以显示动 ...

  8. 2.4 逻辑运算符 &&(与)、||(或)、非(!)

    一.逻辑运算符 &&(与).||(或).非(!) 逻辑运算符两边的表达式一定是布尔值,结果也是布尔值. 1.1.1 逻辑与 && => 表示并且.且的意思: tr ...

  9. 关于mdb数据库在插入过程中报错->Syntax error in INSERT INTO statement.(sql语句没问题)

    今天,在做mdb数据库的增删改查的时候,代码报错插入语句有问题,但是在数据库中正常执行,苦苦探索了多次,终于找到了问题所在. 结果如图: 上面是报错 下面是解决方案   解决方案:主要原因是offic ...

  10. Python练习五

    1.用文件操作的方式,创建登录注册功能,允许用户输错三次. user = input("请输入你要注册的用户名:") password = input("请输入你要注册的 ...