/*
 * Copyright (C) 2007 Marc Hoffman <marc.hoffman@analog.com>
 *
 * Blackfin software video scaler operations
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <assert.h>
#include "config.h"
#include <unistd.h>
#include "rgb2rgb.h"
#include "swscale.h"
#include "swscale_internal.h"

#ifdef __FDPIC__
#define L1CODE __attribute__ ((l1_text))
#else
#define L1CODE
#endif

int ff_bfin_uyvytoyv12 (const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
                        long width, long height,
                        long lumStride, long chromStride, long srcStride) L1CODE;

int ff_bfin_yuyvtoyv12 (const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
                        long width, long height,
                        long lumStride, long chromStride, long srcStride) L1CODE;

static int uyvytoyv12_unscaled (SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
                                int srcSliceH, uint8_t* dst[], int dstStride[])
{
    uint8_t *dsty = dst[0] + dstStride[0]*srcSliceY;
    uint8_t *dstu = dst[1] + dstStride[1]*srcSliceY/2;
    uint8_t *dstv = dst[2] + dstStride[2]*srcSliceY/2;
    uint8_t *ip   = src[0] + srcStride[0]*srcSliceY;
    int w         = dstStride[0];

    ff_bfin_uyvytoyv12 (ip, dsty, dstu, dstv, w, srcSliceH, dstStride[0], dstStride[1], srcStride[0]);

    return srcSliceH;
}

static int yuyvtoyv12_unscaled (SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
                                int srcSliceH, uint8_t* dst[], int dstStride[])
{
    uint8_t *dsty = dst[0] + dstStride[0]*srcSliceY;
    uint8_t *dstu = dst[1] + dstStride[1]*srcSliceY/2;
    uint8_t *dstv = dst[2] + dstStride[2]*srcSliceY/2;
    uint8_t *ip   = src[0] + srcStride[0]*srcSliceY;
    int w         = dstStride[0];

    ff_bfin_yuyvtoyv12 (ip, dsty, dstu, dstv, w, srcSliceH, dstStride[0], dstStride[1], srcStride[0]);

    return srcSliceH;
}


void ff_bfin_get_unscaled_swscale (SwsContext *c)
{
    SwsFunc swScale = c->swScale;
    if (c->flags & SWS_CPU_CAPS_BFIN)
        if (c->dstFormat == PIX_FMT_YUV420P)
            if (c->srcFormat == PIX_FMT_UYVY422) {
                av_log (NULL, AV_LOG_VERBOSE, "selecting Blackfin optimized uyvytoyv12_unscaled\n");
                c->swScale = uyvytoyv12_unscaled;
            }
        if (c->dstFormat == PIX_FMT_YUV420P)
            if (c->srcFormat == PIX_FMT_YUYV422) {
                av_log (NULL, AV_LOG_VERBOSE, "selecting Blackfin optimized yuyvtoyv12_unscaled\n");
                c->swScale = yuyvtoyv12_unscaled;
            }
}
