www.pudn.com > coremp4-1.0.zip > CodecAPI.cpp
/***************************************************************************** * * 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 * ****************************************************************************/ #ifdef __SYMBIAN32__ #include#include GLDEF_C TInt E32Dll(TDllReason){ return KErrNone; } #else #endif #define SUPPORTED_CODEC_VERSION 310 #include "Rules.h" #include "Util.h" #include "VideoCodec.h" #if defined LINUX || defined __SYMBIAN32__ extern"C"{ #endif //---------------------------- // communication functions void *InitCodec(dword sx, dword sy, dword fcc, dword codec_version, void *profiler); void CloseCodec(void *handle); int DecodeFrame(void *handle, const void *buf, dword sz_in, const byte *&y, const byte *&u, const byte *&v, dword &pitch, bool dropping); dword Version(); #if defined LINUX || defined __SYMBIAN32__ } #endif //---------------------------- dword Version(){ return SUPPORTED_CODEC_VERSION; } //---------------------------- #define FCC(a, b, c, d) dword((d<<24) | (c<<16) | (b<<8) | a) //---------------------------- void *InitCodec(dword sx, dword sy, dword fcc, dword codec_version, void *profiler){ if(codec_version 500) return NULL; { //make the fcc lower-case char *cp = (char*)&fcc; for(int i=0; i<4; i++){ char &c = cp[i]; if(c>='A' && c<='Z') c += 'a' - 'A'; } } switch(fcc){ case FCC('x', 'v', 'i', 'd'): case FCC('d', 'i', 'v', 'x'): case FCC('d', 'x', '5', '0'): case FCC('3', 'i', 'v', '2'): case FCC('3', 'i', 'v', 'x'): break; default: return NULL; } C_mp4_decode *dec = CreateMp4Decode(sx, sy, profiler); if(!dec){ #ifdef __PALMOS__ void Info(const char*, dword=0); Info("Core MP4: not enough memory for initialization"); #endif return NULL; } return dec; } //---------------------------- void CloseCodec(void *handle){ C_mp4_decode *dec = (C_mp4_decode*)handle; delete dec; } //---------------------------- int DecodeFrame(void *handle, const void *buf, dword sz_in, const byte *&y, const byte *&u, const byte *&v, dword &pitch, bool dropping){ C_mp4_decode *dec = (C_mp4_decode*)handle; S_yuv_image out; if(!dec->Process((byte*)buf, sz_in, (int)dropping, out)) return 0; y = out.y; u = out.u; v = out.v; pitch = out.pitch; return 1; } //---------------------------- #ifdef __PALMOS__ extern"C" void *DllMain(dword ord){ switch(ord){ case 1: return (void*)&InitCodec; case 2: return (void*)&CloseCodec; case 3: return (void*)&DecodeFrame; } return NULL; } #endif //----------------------------