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

📄 mem_transfer.cpp

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 CPP
字号:
/***************************************************************************** * *  XVID MPEG-4 VIDEO CODEC *  - 8bit<->16bit transfer  - * *  Copyright(C) 2001-2003 Peter Ross <pross@xvid.org> * *  This program is free software ; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation ; either version 2 of the License, or *  (at your option) any later version. * *  This program 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 General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program ; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA * * $Id: mem_transfer.cpp,v 1.1.1.1 2005/07/13 14:36:16 jeanlf Exp $ * ****************************************************************************/#include "global.h"#include "mem_transfer.h"/***************************************************************************** * * All these functions are used to transfer data from a 8 bit data array * to a 16 bit data array. * * This is typically used during motion compensation, that's why some * functions also do the addition/substraction of another buffer during the * so called  transfer. * ****************************************************************************///----------------------------/* * SRC - the source buffer * DST - the destination buffer * * Then the function does the 8->16 bit transfer and this serie of operations : * *    SRC (16bit) = SRC *    DST (8bit)  = max(min(SRC, 255), 0) */void transfer_16to8copy(byte *dst, const int *src, dword stride){   for(int j = 0; j < 8; j++){      for(int i = 0; i < 8; i++){         int pixel = *src++;         if(pixel < 0)            pixel = 0;         //else         if(pixel > 255)            pixel = 255;         dst[i] = byte(pixel);      }      dst += stride;   }}//----------------------------/* * SRC - the source buffer * DST - the destination buffer * * Then the function does the 16->8 bit transfer and this serie of operations : * *    SRC (16bit) = SRC *    DST (8bit)  = max(min(DST+SRC, 255), 0) */void transfer_16to8add(byte *dst, const int *src, dword stride){   for(int j = 0; j < 8; j++){      for(int i = 0; i < 8; i++){         int pixel = dst[i] + *src++;         if(pixel < 0)            pixel = 0;         //else         if(pixel > 255)            pixel = 255;         dst[i] = byte(pixel);      }      //src += 8;      dst += stride;   }}#ifndef _ARM_//----------------------------/* * SRC - the source buffer * DST - the destination buffer * * Then the function does the 8->8 bit transfer and this serie of operations : * *    SRC (8bit) = SRC *    DST (8bit) = SRC */void transfer8x8_copy(byte *dst, const byte *src, dword stride){   assert(!(stride&3));   assert(!(dword(dst)&3));#if defined USE_ARM_ASM && 1   int y, tmp, tmp1;#define NL "add %0, %0, %4\n   add %1, %1, %4\n\t"   asm volatile(      "orr %2, %1, %4\n\t"      "tst %2, #3\n   bne .tc_no_dw\n\t"                              //dword version   "\n.tc_dw_loop:\n\t"#define COPY_QW "ldmia %1, { %2, %3 }\n   stmia %0, { %2, %3 }\n\t"      COPY_QW NL COPY_QW NL COPY_QW NL COPY_QW NL COPY_QW NL COPY_QW NL COPY_QW NL COPY_QW      "b .tc_end\n\t"   "\n.tc_no_dw:\n\t"      "tst %2, #1\n   bne .tc_no_w\n\t"                              //word version   "\n.tc_w_loop:\n\t"#define COPY_W \      "ldrh %2, [%1, #0]\n   strh %2, [%0, #0]\n\t" \      "ldrh %2, [%1, #2]\n   strh %2, [%0, #2]\n\t" \      "ldrh %2, [%1, #4]\n   strh %2, [%0, #4]\n\t" \      "ldrh %2, [%1, #6]\n   strh %2, [%0, #6]\n\t"      COPY_W NL COPY_W NL COPY_W NL COPY_W NL COPY_W NL COPY_W NL COPY_W NL COPY_W      "b .tc_end\n\t"   "\n.tc_no_w:\n\t"      "mov %5, #8\n\t"   "\n.tc_b_loop:\n\t"      "ldrb %2, [%1, #0]\n   strb %2, [%0, #0]\n\t"      "ldrb %2, [%1, #1]\n   strb %2, [%0, #1]\n\t"      "ldrb %2, [%1, #2]\n   strb %2, [%0, #2]\n\t"      "ldrb %2, [%1, #3]\n   strb %2, [%0, #3]\n\t"      "ldrb %2, [%1, #4]\n   strb %2, [%0, #4]\n\t"      "ldrb %2, [%1, #5]\n   strb %2, [%0, #5]\n\t"      "ldrb %2, [%1, #6]\n   strb %2, [%0, #6]\n\t"      "ldrb %2, [%1, #7]\n   strb %2, [%0, #7]\n\t"      NL      "subs %5, %5, #1\n   bne .tc_b_loop\n\t"      "\n.tc_end:\n\t"      : "+r"(dst), "+r"(src), "&=r"(tmp), "&=r"(tmp1)      : "r"(stride), "r"(y)      );#else   if(!(dword(src)&3) && !(dword(dst)&3)){      for(dword y = 8; y--; ){         ((dword*)dst)[0] = ((dword*)src)[0];         ((dword*)dst)[1] = ((dword*)src)[1];         src += stride;         dst += stride;      }   }else   if(!(dword(src)&1) && !(dword(dst)&1)){      for(dword y = 8; y--; ){         ((word*)dst)[0] = ((word*)src)[0];         ((word*)dst)[1] = ((word*)src)[1];         ((word*)dst)[2] = ((word*)src)[2];         ((word*)dst)[3] = ((word*)src)[3];         src += stride;         dst += stride;      }   }else{      for(dword y = 8; y--; ){         dst[0] = src[0];         dst[1] = src[1];         dst[2] = src[2];         dst[3] = src[3];         dst[4] = src[4];         dst[5] = src[5];         dst[6] = src[6];         dst[7] = src[7];         src += stride;         dst += stride;      }   }#endif}#endif//----------------------------#ifndef PROFILE#ifdef __SYMBIAN32__#include <e32base.h>void MemSet(void *dst, byte c, dword len){   Mem::Fill(dst, len, c);}//----------------------------void MemCpy(void *dst, const void *src, dword len){   Mem::Copy(dst, src, len);}//----------------------------int MemCmp(const void *mem1, const void *mem2, dword len){   return Mem::Compare((byte*)mem1, len, (byte*)mem2, len);}//----------------------------dword StrLen(const char *cp){ return User::StringLength((const byte*)cp); }//----------------------------void Fatal(const char *msg, dword code){   int len = StrLen(msg);   TBuf16<20> desc; desc.Copy(TPtr8((byte*)msg, Min(len, 20), len));   User::Panic(desc, code);}#else//----------------------------#include <memory.h>#include <stdio.h>void MemSet(void *dst, byte c, dword len){   memset(dst, c, len);}//----------------------------void MemCpy(void *dst, const void *src, dword len){   memcpy(dst, src, len);}//----------------------------int MemCmp(const void *mem1, const void *mem2, dword len){   return memcmp(mem1, mem2, len);}//----------------------------void *operator new(size_t sz, TLeave){   void *vp = new byte[sz];   if(!vp){                              //todo: fatal error      Fatal("Not enough memory", sz);   }   return vp;}//----------------------------#include <windows.h>void Fatal(const char *msg, dword code){#ifdef _WIN32_WCE   wchar_t buf[256];   swprintf(buf, L"%i (%i)", msg, code);   MessageBox(NULL, buf, L"Fatal error", MB_OK | MB_ICONERROR);#else   char buf[256];   sprintf(buf, "%i (%i)", msg, code);   MessageBox(NULL, buf, "Fatal error", MB_OK | MB_ICONERROR);#endif   exit(1);}//----------------------------#endif#endif//----------------------------

⌨️ 快捷键说明

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