基本信息
源码名称:yuv编解码(2x2 YUV图像拼接)
源码大小:2.48KB
文件格式:.rar
开发语言:C/C++
更新时间:2018-01-23
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
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;
}