ffglobals.cpp.svn-base
来自「ffshow源码」· SVN-BASE 代码 · 共 1,552 行 · 第 1/3 页
SVN-BASE
1,552 行
s->aspected_width = pixel_aspect[s->aspect_ratio_info][0]; s->aspected_height= pixel_aspect[s->aspect_ratio_info][1]; } return 0;}bool decodeMPEG4pictureHeader(const unsigned char *hdr,size_t len,TffPictBase &pict){ int startcode, v; GetBitContext gb; MPEG4context s; init_get_bits(&gb, hdr, (int)len*8); /* search next start code */ align_get_bits(&gb); startcode = 0xff; for(;;) { v = get_bits(&gb, 8); startcode = ((startcode << 8) | v) & 0xffffffff; if(get_bits_count(&gb) >= gb.size_in_bits){ return false; //end of stream } if((startcode&0xFFFFFF00) != 0x100) continue; //no startcode switch(startcode){ case 0x120: if(decode_vol_header(&s, &gb) < 0) return false; else { pict.setSar(Rational(s.aspected_width,s.aspected_height)); return true; } /* #define VOS_STARTCODE 0x1B0#define USER_DATA_STARTCODE 0x1B2#define GOP_STARTCODE 0x1B3#define VOP_STARTCODE 0x1B6 case USER_DATA_STARTCODE: decode_user_data(s, gb); break; case GOP_STARTCODE: mpeg4_decode_gop_header(s, gb); break; case VOP_STARTCODE: return decode_vop_header(s, gb);*/ default: break; } align_get_bits(&gb); startcode = 0xff; }}// encodingconst char_t *encQuantTypes[]={ _l("H.263"), _l("MPEG"), _l("Modulated"), _l("Modulated new"), _l("Custom"), _l("JVT")};const Taspect displayAspects[]={ _l("1:1") , 1.0f,1.0f, _l("4:3") , 4.0f,3.0f, _l("16:9") ,16.0f,9.0f, _l("2.21:1"),2.21f,1.0f, NULL,0};const Taspect sampleAspects[]={ _l("Square") , 1.0f, 1.0f, _l("4:3 PAL") ,12.0f,11.0f, _l("4:3 NTSC") ,10.0f,11.0f, _l("16:9 PAL") ,16.0f,11.0f, _l("16:9 NTSC"),40.0f,33.0f, NULL,0};//======================== YUVcolor ==========================YUVcolor::YUVcolor(COLORREF rgb,bool vob){ unsigned int r=GetRValue(rgb),g=GetGValue(rgb),b=GetBValue(rgb); if (!vob) { Y=(uint8_t)((((uint16_t) ((0.299) * (1L << 8) + 0.5)) * r + ((uint16_t) ((0.587) * (1L << 8) + 0.5)) * g + ((uint16_t) ((0.114) * (1L << 8) + 0.5)) * b) >> 8); U=(int8_t)((-((int16_t) ((0.16874) * (1L << 8) + 0.5)) * r - ((int16_t) ((0.33126) * (1L << 8) + 0.5)) * g + ((int16_t) ((0.50000) * (1L << 8) + 0.5)) * b) >> 9);// + 128; V=(int8_t)(( ((int16_t) ((0.50000) * (1L << 8) + 0.5)) * r - ((int16_t) ((0.41869) * (1L << 8) + 0.5)) * g - ((int16_t) ((0.08131) * (1L << 8) + 0.5)) * b) >> 9);// + 128; } else { Y=(uint8_t)((((uint16_t) (( 0.1494 ) * (1L << 8) + 0.5)) * r + ((uint16_t) (( 0.6061 ) * (1L << 8) + 0.5)) * g + ((uint16_t) (( 0.2445 ) * (1L << 8) + 0.5)) * b) >> 8); U=(int8_t) ((((int16_t) (( 0.6066 ) * (1L << 8) + 0.5)) * r - ((int16_t) (( 0.4322 ) * (1L << 8) + 0.5)) * g - ((int16_t) (( 0.1744 ) * (1L << 8) + 0.5)) * b) >> 8) + 128; V=(int8_t) ((((int16_t) ((-0.08435) * (1L << 8) + 0.5)) * r - ((int16_t) (( 0.3422 ) * (1L << 8) + 0.5)) * g + ((int16_t) (( 0.4266 ) * (1L << 8) + 0.5)) * b) >> 8) + 128; } }// Copyright (C) 1995,1998,1999 DJ Deloriestatic bool isslash(char_t c) {return c=='\\' || c=='/';}static const char_t *find_slash(const char_t *s){ while (*s) { if (isslash(*s)) return s; s++; } return 0;}struct Ttoupper{ template<class T> inline int operator()(T c) {return tchar_traits<char_t>::toupper((tchar_traits<char_t>::toupper_t)c);}};static const char_t *rangematch(const char_t *pattern, char_t test, int nocase){ char_t c, c2; int negate, ok; if ((negate = (*pattern == '!'))!=NULL) ++pattern; for (ok = 0; (c = *pattern++) != ']';) { if (c == 0) return 0;/* illegal pattern */ if (*pattern == '-' && (c2 = pattern[1]) != 0 && c2 != ']') { if (c <= test && test <= c2) ok = 1; if (nocase && Ttoupper()(c) <= Ttoupper()(test) && Ttoupper()(test) <= Ttoupper()(c2)) ok = 1; pattern += 2; } else if (c == test) ok = 1; else if (nocase && (Ttoupper()(c) == Ttoupper()(test))) ok = 1; } return ok == negate ? NULL : pattern;}bool fnmatch(const char_t *pattern, const char_t *string, int flags){ char_t c; char_t test; for (;;) switch ((c = *pattern++)) { case 0: return *string == 0 ? true : false; case '?': if ((test = *string++) == 0 || (isslash(test) && (flags & FNM_PATHNAME))) return false; break; case '*': c = *pattern; // collapse multiple stars while (c=='*') c=*++pattern; // optimize for pattern with * at end or before / if (c == 0) { if (flags & FNM_PATHNAME) return find_slash(string) ? false : true; else return true; } else if (isslash(c) && flags & FNM_PATHNAME) { if ((string = find_slash(string)) == NULL) return false; break; } // general case, use recursion while ((test = *string) != 0) { if (fnmatch(pattern, string, flags) == true) return true; if (isslash(test) && flags & FNM_PATHNAME) break; ++string; } return false; case '[': if ((test = *string++) == 0 || (isslash(test) && flags & FNM_PATHNAME)) return false; if ((pattern = rangematch(pattern, test, flags & FNM_NOCASE)) == NULL) return false; break; case '\\': if (!(flags & FNM_NOESCAPE) && pattern[1] && strchr("*?[\\", pattern[1])) { if ((c = *pattern++) == 0) { c = '\\'; --pattern; } if (c != *string++) return false; break; } // FALLTHROUGH default: if (isslash(c) && isslash(*string)) { string++; break; } if (flags & FNM_NOCASE) { if (Ttoupper()(c) != Ttoupper()(*string++)) return false; } else { if (c != *string++) return false; } break; }}template<class tchar> const tchar* stristr(const tchar *haystack,const tchar *needle) { if (!(haystack && needle)) return NULL; size_t len=strlen(needle); const tchar *p=haystack; while (*p != '\0') { if (_strnicmp(p,needle,len)==0) return p; p++; } return NULL;}template<class tchar> const tchar* strnistr(const tchar *haystack,size_t n,const tchar *needle) { if (!(haystack && needle)) return NULL; size_t len=strlen(needle);n-=len-1; const tchar *p=haystack; while (*p && n--) { if (_strnicmp(p,needle,len)==0) return (tchar*)p; p++; } return NULL;}template<class tchar> const tchar* strnstr(const tchar *haystack,size_t n,const tchar *needle) { if (!(haystack && needle)) return NULL; size_t len=strlen(needle);n-=len-1; const tchar *p=haystack; while (*p && n--) { if (strncmp(p,needle,len)==0) return (tchar*)p; p++; } return NULL;}template<class tchar> const void* memnstr(const void *haystack,size_t n,const tchar *needle){ if (!(haystack && needle)) return NULL; int step=sizeof(tchar); size_t len=strlen(needle)*step;n-=len-step; const tchar *p=(const tchar*)haystack; while (n-=step) { if (memcmp(p,needle,len)==0) return p; p+=step; } return NULL;}template<class tchar> const tchar *strnchr(const tchar *s,size_t n,int c){ while (n-- && *s) if (*s==c) return s; else s++; return NULL; }template<class char_t> char_t* strrmchar(char_t *s,int c){ char_t *p1=s; for (const char_t *p2=p1;*p2;*p1=*p2,p2++,p1+=*p1!=c); *p1='\0'; return s;} int countbits(uint32_t x){ static const int numbits[256]= { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, }; return numbits[((uint8_t*)&x)[0]]+ numbits[((uint8_t*)&x)[1]]+ numbits[((uint8_t*)&x)[2]]+ numbits[((uint8_t*)&x)[3]];}void setThreadName(DWORD dwThreadID,LPCSTR szThreadName){#ifdef DEBUG struct THREADNAME_INFO { DWORD dwType; // must be 0x1000 LPCSTR szName; // pointer to name (in user addr space) DWORD dwThreadID; // thread ID (-1=caller thread) DWORD dwFlags; // reserved for future use, must be zero } info; info.dwType=0x1000; info.szName=szThreadName; info.dwThreadID=dwThreadID; info.dwFlags=0; __try { RaiseException(0x406D1388,0,sizeof(info)/sizeof(DWORD),(ULONG_PTR*)&info); } __except(EXCEPTION_CONTINUE_EXECUTION) { }#endif}char_t *guid2str(const GUID &riid,char_t *dest){ LPOLESTR str; StringFromIID(riid,&str); text<char_t>(str,dest); CoTaskMemFree(str); return dest;}FOURCC hdr2fourcc(const BITMAPINFOHEADER *hdr,const GUID *subtype){ if (subtype && *subtype==MEDIASUBTYPE_QTRle) return FOURCC_QRLE; if (hdr->biCompression==0) { if (subtype) { if (*subtype==MEDIASUBTYPE_RGB555) return FOURCC_RGB5; else if (*subtype==MEDIASUBTYPE_RGB565) return FOURCC_RGB6; else if (*subtype==MEDIASUBTYPE_RGB24 ) return FOURCC_RGB2; else if (*subtype==MEDIASUBTYPE_RGB32 || *subtype==MEDIASUBTYPE_ARGB32) return FOURCC_RGB3; } switch (hdr->biBitCount) { case 1:return FOURCC_PAL1;break; case 4:return FOURCC_PAL4;break; case 8:return FOURCC_PAL8;break; case 15:return FOURCC_RGB5;break; case 16:return FOURCC_RGB6;break; case 24:return FOURCC_RGB2;break; case 32:return FOURCC_RGB3;break; } } return hdr->biCompression;}const char_t *fourcc2str(FOURCC fcc,char_t *name,size_t namelength){ switch (fcc) { case FOURCC_PAL1:strncpy(name,_l("2 colors"),namelength);break; case FOURCC_PAL4:strncpy(name,_l("16 colors"),namelength);break; case FOURCC_PAL8:strncpy(name,_l("256 colors"),namelength);break; case FOURCC_RGB15MPLAYER: case FOURCC_RGB5:strncpy(name,_l("RGB555"),namelength);break; case FOURCC_RGB16MPLAYER: case FOURCC_RGB6:strncpy(name,_l("RGB565"),namelength);break; case FOURCC_RGB24MPLAYER: case FOURCC_RGB2:strncpy(name,_l("RGB24") ,namelength);break; case FOURCC_RGB32MPLAYER: case FOURCC_RGB3:strncpy(name,_l("RGB32") ,namelength);break; case FOURCC_RLE4:strncpy(name,_l("MSRLE4"),namelength);break; case FOURCC_RLE8:strncpy(name,_l("MSRLE8"),namelength);break; case FOURCC_1001:strncpy(name,_l("MPEG1") ,namelength);break; case FOURCC_1002:strncpy(name,_l("MPEG2") ,namelength);break; case FOURCC_BITFIELDS:strncpy(name,_l("bitfields"),namelength);break; default: { char nameA[5]; memcpy(nameA,&fcc,std::min(namelength,(size_t)4));nameA[std::min(namelength,(size_t)4)]='\0'; text<char_t>(nameA,name); break; } } name[namelength-1]='\0'; return name;}void fixMPEGinAVI(FOURCC &fcc){ FOURCC fccu=FCCupper(fcc); if (fccu==FOURCC_1001 || fccu==FOURCC_1002 || fccu==FOURCC_MPG1 || fccu==FOURCC_MPG2) fcc=FOURCC_MPEG;}HWND createInvisibleWindow(HINSTANCE hi,const char_t *classname,const char_t *windowname,WNDPROC wndproc,void* lparam,ATOM *atom){ if (!atom || !*atom) { WNDCLASS wndclass; wndclass.style =0; wndclass.lpfnWndProc =wndproc; wndclass.cbClsExtra =0; wndclass.cbWndExtra =0; wndclass.hInstance =hi; wndclass.hIcon =NULL; wndclass.hCursor =NULL; wndclass.hbrBackground=NULL; wndclass.lpszMenuName =NULL; wndclass.lpszClassName=classname; ATOM at=RegisterClass(&wndclass); if (atom) *atom=at; } return CreateWindow(classname, windowname, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hi, lparam);}void getCLSIDname(const CLSID &clsid,char_t *buf,size_t buflen){ LPOLESTR sclsidW; StringFromIID(clsid,&sclsidW); char_t reg[MAX_PATH]; tsprintf(reg,_l("\\CLSID\\%s"),(const char_t*)text<char_t>(sclsidW)); CoTaskMemFree(sclsidW); TregOpRegRead t(HKEY_CLASSES_ROOT,reg); t._REG_OP_S(0,_l(""),buf,buflen,_l(""));}const TmultipleInstances multipleInstances[]={ 0,_l("no limitations"), 1,_l("only one - check previous filter only"), 3,_l("only one - check all previous filters"), 2,_l("only one - check all filters in graph"), 4,_l("none - disabled"), 0,NULL};template const char* stristr(const char *haystack,const char *needle);template const char* strnstr(const char *haystack,size_t n,const char *needle);template const char* strnistr(const char *haystack,size_t n,const char *needle);template const char *strnchr(const char *s,size_t n,int c);template char* strrmchar(char *s,int c);template void strtok(const char *s,const char *delim,std::vector<DwString<char> > &lst,bool add_empty,size_t max_parts);template void strtok(const char *s,const char *delim,std::vector<Tstrpart<char> > &lst,bool add_empty,size_t max_parts);template void strtok(const char *s,const char *delim,ints &lst,bool add_empty,size_t max_parts);template const void* memnstr(const void *haystachk,size_t n,const char *needle);template const wchar_t* stristr(const wchar_t *haystack,const wchar_t *needle);template const wchar_t* strnstr(const wchar_t *haystack,size_t n,const wchar_t *needle);template const wchar_t* strnistr(const wchar_t *haystack,size_t n,const wchar_t *needle);template const wchar_t *strnchr(const wchar_t *s,size_t n,int c);template void strtok(const wchar_t *s,const wchar_t *delim,std::vector<DwString<wchar_t> > &lst,bool add_empty,size_t max_parts);template void strtok(const wchar_t *s,const wchar_t *delim,std::vector<Tstrpart<wchar_t> > &lst,bool add_empty,size_t max_parts);template void strtok(const wchar_t *s,const wchar_t *delim,ints &lst,bool add_empty,size_t max_parts);template wchar_t* strrmchar(wchar_t *s,int c);template const void* memnstr(const void *haystachk,size_t n,const wchar_t *needle);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?