嵌入式专题: S5PV210 - MPEG4编码

我想说不台的平台,如tiny210和x210。它们的头文件是有稍微区别的。

我这个是x210下的代码。但都须要注意的是NV12T与NV12的问题,默认要求输入的图片是NV12T,经过调整之后,能够同意用NV12。

即便如此。NV12格式的图片也不好拿到啊。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#include "../mfc/SsbSipMfcApi.h"
#include "../mfc/MfcConvert.h"
#include "../mm/MMClock.h"

int test_enc_mpeg4()
{
	MMClock clock;
	clock.Adjust(1000);

	SSBSIP_MFC_ERROR_CODE ret = MFC_RET_OK;

	// 打开
	unsigned int buf_type = CACHE;
	void* handle = SsbSipMfcEncOpen();
	if(handle == NULL)
	{
		printf("failed to open mfc device!\n");
		return -1;
	}
	printf("== SsbSipMfcDecOpen OK \n");

	int img_width = 640;
	int img_height = 480;

	// 初始化
	SSBSIP_MFC_ENC_MPEG4_PARAM param;
	memset(¶m, 0, sizeof(param));
	param.codecType = MPEG4_ENC;
	param.SourceWidth = img_width;
	param.SourceHeight = img_height;
	param.FrameMap = NV12_LINEAR; // 使用linear

	param.IDRPeriod = 20;  // 能够大于3吗?
	param.SliceMode = 0;
	param.SliceArgument = 1;
	param.RandomIntraMBRefresh = 0; // ?

// 不使用frame based rate control
	param.EnableFRMRateControl = 1;
	param.TimeIncreamentRes = 1000;
	param.VopTimeIncreament = 40;
	param.Bitrate = 4000000;

	param.FrameQp = 1;
	param.FrameQp_P = 1;
	param.FrameQp_B = 1;
	param.QSCodeMax = 45;
	param.QSCodeMin = 20;
	param.CBRPeriodRf = 2;

	// 不使用自己定义padding
	param.PadControlOn = 0;
	param.LumaPadVal = 0;
	param.CbPadVal = 0;
	param.CrPadVal = 0;

	param.ProfileIDC = 66;
	param.LevelIDC = 22;
	param.NumberBFrames = 0;
	param.DisableQpelME = 0;

	if(SsbSipMfcEncInit(handle, ¶m) != MFC_RET_OK)
	{
		printf("failed to init encoder !\n");
		return -1;
	}

	/* 得到输入缓冲区地址 */
	SSBSIP_MFC_ENC_INPUT_INFO inbuf;
	if(SsbSipMfcEncGetInBuf (handle, &inbuf) != MFC_RET_OK)
	{
		printf("failed to get in buf !\n");
		return 0;
	}

	printf("in buf: Y (addr=%08X, size=%d), CbCr (addr=%08X, size=%d) \n"
		, inbuf.YVirAddr, inbuf.YSize
		, inbuf.CVirAddr, inbuf.CSize
		);

	/* 得到header */
	SSBSIP_MFC_ENC_OUTPUT_INFO outbuf;
	ret = SsbSipMfcEncGetOutBuf (handle, &outbuf);
	if(ret != MFC_RET_OK)
	{
		printf("failed to get output (%d) \n", ret);
		return -1;
	}
	printf("saving header: %d bytes \n", outbuf.headerSize);
	if(1)
	{
		FILE* fp = fopen("a00.mpeg4", "wb");
		fwrite(outbuf.StrmVirAddr, 1, outbuf.headerSize, fp);
		fclose(fp);
	}

	int y_size = img_width * img_height;
	int c_size = y_size / 2;

	/* 读取图像 */
	FILE* fp = fopen("k00.nv12", "rb");
	int n1 = fread(inbuf.YVirAddr, 1, y_size, fp);
	int n2 = fread(inbuf.CVirAddr, 1, c_size, fp);
	printf("read bytes: n1=%d, n2=%d \n", n1, n2);

	int count = 0;
	while(count ++ < 3)
	{
		printf("... times: %d , now %d ...\n", count, (int) clock.PtsTime());

		/* 编码 */
		ret = SsbSipMfcEncExe(handle);
		if(ret != MFC_RET_OK)
		{
			printf("failed encoding (%d) \n", ret);
			return -1;
		}

		/* 输出结果 */
		SSBSIP_MFC_ENC_OUTPUT_INFO outbuf;
		ret = SsbSipMfcEncGetOutBuf (handle, &outbuf);
		if(ret != MFC_RET_OK)
		{
			printf("failed to get output (%d) \n", ret);
			return -1;
		}

		printf("output: frame type=%d, size=%d, header size=%d \n"
			, outbuf.frameType
			, outbuf.dataSize
			, outbuf.headerSize);

		/* 保存成文件*/
		char filename[128];
		sprintf(filename, "a%02d.mpeg4", count);

		FILE* fp = fopen(filename, "wb");
		fwrite(outbuf.StrmVirAddr, 1, outbuf.dataSize, fp);
		fclose(fp);

	}

	SsbSipMfcEncClose(handle);

	return 0;
}
时间: 2024-08-08 12:26:29

嵌入式专题: S5PV210 - MPEG4编码的相关文章

嵌入式专题: S5PV210 - MFC硬件解码

嵌入式就是瞎折腾.奉献一些过时的代码,让嵌入式的兄弟少折腾一些吧. 这一篇是怎么解码的,本篇用的MPEG2VIDEO解码. 头文件 #ifndef _HW_MPV2_DECODER #define _HW_MPV2_DECODER class HwMpv2Decoder { public: HwMpv2Decoder(); ~HwMpv2Decoder(); int Open(unsigned int width, unsigned int height); void Close(); int

嵌入式专题: S5PV210 - MPEG4解码(MFC)

解码比编码要省心一些,唯一让人操心的是,在初始化的时候要用编码器生成的head数据来初始化的.就是说,在编码的时候,是生成一个head数据,这个数据是用来在解码的时候用的. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include "../mfc/SsbSipMfcApi.h" #include "../mfc/

嵌入式专题: S5PV210 - H264硬件解码(MFC)

先说一下编码的例子好像找不到了,只提供一下解码的例子吧.淡疼的三星要是能以YUV420P为基本图像格式就好了,这样结合FFmpeg来开发,各种应用都比较方法.再设计一个RGB/YUV硬件转码单元,最好. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include "../mfc/SsbSipMfcApi.h" #includ

嵌入式专题: UVC摄像头摄像

所谓的CMOS摄像头,驱动往往是一坨shit,想做摄像头应用,还是上UVC摄像头吧. 这个类里展示UVC摄像头的各种参数的设置.需要注意的是,如果帧率上不去,往往是由于曝光时间太长导致.这个关系是这样的,曝光越长,图片成像质量越好,但帧率自然就下去了. #ifndef _UVC_CAMERA_H #define _UVC_CAMERA_H class UvcCamera { public: UvcCamera(); ~UvcCamera(); int Open(const char* dev,

嵌入式专题: 双网卡wifi组建NAT上外网

条件: 开发板上双网卡,其中一个是usb wifi,提供wifi路由功能.另一个网口可以上外网. 目标:普通PC/手机能够连此wifi路由,上外网. 1. Wifi AP USB Wifi部分:勿用多言,此使用Realtek 8188 UC版本,这款Wifi的官方软件自带了驱动程序相应的应用软件.应该就是RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip这个程序包,里面有3个部分,一个是驱动,一个是hostapd,一个是wpa_supplicant

嵌入式 视频编码(H264)hi3518

这几天在编写视频录制模块,所以,闲暇之余,又粗粗的整理了一下,主要是API,以备不时之用    摄像头获取的模拟信号通过经芯片处理(我们使用的是CX25825),将模拟信号转成数字信号,产生标准的ITU 656 YUV格式的数字信号以帧为单位送到编码卡上的DSP和内存中.分别供视频实时预览.移动侦测处理以及编码等使用.其中编码的作用是将编码卡内存中的YUV数据送到H264编码器中,进过H.264编码产生压缩好的码流,送到主机内存中,供录像或网络传输使用.编码模块完成各个协议编码,协调 MD.VP

视频编码与封装方式详解

http://blog.csdn.net/attilax/article/details/5807047 1.    编码方式和封装格式    1 2.    视频编码标准两大系统    2 MPEG-1. 2 MPEG-2. 3 MPEG-3. 3 MPEG-4. 3 ITU-T. 4 WMV.. 4 3.    常用视频编码方式有Xvid( 4 4.    常见存储封装格式    6 5.    几种常见的转换格式设置    7 6.    无损视频编码    9 1.   编码方式和封装格

基于哈夫曼编码的压缩解压程序

这个程序是研一上学期的课程大作业.当时,跨专业的我只有一点 C 语言和数据结构基础,为此,我查阅了不少资料,再加上自己的思考和分析,实现后不断调试.测试和完善,耗时一周左右,在 2012/11/19 完成.虽然这是一个很小的程序,但却是我完成的第一个程序. 源码托管在 Github:点此打开链接 一.问题描述: 名称:基于哈夫曼编码的文件压缩解压 目的:利用哈夫曼编码压缩存储文件,节省空间 输入:任何格式的文件(压缩)或压缩文件(解压) 输出:压缩文件或解压后的原文件 功能:利用哈夫曼编码压缩解

音视频编码基础知识

本文转载自 http://blog.csdn.net/ljzcom/article/details/7336258 ,如有需要,请移步查看. Technorati 标签: 音视频 编码 基础知识 --------------------------------分割线开始----------------------------------------------- 编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中