实例介绍
yuv编解码C语言代码
【实例简介】
【实例截图】【核心代码】
/*************************************************
* Copyright (c) 2010,深圳茁壮网络股份有限公司技术研究部
* All rights reserved.
*
* 文件名称:YUVSplice.c
* 主要功能:2x2 YUV图像拼接
*
* 取代版本:1.0
* 原作者 :谢光辉
* 完成日期:2010年7月9日
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*预处理图片宽、高及大小*/
#define WIDTH 176
#define HEIGHT 144
#define IMAGE_SIZE (((WIDTH)*(HEIGHT)*3)>>1)
/*预处理图像YUV宽高的各分量*/
#define Y_WIDTH_PREP 176
#define Y_HEIGHT_PREP 144
#define U_WIDTH_PREP 88
#define U_HEIGHT_PREP 72
#define V_WIDTH_PREP 88
#define V_HEIGHT_PREP 72
/*预处理图片U、V分量在码流的相对起始位置*/
#define U_OFFSET_PREP (WIDTH * HEIGHT)
#define V_OFFSET_PREP (U_OFFSET_PREP WIDTH/2 * HEIGHT/2)
/*处理后图像YUV宽高的各分量*/
#define Y_WIDTH 352
#define Y_HEIGHT 288
#define U_WIDTH 176
#define U_HEIGHT 144
#define V_WIDTH 176
#define V_HEIGHT 144
/*处理后U、V分量在码流的相对起始位置*/
#define U_OFFSET (Y_WIDTH * Y_HEIGHT)
#define V_OFFSET (U_OFFSET U_WIDTH * U_HEIGHT)
/*文件帧读完后,需要填充数组的默认值*/
#define FILL_VALUE 127
typedef unsigned char UByte;
typedef int INT;
/*************************
*Function: GetFileSize
*Description: 获取文件大小
*Input:
* fp:文件指针
*Return: 文件大小
*************************/
INT GetFileSize(FILE *fp)
{
INT iSize = 0; /*存储文件大小*/
if (NULL == fp)
{
printf("Don't open file\n");
}
else
{
fseek(fp, 0, SEEK_END);
iSize = ftell(fp);
}
return iSize;
}
/*************************
*Function: GetSizeOfFrame
*Description: 获取文件帧数
*Input:
fp:文件指针
*Return: 返回文件帧数
*************************/
INT GetSizeOfFrame(FILE *fp)
{
return GetFileSize(fp)/IMAGE_SIZE;
}
/*************************
*Function: MaxOfArray
*Description: 返回数组中最大值
*Input:
arr: 数组名
num: 数组大小
*Return: 数组中最大值
*************************/
INT MaxOfArray(INT arr[], int num)
{
if (num <= 0)
{
printf("argument is error");
exit(1);
}
INT iMax = arr[0]; /*存储数组最大值*/
int i = 1;
for (i = 1; i < num; i)
{
if (arr[i] > iMax)
{
iMax = arr[i];
}
}
return iMax;
}
/*************************
*Function: ReadImage
*Description: 返回数组中最大值
*Input:
arr: 数组名
num: 数组大小
*Return: 数组中最大值
*************************/
void ReadImage(UByte *pResultBuf, UByte *pBuf, INT iStartDest, INT iStartSource,
INT iDestOffset, INT iSourceOffset,INT iSize, INT iCount)
{
/*计数功能*/
int k = 0;
for (k = 0; k < iCount; k)
{
strncpy(pResultBuf iStartDest iDestOffset * k,
pBuf iStartSource iSourceOffset * k, iSize);
}
}
int main(int argc, char *argv[])
{
/*待处理文件名*/
const char *pFileName[] = {"dfws.yuv", "france.yuv", "mobile.yuv", "nxss.yuv"};
/*待处理文件个数*/
INT iNum = sizeof(pFileName) / sizeof (const char*);
/*申请存储文件指针的空间*/
FILE* *fp = (FILE**)malloc(sizeof(FILE*) * iNum);
/*存储文件帧数*/
INT *iFrame = (INT*)malloc(sizeof(INT) * iNum);
/*存储文件最大帧数*/
INT iMaxFrame = 0;
/*申请存储一张预处理图片大小的空间*/
UByte *pBuf = (UByte*)malloc(IMAGE_SIZE);
/*申请存储处理后图片大小的空间*/
UByte *pResultBuf = (UByte*)malloc(Y_WIDTH*Y_HEIGHT U_WIDTH*U_HEIGHT V_WIDTH*V_HEIGHT);
/*计数功能*/
INT i = 0, j = 0, k = 0;
/*预处理图片Y分量存入目标区域的起始区域*/
INT iYStartDest = 0;
/*预处理图片U分量存入目标区域的起始区域*/
INT iUStartDest = 0;
/*预处理图片V分量存入目标区域的起始区域*/
INT iVStartDest = 0;
/*预处理文件偏移值*/
INT iOffset = 0;
/*输出文件*/
FILE *fpResult = fopen("result.yuv", "wb");
if (NULL == fpResult) /*创建或者打开失败,程序结束*/
{
printf("Can't not open result.yuv\n");
exit(1);
}
/*初始化申请空间*/
memset(fp, 0, sizeof(FILE*) * iNum);
memset(iFrame, 0, sizeof(INT) * iNum);
memset(pBuf, 0, IMAGE_SIZE);
memset(pResultBuf, 0, Y_WIDTH*Y_HEIGHT U_WIDTH*U_HEIGHT V_WIDTH*V_HEIGHT);
/*打开所有预处理文件*/
for (i = 0; i < iNum; i)
{
fp[i] = fopen(pFileName[i], "rb");
if (NULL == fp[i]) /*文件打开失败*/
{
printf("Don't open file\n");
exit(1);
}
else /*打开成功,存储文件帧数*/
{
iFrame[i] = GetSizeOfFrame(fp[i]);
}
}
/*获取预处理文件中的最大帧数*/
iMaxFrame = MaxOfArray(iFrame, iNum);
/*************************************************/
/*循环处理每帧*/
for (i = 0; i < iMaxFrame; i)
{
/*要处理的数据在文件的偏移量*/
iOffset = i * IMAGE_SIZE;
/*循环处理每个文件的一帧*/
for (j = 0; j < iNum; j)
{
if (i < iFrame[j]) /*文件帧数未处理完*/
{
/*移至要处理数据的起始位置*/
fseek(fp[j], iOffset, SEEK_SET);
/*读取一幅图片的数据*/
fread(pBuf, 1, IMAGE_SIZE, fp[j]);
if (j < iNum/2)
{
//ReadImage(pResultBuf, pBuf, Y_WIDTH_PREP * j, 0,
// Y_WIDTH, Y_WIDTH_PREP,Y_WIDTH_PREP, Y_HEIGHT_PREP);
//
// ReadImage(pResultBuf, pBuf, U_OFFSET U_WIDTH_PREP * j, U_OFFSET_PREP,
// U_WIDTH, U_WIDTH_PREP, U_WIDTH_PREP, HEIGHT/2);
// /*循环把预处理图片U、V分量放置目标数组对应位置*/
// ReadImage(pResultBuf, pBuf, V_OFFSET U_WIDTH_PREP * j, V_OFFSET_PREP,
// V_WIDTH, V_WIDTH_PREP, V_WIDTH_PREP, HEIGHT/2);
iYStartDest = Y_WIDTH_PREP * j;
iUStartDest = U_OFFSET U_WIDTH_PREP * j;
iVStartDest = V_OFFSET U_WIDTH_PREP * j;
}
else
{
iYStartDest = Y_WIDTH * HEIGHT Y_WIDTH_PREP * (j-iNum/2);
iUStartDest = U_OFFSET U_WIDTH * U_HEIGHT_PREP U_WIDTH_PREP * (j-iNum/2);
iVStartDest = V_OFFSET V_WIDTH * V_HEIGHT_PREP V_WIDTH_PREP * (j-iNum/2);
}/*end of inner if*/
ReadImage(pResultBuf, pBuf, iYStartDest, 0,
Y_WIDTH, Y_WIDTH_PREP,Y_WIDTH_PREP, Y_HEIGHT_PREP);
ReadImage(pResultBuf, pBuf, iUStartDest,
U_OFFSET_PREP,U_WIDTH, U_WIDTH_PREP, U_WIDTH_PREP, HEIGHT/2);
/*循环把预处理图片U、V分量放置目标数组对应位置*/
ReadImage(pResultBuf, pBuf, iVStartDest,
V_OFFSET_PREP, V_WIDTH, V_WIDTH_PREP, V_WIDTH_PREP, HEIGHT/2);
}
else /*文件帧数处理完*/
{
if (j < iNum/2)
{
for (k = 0; k < Y_HEIGHT_PREP; k)
{
memset(pResultBuf Y_WIDTH_PREP * j Y_WIDTH * k, FILL_VALUE, Y_WIDTH_PREP);
}
for (k = 0; k < HEIGHT/2; k)
{
memset(pResultBuf U_OFFSET U_WIDTH_PREP * j U_WIDTH * k,
FILL_VALUE, U_WIDTH_PREP);
memset(pResultBuf V_OFFSET V_WIDTH_PREP * j V_WIDTH * k,
FILL_VALUE, V_WIDTH_PREP);
}
}
else
{
for (k = 0; k < Y_HEIGHT_PREP; k)
{
memset(pResultBuf Y_WIDTH * HEIGHT Y_WIDTH_PREP * (j-iNum/2) Y_WIDTH * k,
FILL_VALUE, Y_WIDTH_PREP);
}
for (k = 0; k < HEIGHT/2; k)
{
memset(pResultBuf U_OFFSET U_WIDTH * U_HEIGHT_PREP U_WIDTH_PREP * (j-iNum/2) U_WIDTH * k,
FILL_VALUE, U_WIDTH_PREP);
memset(pResultBuf V_OFFSET V_WIDTH * V_HEIGHT_PREP V_WIDTH_PREP * (j-iNum/2) V_WIDTH * k,
FILL_VALUE, V_WIDTH_PREP);
}
}/*end of inner if*/
}/*end of outer if*/
} /*end of inner for*/
fwrite(pResultBuf, 1, Y_WIDTH*Y_HEIGHT U_WIDTH*U_HEIGHT V_WIDTH*V_HEIGHT, fpResult);
}/*end of outer for*/
for (i = 0; i < iNum; i)
{
fclose(fp[i]);
}
fclose(fpResult);
return 0;
}
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论