⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cubic.c

📁 xawtv绝版源码
💻 C
字号:
/*  * Simple xawtv deinterlacing plugin - cubic interpolation *  * CAVEATS: Effectively halves framerate, (working on it) * May cause some general slowness (uses more cpu) but the framerate is smooth * on my athlon 700, running the -mjc branch of 2.4 kernel (preempt and other * patches for desktop performance) *  * BENEFITS: It's no longer interlaced ;) * Looks a metric shitton better than line doubling & bilinear interpolation * around text, but these nasty white specks occur on the border of pure black * (0) and pure white (255).  My original theory was that it had something to * do with 0 messing up our multiplication, but that does not appear to be the * case based on preliminary fiddling around. *  * AUTHORS: * Conrad Kreyling <conrad@conrad.nerdland.org> * Patrick Barrett <yebyen@nerdland.org> *  * This is licenced under the GNU GPL until someone tells me I'm stealing code * and can't do that ;) www.gnu.org for any version of the license. * * Based on xawtv-3.66/libng/plugins/flt-nop.c (also GPL) * Cubic deinterlacing algorithm adapted from mplayer's libpostproc */#include "config.h"#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include "grab-ng.h"/*static int isOdd; // Global variable so we can tell if a frame uses even or                  //odd scanlines, not implemented properly yet */static void inlinedeinterlace (struct ng_video_buf *frame){  unsigned int x, y, bytes = frame->fmt.bytesperline;  /*   * if(isOdd){   *     isOdd=0;   *     y=3;   * }   * else   * {   *     isOdd=1;   *     y=4;   * } //Set y based on scanline evenness/oddness, not implemented yet   */ /* for (x=0; x < strlen(frame->data); x++){	 switch (frame->data[x])	 {	   case 0:		  frame->data[x]++;		  break;	   case 255:		  frame->data[x]--;		  break;		  	 }  }*/ // This doesn't work to fix the problem with the specks    for (y = 3; y < frame->fmt.height - 3; y += 2)  {	 for (x = 0; x < bytes; x++)	 {		frame->data[(y * bytes + x)] =		   ((-frame->data[((y - 3) * bytes + x)]) +			(9 * frame->data[((y - 1) * bytes + x)]) +			(9 * frame->data[((y + 1) * bytes + x)]) +			(-frame->data[((y + 3) * bytes + x)])) >> 4;	 } // Basic algorithm borrowed from mplayer's libpostproc  }	// Angry math}static void *init (struct ng_video_fmt *out){  /* we will be using this variable soon enough */  static int isOdd = 0;  return &isOdd;}static struct ng_video_buf *frame (void *handle, struct ng_video_buf *frame){  deinterlace (frame);  return frame;}static voidfini (void *handle){  /* nothing to clean up */}/* ------------------------------------------------------------------- */static struct ng_filter filter = {  name:"cubic interpolation",  fmts:    (1 << VIDEO_GRAY)			|    (1 << VIDEO_RGB15_NATIVE)		|    (1 << VIDEO_RGB16_NATIVE)		|    (1 << VIDEO_BGR24)			|    (1 << VIDEO_RGB24)			|    (1 << VIDEO_BGR32)			|    (1 << VIDEO_RGB32)			|    (1 << VIDEO_YUYV)			|    (1 << VIDEO_UYVY),  init:		init,  frame:	frame,  fini:		fini,};extern void ng_plugin_init (void);voidng_plugin_init (void){  ng_filter_register (NG_PLUGIN_MAGIC,__FILE__,&filter);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -