blob: f0dc54dd05951e9a547138d04cfbea9c636044cc [file] [log] [blame]
/*
**
** Copyright (C) 2009 0xlab.org - http://0xlab.org/
** Copyright 2008, The Android Open Source Project
**
** This work is based on yuvconverter project.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
#include "converter.h"
void
yuyv422_to_yuv420(unsigned char *bufsrc, unsigned char *bufdest, int width, int height)
{
unsigned char *ptrsrcy1, *ptrsrcy2;
unsigned char *ptrsrcy3, *ptrsrcy4;
unsigned char *ptrsrccb1, *ptrsrccb2;
unsigned char *ptrsrccb3, *ptrsrccb4;
unsigned char *ptrsrccr1, *ptrsrccr2;
unsigned char *ptrsrccr3, *ptrsrccr4;
int srcystride, srcccstride;
ptrsrcy1 = bufsrc ;
ptrsrcy2 = bufsrc + (width<<1) ;
ptrsrcy3 = bufsrc + (width<<1)*2 ;
ptrsrcy4 = bufsrc + (width<<1)*3 ;
ptrsrccb1 = bufsrc + 1;
ptrsrccb2 = bufsrc + (width<<1) + 1;
ptrsrccb3 = bufsrc + (width<<1)*2 + 1;
ptrsrccb4 = bufsrc + (width<<1)*3 + 1;
ptrsrccr1 = bufsrc + 3;
ptrsrccr2 = bufsrc + (width<<1) + 3;
ptrsrccr3 = bufsrc + (width<<1)*2 + 3;
ptrsrccr4 = bufsrc + (width<<1)*3 + 3;
srcystride = (width<<1)*3;
srcccstride = (width<<1)*3;
unsigned char *ptrdesty1, *ptrdesty2;
unsigned char *ptrdesty3, *ptrdesty4;
unsigned char *ptrdestcb1, *ptrdestcb2;
unsigned char *ptrdestcr1, *ptrdestcr2;
int destystride, destccstride;
ptrdesty1 = bufdest;
ptrdesty2 = bufdest + width;
ptrdesty3 = bufdest + width*2;
ptrdesty4 = bufdest + width*3;
ptrdestcb1 = bufdest + width*height;
ptrdestcb2 = bufdest + width*height + (width>>1);
ptrdestcr1 = bufdest + width*height + ((width*height) >> 2);
ptrdestcr2 = bufdest + width*height + ((width*height) >> 2) + (width>>1);
destystride = (width)*3;
destccstride = (width>>1);
int i, j;
for(j=0; j<(height/4); j++)
{
for(i=0;i<(width/2);i++)
{
(*ptrdesty1++) = (*ptrsrcy1);
(*ptrdesty2++) = (*ptrsrcy2);
(*ptrdesty3++) = (*ptrsrcy3);
(*ptrdesty4++) = (*ptrsrcy4);
ptrsrcy1 += 2;
ptrsrcy2 += 2;
ptrsrcy3 += 2;
ptrsrcy4 += 2;
(*ptrdesty1++) = (*ptrsrcy1);
(*ptrdesty2++) = (*ptrsrcy2);
(*ptrdesty3++) = (*ptrsrcy3);
(*ptrdesty4++) = (*ptrsrcy4);
ptrsrcy1 += 2;
ptrsrcy2 += 2;
ptrsrcy3 += 2;
ptrsrcy4 += 2;
(*ptrdestcb1++) = (*ptrsrccb1);
(*ptrdestcb2++) = (*ptrsrccb3);
ptrsrccb1 += 4;
ptrsrccb3 += 4;
(*ptrdestcr1++) = (*ptrsrccr1);
(*ptrdestcr2++) = (*ptrsrccr3);
ptrsrccr1 += 4;
ptrsrccr3 += 4;
}
/* Update src pointers */
ptrsrcy1 += srcystride;
ptrsrcy2 += srcystride;
ptrsrcy3 += srcystride;
ptrsrcy4 += srcystride;
ptrsrccb1 += srcccstride;
ptrsrccb3 += srcccstride;
ptrsrccr1 += srcccstride;
ptrsrccr3 += srcccstride;
/* Update dest pointers */
ptrdesty1 += destystride;
ptrdesty2 += destystride;
ptrdesty3 += destystride;
ptrdesty4 += destystride;
ptrdestcb1 += destccstride;
ptrdestcb2 += destccstride;
ptrdestcr1 += destccstride;
ptrdestcr2 += destccstride;
}
}
void
yuyv422_to_yuv420sp(unsigned char *bufsrc, unsigned char *bufdest, int width, int height)
{
unsigned char *ptrsrcy1, *ptrsrcy2;
unsigned char *ptrsrcy3, *ptrsrcy4;
unsigned char *ptrsrccb1, *ptrsrccb2;
unsigned char *ptrsrccb3, *ptrsrccb4;
unsigned char *ptrsrccr1, *ptrsrccr2;
unsigned char *ptrsrccr3, *ptrsrccr4;
int srcystride, srcccstride;
ptrsrcy1 = bufsrc ;
ptrsrcy2 = bufsrc + (width<<1) ;
ptrsrcy3 = bufsrc + (width<<1)*2 ;
ptrsrcy4 = bufsrc + (width<<1)*3 ;
ptrsrccb1 = bufsrc + 1;
ptrsrccb2 = bufsrc + (width<<1) + 1;
ptrsrccb3 = bufsrc + (width<<1)*2 + 1;
ptrsrccb4 = bufsrc + (width<<1)*3 + 1;
ptrsrccr1 = bufsrc + 3;
ptrsrccr2 = bufsrc + (width<<1) + 3;
ptrsrccr3 = bufsrc + (width<<1)*2 + 3;
ptrsrccr4 = bufsrc + (width<<1)*3 + 3;
srcystride = (width<<1)*3;
srcccstride = (width<<1)*3;
unsigned char *ptrdesty1, *ptrdesty2;
unsigned char *ptrdesty3, *ptrdesty4;
unsigned char *ptrdestcb1, *ptrdestcb2;
unsigned char *ptrdestcr1, *ptrdestcr2;
int destystride, destccstride;
ptrdesty1 = bufdest;
ptrdesty2 = bufdest + width;
ptrdesty3 = bufdest + width*2;
ptrdesty4 = bufdest + width*3;
ptrdestcb1 = bufdest + width*height;
ptrdestcb2 = bufdest + width*height + width;
ptrdestcr1 = bufdest + width*height + 1;
ptrdestcr2 = bufdest + width*height + width + 1;
destystride = (width)*3;
destccstride = width;
int i, j;
for(j=0; j<(height/4); j++)
{
for(i=0;i<(width/2);i++)
{
(*ptrdesty1++) = (*ptrsrcy1);
(*ptrdesty2++) = (*ptrsrcy2);
(*ptrdesty3++) = (*ptrsrcy3);
(*ptrdesty4++) = (*ptrsrcy4);
ptrsrcy1 += 2;
ptrsrcy2 += 2;
ptrsrcy3 += 2;
ptrsrcy4 += 2;
(*ptrdesty1++) = (*ptrsrcy1);
(*ptrdesty2++) = (*ptrsrcy2);
(*ptrdesty3++) = (*ptrsrcy3);
(*ptrdesty4++) = (*ptrsrcy4);
ptrsrcy1 += 2;
ptrsrcy2 += 2;
ptrsrcy3 += 2;
ptrsrcy4 += 2;
(*ptrdestcb1) = (*ptrsrccb1);
(*ptrdestcb2) = (*ptrsrccb3);
ptrdestcb1 += 2;
ptrdestcb2 += 2;
ptrsrccb1 += 4;
ptrsrccb3 += 4;
(*ptrdestcr1) = (*ptrsrccr1);
(*ptrdestcr2) = (*ptrsrccr3);
ptrdestcr1 += 2;
ptrdestcr2 += 2;
ptrsrccr1 += 4;
ptrsrccr3 += 4;
}
/* Update src pointers */
ptrsrcy1 += srcystride;
ptrsrcy2 += srcystride;
ptrsrcy3 += srcystride;
ptrsrcy4 += srcystride;
ptrsrccb1 += srcccstride;
ptrsrccb3 += srcccstride;
ptrsrccr1 += srcccstride;
ptrsrccr3 += srcccstride;
/* Update dest pointers */
ptrdesty1 += destystride;
ptrdesty2 += destystride;
ptrdesty3 += destystride;
ptrdesty4 += destystride;
ptrdestcb1 += destccstride;
ptrdestcb2 += destccstride;
ptrdestcr1 += destccstride;
ptrdestcr2 += destccstride;
}
}