diff --git a/libcamera/Android.mk b/libcamera/Android.mk
index e2a82b9..9e7dc3e 100644
--- a/libcamera/Android.mk
+++ b/libcamera/Android.mk
@@ -7,7 +7,7 @@
 LOCAL_SRC_FILES :=       \
     CameraHardware.cpp   \
     V4L2Camera.cpp       \
-    converter.cpp
+    convert.S
 
 LOCAL_C_INCLUDES += external/jpeg
 
diff --git a/libcamera/CameraHardware.cpp b/libcamera/CameraHardware.cpp
index 64afcc3..1c30f0d 100644
--- a/libcamera/CameraHardware.cpp
+++ b/libcamera/CameraHardware.cpp
@@ -25,15 +25,20 @@
 #include <fcntl.h>
 #include <sys/mman.h>
 
-#define MIN_WIDTH           640
-#define MIN_HEIGHT          480
-#define CAM_SIZE            "640x480"
+#define MIN_WIDTH           320
+#define MIN_HEIGHT          240
+#define CAM_SIZE            "320x240"
 #define PIXEL_FORMAT        V4L2_PIX_FMT_YUYV
+extern "C" {
+    void yuyv422_to_yuv420sp(unsigned char*,unsigned char*,int,int);
+}
 
 namespace android {
 
 wp<CameraHardwareInterface> CameraHardware::singleton;
 
+const char supportedFpsRanges [] = "(8000,8000),(8000,10000),(10000,10000),(8000,15000),(15000,15000),(8000,20000),(20000,20000),(24000,24000),(25000,25000),(8000,30000),(30000,30000)";
+
 CameraHardware::CameraHardware(int cameraId)
                   : mCameraId(cameraId),
                     mParameters(),
@@ -61,10 +66,11 @@
     CameraParameters p;
 
     p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
-    p.setPreviewFrameRate(15);
+    p.setPreviewFrameRate(30);
     p.setPreviewFormat("yuv422sp");
     p.set(p.KEY_SUPPORTED_PREVIEW_SIZES, CAM_SIZE);
-
+    p.set(p.KEY_SUPPORTED_PREVIEW_SIZES, "640x480");
+    p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,CameraParameters::PIXEL_FORMAT_YUV420SP);
     p.setPictureSize(MIN_WIDTH, MIN_HEIGHT);
     p.setPictureFormat("jpeg");
     p.set(p.KEY_SUPPORTED_PICTURE_SIZES, CAM_SIZE);
@@ -125,15 +131,17 @@
 //-------------------------------------------------------------
 int CameraHardware::previewThread()
 {
+    int width, height;
+    mParameters.getPreviewSize(&width, &height);
     if (!previewStopped) {
         // Get preview frame
         camera.GrabPreviewFrame(mHeap->getBase());
         if ((mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) ||
-		(mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) {
-            if (mMsgEnabled & CAMERA_MSG_VIDEO_FRAME) {
-			camera.GrabRecordFrame(mRecordHeap->getBase());
-			nsecs_t timeStamp = systemTime(SYSTEM_TIME_MONOTONIC);
-			mTimestampFn(timeStamp, CAMERA_MSG_VIDEO_FRAME,mRecordBuffer, mUser);
+                (mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) {
+            if ((mMsgEnabled & CAMERA_MSG_VIDEO_FRAME ) && mRecordRunning ) {
+                yuyv422_to_yuv420sp((unsigned char *)mHeap->getBase(), (unsigned char*)mRecordHeap->getBase(), width, height);
+                nsecs_t timeStamp = systemTime(SYSTEM_TIME_MONOTONIC);
+                mTimestampFn(timeStamp, CAMERA_MSG_VIDEO_FRAME,mRecordBuffer, mUser);
             }
             mDataFn(CAMERA_MSG_PREVIEW_FRAME,mBuffer, mUser);
 	}
@@ -154,11 +162,11 @@
         return INVALID_OPERATION;
     }
     LOGI("startPreview: in startpreview \n");
-
+    mParameters.getPreviewSize(&width, &height);
     for( i=0; i<10; i++) {
         sprintf(devnode,"/dev/video%d",i);
-        LOGI("trying the node %s \n",devnode);
-        ret = camera.Open(devnode, MIN_WIDTH, MIN_HEIGHT, PIXEL_FORMAT);
+        LOGI("trying the node %s width=%d height=%d \n",devnode,width,height);
+        ret = camera.Open(devnode, width, height, PIXEL_FORMAT);
         if( ret >= 0)
             break;
         }
@@ -166,7 +174,7 @@
     if( ret < 0)
         return -1;
 
-    mPreviewFrameSize = MIN_WIDTH * MIN_HEIGHT * 2;
+    mPreviewFrameSize = width * height * 2;
 
     mHeap = new MemoryHeapBase(mPreviewFrameSize);
     mBuffer = new MemoryBase(mHeap, 0, mPreviewFrameSize);
@@ -201,12 +209,6 @@
         previewStopped = true;
     }
 
-    if (mPreviewThread != 0) {
-        camera.Uninit();
-        camera.StopStreaming();
-        camera.Close();
-    }
-
     {
         Mutex::Autolock lock(mLock);
         previewThread = mPreviewThread;
@@ -216,6 +218,12 @@
         previewThread->requestExitAndWait();
     }
 
+    if (mPreviewThread != 0) {
+        camera.Uninit();
+        camera.StopStreaming();
+        camera.Close();
+    }
+
     Mutex::Autolock lock(mLock);
     mPreviewThread.clear();
 }
@@ -229,8 +237,8 @@
 {
     Mutex::Autolock lock(mLock);
 
-    mRecordHeap = new MemoryHeapBase(mPreviewFrameSize);
-    mRecordBuffer = new MemoryBase(mRecordHeap, 0, mPreviewFrameSize);
+    mRecordHeap = new MemoryHeapBase(mPreviewFrameSize*3/4);
+    mRecordBuffer = new MemoryBase(mRecordHeap, 0, mPreviewFrameSize*3/4);
     mRecordRunning = true;
 
     return NO_ERROR;
@@ -307,11 +315,12 @@
 
     int width, height;
     mParameters.getPictureSize(&width, &height);
+    mParameters.getPreviewSize(&width, &height);
 
     for(i=0; i<10; i++) {
         sprintf(devnode,"/dev/video%d",i);
         LOGI("trying the node %s \n",devnode);
-        ret = camera.Open(devnode, MIN_WIDTH, MIN_HEIGHT, PIXEL_FORMAT);
+        ret = camera.Open(devnode, width, height, PIXEL_FORMAT);
         if( ret >= 0)
             break;
     }
@@ -374,16 +383,16 @@
     int w, h;
     int framerate;
 
+    mParameters = params;
+    params.getPictureSize(&w, &h);
+    mParameters.setPictureSize(w,h);
     params.getPreviewSize(&w, &h);
+    mParameters.setPreviewSize(w,h);
     framerate = params.getPreviewFrameRate();
     LOGD("PREVIEW SIZE: w=%d h=%d framerate=%d", w, h, framerate);
-
-    params.getPictureSize(&w, &h);
-
     mParameters = params;
-
-    // Set to fixed sizes
-    mParameters.setPreviewSize(MIN_WIDTH,MIN_HEIGHT);
+    mParameters.setPreviewSize(w,h);
+    mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, supportedFpsRanges);
 
     return NO_ERROR;
 }
diff --git a/libcamera/V4L2Camera.cpp b/libcamera/V4L2Camera.cpp
index 6c0ed4b..78e17b0 100644
--- a/libcamera/V4L2Camera.cpp
+++ b/libcamera/V4L2Camera.cpp
@@ -13,7 +13,6 @@
 #include <utils/threads.h>
 #include <fcntl.h>
 
-#include "converter.h"
 #include "V4L2Camera.h"
 
 extern "C" { /* Android jpeglib.h missed extern "C" */
@@ -204,8 +203,6 @@
     unsigned char *tmpBuffer;
     int ret;
 
-    tmpBuffer = (unsigned char *) calloc (1, videoIn->width * videoIn->height * 2);
-
     videoIn->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
     videoIn->buf.memory = V4L2_MEMORY_MMAP;
 
@@ -218,11 +215,7 @@
     }
     nDequeued++;
 
-    //memcpy (tmpBuffer, videoIn->mem[videoIn->buf.index], (size_t) videoIn->buf.bytesused);
-    memcpy (tmpBuffer, videoIn->mem[videoIn->buf.index], (size_t) videoIn->buf.bytesused);
-    //convertYUYVtoYUV422SP((uint8_t *)tmpBuffer, (uint8_t *)previewBuffer, videoIn->width, videoIn->height);
-    convert((unsigned char *)tmpBuffer, (unsigned char *)previewBuffer, videoIn->width, videoIn->height);
-
+    memcpy (previewBuffer, videoIn->mem[videoIn->buf.index], (size_t) videoIn->buf.bytesused);
     ret = ioctl(fd, VIDIOC_QBUF, &videoIn->buf);
     if (ret < 0) {
         LOGE("GrabPreviewFrame: VIDIOC_QBUF Failed");
@@ -231,42 +224,8 @@
 
     nQueued++;
 
-    free(tmpBuffer);
 }
 
-void V4L2Camera::GrabRecordFrame (void *recordBuffer)
-{
-    unsigned char *tmpBuffer;
-    int ret;
-
-    tmpBuffer = (unsigned char *) calloc (1, videoIn->width * videoIn->height * 2);
-
-    videoIn->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-    videoIn->buf.memory = V4L2_MEMORY_MMAP;
-
-    /* DQ */
-    ret = ioctl(fd, VIDIOC_DQBUF, &videoIn->buf);
-    if (ret < 0) {
-        LOGE("GrabRecordFrame: VIDIOC_DQBUF Failed");
-
-        return;
-    }
-    nDequeued++;
-
-    memcpy (tmpBuffer, videoIn->mem[videoIn->buf.index], (size_t) videoIn->buf.bytesused);
-
-    yuyv422_to_yuv420((unsigned char *)tmpBuffer, (unsigned char *)recordBuffer, videoIn->width, videoIn->height);
-
-    ret = ioctl(fd, VIDIOC_QBUF, &videoIn->buf);
-    if (ret < 0) {
-        LOGE("GrabRecordFrame: VIDIOC_QBUF Failed");
-        return;
-    }
-
-    nQueued++;
-
-    free(tmpBuffer);
-}
 
 sp<IMemory> V4L2Camera::GrabRawFrame ()
 {
@@ -452,54 +411,4 @@
     return fileSize;
 }
 
-void V4L2Camera::convert(unsigned char *buf, unsigned char *rgb, int width, int height)
-{
-    int x,y,z=0;
-    int blocks;
-
-    blocks = (width * height) * 2;
-
-    for (y = 0; y < blocks; y+=4) {
-        unsigned char Y1, Y2, U, V;
-
-        Y1 = buf[y + 0];
-        U = buf[y + 1];
-        Y2 = buf[y + 2];
-        V = buf[y + 3];
-
-        yuv_to_rgb16(Y1, U, V, &rgb[y]);
-        yuv_to_rgb16(Y2, U, V, &rgb[y + 2]);
-    }
-
-}
-
-void V4L2Camera::yuv_to_rgb16(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb)
-{
-    int r,g,b;
-    int z;
-    int rgb16;
-
-    z = 0;
-
-    r = 1.164 * (y - 16) + 1.596 * (v - 128);
-    g = 1.164 * (y - 16) - 0.813 * (v - 128) - 0.391 * (u -128);
-    b = 1.164 * (y - 16) + 2.018 * (u - 128);
-
-    if (r > 255) r = 255;
-    if (g > 255) g = 255;
-    if (b > 255) b = 255;
-
-    if (r < 0) r = 0;
-    if (g < 0) g = 0;
-    if (b < 0) b = 0;
-
-    rgb16 = (int)(((r >> 3)<<11) | ((g >> 2) << 5)| ((b >> 3) << 0));
-
-    *rgb = (unsigned char)(rgb16 & 0xFF);
-    rgb++;
-    *rgb = (unsigned char)((rgb16 & 0xFF00) >> 8);
-
-}
-
-
 }; // namespace android
diff --git a/libcamera/V4L2Camera.h b/libcamera/V4L2Camera.h
index a4cf55b..97255ec 100644
--- a/libcamera/V4L2Camera.h
+++ b/libcamera/V4L2Camera.h
@@ -48,7 +48,6 @@
     int StopStreaming ();
 
     void GrabPreviewFrame (void *previewBuffer);
-    void GrabRecordFrame (void *recordBuffer);
     sp<IMemory> GrabRawFrame ();
     sp<IMemory> GrabJpegFrame ();
 
diff --git a/libcamera/convert.S b/libcamera/convert.S
new file mode 100644
index 0000000..5254a30
--- /dev/null
+++ b/libcamera/convert.S
@@ -0,0 +1,35 @@
+        .arch   armv7-a
+        .fpu    neon
+        .text
+
+        .globl  yuyv422_to_yuv420sp
+        .type   yuyv422_to_yuv420sp, STT_FUNC
+        .func   yuyv422_to_yuv420sp
+yuyv422_to_yuv420sp:
+        push            {r4-r5,lr}
+        mul             r12, r2,  r3
+        add             r4,  r0,  r2,  lsl #1   @ in_1
+        add             r5,  r1,  r2            @ out_1
+        add             lr,  r1,  r12           @ out_uv
+1:
+        mov             r12, r2
+2:
+        vld1.8          {q0},     [r0]!
+        vld1.8          {q1},     [r4]!
+        vuzp.8          d0,  d1
+        vuzp.8          d2,  d3
+        vhadd.u8        d1,  d1,  d3
+        vrev16.8        d1,  d1
+        vst1.8          {d0},     [r1]!
+        vst1.8          {d2},     [r5]!
+        vst1.8          {d1},     [lr]!
+        subs            r12, r12, #8
+        bgt             2b
+        add             r0,  r0,  r2,  lsl #1
+        add             r4,  r4,  r2,  lsl #1
+        add             r1,  r1,  r2
+        add             r5,  r5,  r2
+        subs            r3,  r3,  #2
+        bgt             1b
+        pop             {r4-r5,pc}
+.endfunc
diff --git a/libcamera/converter.cpp b/libcamera/converter.cpp
deleted file mode 100644
index f0dc54d..0000000
--- a/libcamera/converter.cpp
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
-**
-** 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;
-
-    }
-}
diff --git a/libcamera/converter.h b/libcamera/converter.h
deleted file mode 100644
index e7ecf40..0000000
--- a/libcamera/converter.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-**
-** Copyright (C) 2009 0xlab.org - http://0xlab.org/
-** Copyright 2008, The Android Open Source 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.
-*/
-
-#ifndef CONVERTER_H
-#define CONVERTER_H
-
-void yuyv422_to_yuv420(unsigned char *bufsrc, unsigned char *bufdest, int width, int height);
-void yuyv422_to_yuv420sp(unsigned char *bufsrc, unsigned char *bufdest, int width, int height);
-
-#endif
