diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-05-13 10:46:40 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-05-13 10:48:45 +0200 |
commit | 43445935e82a7e9474092bf55b19d6c4d8fa1c7a (patch) | |
tree | d0dc21f4243754086e9f1f438584ff9a89dd800e /gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc | |
parent | 77c15d10a0ddee24c8e33616ce5cf1db7eaaa030 (diff) |
Moved 'deinterlace2' from -bad to -good
And rename it to deinterlace.
Diffstat (limited to 'gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc')
-rw-r--r-- | gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc b/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc new file mode 100644 index 00000000..e8883dd3 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc @@ -0,0 +1,241 @@ +/* + * GStreamer + * Copyright (c) 2002 Tom Barry All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry. + * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 + */ + + +#ifndef TopFirst +#define TopFirst IsOdd +#endif + +#ifdef SEFUNC +#undef SEFUNC +#endif + +#if defined(IS_MMXEXT) +#define SEFUNC(x) Search_Effort_MMXEXT_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight) +#elif defined(IS_3DNOW) +#define SEFUNC(x) Search_Effort_3DNOW_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight) +#elif defined(IS_MMX) +#define SEFUNC(x) Search_Effort_MMX_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight) +#else +#define SEFUNC(x) Search_Effort_C_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight) +#endif + +#include "TomsMoCompAll2.inc" + +#define USE_STRANGE_BOB + +#include "TomsMoCompAll2.inc" + +#undef USE_STRANGE_BOB + +#undef SEFUNC +#if defined(IS_MMXEXT) +#define SEFUNC(x) Search_Effort_MMXEXT_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight) +#elif defined(IS_3DNOW) +#define SEFUNC(x) Search_Effort_3DNOW_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight) +#elif defined(IS_MMX) +#define SEFUNC(x) Search_Effort_MMX_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight) +#else +#define SEFUNC(x) Search_Effort_C_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight) +#endif + +void FUNCT_NAME(GstDeinterlaceMethod *d_method, GstDeinterlace* object, GstBuffer *outbuf) +{ + GstDeinterlaceMethodTomsMoComp *self = GST_DEINTERLACE_METHOD_TOMSMOCOMP (d_method); + long SearchEffort = self->search_effort; + int UseStrangeBob = self->strange_bob; + int IsOdd; + const unsigned char *pWeaveSrc; + const unsigned char *pWeaveSrcP; + unsigned char *pWeaveDest; + const unsigned char *pCopySrc; + const unsigned char *pCopySrcP; + unsigned char *pCopyDest; + int src_pitch; + int dst_pitch; + int rowsize; + int FldHeight; + + /* double stride do address just every odd/even scanline */ + src_pitch = object->field_stride; + dst_pitch = object->row_stride; + rowsize = object->row_stride; + FldHeight = object->field_height; + + pCopySrc = GST_BUFFER_DATA(object->field_history[object->history_count-1].buf); + pCopySrcP = GST_BUFFER_DATA(object->field_history[object->history_count-3].buf); + pWeaveSrc = GST_BUFFER_DATA(object->field_history[object->history_count-2].buf); + pWeaveSrcP = GST_BUFFER_DATA(object->field_history[object->history_count-4].buf); + + /* use bottom field and interlace top field */ + if (object->field_history[object->history_count-2].flags == PICTURE_INTERLACED_BOTTOM) { + IsOdd = 1; + + // if we have an odd field we copy an even field and weave an odd field + pCopyDest = GST_BUFFER_DATA(outbuf); + pWeaveDest = pCopyDest + dst_pitch; + } + /* do it vice verca */ + else { + + IsOdd = 0; + // if we have an even field we copy an odd field and weave an even field + pCopyDest = GST_BUFFER_DATA(outbuf) + dst_pitch; + pWeaveDest = GST_BUFFER_DATA(outbuf); + } + + + // copy 1st and last weave lines + Fieldcopy(pWeaveDest, pCopySrc, rowsize, + 1, dst_pitch*2, src_pitch); + Fieldcopy(pWeaveDest+(FldHeight-1)*dst_pitch*2, + pCopySrc+(FldHeight-1)*src_pitch, rowsize, + 1, dst_pitch*2, src_pitch); + +#ifdef USE_VERTICAL_FILTER + // Vertical Filter currently not implemented for DScaler !! + // copy 1st and last lines the copy field + Fieldcopy(pCopyDest, pCopySrc, rowsize, + 1, dst_pitch*2, src_pitch); + Fieldcopy(pCopyDest+(FldHeight-1)*dst_pitch*2, + pCopySrc+(FldHeight-1)*src_pitch, rowsize, + 1, dst_pitch*2, src_pitch); +#else + + // copy all of the copy field + Fieldcopy(pCopyDest, pCopySrc, rowsize, + FldHeight, dst_pitch*2, src_pitch); +#endif + // then go fill in the hard part, being variously lazy depending upon + // SearchEffort + + if(!UseStrangeBob) { + if (SearchEffort == 0) + { + SEFUNC(0); + } + else if (SearchEffort <= 1) + { + SEFUNC(1); + } + /* else if (SearchEffort <= 2) + { + SEFUNC(2); + } + */ + else if (SearchEffort <= 3) + { + SEFUNC(3); + } + else if (SearchEffort <= 5) + { + SEFUNC(5); + } + else if (SearchEffort <= 9) + { + SEFUNC(9); + } + else if (SearchEffort <= 11) + { + SEFUNC(11); + } + else if (SearchEffort <= 13) + { + SEFUNC(13); + } + else if (SearchEffort <= 15) + { + SEFUNC(15); + } + else if (SearchEffort <= 19) + { + SEFUNC(19); + } + else if (SearchEffort <= 21) + { + SEFUNC(21); + } + else + { + SEFUNC(Max); + } + } + else + { + if (SearchEffort == 0) + { + SEFUNC(0SB); + } + else if (SearchEffort <= 1) + { + SEFUNC(1SB); + } + /* else if (SearchEffort <= 2) + { + SEFUNC(2SB); + } + */ + else if (SearchEffort <= 3) + { + SEFUNC(3SB); + } + else if (SearchEffort <= 5) + { + SEFUNC(5SB); + } + else if (SearchEffort <= 9) + { + SEFUNC(9SB); + } + else if (SearchEffort <= 11) + { + SEFUNC(11SB); + } + else if (SearchEffort <= 13) + { + SEFUNC(13SB); + } + else if (SearchEffort <= 15) + { + SEFUNC(15SB); + } + else if (SearchEffort <= 19) + { + SEFUNC(19SB); + } + else if (SearchEffort <= 21) + { + SEFUNC(21SB); + } + else + { + SEFUNC(MaxSB); + } + } + +#if defined(BUILD_X86_ASM) && !defined(IS_C) + __asm__ __volatile__("emms"); +#endif +} |