[设计模式]-视频编码器接口设计(C版本)

来源:互联网 发布:如何做淘宝客网站 编辑:程序博客网 时间:2024/06/06 08:46

由于工作中经常用涉及到视频编解码,为了便于运用和扩展,再结合设计模式,自己设计了一套可扩展的编码器接口,这里只列出h264和mpeg4两种(自行添加完善),采用C语言编写,具体代码如下:

(大家看出来是哪种设计模式了吗?微笑

CodeBase.h

#define H264_TYPE   1#define MPEG4_TYPE  2typedef struct _Parameter{int framerate; //帧率int bitrate;   //码率int height;    //高int width;     //宽int qmin;      //最小质量因子int qmax;      //最大质量因子int code_id;   //编码器ID}Parameter;typedef  unsigned char CB_UINT8;typedef struct _CodeBase{//编码器类型int type;//编码参数Parameter code_param;//设置编码器类型void (*set_code_type)(struct _CodeBase* pCodeBase);//初始化编码器void (*init_encode)  (struct _CodeBase* pCodeBase);//开始编码void (*start_encode) (struct _CodeBase* pCodeBase,CB_UINT8 *in_data,int in_sz,CB_UINT8 *out_data,int out_sz);//释放编码器void (*deinit_encode)(struct _CodeBase* pCodeBase);}CodeBase;//创建具体对象CodeBase* create_codebase(int type);


CodeBase.c

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include "CodeBase.h"//=======================================================//            H264 Code//=======================================================void set_h264_code_type(struct _CodeBase* p_code_base){assert(NULL != p_code_base);printf("set h264 code type:%d\n",p_code_base->type);}void init_h264_encode  (struct _CodeBase* p_code_base){p_code_base->code_param.framerate = 25;p_code_base->code_param.bitrate   = 800000;p_code_base->code_param.height    = 720;p_code_base->code_param.width     = 576;p_code_base->code_param.qmin      = 2;p_code_base->code_param.qmax      = 40;p_code_base->code_param.code_id   = H264_TYPE;printf("init h264 encode\n");}void start_h264_encode (struct _CodeBase* p_code_base,                    CB_UINT8 *in_data,int in_sz,CB_UINT8 *out_data,int out_sz){assert(NULL != p_code_base ||NULL != in_data ||NULL != out_data);printf("start h264 encode\n");//write your code here//...}void deinit_h264_encode(struct _CodeBase* p_code_base){printf("free h264 encode\n");}//=======================================================//            MPEG4 Code//=======================================================void set_mpeg4_code_type(struct _CodeBase* p_code_base){assert(NULL != p_code_base);printf("set mpeg4 code type:%d\n",p_code_base->type);}void init_mpeg4_encode  (struct _CodeBase* p_code_base){p_code_base->code_param.framerate = 25;p_code_base->code_param.bitrate   = 800000;p_code_base->code_param.height    = 640;p_code_base->code_param.width     = 480;p_code_base->code_param.qmin      = 2;p_code_base->code_param.qmax      = 40;p_code_base->code_param.code_id   = MPEG4_TYPE;printf("init mpeg4 encode\n");}void start_mpeg4_encode (struct _CodeBase* p_code_base,                     CB_UINT8 *in_data,int in_sz, CB_UINT8 *out_data,int out_sz){assert(NULL != p_code_base ||NULL != in_data ||NULL != out_data);printf("start mpeg4 encode\n");//write your code here//...}void deinit_mpeg4_encode(struct _CodeBase* p_code_base){printf("free mpeg4 encode\n");}//=======================================================//                 Create Code        //=======================================================CodeBase* <span style="font-family: Arial, Helvetica, sans-serif;">create_codebas</span>(int type){CodeBase* pCode=NULL;assert(H264_TYPE == type || MPEG4_TYPE == type);pCode = (CodeBase*)malloc(sizeof(CodeBase));assert(NULL != pCode);memset(pCode, 0, sizeof(CodeBase));if(H264_TYPE == type){pCode->type = type;pCode->set_code_type = set_h264_code_type;pCode->init_encode   = init_h264_encode;pCode->start_encode  = start_h264_encode;pCode->deinit_encode = deinit_h264_encode;}else{pCode->type = type;pCode->set_code_type = set_mpeg4_code_type;pCode->init_encode   = init_mpeg4_encode;pCode->start_encode  = start_mpeg4_encode;pCode->deinit_encode = deinit_mpeg4_encode;}return pCode;}


流媒体/rtsp/rtmp/onvif/sip

190717128

WebRtc-Tech

 323038420

欢迎加入共同学习!!


0 0
原创粉丝点击