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

📄 subsample.c

📁 linux下将各类格式图片转换工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/*===========================================================================* * subsample.c								     * *									     * *	Procedures concerned with subsampling				     * *									     * * EXPORTED PROCEDURES:							     * *	LumMotionErrorA							     * *	LumMotionErrorB							     * *	LumMotionErrorC							     * *	LumMotionErrorD							     * *									     * *===========================================================================*//* * Copyright (c) 1995 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. *//*   *  $Header: /n/charlie-brown/project/mm/mpeg/mpeg_dist/mpeg_encode/RCS/subsample.c,v 1.6 1995/01/19 23:09:28 eyhung Exp $ *  $Log: subsample.c,v $ * Revision 1.6  1995/01/19  23:09:28  eyhung * Changed copyrights * * Revision 1.5  1994/11/12  02:12:01  keving * nothing * * Revision 1.4  1993/12/22  19:19:01  keving * nothing * * Revision 1.4  1993/12/22  19:19:01  keving * nothing * * Revision 1.3  1993/07/22  22:23:43  keving * nothing * * Revision 1.2  1993/06/30  20:06:09  keving * nothing * * Revision 1.1  1993/06/22  21:56:05  keving * nothing * *//*==============* * HEADER FILES * *==============*/#include "all.h"#include "mtypes.h"#include "frames.h"#include "bitio.h"#include "prototypes.h"#undef ABS#define ABS(x)	((x < 0) ? (-x) : x)/*=====================* * EXPORTED PROCEDURES * *=====================*//*===========================================================================* * * LumMotionErrorA * *	compute the motion error for the A subsampling pattern * * RETURNS:	the error, or some number greater if it is worse * * SIDE EFFECTS:    none * *===========================================================================*/int32LumMotionErrorA(currentBlock, prevFrame, by, bx, my, mx, bestSoFar)    LumBlock currentBlock;    MpegFrame *prevFrame;    int by;    int bx;    int my;    int mx;    int32 bestSoFar;{    register int32    diff = 0;	    /* max value of diff is 255*256 = 65280 */    register int32 localDiff;    register uint8 *macross;    register uint8 **prev;    register int    fy, fx;    boolean xHalf, yHalf;    xHalf = (ABS(mx) % 2 == 1);    yHalf = (ABS(my) % 2 == 1);    MOTION_TO_FRAME_COORD(by, bx, my/2, mx/2, fy, fx);    if ( xHalf ) {	if ( mx < 0 ) {	    fx--;	}	if ( yHalf ) {	    if ( my < 0 ) {		fy--;	    }	    	    prev = prevFrame->halfBoth;	} else {	    prev = prevFrame->halfX;	}    } else if ( yHalf ) {	if ( my < 0 ) {	    fy--;	}	prev = prevFrame->halfY;    } else {	prev = prevFrame->ref_y;    }    macross = &(prev[fy][fx]);    localDiff = macross[0]-currentBlock[0][0];     diff += ABS(localDiff);    localDiff = macross[2]-currentBlock[0][2];     diff += ABS(localDiff);    localDiff = macross[4]-currentBlock[0][4];     diff += ABS(localDiff);    localDiff = macross[6]-currentBlock[0][6];     diff += ABS(localDiff);    localDiff = macross[8]-currentBlock[0][8];     diff += ABS(localDiff);    localDiff = macross[10]-currentBlock[0][10];     diff += ABS(localDiff);    localDiff = macross[12]-currentBlock[0][12];     diff += ABS(localDiff);    localDiff = macross[14]-currentBlock[0][14];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+2][fx]);    localDiff = macross[0]-currentBlock[2][0];     diff += ABS(localDiff);    localDiff = macross[2]-currentBlock[2][2];     diff += ABS(localDiff);    localDiff = macross[4]-currentBlock[2][4];     diff += ABS(localDiff);    localDiff = macross[6]-currentBlock[2][6];     diff += ABS(localDiff);    localDiff = macross[8]-currentBlock[2][8];     diff += ABS(localDiff);    localDiff = macross[10]-currentBlock[2][10];     diff += ABS(localDiff);    localDiff = macross[12]-currentBlock[2][12];     diff += ABS(localDiff);    localDiff = macross[14]-currentBlock[2][14];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+4][fx]);    localDiff = macross[0]-currentBlock[4][0];     diff += ABS(localDiff);    localDiff = macross[2]-currentBlock[4][2];     diff += ABS(localDiff);    localDiff = macross[4]-currentBlock[4][4];     diff += ABS(localDiff);    localDiff = macross[6]-currentBlock[4][6];     diff += ABS(localDiff);    localDiff = macross[8]-currentBlock[4][8];     diff += ABS(localDiff);    localDiff = macross[10]-currentBlock[4][10];     diff += ABS(localDiff);    localDiff = macross[12]-currentBlock[4][12];     diff += ABS(localDiff);    localDiff = macross[14]-currentBlock[4][14];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+6][fx]);    localDiff = macross[0]-currentBlock[6][0];     diff += ABS(localDiff);    localDiff = macross[2]-currentBlock[6][2];     diff += ABS(localDiff);    localDiff = macross[4]-currentBlock[6][4];     diff += ABS(localDiff);    localDiff = macross[6]-currentBlock[6][6];     diff += ABS(localDiff);    localDiff = macross[8]-currentBlock[6][8];     diff += ABS(localDiff);    localDiff = macross[10]-currentBlock[6][10];     diff += ABS(localDiff);    localDiff = macross[12]-currentBlock[6][12];     diff += ABS(localDiff);    localDiff = macross[14]-currentBlock[6][14];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+8][fx]);    localDiff = macross[0]-currentBlock[8][0];     diff += ABS(localDiff);    localDiff = macross[2]-currentBlock[8][2];     diff += ABS(localDiff);    localDiff = macross[4]-currentBlock[8][4];     diff += ABS(localDiff);    localDiff = macross[6]-currentBlock[8][6];     diff += ABS(localDiff);    localDiff = macross[8]-currentBlock[8][8];     diff += ABS(localDiff);    localDiff = macross[10]-currentBlock[8][10];     diff += ABS(localDiff);    localDiff = macross[12]-currentBlock[8][12];     diff += ABS(localDiff);    localDiff = macross[14]-currentBlock[8][14];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+10][fx]);    localDiff = macross[0]-currentBlock[10][0];     diff += ABS(localDiff);    localDiff = macross[2]-currentBlock[10][2];     diff += ABS(localDiff);    localDiff = macross[4]-currentBlock[10][4];     diff += ABS(localDiff);    localDiff = macross[6]-currentBlock[10][6];     diff += ABS(localDiff);    localDiff = macross[8]-currentBlock[10][8];     diff += ABS(localDiff);    localDiff = macross[10]-currentBlock[10][10];     diff += ABS(localDiff);    localDiff = macross[12]-currentBlock[10][12];     diff += ABS(localDiff);    localDiff = macross[14]-currentBlock[10][14];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+12][fx]);    localDiff = macross[0]-currentBlock[12][0];     diff += ABS(localDiff);    localDiff = macross[2]-currentBlock[12][2];     diff += ABS(localDiff);    localDiff = macross[4]-currentBlock[12][4];     diff += ABS(localDiff);    localDiff = macross[6]-currentBlock[12][6];     diff += ABS(localDiff);    localDiff = macross[8]-currentBlock[12][8];     diff += ABS(localDiff);    localDiff = macross[10]-currentBlock[12][10];     diff += ABS(localDiff);    localDiff = macross[12]-currentBlock[12][12];     diff += ABS(localDiff);    localDiff = macross[14]-currentBlock[12][14];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+14][fx]);    localDiff = macross[0]-currentBlock[14][0];     diff += ABS(localDiff);    localDiff = macross[2]-currentBlock[14][2];     diff += ABS(localDiff);    localDiff = macross[4]-currentBlock[14][4];     diff += ABS(localDiff);    localDiff = macross[6]-currentBlock[14][6];     diff += ABS(localDiff);    localDiff = macross[8]-currentBlock[14][8];     diff += ABS(localDiff);    localDiff = macross[10]-currentBlock[14][10];     diff += ABS(localDiff);    localDiff = macross[12]-currentBlock[14][12];     diff += ABS(localDiff);    localDiff = macross[14]-currentBlock[14][14];     diff += ABS(localDiff);    return diff;}/*===========================================================================* * * LumMotionErrorB * *	compute the motion error for the B subsampling pattern * * RETURNS:	the error, or some number greater if it is worse * * SIDE EFFECTS:    none * *===========================================================================*/int32LumMotionErrorB(currentBlock, prevFrame, by, bx, my, mx, bestSoFar)    LumBlock currentBlock;    MpegFrame *prevFrame;    int by;    int bx;    int my;    int mx;    int32 bestSoFar;{    register int32    diff = 0;	    /* max value of diff is 255*256 = 65280 */    register int32 localDiff;    register uint8 *macross;    register uint8 **prev;    register int    fy, fx;    boolean xHalf, yHalf;    xHalf = (ABS(mx) % 2 == 1);    yHalf = (ABS(my) % 2 == 1);    MOTION_TO_FRAME_COORD(by, bx, my/2, mx/2, fy, fx);    if ( xHalf ) {	if ( mx < 0 ) {	    fx--;	}	if ( yHalf ) {	    if ( my < 0 ) {		fy--;	    }	    	    prev = prevFrame->halfBoth;	} else {	    prev = prevFrame->halfX;	}    } else if ( yHalf ) {	if ( my < 0 ) {	    fy--;	}	prev = prevFrame->halfY;    } else {	prev = prevFrame->ref_y;    }    macross = &(prev[fy+0][fx]);    localDiff = macross[1]-currentBlock[0][1];     diff += ABS(localDiff);    localDiff = macross[3]-currentBlock[0][3];     diff += ABS(localDiff);    localDiff = macross[5]-currentBlock[0][5];     diff += ABS(localDiff);    localDiff = macross[7]-currentBlock[0][7];     diff += ABS(localDiff);    localDiff = macross[9]-currentBlock[0][9];     diff += ABS(localDiff);    localDiff = macross[11]-currentBlock[0][11];     diff += ABS(localDiff);    localDiff = macross[13]-currentBlock[0][13];     diff += ABS(localDiff);    localDiff = macross[15]-currentBlock[0][15];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+2][fx]);    localDiff = macross[1]-currentBlock[2][1];     diff += ABS(localDiff);    localDiff = macross[3]-currentBlock[2][3];     diff += ABS(localDiff);    localDiff = macross[5]-currentBlock[2][5];     diff += ABS(localDiff);    localDiff = macross[7]-currentBlock[2][7];     diff += ABS(localDiff);    localDiff = macross[9]-currentBlock[2][9];     diff += ABS(localDiff);    localDiff = macross[11]-currentBlock[2][11];     diff += ABS(localDiff);    localDiff = macross[13]-currentBlock[2][13];     diff += ABS(localDiff);    localDiff = macross[15]-currentBlock[2][15];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+4][fx]);    localDiff = macross[1]-currentBlock[4][1];     diff += ABS(localDiff);    localDiff = macross[3]-currentBlock[4][3];     diff += ABS(localDiff);    localDiff = macross[5]-currentBlock[4][5];     diff += ABS(localDiff);    localDiff = macross[7]-currentBlock[4][7];     diff += ABS(localDiff);    localDiff = macross[9]-currentBlock[4][9];     diff += ABS(localDiff);    localDiff = macross[11]-currentBlock[4][11];     diff += ABS(localDiff);    localDiff = macross[13]-currentBlock[4][13];     diff += ABS(localDiff);    localDiff = macross[15]-currentBlock[4][15];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+6][fx]);    localDiff = macross[1]-currentBlock[6][1];     diff += ABS(localDiff);    localDiff = macross[3]-currentBlock[6][3];     diff += ABS(localDiff);    localDiff = macross[5]-currentBlock[6][5];     diff += ABS(localDiff);    localDiff = macross[7]-currentBlock[6][7];     diff += ABS(localDiff);    localDiff = macross[9]-currentBlock[6][9];     diff += ABS(localDiff);    localDiff = macross[11]-currentBlock[6][11];     diff += ABS(localDiff);    localDiff = macross[13]-currentBlock[6][13];     diff += ABS(localDiff);    localDiff = macross[15]-currentBlock[6][15];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+8][fx]);    localDiff = macross[1]-currentBlock[8][1];     diff += ABS(localDiff);    localDiff = macross[3]-currentBlock[8][3];     diff += ABS(localDiff);    localDiff = macross[5]-currentBlock[8][5];     diff += ABS(localDiff);    localDiff = macross[7]-currentBlock[8][7];     diff += ABS(localDiff);    localDiff = macross[9]-currentBlock[8][9];     diff += ABS(localDiff);    localDiff = macross[11]-currentBlock[8][11];     diff += ABS(localDiff);    localDiff = macross[13]-currentBlock[8][13];     diff += ABS(localDiff);    localDiff = macross[15]-currentBlock[8][15];     diff += ABS(localDiff);    if ( diff > bestSoFar ) {	return diff;    }    macross = &(prev[fy+10][fx]);    localDiff = macross[1]-currentBlock[10][1];     diff += ABS(localDiff);    localDiff = macross[3]-currentBlock[10][3];     diff += ABS(localDiff);

⌨️ 快捷键说明

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