yuv编码为jpeg linux c,yuv2jpg.c · Jack/yuv420p_jpg_linux_C - Gitee.com

#include "yuv2jpg.h"

#include

#include

void ProcessUV(unsigned char* pUVBuf,unsigned char* pTmpUVBuf,int width,int height,int nStride)

{

//原来程序

#if 0

int i=0;

while(i

pUVBuf[i] = pTmpUVBuf[i/2];

i++;

}

#endif

int i,j;

int count = 0;

for(i = 0; i < height; i+=2)

{

for(j = 0; j < nStride; j+=2)

{

pUVBuf[i * width + j] = pTmpUVBuf[count];

pUVBuf[i * width + j + 1] = pTmpUVBuf[count];

pUVBuf[i * width + j + width] = pTmpUVBuf[count];

pUVBuf[i * width + j + width + 1] = pTmpUVBuf[count];

count++;

}

}

}

int QualityScaling(int quality)

{

if (quality <= 0) quality = 1;

if (quality > 100) quality = 100;

if (quality < 50)

quality = 5000 / quality;

else

quality = 200 - quality*2;

return quality;

}

void DivBuff(unsigned char* pBuf,int width,int height,int nStride,int xLen,int yLen)

{

int xBufs = width/xLen;

intyBufs= height/yLen;

int tmpBufLen = xBufs * xLen * yLen;

unsigned char* tmpBuf = (unsigned char*)malloc(tmpBufLen);

int i;

int j;

int k;

int n;

int bufOffset = 0;

for (i = 0; i < yBufs; ++i)

{

n = 0;

for (j = 0; j < xBufs; ++j)

{

bufOffset = yLen * i * nStride + j * xLen;

for (k = 0; k < yLen; ++k)

{

memcpy(tmpBuf + n,pBuf +bufOffset,xLen);

n += xLen;

bufOffset += nStride;

}

}

memcpy(pBuf +i * tmpBufLen,tmpBuf,tmpBufLen);

}

free(tmpBuf);

}

void SetQuantTable(unsigned char* std_QT,unsigned char* QT, int Q)

{

int tmpVal = 0;

inti;

for (i = 0; i < DCTBLOCKSIZE; ++i)

{

tmpVal = (std_QT[i] * Q + 50L) / 100L;

if (tmpVal < 1)

{

tmpVal = 1L;

}

if (tmpVal > 255)

{

tmpVal = 255L;

}

QT[FZBT[i]] = (unsigned char)tmpVal;

}

}

void InitQTForAANDCT(JPEGINFO *pJpgInfo)

{

unsigned int i = 0;

unsigned int j = 0;

unsigned int k = 0;

for (i = 0; i < DCTSIZE; i++)

{

for (j = 0; j < DCTSIZE; j++)

{

pJpgInfo->YQT_DCT[k] = (float) (1.0 / ((double) pJpgInfo->YQT[FZBT[k]] *

aanScaleFactor[i] * aanScaleFactor[j] * 8.0));

++k;

}

}

k = 0;

for (i = 0; i < DCTSIZE; i++)

{

for (j = 0; j < DCTSIZE; j++)

{

pJpgInfo->UVQT_DCT[k] = (float) (1.0 / ((double) pJpgInfo->UVQT[FZBT[k]] *

aanScaleFactor[i] * aanScaleFactor[j] * 8.0));

++k;

}

}

}

unsigned char ComputeVLI(short val)

{

unsigned char binStrLen = 0;

val = fabs(val);

if(val == 1)

{

binStrLen = 1;

}

else if(val >= 2 && val <= 3)

{

binStrLen = 2;

}

else if(val >= 4 && val <= 7)

{

binStrLen = 3;

}

else if(val >= 8 && val <= 15)

{

binStrLen = 4;

}

else if(val >= 16 && val <= 31)

{

binStrLen = 5;

}

else if(val >= 32 && val <= 63)

{

binStrLen = 6;

}

else if(val >= 64 && val <= 127)

{

binStrLen = 7;

}

else if(val >= 128 && val <= 255)

{

binStrLen = 8;

}

else if(val >= 256 && val <= 511)

{

binStrLen = 9;

}

else if(val >= 512 && val <= 1023)

{

binStrLen = 10;

}

else if(val >= 1024 && val <= 2047)

{

binStrLen = 11;

}

return binStrLen;

}

void BuildVLITable(JPEGINFO *pJpgInfo)

{

short i = 0;

for (i = 0; i < DC_MAX_QUANTED; ++i)

{

pJpgInfo->pVLITAB[i] = ComputeVLI(i);

}

for (i = DC_MIN_QUANTED; i < 0; ++i)

{

pJpgInfo->pVLITAB[i] = ComputeVLI(i);

}

}

int WriteSOI(unsigned char* pOut,int nDataLen)

{

memcpy(pOut+nDataLen,&SOITAG,sizeof(SOITAG));

return nDataLen+sizeof(SOITAG);

}

int WriteEOI(unsigned char* pOut,int nDataLen)

{

memcpy(pOut+nDataLen,&EOITAG,sizeof(EOITAG));

return nDataLen + sizeof(EOITAG);

}

int WriteAPP0(unsigned char* pOut,int nDataLen)

{

JPEGAPP0 APP0;

APP0.segmentTag = 0xE0FF;

APP0.length = 0x1000;

APP0.id[0] = 'J';

APP0.id[1] = 'F';

APP0.id[2] = 'I';

APP0.id[3] = 'F';

APP0.id[4] = 0;

APP0.ver = 0x0101;

APP0.densityUnit = 0x00;

APP0.densityX = 0x0100;

APP0.densityY = 0x0100;

APP0.thp = 0x00;

APP0.tvp = 0x00;

//memcpy(pOut+nDataLen,&APP0,sizeof(APP0));

memcpy(pOut+nDataLen,&APP0.segmentTag,2);

memcpy(pOut+nDataLen+2,&APP0.length,2);

memcpy(pOut+nDataLen+4,APP0.id,5);

memcpy(pOut+nDataLen+9,&APP0.ver,2);

*(pOut+nDataLen+11) = APP0.densityUnit;

memcpy(pOut+nDataLen+12,&APP0.densityX,2);

memcpy(pOut+nDataLen+14,&APP0.densityY,2);

*(pOut+nDataLen+16) = APP0.thp;

*(pOut+nDataLen+17) = APP0.tvp;

return nDataLen + sizeof(APP0)-2;

}

int WriteDQT(JPEGINFO *pJpgInfo,unsigned char* pOut,int nDataLen)

{

unsigned int i = 0;

JPEGDQT_8BITS DQT_Y;

DQT_Y.segmentTag = 0xDBFF;

DQT_Y.length = 0x4300;

DQT_Y.tableInfo = 0x00;

for (i = 0; i < DCTBLOCKSIZE; i++)

{

DQT_Y.table[i] = pJpgInfo->YQT[i];

}

//memcpy(pOut+nDataLen , &DQT_Y,sizeof(DQT_Y));

memcpy(pOut+nDataLen,&DQT_Y.segmentTag,2);

memcpy(pOut+nDataLen+2,&DQT_Y.length,2);

*(pOut+nDataLen+4) = DQT_Y.tableInfo;

memcpy(pOut+nDataLen+5,DQT_Y.table,64);

nDataLen += sizeof(DQT_Y)-1;

DQT_Y.tableInfo = 0x01;

for (i = 0; i < DCTBLOCKSIZE; i++)

{

DQT_Y.table[i] = pJpgInfo->UVQT[i];

}

//memcpy(pOut+nDataLen,&DQT_Y,sizeof(DQT_Y));

memcpy(pOut+nDataLen,&DQT_Y.segmentTag,2);

memcpy(pOut+nDataLen+2,&DQT_Y.length,2);

*(pOut+nDataLen+4) = DQT_Y.tableInfo;

memcpy(pOut+nDataLen+5,DQT_Y.table,64);

nDataLen += sizeof(DQT_Y)-1;

return nDataLen;

}

unsigned short Intel2Moto(unsigned short val)

{

unsigned char highBits = (unsigned char)(val / 256);

unsigned char lowBits = (unsigned char)(val % 256);

return lowBits * 256 + highBits;

}

int WriteSOF(unsigned char* pOut,int nDataLen,int width,int height)

{

JPEGSOF0_24BITS SOF;

SOF.segmentTag = 0xC0FF;

SOF.length = 0x1100;

SOF.precision = 0x08;

SOF.height = Intel2Moto((unsigned short)height);

SOF.width = Intel2Moto((unsigned short)width);

SOF.sigNum = 0x03;

SOF.YID = 0x01;

SOF.QTY = 0x00;

SOF.UID = 0x02;

SOF.QTU = 0x01;

SOF.VID = 0x03;

SOF.QTV = 0x01;

SOF.HVU = 0x11;

SOF.HVV = 0x11;

SOF.HVY = 0x11;

//memcpy(pOut + nDataLen,&SOF,sizeof(SOF));

memcpy(pOut+nDataLen,&SOF.segmentTag,2);

memcpy(pOut+nDataLen+2,&SOF.length,2);

*(pOut+nDataLen+4) = SOF.precision;

memcpy(pOut+nDataLen+5,&SOF.height,2);

memcpy(pOut+nDataLen+7,&SOF.width,2);

*(pOut+nDataLen+9) = SOF.sigNum;

*(pOut+nDataLen+10) = SOF.YID;

*(pOut+nDataLen+11) = SOF.HVY;

*(pOut+nDataLen+12) = SOF.QTY;

*(pOut+nDataLen+13) = SOF.UID;

*(pOut+nDataLen+14) = SOF.HVU;

*(pOut+nDataLen+15) = SOF.QTU;

*(pOut+nDataLen+16) = SOF.VID;

*(pOut+nDataLen+17) = SOF.HVV;

*(pOut+nDataLen+18) = SOF.QTV;

return nDataLen + sizeof(SOF)-1;

}

int WriteByte(unsigned char val,unsigned char* pOut,int nDataLen)

{

pOut[nDataLen] = val;

return nDataLen + 1;

}

int WriteDHT(unsigned char* pOut,int nDataLen)

{

unsigned int i = 0;

JPEGDHT DHT;

DHT.segmentTag = 0xC4FF;

DHT.length = Intel2Moto(19 + 12);

DHT.tableInfo = 0x00;

for (i = 0; i < 16; i++)

{

DHT.huffCode[i] = STD_DC_Y_NRCODES[i + 1];

}

//memcpy(pOut+nDataLen,&DHT,sizeof(DHT));

memcpy(pOut+nDataLen,&DHT.segmentTag,2);

memcpy(pOut+nDataLen+2,&DHT.length,2);

*(pOut+nDataLen+4) = DHT.tableInfo;

memcpy(pOut+nDataLen+5,DHT.huffCode,16);

nDataLen += sizeof(DHT)-1;

for (i = 0; i <= 11; i++)

{

nDataLen = WriteByte(STD_DC_Y_VALUES[i],pOut,nDataLen);

}

DHT.tableInfo = 0x01;

for (i = 0; i < 16; i++)

{

DHT.huffCode[i] = STD_DC_UV_NRCODES[i + 1];

}

//memcpy(pOut+nDataLen,&DHT,sizeof(DHT));

memcpy(pOut+nDataLen,&DHT.segmentTag,2);

memcpy(pOut+nDataLen+2,&DHT.length,2);

*(pOut+nDataLen+4) = DHT.tableInfo;

memcpy(pOut+nDataLen+5,DHT.huffCode,16);

nDataLen += sizeof(DHT)-1;

for (i = 0; i <= 11; i++)

{

nDataLen = WriteByte(STD_DC_UV_VALUES[i],pOut,nDataLen);

}

DHT.length = Intel2Moto(19 + 162);

DHT.tableInfo = 0x10;

for (i = 0; i < 16; i++)

{

DHT.huffCode[i] = STD_AC_Y_NRCODES[i + 1];

}

//memcpy(pOut+nDataLen,&DHT,sizeof(DHT));

memcpy(pOut+nDataLen,&DHT.segmentTag,2);

memcpy(pOut+nDataLen+2,&DHT.length,2);

*(pOut+nDataLen+4) = DHT.tableInfo;

memcpy(pOut+nDataLen+5,DHT.huffCode,16);

nDataLen += sizeof(DHT)-1;

for (i = 0; i <= 161; i++)

{

nDataLen = WriteByte(STD_AC_Y_VALUES[i],pOut,nDataLen);

}

DHT.tableInfo = 0x11;

for (i = 0; i < 16; i++)

{

DHT.huffCode[i] = STD_AC_UV_NRCODES[i + 1];

}

//memcpy(pOut + nDataLen,&DHT,sizeof(DHT));

memcpy(pOut+nDataLen,&DHT.segmentTag,2);

memcpy(pOut+nDataLen+2,&DHT.length,2);

*(pOut+nDataLen+4) = DHT.tableInfo;

memcpy(pOut+nDataLen+5,DHT.huffCode,16);

nDataLen += sizeof(DHT)-1;

for (i = 0; i <= 161; i++)

{

nDataLen = WriteByte(STD_AC_UV_VALUES[i],pOut,nDataLen);

}

return nDataLen;

}

int WriteSOS(unsigned char* pOut,int nDataLen)

{

JPEGSOS_24BITS SOS;

SOS.segmentTag = 0xDAFF;

SOS.length = 0x0C00;

SOS.sigNum = 0x03;

SOS.YID = 0x01;

SOS.HTY = 0x00;

SOS.UID = 0x02;

SOS.HTU = 0x11;

SOS.VID = 0x03;

SOS.HTV = 0x11;

SOS.Se = 0x3F;

SOS.Ss = 0x00;

SOS.Bf = 0x00;

memcpy(pOut+nDataLen,&SOS,sizeof(SOS));

return nDataLen+sizeof(SOS);

}

void BuildSTDHuffTab(unsigned char* nrcodes,unsigned char* stdTab,HUFFCODE* huffCode)

{

unsigned char i = 0;

unsigned char j = 0;

unsigned char k = 0;

unsigned short code = 0;

for (i = 1; i <= 16; i++)

{

for (j = 1; j <= nrcodes[i]; j++)

{

huffCode[stdTab[k]].code = code;

huffCode[stdTab[k]].length = i;

++k;

++code;

}

code*=2;

}

for (i = 0; i < k; i++)

{

huffCode[i].val = stdTab[i];

}

}

void FDCT(float* lpBuff)

{

float tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;

float tmp10, tmp11, tmp12, tmp13;

float z1, z2, z3, z4, z5, z11, z13;

float* dataptr;

int ctr;

dataptr = lpBuff;

for (ctr = DCTSIZE-1; ctr >= 0; ctr--)

{

tmp0 = dataptr[0] + dataptr[7];

tmp7 = dataptr[0] - dataptr[7];

tmp1 = dataptr[1] + dataptr[6];

tmp6 = dataptr[1] - dataptr[6];

tmp2 = dataptr[2] + dataptr[5];

tmp5 = dataptr[2] - dataptr[5];

tmp3 = dataptr[3] + dataptr[4];

tmp4 = dataptr[3] - dataptr[4];

tmp10 = tmp0 + tmp3;

tmp13 = tmp0 - tmp3;

tmp11 = tmp1 + tmp2;

tmp12 = tmp1 - tmp2;

dataptr[0] = tmp10 + tmp11; /* phase 3 */

dataptr[4] = tmp10 - tmp11;

z1 = (float)((tmp12 + tmp13) * (0.707106781)); /* c4 */

dataptr[2] = tmp13 + z1; /* phase 5 */

dataptr[6] = tmp13 - z1;

tmp10 = tmp4 + tmp5; /* phase 2 */

tmp11 = tmp5 + tmp6;

tmp12 = tmp6 + tmp7;

z5 = (float)((tmp10 - tmp12) * ( 0.382683433)); /* c6 */

z2 = (float)((0.541196100) * tmp10 + z5); /* c2-c6 */

z4 = (float)((1.306562965) * tmp12 + z5); /* c2+c6 */

z3 = (float)(tmp11 * (0.707106781)); /* c4 */

z11 = tmp7 + z3;

z13 = tmp7 - z3;

dataptr[5] = z13 + z2; /* phase 6 */

dataptr[3] = z13 - z2;

dataptr[1] = z11 + z4;

dataptr[7] = z11 - z4;

dataptr += DCTSIZE;

}

dataptr = lpBuff;

for (ctr = DCTSIZE-1; ctr >= 0; ctr--)

{

tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];

tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];

tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];

tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];

tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];

tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];

tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];

tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];

tmp10 = tmp0 + tmp3;

tmp13 = tmp0 - tmp3;

tmp11 = tmp1 + tmp2;

tmp12 = tmp1 - tmp2;

dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */

dataptr[DCTSIZE*4] = tmp10 - tmp11;

z1 = (float)((tmp12 + tmp13) * (0.707106781)); /* c4 */

dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */

dataptr[DCTSIZE*6] = tmp13 - z1;

tmp10 = tmp4 + tmp5; /* phase 2 */

tmp11 = tmp5 + tmp6;

tmp12 = tmp6 + tmp7;

z5 = (float)((tmp10 - tmp12) * (0.382683433)); /* c6 */

z2 = (float)((0.541196100) * tmp10 + z5); /* c2-c6 */

z4 = (float)((1.306562965) * tmp12 + z5); /* c2+c6 */

z3 = (float)(tmp11 * (0.707106781)); /* c4 */

z11 = tmp7 + z3; /* phase 5 */

z13 = tmp7 - z3;

dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */

dataptr[DCTSIZE*3] = z13 - z2;

dataptr[DCTSIZE*1] = z11 + z4;

dataptr[DCTSIZE*7] = z11 - z4;

++dataptr;

}

}

int WriteBitsStream(JPEGINFO *pJpgInfo,unsigned short value,unsigned char codeLen,unsigned char* pOut,int nDataLen)

{

char posval;//bit position in the bitstring we read, should be<=15 and >=0

posval=codeLen-1;

printf("posval is %d\n",posval);

while (posval>=0)

{

if (value & mask[posval])

{

pJpgInfo->bytenew|=mask[pJpgInfo->bytepos];

}

posval--;

pJpgInfo->bytepos--;

if (pJpgInfo->bytepos<0)

{

if (pJpgInfo->bytenew==0xFF)

{

nDataLen = WriteByte(0xFF,pOut,nDataLen);

nDataLen = WriteByte(0,pOut,nDataLen);

}

else

{

nDataLen = WriteByte(pJpgInfo->bytenew,pOut,nDataLen);

}

pJpgInfo->bytepos=7;

pJpgInfo->bytenew=0;

}

}

return nDataLen;

}

int WriteBits(JPEGINFO *pJpgInfo,HUFFCODE huffCode,unsigned char* pOut,int nDataLen)

{

return WriteBitsStream(pJpgInfo,huffCode.code,huffCode.length,pOut,nDataLen);

}

int WriteBits2(JPEGINFO *pJpgInfo,SYM2 sym,unsigned char* pOut,int nDataLen)

{

return WriteBitsStream(pJpgInfo,sym.amplitude,sym.codeLen,pOut,nDataLen);

}

double mypow(double x,double y){

int i=0;

double sum=1;

for(i=1;i<=(int)y;i++)

sum *=x;

return sum;

}

SYM2 BuildSym2(short value)

{

SYM2 Symbol;

Symbol.codeLen = ComputeVLI(value);

Symbol.amplitude = 0;

if (value >= 0)

{

Symbol.amplitude = value;

}

else

{

double tmp = mypow(2,Symbol.codeLen);

Symbol.amplitude = (short)(tmp-1) + value;

}

return Symbol;

}

void RLEComp(short* lpbuf,ACSYM* lpOutBuf,unsigned char *resultLen)

{

unsigned char zeroNum = 0;

unsigned int EOBPos = 0;

unsigned char MAXZEROLEN = 15;

unsigned int i = 0;

unsigned int j = 0;

EOBPos = DCTBLOCKSIZE - 1;

for (i = EOBPos; i > 0; i--)

{

if (lpbuf[i] == 0)

{

--EOBPos;

}

else

{

break;

}

}

for (i = 1; i <= EOBPos; i++)

{

if (lpbuf[i] == 0 && zeroNum < MAXZEROLEN)

{

++zeroNum;

}

else

{

lpOutBuf[j].zeroLen = zeroNum;

lpOutBuf[j].codeLen = ComputeVLI(lpbuf[i]);

lpOutBuf[j].amplitude = lpbuf[i];

zeroNum = 0;

++(*resultLen);

++j;

}

}

}

int ProcessDU(JPEGINFO *pJpgInfo,float* lpBuf,float* quantTab,HUFFCODE* dcHuffTab,HUFFCODE* acHuffTab,short* DC,unsigned char* pOut,int nDataLen)

{

unsigned char i = 0;

unsigned int j = 0;

short diffVal = 0;

unsigned char acLen = 0;

short sigBuf[DCTBLOCKSIZE];

ACSYM acSym[DCTBLOCKSIZE];

FDCT(lpBuf);

for (i = 0; i < DCTBLOCKSIZE; i++)

{

sigBuf[FZBT[i]] = (short)((lpBuf[i] * quantTab[i] + 16384.5) - 16384);

}

diffVal = sigBuf[0] - *DC;

*DC = sigBuf[0];

if (diffVal == 0)

{

nDataLen = WriteBits(pJpgInfo,dcHuffTab[0],pOut,nDataLen);

}

else

{

nDataLen = WriteBits(pJpgInfo,dcHuffTab[pJpgInfo->pVLITAB[diffVal]],pOut,nDataLen);

nDataLen = WriteBits2(pJpgInfo,BuildSym2(diffVal),pOut,nDataLen);

}

for (i = 63; (i > 0) && (sigBuf[i] == 0); i--)

{

}

if (i == 0)

{

nDataLen = WriteBits(pJpgInfo,acHuffTab[0x00],pOut,nDataLen);

}

else

{

RLEComp(sigBuf,&acSym[0],&acLen);

for (j = 0; j < acLen; j++)

{

if (acSym[j].codeLen == 0)

{

nDataLen = WriteBits(pJpgInfo,acHuffTab[0xF0],pOut,nDataLen);

}

else

{

nDataLen = WriteBits(pJpgInfo,acHuffTab[acSym[j].zeroLen * 16 + acSym[j].codeLen],pOut,nDataLen);

nDataLen = WriteBits2(pJpgInfo,BuildSym2(acSym[j].amplitude),pOut,nDataLen);

}

}

if (i != 63)

{

nDataLen = WriteBits(pJpgInfo,acHuffTab[0x00],pOut,nDataLen);

}

}

return nDataLen;

}

int ProcessData(JPEGINFO *pJpgInfo,unsigned char* lpYBuf,unsigned char* lpUBuf,unsigned char* lpVBuf,int width,int height,int myBufLen, int muBufLen,int mvBufLen,unsigned char* pOut,int nDataLen)

{

size_t yBufLen = strlen(lpYBuf);

size_t uBufLen = strlen(lpUBuf);

size_t vBufLen = strlen(lpVBuf);

float dctYBuf[DCTBLOCKSIZE];

float dctUBuf[DCTBLOCKSIZE];

float dctVBuf[DCTBLOCKSIZE];

unsigned int mcuNum = 0;

short yDC = 0;

short uDC = 0;

short vDC = 0;

unsigned char yCounter = 0;

unsigned char uCounter = 0;

unsigned char vCounter = 0;

unsigned int i = 0;

unsigned int j = 0;

unsigned int k = 0;

unsigned int p = 0;

unsigned int m = 0;

unsigned int n = 0;

unsigned int s = 0;

mcuNum = (height * width * 3)/(DCTBLOCKSIZE * 3);

for (p = 0;p < mcuNum; p++)

{

yCounter = 1;//MCUIndex[SamplingType][0];

uCounter = 1;//MCUIndex[SamplingType][1];

vCounter = 1;//MCUIndex[SamplingType][2];

for (; i < yBufLen; i += DCTBLOCKSIZE)

{

for (j = 0; j < DCTBLOCKSIZE; j++)

{

dctYBuf[j] = (float)(lpYBuf[i + j] - 128);

}

if (yCounter > 0)

{

--yCounter;

nDataLen = ProcessDU(pJpgInfo,dctYBuf,pJpgInfo->YQT_DCT,pJpgInfo->STD_DC_Y_HT,pJpgInfo->STD_AC_Y_HT,&yDC,pOut,nDataLen);

}

else

{

break;

}

}

//------------------------------------------------------------------

for (; m < uBufLen; m += DCTBLOCKSIZE)

{

for (n = 0; n < DCTBLOCKSIZE; n++)

{

dctUBuf[n] = (float)(lpUBuf[m + n] - 128);

}

if (uCounter > 0)

{

--uCounter;

nDataLen = ProcessDU(pJpgInfo,dctUBuf,pJpgInfo->UVQT_DCT,pJpgInfo->STD_DC_UV_HT,pJpgInfo->STD_AC_UV_HT,&uDC,pOut,nDataLen);

}

else

{

break;

}

}

//-------------------------------------------------------------------

for (; s < vBufLen; s += DCTBLOCKSIZE)

{

for (k = 0; k < DCTBLOCKSIZE; k++)

{

dctVBuf[k] = (float)(lpVBuf[s + k] - 128);

}

if (vCounter > 0)

{

--vCounter;

nDataLen = ProcessDU(pJpgInfo,dctVBuf,pJpgInfo->UVQT_DCT,pJpgInfo->STD_DC_UV_HT,pJpgInfo->STD_AC_UV_HT,&vDC,pOut,nDataLen);

}

else

{

break;

}

}

}

return nDataLen;

}

int YUV2Jpg(unsigned char* in_Y,unsigned char* in_U,unsigned char* in_V,int width,int height,int quality,int nStride,unsigned char* pOut,unsigned long *pnOutSize)

{

unsigned char* pYBuf;

unsigned char* pUBuf;

unsigned char* pVBuf;

int nYLen = nStride * height;

//int nUVLen = nStride * height / 4;

intnDataLen;

JPEGINFO * JpgInfo;

JpgInfo = (JPEGINFO *)malloc(sizeof(JPEGINFO));

printf("sizeof(JPEGAPP0)=\n");

printf("sizeof(JPEGDQT_8BITS)=\n");

printf("sizeof(JPEGSOF0_24BITS)=\n");

printf("sizeof(JPEGDHT)=%u\n",sizeof(JPEGDHT));

printf("10\n");

printf("sizeof(JPEGinfo)=%u\n",sizeof(JPEGINFO));

memset(JpgInfo,0,sizeof(JPEGINFO));

//printf("sizeof(JPEGINFO)=%d\n",sizeof(JPEGINFO));

//JpgInfo.bytenew = 0;

//JpgInfo.bytepos = 7;

JpgInfo->bytenew = 0;

JpgInfo->bytepos = 7;

printf("------------------------------6\n");

pYBuf = (unsigned char*)malloc(nYLen);

memset(pYBuf,0,nYLen);

//printf("nYLen=%d\n",nYLen);

memcpy(pYBuf,in_Y,nYLen);

printf("-----------------------------7\n");

pUBuf = (unsigned char*)malloc(nYLen);

pVBuf = (unsigned char*)malloc(nYLen);

printf("---------------------------------8\n");

//memcpy(pUBuf,in_U,nUVLen);

//memcpy(pVBuf,in_V,nUVLen);

//memset(pUBuf,0,nYLen/4);

//memset(pVBuf,0,nYLen/4);

ProcessUV(pUBuf,in_U,width,height,nStride);

ProcessUV(pVBuf,in_V,width,height,nStride);

printf("-------------------------------5\n");

DivBuff(pYBuf,width,height,nStride,DCTSIZE,DCTSIZE);

DivBuff(pUBuf,width,height,nStride,DCTSIZE,DCTSIZE);

DivBuff(pVBuf,width,height,nStride,DCTSIZE,DCTSIZE);

quality = QualityScaling(quality);

SetQuantTable(std_Y_QT,JpgInfo->YQT, quality);

SetQuantTable(std_UV_QT,JpgInfo->UVQT,quality);

InitQTForAANDCT(JpgInfo);

JpgInfo->pVLITAB=JpgInfo->VLI_TAB +2048;

BuildVLITable(JpgInfo);

nDataLen = 0;

printf("---------------------------2\n");

nDataLen = WriteSOI(pOut,nDataLen);

nDataLen = WriteAPP0(pOut,nDataLen);

nDataLen = WriteDQT(JpgInfo,pOut,nDataLen);

nDataLen = WriteSOF(pOut,nDataLen,width,height);

nDataLen = WriteDHT(pOut,nDataLen);

nDataLen = WriteSOS(pOut,nDataLen);

printf("------------------------------1\n");

BuildSTDHuffTab(STD_DC_Y_NRCODES,STD_DC_Y_VALUES,JpgInfo->STD_DC_Y_HT);

BuildSTDHuffTab(STD_AC_Y_NRCODES,STD_AC_Y_VALUES,JpgInfo->STD_AC_Y_HT);

BuildSTDHuffTab(STD_DC_UV_NRCODES,STD_DC_UV_VALUES,JpgInfo->STD_DC_UV_HT);

BuildSTDHuffTab(STD_AC_UV_NRCODES,STD_AC_UV_VALUES,JpgInfo->STD_AC_UV_HT);

printf("-----------------------------3\n");

nDataLen = ProcessData(JpgInfo,pYBuf,pUBuf,pVBuf,width,height,nYLen,nYLen,nYLen,pOut,nDataLen);

nDataLen = WriteEOI(pOut,nDataLen);

printf("------------------------------4\n");

free(JpgInfo);

free(pYBuf);

free(pUBuf);

free(pVBuf);

*pnOutSize = nDataLen;

return 0;

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值