[设计模式]-视频编码器接口设计(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;}
0 0
- [设计模式]-视频编码器接口设计(C版本)
- DM365的视频编码器的硬件设计
- 编码器设计
- C语言的设计模式-接口隔离
- C语言设计模式与接口
- 设计模式(C++)
- 设计模式 行为模式 命令模式 c语言 版本实现
- 设计HEVC/H.265硬件视频编码器难点
- java设计模式(一)接口模式
- 设计模式(二)-- 接口设计模式概述
- 设计模式----python版本
- Java接口设计模式
- Java接口设计模式
- Java接口设计模式
- 接口及其设计模式
- javascript设计模式--接口
- 【设计模式】之接口
- Java设计模式---接口
- Android照片墙应用实现,再多的图片也不怕崩溃
- Objective-C的陷阱与缺陷
- 我的学习之旅(26)system.h
- $GLOBALS['HTTP_RAW_POST_DATA'] 和$_POST的区别
- 孤岛能源安卓游戏源码
- [设计模式]-视频编码器接口设计(C版本)
- 一张表的某列值为另一张表的某列值之和
- No suitable driver sqlite tomcat 驱动
- java发送http请求
- Linux下MySQL忘记密码的破解方法
- 我的学习之旅(27)io.h
- Linux poll机制精彩分析
- Android自动化测试:获取当前前台应用的Activity名字
- android studio 用release签名进行debug