static void cvt_420p_to_rgb565(int width,int height,constunsignedchar*src,unsignedshort*dst)
{
int line, col, linewidth;
int y, u, v, yy, vr, ug, vg, ub;
int r, g, b;
const unsigned char *py,*pu,*pv;
linewidth = width >> 1;
py = src;
pu = py + (width * height);
pv = pu + (width * height)/ 4;
y = *py++;
yy = y << 8;
u = *pu - 128;
ug = 88 * u;
ub = 454 * u;
v = *pv - 128;
vg = 183 * v;
vr = 359 * v;
for (line = 0;line< height;line++){
for (col = 0; col < width; col++){
r = (yy + vr) >> 8;
g = (yy - ug - vg)>> 8;
b = (yy + ub ) >> 8;
if (r < 0) r = 0;
if (r > 255) r = 255;
if (g < 0) g = 0;
if (g > 255) g = 255;
if (b < 0) b = 0;
if (b > 255) b = 255;
*dst++ = (((unsignedshort)r>>3)<<11)|(((unsignedshort)g>>2)<<5)|(((unsignedshort)b>>3)<<0);
y = *py++;
yy = y << 8;
if (col & 1) {
pu++;
pv++;
u = *pu - 128;
ug = 88 * u;
ub = 454 * u;
v = *pv - 128;
vg = 183 * v;
vr = 359 * v;
}
}
if ((line & 1)== 0){
pu -= linewidth;
pv -= linewidth;
}
}
}
http://www.elautoctrl.info/wordpress/archives/921
http://blog.csdn.net/dotphoenix/article/details/6431351
extra:
Android手机你应该用little endian:
pSwsContext = sws_getContext(nWidth, nHeight, PIX_FMT_YUV420P, nWidth, nHeight
, PIX_FMT_RGB565LE, SWS_BICUBIC, NULL, NULL, NULL);
刚好手头有一个例子,就顺便给你一个例子吧:
SwsContext *img_convert_ctx = sws_getContext(codecContext->width, codecContext->height,
PIX_FMT_YUV420P,
mReqWidth,mReqHeight,
PIX_FMT_RGB565LE,
SWS_BICUBIC, NULL, NULL, NULL);
LOGD("sws_getContext return =%d",img_convert_ctx);
if(img_convert_ctx){
AVFrame *picture;
avcodec_get_frame_defaults(picture);
picture->data[0] = (uint8_t*)mRGB565Data;
picture->data[1] = 0;
picture->data[2] = 0;
picture->linesize[0] = mReqWidth;
picture->linesize[1] = 0;
picture->linesize[2] = 0;
sws_scale(img_convert_ctx, frame.data, frame.linesize,
0, codecContext->height, picture->data,
picture->linesize);
result = 0;
}