From 105f6c9b70215784f970852d158a9722e6de60a4 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 3 Feb 2012 23:24:33 +0100 Subject: [PATCH] Imported Upstream version 0.4.5+svn3450~dfsg1 --- modules/xvid_dec/xvid_wce/AUTHORS | 36 - modules/xvid_dec/xvid_wce/CodecAPI.cpp | 114 -- modules/xvid_dec/xvid_wce/LICENSE | 340 ---- modules/xvid_dec/xvid_wce/README | 29 - modules/xvid_dec/xvid_wce/ReadMe.txt | 65 - modules/xvid_dec/xvid_wce/Rules.h | 66 - modules/xvid_dec/xvid_wce/TODO | 52 - modules/xvid_dec/xvid_wce/bitstream.cpp | 1104 ------------- modules/xvid_dec/xvid_wce/bitstream.h | 116 -- modules/xvid_dec/xvid_wce/decoder.cpp | 1448 ------------------ modules/xvid_dec/xvid_wce/decoder.h | 269 ---- modules/xvid_dec/xvid_wce/font.cpp | 598 -------- modules/xvid_dec/xvid_wce/global.h | 355 ----- modules/xvid_dec/xvid_wce/gmc.cpp | 396 ----- modules/xvid_dec/xvid_wce/gmc.h | 45 - modules/xvid_dec/xvid_wce/image.cpp | 356 ----- modules/xvid_dec/xvid_wce/image.h | 37 - modules/xvid_dec/xvid_wce/interpolate8x8.cpp | 872 ----------- modules/xvid_dec/xvid_wce/interpolate8x8.h | 107 -- modules/xvid_dec/xvid_wce/mbcoding.cpp | 936 ----------- modules/xvid_dec/xvid_wce/mbprediction.cpp | 341 ----- modules/xvid_dec/xvid_wce/mbprediction.h | 54 - modules/xvid_dec/xvid_wce/mem_align.cpp | 131 -- modules/xvid_dec/xvid_wce/mem_align.h | 35 - modules/xvid_dec/xvid_wce/mem_transfer.cpp | 281 ---- modules/xvid_dec/xvid_wce/mem_transfer.h | 61 - modules/xvid_dec/xvid_wce/note | 4 - modules/xvid_dec/xvid_wce/portab.h | 166 -- modules/xvid_dec/xvid_wce/qpel.inl | 146 -- modules/xvid_dec/xvid_wce/qpel_tab.cpp | 103 -- modules/xvid_dec/xvid_wce/quant.h | 54 - modules/xvid_dec/xvid_wce/quant_h263.cpp | 85 - modules/xvid_dec/xvid_wce/quant_matrix.cpp | 115 -- modules/xvid_dec/xvid_wce/quant_matrix.h | 44 - modules/xvid_dec/xvid_wce/quant_mpeg.cpp | 98 -- modules/xvid_dec/xvid_wce/reduced.cpp | 195 --- modules/xvid_dec/xvid_wce/reduced.h | 54 - modules/xvid_dec/xvid_wce/vlc_codes.h | 50 - modules/xvid_dec/xvid_wce/xvid.cpp | 185 --- modules/xvid_dec/xvid_wce/xvid.h | 502 ------ modules/xvid_dec/xvid_wce/xvid_ppc.asm | 592 ------- 41 files changed, 10637 deletions(-) delete mode 100644 modules/xvid_dec/xvid_wce/AUTHORS delete mode 100644 modules/xvid_dec/xvid_wce/CodecAPI.cpp delete mode 100644 modules/xvid_dec/xvid_wce/LICENSE delete mode 100644 modules/xvid_dec/xvid_wce/README delete mode 100644 modules/xvid_dec/xvid_wce/ReadMe.txt delete mode 100644 modules/xvid_dec/xvid_wce/Rules.h delete mode 100644 modules/xvid_dec/xvid_wce/TODO delete mode 100644 modules/xvid_dec/xvid_wce/bitstream.cpp delete mode 100644 modules/xvid_dec/xvid_wce/bitstream.h delete mode 100644 modules/xvid_dec/xvid_wce/decoder.cpp delete mode 100644 modules/xvid_dec/xvid_wce/decoder.h delete mode 100644 modules/xvid_dec/xvid_wce/font.cpp delete mode 100644 modules/xvid_dec/xvid_wce/global.h delete mode 100644 modules/xvid_dec/xvid_wce/gmc.cpp delete mode 100644 modules/xvid_dec/xvid_wce/gmc.h delete mode 100644 modules/xvid_dec/xvid_wce/image.cpp delete mode 100644 modules/xvid_dec/xvid_wce/image.h delete mode 100644 modules/xvid_dec/xvid_wce/interpolate8x8.cpp delete mode 100644 modules/xvid_dec/xvid_wce/interpolate8x8.h delete mode 100644 modules/xvid_dec/xvid_wce/mbcoding.cpp delete mode 100644 modules/xvid_dec/xvid_wce/mbprediction.cpp delete mode 100644 modules/xvid_dec/xvid_wce/mbprediction.h delete mode 100644 modules/xvid_dec/xvid_wce/mem_align.cpp delete mode 100644 modules/xvid_dec/xvid_wce/mem_align.h delete mode 100644 modules/xvid_dec/xvid_wce/mem_transfer.cpp delete mode 100644 modules/xvid_dec/xvid_wce/mem_transfer.h delete mode 100644 modules/xvid_dec/xvid_wce/note delete mode 100644 modules/xvid_dec/xvid_wce/portab.h delete mode 100644 modules/xvid_dec/xvid_wce/qpel.inl delete mode 100644 modules/xvid_dec/xvid_wce/qpel_tab.cpp delete mode 100644 modules/xvid_dec/xvid_wce/quant.h delete mode 100644 modules/xvid_dec/xvid_wce/quant_h263.cpp delete mode 100644 modules/xvid_dec/xvid_wce/quant_matrix.cpp delete mode 100644 modules/xvid_dec/xvid_wce/quant_matrix.h delete mode 100644 modules/xvid_dec/xvid_wce/quant_mpeg.cpp delete mode 100644 modules/xvid_dec/xvid_wce/reduced.cpp delete mode 100644 modules/xvid_dec/xvid_wce/reduced.h delete mode 100644 modules/xvid_dec/xvid_wce/vlc_codes.h delete mode 100644 modules/xvid_dec/xvid_wce/xvid.cpp delete mode 100644 modules/xvid_dec/xvid_wce/xvid.h delete mode 100644 modules/xvid_dec/xvid_wce/xvid_ppc.asm diff --git a/modules/xvid_dec/xvid_wce/AUTHORS b/modules/xvid_dec/xvid_wce/AUTHORS deleted file mode 100644 index 36902a8..0000000 --- a/modules/xvid_dec/xvid_wce/AUTHORS +++ /dev/null @@ -1,36 +0,0 @@ -AUTHORS -======= - -This file lists all authors of XviD MPEG4 core library. If you think -your name should appear on this list, please send us an email telling -us your name, we will be pleased to add it here. - -The lists are classified by alphabetical order. - - -Project initiators: -------------------- - -Christoph Lampert -Michael Militzer -Peter Ross - - -Regular contributors: ---------------------- - -Edouard Gomez -Pascal Massimino -Radoslaw Czyz - - -Spontaneous contributors: -------------------------- - -Benjamin Herrenschmidt -Daniel Smith -Dirk Knop -Guillaume Morin -MinChen - -Last edited: $Date: 2005-07-13 14:36:12 $ diff --git a/modules/xvid_dec/xvid_wce/CodecAPI.cpp b/modules/xvid_dec/xvid_wce/CodecAPI.cpp deleted file mode 100644 index 34ac6b8..0000000 --- a/modules/xvid_dec/xvid_wce/CodecAPI.cpp +++ /dev/null @@ -1,114 +0,0 @@ -//---------------------------- -// Symbian codec API -// -//---------------------------- -#include "rules.h" -#include "global.h" -#include "xvid.h" - -#ifdef __SYMBIAN32__ -#include -#include -//GLDEF_C TInt E32Dll(TDllReason){ return KErrNone; } -#else -#endif - - -//---------------------------- - -struct S_decoder{ - xvid_dec_frame_t xvid_dec_frame; - dword size_x; - void *dec_handle; -}; - -#define FCC(a, b, c, d) dword((d<<24) | (c<<16) | (b<<8) | a) - -//---------------------------- - -void * InitCodec(dword sx, dword sy, dword fcc){ - - switch(fcc){ - case FCC('x', 'v', 'i', 'd'): - case FCC('X', 'V', 'I', 'D'): - case FCC('D', 'I', 'V', 'X'): - case FCC('d', 'i', 'v', 'x'): - case FCC('D', 'X', '5', '0'): - case FCC('3', 'I', 'V', '2'): - case FCC('3', 'i', 'v', '2'): - case FCC('3', 'I', 'V', 'X'): - break; - default: - return NULL; - } - S_decoder *dec = new S_decoder; - if (!dec) return NULL; - dec->size_x = sx; - - xvid_dec_frame_t &xvid_dec_frame = dec->xvid_dec_frame; - MemSet(&xvid_dec_frame, 0, sizeof(xvid_dec_frame)); - xvid_dec_frame.version = XVID_VERSION; - //xvid_dec_frame.general = 0; - //convert into true-color, we'll perform convertion to dest format ourselves - //xvid_dec_frame.output.csp = XVID_CSP_BGR; - - xvid_gbl_init_t xvid_gbl_init; - MemSet(&xvid_gbl_init, 0, sizeof(xvid_gbl_init)); - xvid_gbl_init.version = XVID_VERSION; - xvid_gbl_init.cpu_flags = 0; - //xvid_gbl_init.debug = XVID_DEBUG_ERROR | XVID_DEBUG_STARTCODE | XVID_DEBUG_HEADER; - xvid_global(NULL, 0, &xvid_gbl_init, NULL); - - xvid_dec_create_t xvid_dec_create; - MemSet(&xvid_dec_create, 0, sizeof(xvid_dec_create)); - xvid_dec_create.version = XVID_VERSION; - xvid_dec_create.width = 0; - xvid_dec_create.height = 0; -#ifdef PROFILE - xvid_dec_create.prof = &prof; -#endif - xvid_dec_create.width = sx; - xvid_dec_create.height = sy; - - int ret = xvid_decore(NULL, XVID_DEC_CREATE, &xvid_dec_create, NULL); - if(ret){ - delete dec; - return NULL; - } - dec->size_x = sx; - dec->dec_handle = xvid_dec_create.handle; - - return dec; -} - -//---------------------------- - -void CloseCodec(void *handle){ - S_decoder *dec = (S_decoder*)handle; - xvid_decore(dec->dec_handle, XVID_DEC_DESTROY, NULL, NULL); - delete dec; -} - -//---------------------------- - -int DecodeFrame(void *handle, const void *buf, dword sz_in, byte *&y, byte *&u, byte *&v, dword &pitch){ - - S_decoder *dec = (S_decoder*)handle; - - dec->xvid_dec_frame.bitstream = buf; - dec->xvid_dec_frame.length = sz_in; - xvid_decore(dec->dec_handle, XVID_DEC_DECODE, &dec->xvid_dec_frame, NULL); - - const C_xvid_image *img = dec->xvid_dec_frame.img_out; - if(!img) - return 0; - - y = img->y; - u = img->u; - v = img->v; - int mb_width = (dec->size_x + 15) / 16; - pitch = 16 * mb_width + 2 * EDGE_SIZE; - return 1; -} - -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/LICENSE b/modules/xvid_dec/xvid_wce/LICENSE deleted file mode 100644 index 14db8fc..0000000 --- a/modules/xvid_dec/xvid_wce/LICENSE +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/modules/xvid_dec/xvid_wce/README b/modules/xvid_dec/xvid_wce/README deleted file mode 100644 index b9ea387..0000000 --- a/modules/xvid_dec/xvid_wce/README +++ /dev/null @@ -1,29 +0,0 @@ -1) Introduction ---------------- - -XviD is a high performance and high quality MPEG-4 video de-/encoding -solution. - -The XviD package currently consists of three parts: - -- xvidcore: the main MPEG-4 de-/encoding library, and simple example - programs -- dshow: windows direct show decoder filter which links against - xvidcore to allow MPEG-4 playback on Windows based OS. -- vfw: video for windows GUI - - -2) Documentation ----------------- - -- xvidcore/doc/README: some general information. -- xvidcore/doc/INSTALL: building and installing instructions. - - -3) Licensing: ------------- - -- XviD is licensed as a whole under the terms of the XviD license - described in the file LICENSE This is true for all files belonging - to XviD except for those which specifically carry a different - license header. \ No newline at end of file diff --git a/modules/xvid_dec/xvid_wce/ReadMe.txt b/modules/xvid_dec/xvid_wce/ReadMe.txt deleted file mode 100644 index 5550da6..0000000 --- a/modules/xvid_dec/xvid_wce/ReadMe.txt +++ /dev/null @@ -1,65 +0,0 @@ -This is a port of the XviD decoder for symbian and PocketPC OS. It was found by luck on the net at http://www.lonelycatgames.com/mobile/smartmovie/ - -Symbian codec system: - -//---------------------------- -General rules: -- All codecs are located in c:\system\codecs on target device -- Each codec is single native DLL -- One codec may support one or more video formats -- Formats are identified by 32-bit fourcc code - -//---------------------------- -Codec API: - -Codec DLL need to have following functions exported: - -Function Ordinal -InitCodec 1 -CloseCodec 2 -DecodeFrame 3 - -Because Symbian DLL doesn't support exporting DLL functions by name, exported functions -must have ordinals as specified in above table. - -//---------------------------- -Detailed API definition: - -void *InitCodec(dword sx, dword sy, dword fcc); -Initialize codec, using provided fcc code and dimensions of video image. -Parameters: - [IN] sx, sy - resolution of video image (width, height) - [IN] fcc - Four-cc code of video stream -Return value: - pointer to decoder handle (passed to other functions), or NULL if fourcc code is not supported by codec - -//---------------------------- -void CloseCodec(void *handle); -Close codec, unitinialize memory, etc. -Parameters: - [IN] handle - handle value obtained by InitCodec function - -//---------------------------- -int DecodeFrame(void *handle, const void *buf, dword sz_in, const byte *&y, const byte *&u, const byte *&v, dword &pitch); -Decode single frame. The frame data may depend on previous frame data passed in by previous call to this function. -It is safe to call this function with data of non-contiguous frame, for example when seeking, provided that -the frame is a keyframe - i.e. contains data for entire image. -Parameters: - [IN] handle - handle value obtained by InitCodec function - [IN] buf - pointer to bitstream buffer - [IN] sz_in - size of 'buf' buffer data - [OUT] y, u, v - pointer references filled with YUV to YUV data of decoded frame when the call returns; these - pointers are valid until next call to DecodeFrame or CloseCodec functions - [OUT] pitch - size of image line, in bytes (for Y array; U and V arrays have half pitch of Y, because UV is - coded only for each 4x4 pixel block -Return value: - 0 - frame was not decoded (i.e. preroll frame); pointers y, u, v are not filled - 1 - frame was decoded, contains packed YUV data - 2 - frame was decoded, contains interleaved RGB data, returned in 'y' pointer - -//---------------------------- - -Note: -The source project is built in Microsoft Visual C++ 6 environment. -It is assumed that Symbian Series60 SDK is installed in C:\Symbian\6.1\Series60\Epoc32 - diff --git a/modules/xvid_dec/xvid_wce/Rules.h b/modules/xvid_dec/xvid_wce/Rules.h deleted file mode 100644 index 21327fd..0000000 --- a/modules/xvid_dec/xvid_wce/Rules.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef __RULES_H -#define __RULES_H - -/*---------------------------- - Copyright (c) Lonely Cat Games All rights reserved. - General types required for compilation of Insanity group of libraries. -----------------------------*/ - //warning settings for MS compiler -#ifdef _MSC_VER - -#pragma warning(disable: 4786)//trunc symbols to 255 chars -#pragma warning(disable: 4530)//exception handling -#pragma warning(disable: 4800)//exception handling -#pragma warning(disable: 4096)//exception handling -#pragma warning(disable: 4100)//unreferenced formal parameter -#pragma warning(disable: 4505)//unreferenced local function has been removed -#pragma warning(disable: 4514)//unreferenced inline function has been removed -#pragma warning(disable: 4663)//C++ error in std headers -#pragma warning(disable: 4710)//function not inlined -#pragma warning(disable: 4201)//nonstandard extension with unnamed structs -#pragma warning(disable: 4244)//conversion from ??? to ???, possible loss of data -#pragma warning(disable: 4146)//unary minus operator applied to unsigned type, result still unsigned -#pragma warning(disable: 4284)//C++... -#pragma warning(disable: 4290)//C++ Exception Specification ignored -#pragma warning(disable: 4127)//conditional expression is constant -#pragma warning(disable: 4663)//C++ language change... -#pragma warning(disable: 4702)//unreachable code -#pragma warning(disable: 4511)//copy constructor could not be generated -#pragma warning(disable: 4512)//assignment operator could not be generated -#pragma warning(disable: 4711)//function selected for automatic inline expansion - - - - //level4 warnings: -#pragma warning(3: 4189) //local variable is initialized but not referenced -#pragma warning(3: 4305) //truncation from const double to float -//#pragma warning(3: 4244) //conversion from ??? to ???, possible loss of data -#pragma warning(3: 4245) //signed/unsigned mismatch -#pragma warning(3: 4018) //signed/unsigned mismatch -#pragma warning(3: 4706) //assignment within conditional expression -#pragma warning(3: 4701) //local variable may be used without having been initialized -#pragma warning(3: 4211) //nonstandard extension used : redefined extern to static -#pragma warning(3: 4310) //cast truncates constant value - -#endif - -//---------------------------- - -typedef unsigned char byte; -typedef signed char schar; -typedef unsigned short word; -typedef unsigned long dword; -typedef unsigned long ulong; - -#ifndef _SIZE_T_DEFINED_ -#define _SIZE_T_DEFINED_ -typedef unsigned size_t; -#endif - -#ifndef NULL - #define NULL 0 -#endif - -//---------------------------- - -#endif diff --git a/modules/xvid_dec/xvid_wce/TODO b/modules/xvid_dec/xvid_wce/TODO deleted file mode 100644 index f194d8d..0000000 --- a/modules/xvid_dec/xvid_wce/TODO +++ /dev/null @@ -1,52 +0,0 @@ -TODO -==== - -This file lists the TODO items stll pending for the 1.0 release. - - -Active Items to work on: ------------------------- - -* update vfw & dshow decoder frontends - - GUI isn't perfect for vfw -* update/fix CBR plugin - - misses target bitrate, bitrate burst in static motion/high motion - transitions -* bug hunting (ed.gomez/syskin) - - xvidcore is still a place where bugs feel confortable -* docbook writing (every developer should contribute) - - New API has to be documented. -* two pass code should not introduce quality regressions (every tester) - - first feedback proved kfthresholding was hurting quality, a - decision on its behavior has to be settled. -* MMX MPEG4 quantization is unprecise. This is probably an inherent - problem in some MMX opcode precision. - - -Already completed items: ------------------------- - -* remove divx4 api (ed.gomez) -* remove VOP_TYPE enumerations (peter) -* remove HINTed ME stuff (ed.gomez) -* xvid_image_t/xvid_gbl_convert_t (peter) -* xvid_global structs (peter) -* errors codes (peter) -* xvid_decoder structs (peter) -* apply encoder api changes "HEAPS" (peter) -* rawdec (use xvid_decraw instead) (ed.gomez) -* Support for GMC 3 warp points (christoph) -* New Qpel code (michael) -* ME splitting and ME improvements (syskin) -* New unix build process (ed.gomez) -* New thread/instance safe sse2 code (p.massimino) -* INSTALL guide for Unix and Win32 (ed.gomez) -* dshow static link to libxvidcore.lib (peter) -* update/fix Lumimasking (syskin) -* trellis for mpeg and relaxed optimization for big levels (skal) -* thread safe mpeg quantizing (michael) -* Interlacing for bvop and svop (syskin) -* YV12/I420/USER clarification (christoph) -* vfw and dshow link dynamically to xvidcore.dll (syskin) - -Last edited: $Date: 2005-07-13 14:36:16 $ diff --git a/modules/xvid_dec/xvid_wce/bitstream.cpp b/modules/xvid_dec/xvid_wce/bitstream.cpp deleted file mode 100644 index 7125167..0000000 --- a/modules/xvid_dec/xvid_wce/bitstream.cpp +++ /dev/null @@ -1,1104 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Bitstream reader/writer - - * - * Copyright (C) 2001-2003 Peter Ross - * 2003 Cristoph Lampert - * - * 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: bitstream.cpp,v 1.1.1.1 2005-07-13 14:36:12 jeanlf Exp $ - * - ****************************************************************************/ - -#include "bitstream.h" -#include "quant_matrix.h" - -#ifdef WIN32 -#include -#endif - -//---------------------------- - -inline dword ByteSwap(dword a){ - return (a<<24) | ((a&0xff00) << 8) | ((a&0xff0000) >> 8) | (a>>24); -} - -//---------------------------- - -void Bitstream::Init(const void *bitstream, dword _length){ - - dword adjbitstream = (dword)bitstream; - - /* - * Start the stream on a dword boundary, by rounding down to the - * previous dword and skipping the intervening bytes. - */ - long bitpos = ((sizeof(dword)-1) & (long)bitstream); - adjbitstream = adjbitstream - bitpos; - start = tail = (dword *) adjbitstream; - - if(_length){ - dword tmp = *start; -#ifndef ARCH_IS_BIG_ENDIAN - tmp = ByteSwap(tmp); -#endif - bufa = tmp; - if(_length>4){ - tmp = *(start + 1); -#ifndef ARCH_IS_BIG_ENDIAN - tmp = ByteSwap(tmp); -#endif - bufb = tmp; - }else - bufb = 0; - }else - bufa = bufb = 0; - - buf = 0; - pos = initpos = bitpos*8; - length = _length; -} - -//--------------------------- - -/* reads n bits from bitstream without changing the stream pos */ - -dword Bitstream::ShowBits(dword bits){ - - int nbit = (bits + pos) - 32; - if(nbit > 0) - return ((bufa & (0xffffffff >> pos)) << nbit) | (bufb >> (32 - nbit)); - return (bufa & (0xffffffff >> pos)) >> (32 - pos - bits); -} - -//--------------------------- -// skip n bits forward in bitstream -void Bitstream::Skip(dword bits){ - - pos += bits; - if(pos >= 32){ - dword tmp; - - bufa = bufb; - tmp = *((dword *) tail + 2); -#ifndef ARCH_IS_BIG_ENDIAN - tmp = ByteSwap(tmp); -#endif - bufb = tmp; - tail++; - pos -= 32; - } -} - -//--------------------------- -/* show nbits from next byte alignment */ -dword Bitstream::ShowBitsFromByteAlign(int bits){ - - int bspos = pos + NumBitsToByteAlign(); - int nbit = (bits + bspos) - 32; - - if (bspos >= 32) { - return bufb >> (32 - nbit); - } else if (nbit > 0) { - return ((bufa & (0xffffffff >> bspos)) << nbit) | (bufb >> (32 - nbit)); - } else { - return (bufa & (0xffffffff >> bspos)) >> (32 - bspos - bits); - } - -} - -//--------------------------- -/* read n bits from bitstream */ -dword Bitstream::GetBits(dword n){ - dword ret = ShowBits(n); - Skip(n); - return ret; -} - -//--------------------------- - -static const dword intra_dc_threshold_table[] = { - 32, /* never use */ - 13, - 15, - 17, - 19, - 21, - 23, - 1, -}; - -//---------------------------- - -void Bitstream::get_matrix(byte * matrix){ - - int i = 0; - int last, value = 0; - - do { - last = value; - value = GetBits(8); - matrix[scan_tables[0][i++]] = value; - } - while (value != 0 && i < 64); - i--; /* fix little bug at coeff not full */ - - while (i < 64) { - matrix[scan_tables[0][i++]] = last; - } -} - -//---------------------------- -/* - * for PVOP addbits == fcode - 1 - * for BVOP addbits == max(fcode,bcode) - 1 - * returns mbpos - */ -int S_decoder::read_video_packet_header(Bitstream *bs, const int addbits, int *quant, int *fcode_forward, int *fcode_backward, int *intra_dc_threshold){ - - int startcode_bits = NUMBITS_VP_RESYNC_MARKER + addbits; - int mbnum_bits = log2bin(mb_width * mb_height - 1); - int mbnum; - int hec = 0; - - bs->Skip(bs->NumBitsToByteAlign()); - bs->Skip(startcode_bits); - - DPRINTF(XVID_DEBUG_STARTCODE, "\n"); - - if (shape != VIDOBJLAY_SHAPE_RECTANGULAR) - { - hec = bs->GetBit(); /* header_extension_code */ - if (hec && !(sprite_enable == SPRITE_STATIC /* && current_coding_type = I_VOP */)) - { - bs->Skip(13); /* vop_width */ - READ_MARKER(); - bs->Skip(13); /* vop_height */ - READ_MARKER(); - bs->Skip(13); /* vop_horizontal_mc_spatial_ref */ - READ_MARKER(); - bs->Skip(13); /* vop_vertical_mc_spatial_ref */ - READ_MARKER(); - } - } - - mbnum = bs->GetBits(mbnum_bits); /* macroblock_number */ - DPRINTF(XVID_DEBUG_HEADER, "mbnum %i\n", mbnum); - - if (shape != VIDOBJLAY_SHAPE_BINARY_ONLY) - { - *quant = bs->GetBits(quant_bits); /* quant_scale */ - DPRINTF(XVID_DEBUG_HEADER, "quant %i\n", *quant); - } - - if (shape == VIDOBJLAY_SHAPE_RECTANGULAR) - hec = bs->GetBit(); /* header_extension_code */ - - - DPRINTF(XVID_DEBUG_HEADER, "header_extension_code %i\n", hec); - if (hec) - { - int time_base; - int time_increment = 0; - int coding_type; - - for (time_base=0; bs->GetBit()!=0; time_base++); /* modulo_time_base */ - READ_MARKER(); - if (time_inc_bits) - time_increment = (bs->GetBits(time_inc_bits)); /* vop_time_increment */ - READ_MARKER(); - //DPRINTF(XVID_DEBUG_HEADER,"time %i:%i\n", time_base, time_increment); - - coding_type = bs->GetBits(2); - DPRINTF(XVID_DEBUG_HEADER,"coding_type %i\n", coding_type); - - if (shape != VIDOBJLAY_SHAPE_RECTANGULAR) - { - bs->Skip(1); /* change_conv_ratio_disable */ - if (coding_type != I_VOP) - bs->Skip(1); /* vop_shape_coding_type */ - } - - if (shape != VIDOBJLAY_SHAPE_BINARY_ONLY) - { - *intra_dc_threshold = intra_dc_threshold_table[bs->GetBits(3)]; - - if (sprite_enable == SPRITE_GMC && coding_type == S_VOP && - sprite_warping_points > 0) - { - /* TODO: sprite trajectory */ - } - if(reduced_resolution_enable && shape == VIDOBJLAY_SHAPE_RECTANGULAR && (coding_type == P_VOP || coding_type == I_VOP)){ - bs->Skip(1); /* XXX: vop_reduced_resolution */ - } - - if (coding_type != I_VOP && fcode_forward) - { - *fcode_forward = bs->GetBits(3); - DPRINTF(XVID_DEBUG_HEADER,"fcode_forward %i\n", *fcode_forward); - } - - if (coding_type == B_VOP && fcode_backward) - { - *fcode_backward = bs->GetBits(3); - DPRINTF(XVID_DEBUG_HEADER,"fcode_backward %i\n", *fcode_backward); - } - } - - } - - if (newpred_enable) { - int vop_id; - int vop_id_for_prediction; - - vop_id = bs->GetBits(MIN(time_inc_bits + 3, 15)); - DPRINTF(XVID_DEBUG_HEADER, "vop_id %i\n", vop_id); - if (bs->GetBit()) /* vop_id_for_prediction_indication */ - { - vop_id_for_prediction = bs->GetBits(MIN(time_inc_bits + 3, 15)); - DPRINTF(XVID_DEBUG_HEADER, "vop_id_for_prediction %i\n", vop_id_for_prediction); - } - READ_MARKER(); - } - - return mbnum; -} - -//---------------------------- -/* vol estimation header */ -void S_decoder::read_vol_complexity_estimation_header(Bitstream * bs){ - - ESTIMATION * e = &estimation; - - e->method = bs->GetBits(2); /* estimation_method */ - DPRINTF(XVID_DEBUG_HEADER,"+ complexity_estimation_header; method=%i\n", e->method); - - if (e->method == 0 || e->method == 1){ - if(!bs->GetBit()){ - //shape_complexity_estimation_disable - e->opaque = bs->GetBit(); /* opaque */ - e->transparent = bs->GetBit(); /* transparent */ - e->intra_cae = bs->GetBit(); /* intra_cae */ - e->inter_cae = bs->GetBit(); /* inter_cae */ - e->no_update = bs->GetBit(); /* no_update */ - e->upsampling = bs->GetBit(); /* upsampling */ - } - - if (!bs->GetBit()) /* texture_complexity_estimation_set_1_disable */ - { - e->intra_blocks = bs->GetBit(); /* intra_blocks */ - e->inter_blocks = bs->GetBit(); /* inter_blocks */ - e->inter4v_blocks = bs->GetBit(); /* inter4v_blocks */ - e->not_coded_blocks = bs->GetBit(); /* not_coded_blocks */ - } - } - - READ_MARKER(); - - if (!bs->GetBit()){ - //texture_complexity_estimation_set_2_disable - e->dct_coefs = bs->GetBit(); /* dct_coefs */ - e->dct_lines = bs->GetBit(); /* dct_lines */ - e->vlc_symbols = bs->GetBit(); /* vlc_symbols */ - e->vlc_bits = bs->GetBit(); /* vlc_bits */ - } - - if (!bs->GetBit()){ - //motion_compensation_complexity_disable - e->apm = bs->GetBit(); /* apm */ - e->npm = bs->GetBit(); /* npm */ - e->interpolate_mc_q = bs->GetBit(); /* interpolate_mc_q */ - e->forw_back_mc_q = bs->GetBit(); /* forw_back_mc_q */ - e->halfpel2 = bs->GetBit(); /* halfpel2 */ - e->halfpel4 = bs->GetBit(); /* halfpel4 */ - } - - READ_MARKER(); - - if (e->method == 1){ - if (!bs->GetBit()){ - //version2_complexity_estimation_disable - e->sadct = bs->GetBit(); /* sadct */ - e->quarterpel = bs->GetBit(); /* quarterpel */ - } - } -} - -//---------------------------- -/* vop estimation header */ -void S_decoder::read_vop_complexity_estimation_header(Bitstream * bs, int coding_type){ - - ESTIMATION * e = &estimation; - - if (e->method == 0 || e->method == 1) - { - if (coding_type == I_VOP) { - if (e->opaque) bs->Skip(8); /* dcecs_opaque */ - if (e->transparent) bs->Skip(8); /* */ - if (e->intra_cae) bs->Skip(8); /* */ - if (e->inter_cae) bs->Skip(8); /* */ - if (e->no_update) bs->Skip(8); /* */ - if (e->upsampling) bs->Skip(8); /* */ - if (e->intra_blocks) bs->Skip(8); /* */ - if (e->not_coded_blocks) bs->Skip(8); /* */ - if (e->dct_coefs) bs->Skip(8); /* */ - if (e->dct_lines) bs->Skip(8); /* */ - if (e->vlc_symbols) bs->Skip(8); /* */ - if (e->vlc_bits) bs->Skip(8); /* */ - if (e->sadct) bs->Skip(8); /* */ - } - - if (coding_type == P_VOP) { - if (e->opaque) bs->Skip(8); /* */ - if (e->transparent) bs->Skip(8); /* */ - if (e->intra_cae) bs->Skip(8); /* */ - if (e->inter_cae) bs->Skip(8); /* */ - if (e->no_update) bs->Skip(8); /* */ - if (e->upsampling) bs->Skip(8); /* */ - if (e->intra_blocks) bs->Skip(8); /* */ - if (e->not_coded_blocks) bs->Skip(8); /* */ - if (e->dct_coefs) bs->Skip(8); /* */ - if (e->dct_lines) bs->Skip(8); /* */ - if (e->vlc_symbols) bs->Skip(8); /* */ - if (e->vlc_bits) bs->Skip(8); /* */ - if (e->inter_blocks) bs->Skip(8); /* */ - if (e->inter4v_blocks) bs->Skip(8); /* */ - if (e->apm) bs->Skip(8); /* */ - if (e->npm) bs->Skip(8); /* */ - if (e->forw_back_mc_q) bs->Skip(8); /* */ - if (e->halfpel2) bs->Skip(8); /* */ - if (e->halfpel4) bs->Skip(8); /* */ - if (e->sadct) bs->Skip(8); /* */ - if (e->quarterpel) bs->Skip(8); /* */ - } - if (coding_type == B_VOP) { - if (e->opaque) bs->Skip(8); /* */ - if (e->transparent) bs->Skip(8); /* */ - if (e->intra_cae) bs->Skip(8); /* */ - if (e->inter_cae) bs->Skip(8); /* */ - if (e->no_update) bs->Skip(8); /* */ - if (e->upsampling) bs->Skip(8); /* */ - if (e->intra_blocks) bs->Skip(8); /* */ - if (e->not_coded_blocks) bs->Skip(8); /* */ - if (e->dct_coefs) bs->Skip(8); /* */ - if (e->dct_lines) bs->Skip(8); /* */ - if (e->vlc_symbols) bs->Skip(8); /* */ - if (e->vlc_bits) bs->Skip(8); /* */ - if (e->inter_blocks) bs->Skip(8); /* */ - if (e->inter4v_blocks) bs->Skip(8); /* */ - if (e->apm) bs->Skip(8); /* */ - if (e->npm) bs->Skip(8); /* */ - if (e->forw_back_mc_q) bs->Skip(8); /* */ - if (e->halfpel2) bs->Skip(8); /* */ - if (e->halfpel4) bs->Skip(8); /* */ - if (e->interpolate_mc_q) bs->Skip(8); /* */ - if (e->sadct) bs->Skip(8); /* */ - if (e->quarterpel) bs->Skip(8); /* */ - } - - if (coding_type == S_VOP && sprite_enable == SPRITE_STATIC) { - if (e->intra_blocks) bs->Skip(8); /* */ - if (e->not_coded_blocks) bs->Skip(8); /* */ - if (e->dct_coefs) bs->Skip(8); /* */ - if (e->dct_lines) bs->Skip(8); /* */ - if (e->vlc_symbols) bs->Skip(8); /* */ - if (e->vlc_bits) bs->Skip(8); /* */ - if (e->inter_blocks) bs->Skip(8); /* */ - if (e->inter4v_blocks) bs->Skip(8); /* */ - if (e->apm) bs->Skip(8); /* */ - if (e->npm) bs->Skip(8); /* */ - if (e->forw_back_mc_q) bs->Skip(8); /* */ - if (e->halfpel2) bs->Skip(8); /* */ - if (e->halfpel4) bs->Skip(8); /* */ - if (e->interpolate_mc_q) bs->Skip(8); /* */ - } - } -} - -//---------------------------- -// decode headers -// returns coding_type, or -1 if error - -#define VIDOBJ_START_CODE_MASK 0x0000001f -#define VIDOBJLAY_START_CODE_MASK 0x0000000f - -int S_decoder::BitstreamReadHeaders(Bitstream * bs, bool &rounding, bool *reduced_resolution, dword *quant, dword *fcode_forward, - dword *fcode_backward, dword *intra_dc_threshold, WARPPOINTS *gmc_warp){ - - dword vol_ver_id; - dword coding_type; - dword start_code; - dword time_incr = 0; - int time_increment = 0; - int resize = 0; - - while((bs->Pos() >> 3) < bs->length){ - bs->ByteAlign(); - start_code = bs->ShowBits(32); - - switch(start_code){ - case VISOBJSEQ_START_CODE: - { - DPRINTF(XVID_DEBUG_STARTCODE, "\n"); - - bs->Skip(32); //visual_object_sequence_start_code - int profile = bs->GetBits(8); //profile_and_level_indication - - DPRINTF(XVID_DEBUG_HEADER, "profile_and_level_indication %i\n", profile); - } - break; - case VISOBJSEQ_STOP_CODE: - { - //visual_object_sequence_stop_code - bs->Skip(32); - DPRINTF(XVID_DEBUG_STARTCODE, "\n"); - - } - break; - case VISOBJ_START_CODE: - { - DPRINTF(XVID_DEBUG_STARTCODE, "\n"); - - bs->Skip(32); //visual_object_start_code - - int visobj_ver_id; - //is_visual_object_identified - if(bs->GetBit()){ - visobj_ver_id = bs->GetBits(4); /* visual_object_ver_id */ - DPRINTF(XVID_DEBUG_HEADER,"visobj_ver_id %i\n", visobj_ver_id); - bs->Skip(3); //visual_object_priority - }else{ - visobj_ver_id = 1; - } - - if(bs->ShowBits(4) != VISOBJ_TYPE_VIDEO){ - //visual_object_type - DPRINTF(XVID_DEBUG_ERROR, "visual_object_type != video\n"); - return -1; - } - bs->Skip(4); - //video_signal_type - - if(bs->GetBit()){ - DPRINTF(XVID_DEBUG_HEADER,"+ video_signal_type\n"); - bs->Skip(3); /* video_format */ - bs->Skip(1); /* video_range */ - if (bs->GetBit()) /* color_description */ - { - DPRINTF(XVID_DEBUG_HEADER,"+ color_description"); - bs->Skip(8); /* color_primaries */ - bs->Skip(8); /* transfer_characteristics */ - bs->Skip(8); /* matrix_coefficients */ - } - } - } - break; - case GRPOFVOP_START_CODE: - { - DPRINTF(XVID_DEBUG_STARTCODE, "\n"); - - bs->Skip(32); - { - int hours, minutes, seconds; - - hours = bs->GetBits(5); - minutes = bs->GetBits(6); - READ_MARKER(); - seconds = bs->GetBits(6); - //DPRINTF(XVID_DEBUG_HEADER, "time %ih%im%is\n", hours,minutes,seconds); - } - bs->Skip(1); /* closed_gov */ - bs->Skip(1); /* broken_link */ - } - break; - case VOP_START_CODE: - { - - DPRINTF(XVID_DEBUG_STARTCODE, "\n"); - - bs->Skip(32); /* vop_start_code */ - - coding_type = bs->GetBits(2); /* vop_coding_type */ - DPRINTF(XVID_DEBUG_HEADER, "coding_type %i\n", coding_type); - - /*********************** for decode B-frame time ***********************/ - while (bs->GetBit() != 0) /* time_base */ - time_incr++; - - READ_MARKER(); - - if (time_inc_bits) { - time_increment = (bs->GetBits(time_inc_bits)); /* vop_time_increment */ - } - - DPRINTF(XVID_DEBUG_HEADER, "time_base %i\n", time_incr); - DPRINTF(XVID_DEBUG_HEADER, "time_increment %i\n", time_increment); - - //DPRINTF(XVID_DEBUG_TIMECODE, "%c %i:%i\n", coding_type == I_VOP ? 'I' : coding_type == P_VOP ? 'P' : coding_type == B_VOP ? 'B' : 'S', time_incr, time_increment); - if (coding_type != B_VOP) { - last_time_base = time_base; - time_base += time_incr; - time = time_increment; - -#if 0 - time_base * time_inc_resolution + - time_increment; -#endif - time_pp = (dword) - (time_inc_resolution + time - last_non_b_time)%time_inc_resolution; - last_non_b_time = time; - } else { - time = time_increment; -#if 0 - (last_time_base + - time_incr) * time_inc_resolution + time_increment; -#endif - time_bp = (dword) - (time_inc_resolution + last_non_b_time - time)%time_inc_resolution; - } - DPRINTF(XVID_DEBUG_HEADER,"time_pp=%i\n", time_pp); - DPRINTF(XVID_DEBUG_HEADER,"time_bp=%i\n", time_bp); - - READ_MARKER(); - - if (!bs->GetBit()) /* vop_coded */ - { - DPRINTF(XVID_DEBUG_HEADER, "vop_coded==false\n"); - return N_VOP; - } - - if (newpred_enable) { - int vop_id; - int vop_id_for_prediction; - - vop_id = bs->GetBits(MIN(time_inc_bits + 3, 15)); - DPRINTF(XVID_DEBUG_HEADER, "vop_id %i\n", vop_id); - if (bs->GetBit()) /* vop_id_for_prediction_indication */ - { - vop_id_for_prediction = bs->GetBits(MIN(time_inc_bits + 3, 15)); - DPRINTF(XVID_DEBUG_HEADER, "vop_id_for_prediction %i\n", vop_id_for_prediction); - } - READ_MARKER(); - } - - //fix a little bug by MinChen - if((shape != VIDOBJLAY_SHAPE_BINARY_ONLY) && - ((coding_type == P_VOP) || (coding_type == S_VOP && sprite_enable == SPRITE_GMC))){ - rounding = !!bs->GetBit(); //rounding_type - DPRINTF(XVID_DEBUG_HEADER, "rounding %i\n", rounding); - } - - if(reduced_resolution_enable && shape == VIDOBJLAY_SHAPE_RECTANGULAR && (coding_type == P_VOP || coding_type == I_VOP)) { - - *reduced_resolution = !!bs->GetBit(); - DPRINTF(XVID_DEBUG_HEADER, "reduced_resolution %i\n", *reduced_resolution); - }else{ - *reduced_resolution = false; - } - - if (shape != VIDOBJLAY_SHAPE_RECTANGULAR) { - if(!(sprite_enable == SPRITE_STATIC && coding_type == I_VOP)) { - - dword width, height; - dword horiz_mc_ref, vert_mc_ref; - - width = bs->GetBits(13); - READ_MARKER(); - height = bs->GetBits(13); - READ_MARKER(); - horiz_mc_ref = bs->GetBits(13); - READ_MARKER(); - vert_mc_ref = bs->GetBits(13); - READ_MARKER(); - - DPRINTF(XVID_DEBUG_HEADER, "width %i\n", width); - DPRINTF(XVID_DEBUG_HEADER, "height %i\n", height); - DPRINTF(XVID_DEBUG_HEADER, "horiz_mc_ref %i\n", horiz_mc_ref); - DPRINTF(XVID_DEBUG_HEADER, "vert_mc_ref %i\n", vert_mc_ref); - } - - bs->Skip(1); /* change_conv_ratio_disable */ - if (bs->GetBit()) /* vop_constant_alpha */ - { - bs->Skip(8); /* vop_constant_alpha_value */ - } - } - - if (shape != VIDOBJLAY_SHAPE_BINARY_ONLY) { - - if (!complexity_estimation_disable) - { - read_vop_complexity_estimation_header(bs, coding_type); - } - - /* intra_dc_vlc_threshold */ - *intra_dc_threshold = - intra_dc_threshold_table[bs->GetBits(3)]; - - top_field_first = 0; - alternate_vertical_scan = 0; - - if(interlacing){ - top_field_first = bs->GetBit(); - DPRINTF(XVID_DEBUG_HEADER, "interlace top_field_first %i\n", top_field_first); - alternate_vertical_scan = bs->GetBit(); - DPRINTF(XVID_DEBUG_HEADER, "interlace alternate_vertical_scan %i\n", alternate_vertical_scan); - - } - } - - if ((sprite_enable == SPRITE_STATIC || sprite_enable== SPRITE_GMC) && coding_type == S_VOP) { - - int i; - - for (i = 0 ; i < sprite_warping_points; i++) - { - int length; - int x = 0, y = 0; - - /* sprite code borowed from ffmpeg; thx Michael Niedermayer */ - length = bs->bs_get_spritetrajectory(); - if(length){ - x= bs->GetBits(length); - if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/ - x = - (x ^ ((1 << length) - 1)); - } - READ_MARKER(); - - length = bs->bs_get_spritetrajectory(); - if(length){ - y = bs->GetBits(length); - if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/ - y = - (y ^ ((1 << length) - 1)); - } - READ_MARKER(); - - gmc_warp->duv[i].x = x; - gmc_warp->duv[i].y = y; - - //DPRINTF(XVID_DEBUG_HEADER,"sprite_warping_point[%i] xy=(%i,%i)\n", i, x, y); - } - - if (sprite_brightness_change) - { - /* XXX: brightness_change_factor() */ - } - if (sprite_enable == SPRITE_STATIC) - { - /* XXX: todo */ - } - - } - - if ((*quant = bs->GetBits(quant_bits)) < 1) /* vop_quant */ - *quant = 1; - DPRINTF(XVID_DEBUG_HEADER, "quant %i\n", *quant); - - if (coding_type != I_VOP) { - *fcode_forward = bs->GetBits(3); /* fcode_forward */ - DPRINTF(XVID_DEBUG_HEADER, "fcode_forward %i\n", *fcode_forward); - } - - if (coding_type == B_VOP) { - *fcode_backward = bs->GetBits(3); /* fcode_backward */ - DPRINTF(XVID_DEBUG_HEADER, "fcode_backward %i\n", *fcode_backward); - } - if(!scalability){ - if ((shape != VIDOBJLAY_SHAPE_RECTANGULAR) && - (coding_type != I_VOP)) { - bs->Skip(1); /* vop_shape_coding_type */ - } - } - return coding_type; - - } - break; - case USERDATA_START_CODE: - { - char tmp[256]; - int i; - - bs->Skip(32); /* user_data_start_code */ - - tmp[0] = bs->ShowBits(8); - - for(i = 1; i < 256; i++){ - tmp[i] = (bs->ShowBits(16) & 0xFF); - - if(tmp[i] == 0) - break; - - bs->Skip(8); - } - - //DPRINTF(XVID_DEBUG_STARTCODE, ": %s\n", tmp); - - /* read xvid bitstream version */ -#ifdef WIN32 - { - char packed; - int version, build; - if(MemCmp(tmp, "XviD", 4) == 0) { - sscanf(tmp, "XviD%d", &bs_version); - DPRINTF(XVID_DEBUG_HEADER, "xvid bitstream version=%i", bs_version); - } - - /* divx detection */ - i = sscanf(tmp, "DivX%dBuild%d%c", &version, &build, &packed); - if (i < 2) - i = sscanf(tmp, "DivX%db%d%c", &version, &build, &packed); - if (i >= 2){ - packed_mode = (i == 3 && packed == 'p'); - //DPRINTF(XVID_DEBUG_HEADER, "divx version=%i, build=%i packed=%i\n", version, build, packed_mode); - } - } -#endif - } - break; - default: - switch(start_code & ~VIDOBJ_START_CODE_MASK){ - case VIDOBJ_START_CODE: - { - - DPRINTF(XVID_DEBUG_STARTCODE, "\n"); - DPRINTF(XVID_DEBUG_HEADER, "vo id %i\n", start_code & VIDOBJ_START_CODE_MASK); - //video_object_start_code - bs->Skip(32); - } - break; - case VIDOBJLAY_START_CODE: - { - - DPRINTF(XVID_DEBUG_STARTCODE, "\n"); - DPRINTF(XVID_DEBUG_HEADER, "vol id %i\n", start_code & VIDOBJLAY_START_CODE_MASK); - - bs->Skip(32); //video_object_layer_start_code - bs->Skip(1); //random_accessible_vol - - bs->Skip(8); //video_object_type_indication - - if(bs->GetBit()){ - //is_object_layer_identifier - DPRINTF(XVID_DEBUG_HEADER, "+ is_object_layer_identifier\n"); - vol_ver_id = bs->GetBits(4); /* video_object_layer_verid */ - DPRINTF(XVID_DEBUG_HEADER,"ver_id %i\n", vol_ver_id); - bs->Skip(3); /* video_object_layer_priority */ - }else{ - vol_ver_id = 1; - } - - aspect_ratio = bs->GetBits(4); - - if(aspect_ratio == VIDOBJLAY_AR_EXTPAR){ - //aspect_ratio_info - DPRINTF(XVID_DEBUG_HEADER, "+ aspect_ratio_info\n"); - par_width = bs->GetBits(8); /* par_width */ - par_height = bs->GetBits(8); /* par_height */ - } - - if(bs->GetBit()){ - //vol_control_parameters - DPRINTF(XVID_DEBUG_HEADER, "+ vol_control_parameters\n"); - bs->Skip(2); /* chroma_format */ - low_delay = (bs->GetBit()!=0); - DPRINTF(XVID_DEBUG_HEADER, "low_delay %i\n", (int)low_delay); - if (bs->GetBit()) /* vbv_parameters */ - { - unsigned int bitrate; - unsigned int buffer_size; - unsigned int occupancy; - - DPRINTF(XVID_DEBUG_HEADER,"+ vbv_parameters\n"); - - bitrate = bs->GetBits(15) << 15; /* first_half_bit_rate */ - READ_MARKER(); - bitrate |= bs->GetBits(15); /* latter_half_bit_rate */ - READ_MARKER(); - - buffer_size = bs->GetBits(15) << 3; /* first_half_vbv_buffer_size */ - READ_MARKER(); - buffer_size |= bs->GetBits(3); /* latter_half_vbv_buffer_size */ - - occupancy = bs->GetBits(11) << 15; /* first_half_vbv_occupancy */ - READ_MARKER(); - occupancy |= bs->GetBits(15); /* latter_half_vbv_occupancy */ - READ_MARKER(); - - DPRINTF(XVID_DEBUG_HEADER,"bitrate %d (unit=400 bps)\n", bitrate); - DPRINTF(XVID_DEBUG_HEADER,"buffer_size %d (unit=16384 bits)\n", buffer_size); - DPRINTF(XVID_DEBUG_HEADER,"occupancy %d (unit=64 bits)\n", occupancy); - } - }else{ - low_delay = low_delay_default; - } - - //video_object_layer_shape - shape = bs->GetBits(2); - - DPRINTF(XVID_DEBUG_HEADER, "shape %i\n", shape); - if(shape != VIDOBJLAY_SHAPE_RECTANGULAR){ - DPRINTF(XVID_DEBUG_ERROR,"non-rectangular shapes are not supported\n"); - } - - if(shape == VIDOBJLAY_SHAPE_GRAYSCALE && vol_ver_id != 1){ - //video_object_layer_shape_extension - bs->Skip(4); - } - - READ_MARKER(); - - /********************** for decode B-frame time ***********************/ - time_inc_resolution = bs->GetBits(16); /* vop_time_increment_resolution */ - DPRINTF(XVID_DEBUG_HEADER,"vop_time_increment_resolution %i\n", time_inc_resolution); - -#if 0 - time_inc_resolution--; -#endif - - if(time_inc_resolution > 0){ - time_inc_bits = log2bin(time_inc_resolution-1); - }else{ -#if 0 - time_inc_bits = 0; -#endif - /* for "old" xvid compatibility, set time_inc_bits = 1 */ - time_inc_bits = 1; - } - - READ_MARKER(); - - if(bs->GetBit()){ - //fixed_vop_rate - DPRINTF(XVID_DEBUG_HEADER, "+ fixed_vop_rate\n"); - bs->Skip(time_inc_bits); //fixed_vop_time_increment - } - - if(shape != VIDOBJLAY_SHAPE_BINARY_ONLY){ - - if(shape == VIDOBJLAY_SHAPE_RECTANGULAR){ - dword _width, _height; - - READ_MARKER(); - _width = bs->GetBits(13); //video_object_layer_width - READ_MARKER(); - _height = bs->GetBits(13); //video_object_layer_height - READ_MARKER(); - - DPRINTF(XVID_DEBUG_HEADER, "width %i\n", _width); - DPRINTF(XVID_DEBUG_HEADER, "height %i\n", _height); - - if(width != _width || height != _height){ - if(fixed_dimensions){ - DPRINTF(XVID_DEBUG_ERROR, "decoder width/height does not match bitstream\n"); - return -1; - } - resize = 1; - width = _width; - height = _height; - } - } - - interlacing = !!bs->GetBit(); - DPRINTF(XVID_DEBUG_HEADER, "interlacing %i\n", interlacing); - - if(!bs->GetBit()){ - //obmc_disable - DPRINTF(XVID_DEBUG_ERROR, "obmc_disabled==false not supported\n"); - /* TODO */ - /* fucking divx4.02 has this enabled */ - } - - sprite_enable = bs->GetBits((vol_ver_id == 1 ? 1 : 2)); - - if(sprite_enable == SPRITE_STATIC || sprite_enable == SPRITE_GMC){ - int low_latency_sprite_enable; - - if(sprite_enable != SPRITE_GMC){ - int sprite_width; - int sprite_height; - int sprite_left_coord; - int sprite_top_coord; - sprite_width = bs->GetBits(13); /* sprite_width */ - READ_MARKER(); - sprite_height = bs->GetBits(13); /* sprite_height */ - READ_MARKER(); - sprite_left_coord = bs->GetBits(13); /* sprite_left_coordinate */ - READ_MARKER(); - sprite_top_coord = bs->GetBits(13); /* sprite_top_coordinate */ - READ_MARKER(); - } - sprite_warping_points = bs->GetBits(6); /* no_of_sprite_warping_points */ - sprite_warping_accuracy = bs->GetBits(2); /* sprite_warping_accuracy */ - sprite_brightness_change = bs->GetBits(1); /* brightness_change */ - if (sprite_enable != SPRITE_GMC) - { - low_latency_sprite_enable = bs->GetBits(1); /* low_latency_sprite_enable */ - } - } - - if(vol_ver_id != 1 && shape != VIDOBJLAY_SHAPE_RECTANGULAR){ - //sadct_disable - bs->Skip(1); - } - - if(bs->GetBit()){ - //not_8_bit - DPRINTF(XVID_DEBUG_HEADER, "not_8_bit==true (ignored)\n"); - quant_bits = bs->GetBits(4); /* quant_precision */ - bs->Skip(4); /* bits_per_pixel */ - }else{ - quant_bits = 5; - } - - if(shape == VIDOBJLAY_SHAPE_GRAYSCALE){ - bs->Skip(1); /* no_gray_quant_update */ - bs->Skip(1); /* composition_method */ - bs->Skip(1); /* linear_composition */ - } - - quant_type = bs->GetBit(); - DPRINTF(XVID_DEBUG_HEADER, "quant_type %i\n", quant_type); - - if(quant_type){ - if (bs->GetBit()) //load_intra_quant_mat - { - byte matrix[64]; - - DPRINTF(XVID_DEBUG_HEADER, "load_intra_quant_mat\n"); - - bs->get_matrix(matrix); - set_intra_matrix(mpeg_quant_matrices, matrix); - }else - set_intra_matrix(mpeg_quant_matrices, get_default_intra_matrix()); - - if (bs->GetBit()) /* load_inter_quant_mat */ - { - byte matrix[64]; - - DPRINTF(XVID_DEBUG_HEADER, "load_inter_quant_mat\n"); - - bs->get_matrix(matrix); - set_inter_matrix(mpeg_quant_matrices, matrix); - }else - set_inter_matrix(mpeg_quant_matrices, get_default_inter_matrix()); - - if (shape == VIDOBJLAY_SHAPE_GRAYSCALE) { - DPRINTF(XVID_DEBUG_ERROR, "greyscale matrix not supported\n"); - return -1; - } - - } - - if(vol_ver_id != 1){ - quarterpel = bs->GetBit(); - DPRINTF(XVID_DEBUG_HEADER,"quarterpel %i\n", quarterpel); - }else - quarterpel = 0; - - - complexity_estimation_disable = bs->GetBit(); - if(!complexity_estimation_disable){ - read_vol_complexity_estimation_header(bs); - } - - bs->Skip(1); //resync_marker_disable - - if(bs->GetBit()){ - //data_partitioned - DPRINTF(XVID_DEBUG_ERROR, "data_partitioned not supported\n"); - bs->Skip(1); /* reversible_vlc */ - } - - if(vol_ver_id != 1){ - newpred_enable = !!bs->GetBit(); - if (newpred_enable) /* newpred_enable */ - { - DPRINTF(XVID_DEBUG_HEADER, "+ newpred_enable\n"); - bs->Skip(2); /* requested_upstream_message_type */ - bs->Skip(1); /* newpred_segment_type */ - } - reduced_resolution_enable = !!bs->GetBit(); //reduced_resolution_vop_enable - DPRINTF(XVID_DEBUG_HEADER, "reduced_resolution_enable %i\n", reduced_resolution_enable); - }else{ - newpred_enable = false; - reduced_resolution_enable = false; - } - - scalability = (bs->GetBit()!=0); - if(scalability){ - DPRINTF(XVID_DEBUG_ERROR, "scalability not supported\n"); - bs->Skip(1); /* hierarchy_type */ - bs->Skip(4); /* ref_layer_id */ - bs->Skip(1); /* ref_layer_sampling_direc */ - bs->Skip(5); /* hor_sampling_factor_n */ - bs->Skip(5); /* hor_sampling_factor_m */ - bs->Skip(5); /* vert_sampling_factor_n */ - bs->Skip(5); /* vert_sampling_factor_m */ - bs->Skip(1); /* enhancement_type */ - if(shape == VIDOBJLAY_SHAPE_BINARY /* && hierarchy_type==0 */) { - bs->Skip(1); /* use_ref_shape */ - bs->Skip(1); /* use_ref_texture */ - bs->Skip(5); /* shape_hor_sampling_factor_n */ - bs->Skip(5); /* shape_hor_sampling_factor_m */ - bs->Skip(5); /* shape_vert_sampling_factor_n */ - bs->Skip(5); /* shape_vert_sampling_factor_m */ - } - return -1; - } - }else{ - //shape == BINARY_ONLY - if(vol_ver_id != 1){ - scalability = (bs->GetBit()!=0); - if(scalability){ - DPRINTF(XVID_DEBUG_ERROR, "scalability not supported\n"); - bs->Skip(4); /* ref_layer_id */ - bs->Skip(5); /* hor_sampling_factor_n */ - bs->Skip(5); /* hor_sampling_factor_m */ - bs->Skip(5); /* vert_sampling_factor_n */ - bs->Skip(5); /* vert_sampling_factor_m */ - return -1; - } - } - bs->Skip(1); /* resync_marker_disable */ - - } - - return (resize ? -3 : -2); //VOL - - } - break; - default: - { - //start_code == ? - //if(bs->ShowBits(24) == 0x000001) - if((start_code&0x00ffffff) == 0x000001){ - DPRINTF(XVID_DEBUG_STARTCODE, "\n", bs->ShowBits(32)); - } - bs->Skip(8); - } - } - } - } - -#if 0 - DPRINTF("*** WARNING: no vop_start_code found"); -#endif - return -1; //ignore it -} - -//---------------------------- - diff --git a/modules/xvid_dec/xvid_wce/bitstream.h b/modules/xvid_dec/xvid_wce/bitstream.h deleted file mode 100644 index f774e0d..0000000 --- a/modules/xvid_dec/xvid_wce/bitstream.h +++ /dev/null @@ -1,116 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Bitstream reader/writer inlined functions and constants- - * - * Copyright (C) 2001-2003 Peter Ross - * - * 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: bitstream.h,v 1.1.1.1 2005-07-13 14:36:12 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _BITSTREAM_H_ -#define _BITSTREAM_H_ - -#include "portab.h" -#include "decoder.h" - - -/***************************************************************************** - * Constants - ****************************************************************************/ - -/* comment any #defs we dont use */ - -#define VIDOBJ_START_CODE 0x00000100 /* ..0x0000011f */ -#define VIDOBJLAY_START_CODE 0x00000120 /* ..0x0000012f */ -#define VISOBJSEQ_START_CODE 0x000001b0 -#define VISOBJSEQ_STOP_CODE 0x000001b1 /* ??? */ -#define USERDATA_START_CODE 0x000001b2 -#define GRPOFVOP_START_CODE 0x000001b3 -/*#define VIDSESERR_ERROR_CODE 0x000001b4 */ -#define VISOBJ_START_CODE 0x000001b5 -#define VOP_START_CODE 0x000001b6 -/*#define STUFFING_START_CODE 0x000001c3 */ - - -#define VISOBJ_TYPE_VIDEO 1 -/*#define VISOBJ_TYPE_STILLTEXTURE 2 */ -/*#define VISOBJ_TYPE_MESH 3 */ -/*#define VISOBJ_TYPE_FBA 4 */ -/*#define VISOBJ_TYPE_3DMESH 5 */ - - -#define VIDOBJLAY_TYPE_SIMPLE 1 -/*#define VIDOBJLAY_TYPE_SIMPLE_SCALABLE 2 */ -/*#define VIDOBJLAY_TYPE_CORE 3 */ -/*#define VIDOBJLAY_TYPE_MAIN 4 */ -/*#define VIDOBJLAY_TYPE_NBIT 5 */ -/*#define VIDOBJLAY_TYPE_ANIM_TEXT 6 */ -/*#define VIDOBJLAY_TYPE_ANIM_MESH 7 */ -/*#define VIDOBJLAY_TYPE_SIMPLE_FACE 8 */ -/*#define VIDOBJLAY_TYPE_STILL_SCALABLE 9 */ -#define VIDOBJLAY_TYPE_ART_SIMPLE 10 -/*#define VIDOBJLAY_TYPE_CORE_SCALABLE 11 */ -/*#define VIDOBJLAY_TYPE_ACE 12 */ -/*#define VIDOBJLAY_TYPE_ADVANCED_SCALABLE_TEXTURE 13 */ -/*#define VIDOBJLAY_TYPE_SIMPLE_FBA 14 */ -/*#define VIDEOJLAY_TYPE_SIMPLE_STUDIO 15*/ -/*#define VIDEOJLAY_TYPE_CORE_STUDIO 16*/ -#define VIDOBJLAY_TYPE_ASP 17 -/*#define VIDOBJLAY_TYPE_FGS 18*/ - - -/*#define VIDOBJLAY_AR_SQUARE 1 */ -/*#define VIDOBJLAY_AR_625TYPE_43 2 */ -/*#define VIDOBJLAY_AR_525TYPE_43 3 */ -/*#define VIDOBJLAY_AR_625TYPE_169 8 */ -/*#define VIDOBJLAY_AR_525TYPE_169 9 */ -#define VIDOBJLAY_AR_EXTPAR 15 - - -#define VIDOBJLAY_SHAPE_RECTANGULAR 0 -#define VIDOBJLAY_SHAPE_BINARY 1 -#define VIDOBJLAY_SHAPE_BINARY_ONLY 2 -#define VIDOBJLAY_SHAPE_GRAYSCALE 3 - - -#define SPRITE_NONE 0 -#define SPRITE_STATIC 1 -#define SPRITE_GMC 2 - - - -#define READ_MARKER() bs->Skip(1) -//#define WRITE_MARKER() BitstreamPutBit(bs, 1) - -/* vop coding types */ -/* intra, prediction, backward, sprite, not_coded */ -#define I_VOP 0 -#define P_VOP 1 -#define B_VOP 2 -#define S_VOP 3 -#define N_VOP 4 - -/* resync-specific */ -#define NUMBITS_VP_RESYNC_MARKER 17 -#define RESYNC_MARKER 1 - -extern const dword scan_tables[3][64]; - - -#endif /* _BITSTREAM_H_ */ diff --git a/modules/xvid_dec/xvid_wce/decoder.cpp b/modules/xvid_dec/xvid_wce/decoder.cpp deleted file mode 100644 index e3d9713..0000000 --- a/modules/xvid_dec/xvid_wce/decoder.cpp +++ /dev/null @@ -1,1448 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Decoder Module - - * - * Copyright(C) 2002 MinChen - * 2002-2003 Peter Ross - * - * 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: decoder.cpp,v 1.4 2008-08-20 13:57:54 jeanlf Exp $ - * - ****************************************************************************/ - -#include "quant.h" -#include "quant_matrix.h" -#include "interpolate8x8.h" -#include "reduced.h" -#include "mbprediction.h" -#include "gmc.h" -#include "mem_align.h" - -#ifdef __SYMBIAN32__ -#include -#endif - -//---------------------------- - -# define DECLARE_ALIGNED_MATRIX(name,sizex,sizey,type,alignment) \ - type name##_storage[(sizex)*(sizey)+(alignment)-1]; \ - type * name = (type *) (((int) name##_storage+(alignment - 1)) & ~((int)(alignment)-1)) - -//---------------------------- -//---------------------------- -/* K = 4 */ -static const dword roundtab_76[16] = { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1 }; - -/* K = 1 */ -const dword roundtab_79[4] = { 0, 1, 0, 0 }; - -//---------------------------- - -int S_decoder::Resize(){ - //free existing - image_destroy(&cur, edged_width, edged_height); - image_destroy(&refn[0], edged_width, edged_height); - image_destroy(&refn[1], edged_width, edged_height); - image_destroy(&tmp, edged_width, edged_height); - image_destroy(&qtmp, edged_width, edged_height); - - image_destroy(&gmc, edged_width, edged_height); - - if(last_mbs) - xvid_free(last_mbs); - if(mbs) - xvid_free(mbs); - - //realloc - mb_width = (width + 15) / 16; - mb_height = (height + 15) / 16; - - edged_width = 16 * mb_width + 2 * EDGE_SIZE; - edged_height = 16 * mb_height + 2 * EDGE_SIZE; - - if(image_create(&cur, edged_width, edged_height)){ - xvid_free(this); - return XVID_ERR_MEMORY; - } - - if(image_create(&refn[0], edged_width, edged_height)){ - image_destroy(&cur, edged_width, edged_height); - xvid_free(this); - return XVID_ERR_MEMORY; - } - - //support B-frame to reference last 2 frame - if(image_create(&refn[1], edged_width, edged_height)){ - image_destroy(&cur, edged_width, edged_height); - image_destroy(&refn[0], edged_width, edged_height); - xvid_free(this); - return XVID_ERR_MEMORY; - } - if(image_create(&tmp, edged_width, edged_height)){ - image_destroy(&cur, edged_width, edged_height); - image_destroy(&refn[0], edged_width, edged_height); - image_destroy(&refn[1], edged_width, edged_height); - xvid_free(this); - return XVID_ERR_MEMORY; - } - - if(image_create(&qtmp, edged_width, edged_height)){ - image_destroy(&cur, edged_width, edged_height); - image_destroy(&refn[0], edged_width, edged_height); - image_destroy(&refn[1], edged_width, edged_height); - image_destroy(&tmp, edged_width, edged_height); - xvid_free(this); - return XVID_ERR_MEMORY; - } - - if(image_create(&gmc, edged_width, edged_height)){ - image_destroy(&qtmp, edged_width, edged_height); - image_destroy(&cur, edged_width, edged_height); - image_destroy(&refn[0], edged_width, edged_height); - image_destroy(&refn[1], edged_width, edged_height); - image_destroy(&tmp, edged_width, edged_height); - xvid_free(this); - return XVID_ERR_MEMORY; - } - - mbs = (MACROBLOCK*)xvid_malloc(sizeof(MACROBLOCK) * mb_width * mb_height, CACHE_LINE); - if(mbs == NULL){ - image_destroy(&cur, edged_width, edged_height); - image_destroy(&refn[0], edged_width, edged_height); - image_destroy(&refn[1], edged_width, edged_height); - image_destroy(&tmp, edged_width, edged_height); - image_destroy(&qtmp, edged_width, edged_height); - xvid_free(this); - return XVID_ERR_MEMORY; - } - MemSet(mbs, 0, sizeof(MACROBLOCK) * mb_width * mb_height); - - //for skip MB flag - last_mbs = (MACROBLOCK*)xvid_malloc(sizeof(MACROBLOCK) * mb_width * mb_height, CACHE_LINE); - if(!last_mbs){ - xvid_free(mbs); - image_destroy(&cur, edged_width, edged_height); - image_destroy(&refn[0], edged_width, edged_height); - image_destroy(&refn[1], edged_width, edged_height); - image_destroy(&tmp, edged_width, edged_height); - image_destroy(&qtmp, edged_width, edged_height); - xvid_free(this); - return XVID_ERR_MEMORY; - } - MemSet(last_mbs, 0, sizeof(MACROBLOCK) * mb_width * mb_height); - - return 0; -} - -//---------------------------- - -int decoder_create(xvid_dec_create_t *create){ - - if(XVID_VERSION_MAJOR(create->version) != 1) /* v1.x.x */ - return XVID_ERR_VERSION; - - S_decoder *dec = (S_decoder*)xvid_malloc(sizeof(S_decoder), CACHE_LINE); - //S_decoder *dec = new(ELeave) S_decoder(create); - if(!dec) - return XVID_ERR_MEMORY; - - return dec->Init(create); -} - -//---------------------------- - -S_decoder::S_decoder(xvid_dec_create_t *create): -#ifdef PROFILE - prof(*create->prof), -#endif - time_inc_resolution(0), - fixed_time_inc(0), - time_inc_bits(0), - shape(0), - quant_bits(0), - quant_type(0), - mpeg_quant_matrices(0), - quarterpel(0), - complexity_estimation_disable(0), - interlacing(false), - top_field_first(0), - alternate_vertical_scan(0), - aspect_ratio(0), - par_width(0), - par_height(0), - sprite_enable(0), - sprite_warping_points(0), - sprite_warping_accuracy(0), - sprite_brightness_change(0), - newpred_enable(0), - reduced_resolution_enable(false), - bs_version(0), - width(0), - height(0), - edged_width(0), - edged_height(0), - mb_width(0), - mb_height(0), - mbs(0), - last_mbs(0), - last_coding_type(0), - frames(0), - time(0), - time_base(0), - last_time_base(0), - last_non_b_time(0), - time_pp(0), - time_bp(0), - fixed_dimensions(false), - scalability(false), - low_delay(false), - low_delay_default(false), - last_reduced_resolution(false), - packed_mode(false) -{ - MemSet(&p_fmv, 0, sizeof(p_fmv)); - MemSet(&p_bmv, 0, sizeof(p_bmv)); -} - -//---------------------------- - -S_decoder::~S_decoder(){ - - xvid_free(last_mbs); - xvid_free(mbs); - - //image based GMC - image_destroy(&gmc, edged_width, edged_height); - - image_destroy(&refn[0], edged_width, edged_height); - image_destroy(&refn[1], edged_width, edged_height); - image_destroy(&tmp, edged_width, edged_height); - image_destroy(&qtmp, edged_width, edged_height); - image_destroy(&cur, edged_width, edged_height); - xvid_free(mpeg_quant_matrices); -} - -//---------------------------- - -int S_decoder::Init(xvid_dec_create_t *create){ - - mpeg_quant_matrices = (dword*)xvid_malloc(sizeof(dword) * 64 * 8, CACHE_LINE); - if(!mpeg_quant_matrices){ - delete this; - return XVID_ERR_MEMORY; - } - - create->handle = this; - - width = create->width; - height = create->height; - - cur.Null(); - refn[0].Null(); - refn[1].Null(); - tmp.Null(); - qtmp.Null(); - - //image based GMC - gmc.Null(); - - - mbs = NULL; - last_mbs = NULL; - - init_mpeg_matrix(mpeg_quant_matrices); - - //For B-frame support (used to save reference frame's time - frames = 0; - time = time_base = last_time_base = 0; - low_delay = false; - packed_mode = false; - - fixed_dimensions = (width > 0 && height > 0); - - init_vlc_tables(); - idct_int32_init(); - - if(fixed_dimensions) - return Resize(); - return 0; -} - -//---------------------------- - -static const int dquant_table[4] = { - -1, -2, 1, 2 -}; - -//---------------------------- - -static dword get_dc_scaler(dword quant, dword lum){ - - if(quant < 5) - return 8; - if(quant < 25 && !lum) - return (quant + 13) / 2; - if(quant < 9) - return 2 * quant; - if(quant < 25) - return quant + 8; - if(lum) - return 2 * quant - 16; - return quant - 6; -} - -//--------------------------- - -#ifdef _ARM_ -extern"C" -void XVID_ClearMatrix(void *dst); - -#else -void XVID_ClearMatrix(void *dst); -#ifndef USE_ARM_ASM -inline void XVID_ClearMatrix(void *dst){ MemSet(dst, 0, 64 * sizeof(int)); } -#endif -#endif - -//-------------------------- -/* decode an intra macroblock */ -void S_decoder::MBIntra(MACROBLOCK *pMB, dword x_pos, dword y_pos, dword acpred_flag, dword cbp, Bitstream *bs, - dword quant, dword intra_dc_threshold, dword bound, bool reduced_resolution){ - - DECLARE_ALIGNED_MATRIX(block, 6, 64, int, CACHE_LINE); - DECLARE_ALIGNED_MATRIX(data, 6, 64, int, CACHE_LINE); - - int i; - - dword stride = edged_width; - const dword stride2 = stride / 2; - byte *pY_Cur, *pU_Cur, *pV_Cur; - - if(reduced_resolution) { - pY_Cur = cur.y + (y_pos << 5) * stride + (x_pos << 5); - pU_Cur = cur.u + (y_pos << 4) * stride2 + (x_pos << 4); - pV_Cur = cur.v + (y_pos << 4) * stride2 + (x_pos << 4); - }else{ - pY_Cur = cur.y + (y_pos << 4) * stride + (x_pos << 4); - pU_Cur = cur.u + (y_pos << 3) * stride2 + (x_pos << 3); - pV_Cur = cur.v + (y_pos << 3) * stride2 + (x_pos << 3); - } - - MemSet(block, 0, 6 * 64 * sizeof(int)); //clear - - const dword iQuant = pMB->quant; - for(i = 0; i < 6; i++){ - dword iDcScaler = get_dc_scaler(iQuant, i < 4); - int predictors[8]; - int start_coeff; - - predict_acdc(mbs, x_pos, y_pos, mb_width, i, &block[i * 64], iQuant, iDcScaler, predictors, bound); - if(!acpred_flag) - pMB->acpred_directions[i] = 0; - - if(quant < intra_dc_threshold){ - PROF_S(PROF_1); - int dc_size; - int dc_dif; - - dc_size = i < 4 ? bs->get_dc_size_lum() : bs->get_dc_size_chrom(); - dc_dif = dc_size ? bs->get_dc_dif(dc_size) : 0; - - if (dc_size > 8) { - bs->Skip(1); /* marker */ - } - - block[i * 64 + 0] = dc_dif; - start_coeff = 1; - - DPRINTF(XVID_DEBUG_COEFF,"block[0] %i\n", dc_dif); - PROF_E(PROF_1); - }else{ - start_coeff = 0; - } - if(cbp & (1 << (5 - i))){ - //coded - int direction = alternate_vertical_scan ? 2 : pMB->acpred_directions[i]; - get_intra_block(bs, &block[i * 64], direction, start_coeff); - } - add_acdc(pMB, i, &block[i * 64], iDcScaler, predictors); - if(quant_type == 0){ - dequant_h263_intra(&data[i * 64], &block[i * 64], iQuant, iDcScaler, mpeg_quant_matrices); - }else{ - dequant_mpeg_intra(&data[i * 64], &block[i * 64], iQuant, iDcScaler, mpeg_quant_matrices); - } - InverseDiscreteCosineTransform(&data[i * 64]); - } - - dword next_block = stride * 8; - if(interlacing && pMB->field_dct){ - next_block = stride; - stride *= 2; - } - if(reduced_resolution){ - next_block*=2; - copy_upsampled_8x8_16to8(pY_Cur, &data[0 * 64], stride); - copy_upsampled_8x8_16to8(pY_Cur + 16, &data[1 * 64], stride); - copy_upsampled_8x8_16to8(pY_Cur + next_block, &data[2 * 64], stride); - copy_upsampled_8x8_16to8(pY_Cur + 16 + next_block, &data[3 * 64], stride); - copy_upsampled_8x8_16to8(pU_Cur, &data[4 * 64], stride2); - copy_upsampled_8x8_16to8(pV_Cur, &data[5 * 64], stride2); - }else{ - transfer_16to8copy(pY_Cur, &data[0 * 64], stride); - transfer_16to8copy(pY_Cur + 8, &data[1 * 64], stride); - transfer_16to8copy(pY_Cur + next_block, &data[2 * 64], stride); - transfer_16to8copy(pY_Cur + 8 + next_block, &data[3 * 64], stride); - transfer_16to8copy(pU_Cur, &data[4 * 64], stride2); - transfer_16to8copy(pV_Cur, &data[5 * 64], stride2); - } -} - -//---------------------------- - -void S_decoder::mb_decode(const dword cbp, Bitstream * bs, byte * pY_Cur, byte * pU_Cur, byte * pV_Cur, bool reduced_resolution, const MACROBLOCK *pMB){ - - DECLARE_ALIGNED_MATRIX(block, 1, 64, int, CACHE_LINE); - DECLARE_ALIGNED_MATRIX(data, 6, 64, int, CACHE_LINE); - - int i; - int stride = edged_width; - const int stride2 = stride/2; - - const dword iQuant = pMB->quant; - const int direction = alternate_vertical_scan ? 2 : 0; - const quant_interFuncPtr dequant = quant_type == 0 ? dequant_h263_inter : dequant_mpeg_inter; - for(i = 0; i < 6; i++){ - if(cbp & (1 << (5 - i))){ - //coded - XVID_ClearMatrix(block); - get_inter_block(bs, block, direction); - dequant(&data[i * 64], block, iQuant, mpeg_quant_matrices); - InverseDiscreteCosineTransform(&data[i * 64]); - } - } - - int next_block = stride * (reduced_resolution ? 16 : 8); - if(interlacing && pMB->field_dct){ - next_block = stride; - stride *= 2; - } - - if(reduced_resolution){ - if(cbp & 32) - add_upsampled_8x8_16to8(pY_Cur, &data[0 * 64], stride); - if(cbp & 16) - add_upsampled_8x8_16to8(pY_Cur + 16, &data[1 * 64], stride); - if(cbp & 8) - add_upsampled_8x8_16to8(pY_Cur + next_block, &data[2 * 64], stride); - if(cbp & 4) - add_upsampled_8x8_16to8(pY_Cur + 16 + next_block, &data[3 * 64], stride); - if(cbp & 2) - add_upsampled_8x8_16to8(pU_Cur, &data[4 * 64], stride2); - if(cbp & 1) - add_upsampled_8x8_16to8(pV_Cur, &data[5 * 64], stride2); - }else{ - if(cbp & 32) - transfer_16to8add(pY_Cur, &data[0 * 64], stride); - if(cbp & 16) - transfer_16to8add(pY_Cur + 8, &data[1 * 64], stride); - if(cbp & 8) - transfer_16to8add(pY_Cur + next_block, &data[2 * 64], stride); - if(cbp & 4) - transfer_16to8add(pY_Cur + 8 + next_block, &data[3 * 64], stride); - if(cbp & 2) - transfer_16to8add(pU_Cur, &data[4 * 64], stride2); - if(cbp & 1) - transfer_16to8add(pV_Cur, &data[5 * 64], stride2); - } -} - -//---------------------------- - -void S_decoder::DecodeInterMacroBlock(const MACROBLOCK * pMB, dword x_pos, dword y_pos, dword cbp, Bitstream *bs, - bool rounding, bool reduced_resolution, int ref){ - - dword stride = edged_width; - dword stride2 = stride / 2; - dword i; - - byte *pY_Cur, *pU_Cur, *pV_Cur; - - int uv_dx, uv_dy; - VECTOR mv[4]; //local copy of mvs - - if(reduced_resolution){ - pY_Cur = cur.y + (y_pos << 5) * stride + (x_pos << 5); - pU_Cur = cur.u + (y_pos << 4) * stride2 + (x_pos << 4); - pV_Cur = cur.v + (y_pos << 4) * stride2 + (x_pos << 4); - for (i = 0; i < 4; i++) { - mv[i].x = RRV_MV_SCALEUP(pMB->mvs[i].x); - mv[i].y = RRV_MV_SCALEUP(pMB->mvs[i].y); - } - }else{ - pY_Cur = cur.y + (y_pos << 4) * stride + (x_pos << 4); - pU_Cur = cur.u + (y_pos << 3) * stride2 + (x_pos << 3); - pV_Cur = cur.v + (y_pos << 3) * stride2 + (x_pos << 3); - for(i = 0; i < 4; i++) - mv[i] = pMB->mvs[i]; - } - - if(pMB->mode != MODE_INTER4V){ - //INTER, INTER_Q, NOT_CODED, FORWARD, BACKWARD - - uv_dx = mv[0].x; - uv_dy = mv[0].y; - if (quarterpel) { - uv_dx /= 2; - uv_dy /= 2; - } - uv_dx = (uv_dx >> 1) + roundtab_79[uv_dx & 0x3]; - uv_dy = (uv_dy >> 1) + roundtab_79[uv_dy & 0x3]; - - if(reduced_resolution) - interpolate32x32_switch(cur.y, refn[0].y, 32*x_pos, 32*y_pos, mv[0].x, mv[0].y, stride, rounding); - else - if(quarterpel) - interpolate16x16_quarterpel(cur.y, refn[ref].y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos, mv[0].x, mv[0].y, stride, rounding); - else - interpolate16x16_switch(cur.y, refn[ref].y, 16*x_pos, 16*y_pos, mv[0].x, mv[0].y, stride, rounding); - }else{ - //MODE_INTER4V - - if(quarterpel) { - uv_dx = (mv[0].x / 2) + (mv[1].x / 2) + (mv[2].x / 2) + (mv[3].x / 2); - uv_dy = (mv[0].y / 2) + (mv[1].y / 2) + (mv[2].y / 2) + (mv[3].y / 2); - }else{ - uv_dx = mv[0].x + mv[1].x + mv[2].x + mv[3].x; - uv_dy = mv[0].y + mv[1].y + mv[2].y + mv[3].y; - } - - uv_dx = (uv_dx >> 3) + roundtab_76[uv_dx & 0xf]; - uv_dy = (uv_dy >> 3) + roundtab_76[uv_dy & 0xf]; - - if(reduced_resolution){ - interpolate16x16_switch(cur.y, refn[0].y, 32*x_pos, 32*y_pos, mv[0].x, mv[0].y, stride, rounding); - interpolate16x16_switch(cur.y, refn[0].y, 32*x_pos + 16, 32*y_pos, mv[1].x, mv[1].y, stride, rounding); - interpolate16x16_switch(cur.y, refn[0].y, 32*x_pos, 32*y_pos + 16, mv[2].x, mv[2].y, stride, rounding); - interpolate16x16_switch(cur.y, refn[0].y, 32*x_pos + 16, 32*y_pos + 16, mv[3].x, mv[3].y, stride, rounding); - interpolate16x16_switch(cur.u, refn[0].u, 16*x_pos, 16*y_pos, uv_dx, uv_dy, stride2, rounding); - interpolate16x16_switch(cur.v, refn[0].v, 16*x_pos, 16*y_pos, uv_dx, uv_dy, stride2, rounding); - }else - if(quarterpel){ - interpolate8x8_quarterpel(cur.y, refn[0].y , qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos, mv[0].x, mv[0].y, stride, rounding); - interpolate8x8_quarterpel(cur.y, refn[0].y , qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos + 8, 16*y_pos, mv[1].x, mv[1].y, stride, rounding); - interpolate8x8_quarterpel(cur.y, refn[0].y , qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos + 8, mv[2].x, mv[2].y, stride, rounding); - interpolate8x8_quarterpel(cur.y, refn[0].y , qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos + 8, 16*y_pos + 8, mv[3].x, mv[3].y, stride, rounding); - } else { - interpolate8x8_switch(cur.y, refn[0].y , 16*x_pos, 16*y_pos, mv[0].x, mv[0].y, stride, rounding); - interpolate8x8_switch(cur.y, refn[0].y , 16*x_pos + 8, 16*y_pos, mv[1].x, mv[1].y, stride, rounding); - interpolate8x8_switch(cur.y, refn[0].y , 16*x_pos, 16*y_pos + 8, mv[2].x, mv[2].y, stride, rounding); - interpolate8x8_switch(cur.y, refn[0].y , 16*x_pos + 8, 16*y_pos + 8, mv[3].x, mv[3].y, stride, rounding); - } - } - //chroma - if(reduced_resolution){ - interpolate16x16_switch(cur.u, refn[0].u, 16*x_pos, 16*y_pos, uv_dx, uv_dy, stride2, rounding); - interpolate16x16_switch(cur.v, refn[0].v, 16*x_pos, 16*y_pos, uv_dx, uv_dy, stride2, rounding); - }else{ - interpolate8x8_switch(cur.u, refn[ref].u, 8*x_pos, 8*y_pos, uv_dx, uv_dy, stride2, rounding); - interpolate8x8_switch(cur.v, refn[ref].v, 8*x_pos, 8*y_pos, uv_dx, uv_dy, stride2, rounding); - } - if(cbp) - mb_decode(cbp, bs, pY_Cur, pU_Cur, pV_Cur, reduced_resolution, pMB); -} - -//---------------------------- - -inline int gmc_sanitize(int value, int quarterpel, int fcode){ - - int length = 1 << (fcode+4); - -#if 0 - if (quarterpel) value *= 2; -#endif - - if (value < -length) - return -length; - else if (value >= length) - return length-1; - else return value; -} - -//---------------------------- - -void S_decoder::mbgmc(MACROBLOCK *pMB, dword x_pos, dword y_pos, dword fcode, dword cbp, Bitstream * bs, bool rounding){ - - const dword stride = edged_width; - const dword stride2 = stride / 2; - - byte *const pY_Cur=cur.y + (y_pos << 4) * stride + (x_pos << 4); - byte *const pU_Cur=cur.u + (y_pos << 3) * stride2 + (x_pos << 3); - byte *const pV_Cur=cur.v + (y_pos << 3) * stride2 + (x_pos << 3); - - NEW_GMC_DATA *gmc_data = &new_gmc_data; - - pMB->mvs[0] = pMB->mvs[1] = pMB->mvs[2] = pMB->mvs[3] = pMB->amv; - - //this is where the calculations are done - gmc_data->predict_16x16(gmc_data, cur.y + y_pos*16*stride + x_pos*16, refn[0].y, stride, stride, x_pos, y_pos, rounding); - gmc_data->predict_8x8(gmc_data, cur.u + y_pos*8*stride2 + x_pos*8, refn[0].u, cur.v + y_pos*8*stride2 + x_pos*8, refn[0].v, stride2, stride2, x_pos, y_pos, rounding); - gmc_data->get_average_mv(gmc_data, &pMB->amv, x_pos, y_pos, quarterpel); - - pMB->amv.x = gmc_sanitize(pMB->amv.x, quarterpel, fcode); - pMB->amv.y = gmc_sanitize(pMB->amv.y, quarterpel, fcode); - - pMB->mvs[0] = pMB->mvs[1] = pMB->mvs[2] = pMB->mvs[3] = pMB->amv; - - if(cbp) - mb_decode(cbp, bs, pY_Cur, pU_Cur, pV_Cur, 0, pMB); -} - -//---------------------------- - -void S_decoder::I_Frame(Bitstream * bs, bool reduced_resolution, int quant, int intra_dc_threshold){ - - dword bound; - dword x, y; - //dword mb_width = mb_width; - //dword mb_height = mb_height; - - if (reduced_resolution) { - mb_width = (width + 31) / 32; - mb_height = (height + 31) / 32; - } - - bound = 0; - - for (y = 0; y < mb_height; y++) { - for (x = 0; x < mb_width; x++) { - dword mcbpc; - dword cbpc; - dword acpred_flag; - dword cbpy; - dword cbp; - - while(bs->ShowBits(9) == 1) - bs->Skip(9); - - if(bs->check_resync_marker(0)){ - bound = read_video_packet_header(bs, 0, &quant, NULL, NULL, &intra_dc_threshold); - x = bound % mb_width; - y = bound / mb_width; - } - MACROBLOCK *mb = &mbs[y * mb_width + x]; - - //DPRINTF(XVID_DEBUG_MB, "macroblock (%i,%i) %08x\n", x, y, bs->ShowBits(32)); - - mcbpc = bs->get_mcbpc_intra(); - mb->mode = mcbpc & 7; - cbpc = (mcbpc >> 4); - - acpred_flag = bs->GetBit(); - - cbpy = bs->GetCbpy(1); - cbp = (cbpy << 2) | cbpc; - - if (mb->mode == MODE_INTRA_Q) { - quant += dquant_table[bs->GetBits(2)]; - if (quant > 31) { - quant = 31; - } else if (quant < 1) { - quant = 1; - } - } - mb->quant = quant; - mb->mvs[0].x = mb->mvs[0].y = - mb->mvs[1].x = mb->mvs[1].y = - mb->mvs[2].x = mb->mvs[2].y = - mb->mvs[3].x = mb->mvs[3].y =0; - - if(interlacing){ - mb->field_dct = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB,"deci: field_dct: %i\n", mb->field_dct); - } - MBIntra(mb, x, y, acpred_flag, cbp, bs, quant, intra_dc_threshold, bound, reduced_resolution); - } - /* -#ifdef XVID_CSP_SLICE - if(out_frm) - output_slice(&cur, edged_width,width,out_frm,0,y,mb_width); -#endif - */ - } -} - -//---------------------------- - -void S_decoder::GetMotionVector(Bitstream * bs, int x, int y, int k, VECTOR *ret_mv, int fcode, int bound){ - - const int scale_fac = 1 << (fcode - 1); - const int high = (32 * scale_fac) - 1; - const int low = ((-32) * scale_fac); - const int range = (64 * scale_fac); - - const VECTOR pmv = get_pmv2(mbs, mb_width, bound, x, y, k); - VECTOR mv; - - mv.x = bs->GetMoveVector(fcode); - mv.y = bs->GetMoveVector(fcode); - - //DPRINTF(XVID_DEBUG_MV,"mv_diff (%i,%i) pred (%i,%i) result (%i,%i)\n", mv.x, mv.y, pmv.x, pmv.y, mv.x+pmv.x, mv.y+pmv.y); - - mv.x += pmv.x; - mv.y += pmv.y; - - if(mv.x < low){ - mv.x += range; - }else - if(mv.x > high){ - mv.x -= range; - } - - if(mv.y < low){ - mv.y += range; - }else - if(mv.y > high){ - mv.y -= range; - } - - ret_mv->x = mv.x; - ret_mv->y = mv.y; -} - -//---------------------------- -// for P_VOP set gmc_warp to NULL -void S_decoder::P_Frame(Bitstream *bs, int rounding, bool reduced_resolution, int quant, int fcode, - int intra_dc_threshold, const WARPPOINTS *gmc_warp){ - - //dword mb_width = mb_width; - //dword mb_height = mb_height; - - if(reduced_resolution){ - mb_width = (width + 31) / 32; - mb_height = (height + 31) / 32; - } - - SetEdges(refn[0]); - - if(gmc_warp){ - //accuracy: 0==1/2, 1=1/4, 2=1/8, 3=1/16 - generate_GMCparameters(sprite_warping_points, sprite_warping_accuracy, gmc_warp, width, height, &new_gmc_data); - //image warping is done block-based in decoder_mbgmc(), now - } - - PROF_S(PROF_FRM_P); - dword bound = 0; - - for(dword y = 0; y < mb_height; y++){ - //int cp_mb = 0, st_mb = 0; - for(dword x = 0; x < mb_width; x++){ - //skip stuffing - while(bs->ShowBits(10) == 1) - bs->Skip(10); - - if(bs->check_resync_marker(fcode - 1)){ - bound = read_video_packet_header(bs, fcode - 1, &quant, &fcode, NULL, &intra_dc_threshold); - x = bound % mb_width; - y = bound / mb_width; - } - MACROBLOCK *mb = &mbs[y * mb_width + x]; - - //DPRINTF(XVID_DEBUG_MB, "macroblock (%i,%i) %08x\n", x, y, bs->ShowBits(32)); - - if(!(bs->GetBit())){ - //block _is_ coded - int mcsel = 0; //mcsel: '0'=local motion, '1'=GMC - - //cp_mb++; - dword mcbpc = bs->GetMcbpcInter(); - mb->mode = mcbpc & 7; - dword cbpc = (mcbpc >> 4); - - DPRINTF(XVID_DEBUG_MB, "mode %i\n", mb->mode); - DPRINTF(XVID_DEBUG_MB, "cbpc %i\n", cbpc); - - dword intra = (mb->mode == MODE_INTRA || mb->mode == MODE_INTRA_Q); - - dword acpred_flag = 0; - if(gmc_warp && (mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q)) - mcsel = bs->GetBit(); - else - if(intra) - acpred_flag = bs->GetBit(); - - dword cbpy = bs->GetCbpy(intra); - //DPRINTF(XVID_DEBUG_MB, "cbpy %i mcsel %i \n", cbpy,mcsel); - - dword cbp = (cbpy << 2) | cbpc; - - if(mb->mode == MODE_INTER_Q || mb->mode == MODE_INTRA_Q){ - int dquant = dquant_table[bs->GetBits(2)]; - DPRINTF(XVID_DEBUG_MB, "dquant %i\n", dquant); - quant += dquant; - if (quant > 31) { - quant = 31; - } else if (quant < 1) { - quant = 1; - } - DPRINTF(XVID_DEBUG_MB, "quant %i\n", quant); - } - mb->quant = quant; - - if(interlacing){ - if((cbp || intra) && !mcsel){ - mb->field_dct = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB,"decp: field_dct: %i\n", mb->field_dct); - } - - if(mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q){ - mb->field_pred = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB, "decp: field_pred: %i\n", mb->field_pred); - - if(mb->field_pred){ - mb->field_for_top = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB,"decp: field_for_top: %i\n", mb->field_for_top); - mb->field_for_bot = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB,"decp: field_for_bot: %i\n", mb->field_for_bot); - } - } - } - if(mcsel){ - mbgmc(mb, x, y, fcode, cbp, bs, rounding); - PROF_E(PROF_0); - continue; - - }else - if(mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q){ - if(interlacing && mb->field_pred){ - GetMotionVector(bs, x, y, 0, &mb->mvs[0], fcode, bound); - GetMotionVector(bs, x, y, 0, &mb->mvs[1], fcode, bound); - }else{ - GetMotionVector(bs, x, y, 0, &mb->mvs[0], fcode, bound); - mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = mb->mvs[0]; - } - }else - if(mb->mode == MODE_INTER4V){ - GetMotionVector(bs, x, y, 0, &mb->mvs[0], fcode, bound); - GetMotionVector(bs, x, y, 1, &mb->mvs[1], fcode, bound); - GetMotionVector(bs, x, y, 2, &mb->mvs[2], fcode, bound); - GetMotionVector(bs, x, y, 3, &mb->mvs[3], fcode, bound); - }else{ /* MODE_INTRA, MODE_INTRA_Q */ - mb->mvs[0].x = mb->mvs[1].x = mb->mvs[2].x = mb->mvs[3].x = 0; - mb->mvs[0].y = mb->mvs[1].y = mb->mvs[2].y = mb->mvs[3].y = 0; - MBIntra(mb, x, y, acpred_flag, cbp, bs, quant, intra_dc_threshold, bound, reduced_resolution); - continue; - } - PROF_S(PROF_5); - DecodeInterMacroBlock(mb, x, y, cbp, bs, rounding, reduced_resolution, 0); - PROF_E(PROF_5); - }else - if(gmc_warp){ - //a not coded S(GMC)-VOP macroblock - mb->mode = MODE_NOT_CODED_GMC; - mbgmc(mb, x, y, fcode, 0x00, bs, rounding); - - /* -#ifdef XVID_CSP_SLICE - if(out_frm && cp_mb > 0) { - output_slice(&cur, edged_width,width,out_frm,st_mb,y,cp_mb); - cp_mb = 0; - } - st_mb = x+1; -#endif - */ - }else{ - //not coded P_VOP macroblock - mb->mode = MODE_NOT_CODED; - - mb->mvs[0].x = mb->mvs[1].x = mb->mvs[2].x = mb->mvs[3].x = 0; - mb->mvs[0].y = mb->mvs[1].y = mb->mvs[2].y = mb->mvs[3].y = 0; - - DecodeInterMacroBlock(mb, x, y, 0, bs, rounding, reduced_resolution, 0); - /* -#ifdef XVID_CSP_SLICE - if(out_frm && cp_mb > 0) { - output_slice(&cur, edged_width,width,out_frm,st_mb,y,cp_mb); - cp_mb = 0; - } - st_mb = x+1; -#endif - */ - } - } - /* -#ifdef XVID_CSP_SLICE - if(out_frm && cp_mb > 0) - output_slice(&cur, edged_width,width,out_frm,st_mb,y,cp_mb); -#endif - */ - } - PROF_E(PROF_FRM_P); -} - -//---------------------------- -/* decode B-frame motion vector */ -static void get_b_motion_vector(Bitstream * bs, VECTOR * mv, int fcode, const VECTOR pmv){ - - const int scale_fac = 1 << (fcode - 1); - const int high = (32 * scale_fac) - 1; - const int low = ((-32) * scale_fac); - const int range = (64 * scale_fac); - - int mv_x = bs->GetMoveVector(fcode); - int mv_y = bs->GetMoveVector(fcode); - - mv_x += pmv.x; - mv_y += pmv.y; - - if (mv_x < low) - mv_x += range; - else if (mv_x > high) - mv_x -= range; - - if (mv_y < low) - mv_y += range; - else if (mv_y > high) - mv_y -= range; - - mv->x = mv_x; - mv->y = mv_y; -} - -//---------------------------- -/* decode an B-frame direct & interpolate macroblock */ -void S_decoder::BFrameInterpolateMBInter(const IMAGE &forward, const IMAGE &backward, const MACROBLOCK *pMB, dword x_pos, dword y_pos, Bitstream *bs, int direct){ - - PROF_S(PROF_BINT_MBI); - dword stride = edged_width; - dword stride2 = stride / 2; - int uv_dx, uv_dy; - int b_uv_dx, b_uv_dy; - byte *pY_Cur, *pU_Cur, *pV_Cur; - const dword cbp = pMB->cbp; - - pY_Cur = cur.y + (y_pos << 4) * stride + (x_pos << 4); - pU_Cur = cur.u + (y_pos << 3) * stride2 + (x_pos << 3); - pV_Cur = cur.v + (y_pos << 3) * stride2 + (x_pos << 3); - - if(!direct){ - uv_dx = pMB->mvs[0].x; - uv_dy = pMB->mvs[0].y; - - b_uv_dx = pMB->b_mvs[0].x; - b_uv_dy = pMB->b_mvs[0].y; - - if(quarterpel){ - uv_dx /= 2; - uv_dy /= 2; - b_uv_dx /= 2; - b_uv_dy /= 2; - } - uv_dx = (uv_dx >> 1) + roundtab_79[uv_dx & 0x3]; - uv_dy = (uv_dy >> 1) + roundtab_79[uv_dy & 0x3]; - - b_uv_dx = (b_uv_dx >> 1) + roundtab_79[b_uv_dx & 0x3]; - b_uv_dy = (b_uv_dy >> 1) + roundtab_79[b_uv_dy & 0x3]; - }else{ - if(quarterpel) { - uv_dx = (pMB->mvs[0].x / 2) + (pMB->mvs[1].x / 2) + (pMB->mvs[2].x / 2) + (pMB->mvs[3].x / 2); - uv_dy = (pMB->mvs[0].y / 2) + (pMB->mvs[1].y / 2) + (pMB->mvs[2].y / 2) + (pMB->mvs[3].y / 2); - b_uv_dx = (pMB->b_mvs[0].x / 2) + (pMB->b_mvs[1].x / 2) + (pMB->b_mvs[2].x / 2) + (pMB->b_mvs[3].x / 2); - b_uv_dy = (pMB->b_mvs[0].y / 2) + (pMB->b_mvs[1].y / 2) + (pMB->b_mvs[2].y / 2) + (pMB->b_mvs[3].y / 2); - } else { - uv_dx = pMB->mvs[0].x + pMB->mvs[1].x + pMB->mvs[2].x + pMB->mvs[3].x; - uv_dy = pMB->mvs[0].y + pMB->mvs[1].y + pMB->mvs[2].y + pMB->mvs[3].y; - b_uv_dx = pMB->b_mvs[0].x + pMB->b_mvs[1].x + pMB->b_mvs[2].x + pMB->b_mvs[3].x; - b_uv_dy = pMB->b_mvs[0].y + pMB->b_mvs[1].y + pMB->b_mvs[2].y + pMB->b_mvs[3].y; - } - - uv_dx = (uv_dx >> 3) + roundtab_76[uv_dx & 0xf]; - uv_dy = (uv_dy >> 3) + roundtab_76[uv_dy & 0xf]; - b_uv_dx = (b_uv_dx >> 3) + roundtab_76[b_uv_dx & 0xf]; - b_uv_dy = (b_uv_dy >> 3) + roundtab_76[b_uv_dy & 0xf]; - } - - if(quarterpel){ - if(!direct){ - interpolate16x16_quarterpel(cur.y, forward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos, pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); - }else{ - interpolate8x8_quarterpel(cur.y, forward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos, pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); - interpolate8x8_quarterpel(cur.y, forward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos + 8, 16*y_pos, pMB->mvs[1].x, pMB->mvs[1].y, stride, 0); - interpolate8x8_quarterpel(cur.y, forward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos + 8, pMB->mvs[2].x, pMB->mvs[2].y, stride, 0); - interpolate8x8_quarterpel(cur.y, forward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos + 8, 16*y_pos + 8, pMB->mvs[3].x, pMB->mvs[3].y, stride, 0); - } - }else{ - interpolate8x8_switch(cur.y, forward.y, 16 * x_pos, 16 * y_pos, pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); - interpolate8x8_switch(cur.y, forward.y, 16 * x_pos + 8, 16 * y_pos, pMB->mvs[1].x, pMB->mvs[1].y, stride, 0); - interpolate8x8_switch(cur.y, forward.y, 16 * x_pos, 16 * y_pos + 8, pMB->mvs[2].x, pMB->mvs[2].y, stride, 0); - interpolate8x8_switch(cur.y, forward.y, 16 * x_pos + 8, 16 * y_pos + 8, pMB->mvs[3].x, pMB->mvs[3].y, stride, 0); - } - - interpolate8x8_switch(cur.u, forward.u, 8 * x_pos, 8 * y_pos, uv_dx, uv_dy, stride2, 0); - interpolate8x8_switch(cur.v, forward.v, 8 * x_pos, 8 * y_pos, uv_dx, uv_dy, stride2, 0); - - if(quarterpel){ - if(!direct){ - interpolate16x16_quarterpel(tmp.y, backward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos, pMB->b_mvs[0].x, pMB->b_mvs[0].y, stride, 0); - }else{ - interpolate8x8_quarterpel(tmp.y, backward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos, pMB->b_mvs[0].x, pMB->b_mvs[0].y, stride, 0); - interpolate8x8_quarterpel(tmp.y, backward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos + 8, 16*y_pos, pMB->b_mvs[1].x, pMB->b_mvs[1].y, stride, 0); - interpolate8x8_quarterpel(tmp.y, backward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos, 16*y_pos + 8, pMB->b_mvs[2].x, pMB->b_mvs[2].y, stride, 0); - interpolate8x8_quarterpel(tmp.y, backward.y, qtmp.y, qtmp.y + 64, qtmp.y + 128, 16*x_pos + 8, 16*y_pos + 8, pMB->b_mvs[3].x, pMB->b_mvs[3].y, stride, 0); - } - }else{ - interpolate8x8_switch(tmp.y, backward.y, 16 * x_pos, 16 * y_pos, pMB->b_mvs[0].x, pMB->b_mvs[0].y, stride, 0); - interpolate8x8_switch(tmp.y, backward.y, 16 * x_pos + 8, 16 * y_pos, pMB->b_mvs[1].x, pMB->b_mvs[1].y, stride, 0); - interpolate8x8_switch(tmp.y, backward.y, 16 * x_pos, 16 * y_pos + 8, pMB->b_mvs[2].x, pMB->b_mvs[2].y, stride, 0); - interpolate8x8_switch(tmp.y, backward.y, 16 * x_pos + 8, 16 * y_pos + 8, pMB->b_mvs[3].x, pMB->b_mvs[3].y, stride, 0); - } - - interpolate8x8_switch(tmp.u, backward.u, 8 * x_pos, 8 * y_pos, b_uv_dx, b_uv_dy, stride2, 0); - interpolate8x8_switch(tmp.v, backward.v, 8 * x_pos, 8 * y_pos, b_uv_dx, b_uv_dy, stride2, 0); - - interpolate8x8_avg2(cur.y + (16 * y_pos * stride) + 16 * x_pos, cur.y + (16 * y_pos * stride) + 16 * x_pos, - tmp.y + (16 * y_pos * stride) + 16 * x_pos, stride, 1, 8); - - interpolate8x8_avg2(cur.y + (16 * y_pos * stride) + 16 * x_pos + 8, cur.y + (16 * y_pos * stride) + 16 * x_pos + 8, - tmp.y + (16 * y_pos * stride) + 16 * x_pos + 8, stride, 1, 8); - - interpolate8x8_avg2(cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos, cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos, - tmp.y + ((16 * y_pos + 8) * stride) + 16 * x_pos, stride, 1, 8); - - interpolate8x8_avg2(cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, - tmp.y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, stride, 1, 8); - - interpolate8x8_avg2(cur.u + (8 * y_pos * stride2) + 8 * x_pos, cur.u + (8 * y_pos * stride2) + 8 * x_pos, - tmp.u + (8 * y_pos * stride2) + 8 * x_pos, stride2, 1, 8); - - interpolate8x8_avg2(cur.v + (8 * y_pos * stride2) + 8 * x_pos, cur.v + (8 * y_pos * stride2) + 8 * x_pos, - tmp.v + (8 * y_pos * stride2) + 8 * x_pos, stride2, 1, 8); - - if(cbp) - mb_decode(cbp, bs, pY_Cur, pU_Cur, pV_Cur, 0, pMB); - PROF_E(PROF_BINT_MBI); -} - -//---------------------------- -/* for decode B-frame dbquant */ -static int get_dbquant(Bitstream * bs){ - if (!bs->GetBit()) /* '0' */ - return (0); - else if (!bs->GetBit()) /* '10' */ - return (-2); - else /* '11' */ - return (2); -} - -//---------------------------- -/* - * decode B-frame mb_type - * bit ret_value - * 1 0 - * 01 1 - * 001 2 - * 0001 3 - */ -static int get_mbtype(Bitstream * bs){ - int mb_type; - - for (mb_type = 0; mb_type <= 3; mb_type++) - if (bs->GetBit()) - return (mb_type); - - return -1; -} - -//---------------------------- - -void S_decoder::B_Frame(Bitstream *bs, int quant, int fcode_forward, int fcode_backward){ - - dword x, y; - VECTOR mv; - const VECTOR zeromv = {0,0}; - const int64_t TRB = time_pp - time_bp, TRD = time_pp; - int i; - - PROF_S(PROF_FRM_B); - SetEdges(refn[0]); - SetEdges(refn[1]); - - for(y = 0; y < mb_height; y++){ - //initialize Pred Motion Vector - p_fmv = p_bmv = zeromv; - for(x = 0; x < mb_width; x++){ - MACROBLOCK *mb = &mbs[y * mb_width + x]; - MACROBLOCK *last_mb = &last_mbs[y * mb_width + x]; - const int fcode_max = (fcode_forward>fcode_backward) ? fcode_forward : fcode_backward; - - if(bs->check_resync_marker(fcode_max - 1)){ - dword intra_dc_threshold; /* fake variable */ - int bound = read_video_packet_header(bs, fcode_max - 1, &quant, &fcode_forward, &fcode_backward, (int*)&intra_dc_threshold); - x = bound % mb_width; - y = bound / mb_width; - //reset predicted macroblocks - p_fmv = p_bmv = zeromv; - } - - mv = mb->b_mvs[0] = mb->b_mvs[1] = mb->b_mvs[2] = mb->b_mvs[3] = mb->mvs[0] = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = zeromv; - mb->quant = quant; - - /* - * skip if the co-located P_VOP macroblock is not coded - * if not codec in co-located S_VOP macroblock is _not_ - * automatically skipped - */ - - if(last_mb->mode == MODE_NOT_CODED){ - mb->cbp = 0; - mb->mode = MODE_FORWARD; - DecodeInterMacroBlock(mb, x, y, mb->cbp, bs, 0, 0, 1); - continue; - } - - if(!bs->GetBit()){ - //modb=='0' - const byte modb2 = bs->GetBit(); - - mb->mode = get_mbtype(bs); - - if (!modb2) /* modb=='00' */ - mb->cbp = bs->GetBits(6); - else - mb->cbp = 0; - - if (mb->mode && mb->cbp) { - quant += get_dbquant(bs); - if (quant > 31) - quant = 31; - else if (quant < 1) - quant = 1; - } - mb->quant = quant; - - if(interlacing){ - if (mb->cbp) { - mb->field_dct = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB,"decp: field_dct: %i\n", mb->field_dct); - } - - if (mb->mode) { - mb->field_pred = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB, "decp: field_pred: %i\n", mb->field_pred); - - if (mb->field_pred) { - mb->field_for_top = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB,"decp: field_for_top: %i\n", mb->field_for_top); - mb->field_for_bot = bs->GetBit(); - DPRINTF(XVID_DEBUG_MB,"decp: field_for_bot: %i\n", mb->field_for_bot); - } - } - } - - }else{ - mb->mode = MODE_DIRECT_NONE_MV; - mb->cbp = 0; - } - - switch(mb->mode){ - case MODE_DIRECT: - get_b_motion_vector(bs, &mv, 1, zeromv); - //flow... - case MODE_DIRECT_NONE_MV: - for(i=0; i<4; i++){ - mb->mvs[i].x = (int)((int(TRB) * last_mb->mvs[i].x) / (int)TRD + mv.x); - mb->b_mvs[i].x = (int) ((mv.x == 0) ? - (int(TRB - TRD) * last_mb->mvs[i].x) / (int)TRD : - mb->mvs[i].x - last_mb->mvs[i].x); - mb->mvs[i].y = (int) ((int(TRB) * last_mb->mvs[i].y) / (int)TRD + mv.y); - mb->b_mvs[i].y = (int) ((mv.y == 0) ? - (int(TRB - TRD) * last_mb->mvs[i].y) / int(TRD) : - int(mb->mvs[i].y - last_mb->mvs[i].y)); - } - BFrameInterpolateMBInter(refn[1], refn[0], mb, x, y, bs, 1); - break; - - case MODE_INTERPOLATE: - get_b_motion_vector(bs, &mb->mvs[0], fcode_forward, p_fmv); - p_fmv = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = mb->mvs[0]; - - get_b_motion_vector(bs, &mb->b_mvs[0], fcode_backward, p_bmv); - p_bmv = mb->b_mvs[1] = mb->b_mvs[2] = mb->b_mvs[3] = mb->b_mvs[0]; - - BFrameInterpolateMBInter(refn[1], refn[0], mb, x, y, bs, 0); - break; - - case MODE_BACKWARD: - get_b_motion_vector(bs, &mb->mvs[0], fcode_backward, p_bmv); - p_bmv = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = mb->mvs[0]; - - DecodeInterMacroBlock(mb, x, y, mb->cbp, bs, 0, 0, 0); - break; - - case MODE_FORWARD: - get_b_motion_vector(bs, &mb->mvs[0], fcode_forward, p_fmv); - p_fmv = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = mb->mvs[0]; - - DecodeInterMacroBlock(mb, x, y, mb->cbp, bs, 0, 0, 1); - break; - - default: - DPRINTF(XVID_DEBUG_ERROR,"Not supported B-frame mb_type = %i\n", mb->mode); - } - } - } - PROF_E(PROF_FRM_B); -} - -//---------------------------- -/* perform post processing if necessary, and output the image */ -/* -void S_decoder::Output(IMAGE *img, xvid_dec_frame_t *frame, xvid_dec_stats_t *stats, int coding_type){ - - //image_output(img, width, height, edged_width, (byte**)frame->output.plane, (unsigned int*)frame->output.stride, frame->output.csp, interlacing); - yv12_to_bgr((byte*)frame->output.plane, frame->output.stride, img->y, img->u, img->v, edged_width, edged_width/2, width, height, false); - - if(stats){ - stats->type = coding2type(coding_type); - stats->data.vop.time_base = (int)time_base; - stats->data.vop.time_increment = 0; //XXX: todo - } -} -*/ - -//---------------------------- - -int S_decoder::Decode(xvid_dec_frame_t *frame, xvid_dec_stats_t *stats){ - - PROF_S(PROF_DECODE); - - Bitstream bs; - bool rounding; - bool reduced_resolution; - dword quant; - dword fcode_forward; - dword fcode_backward; - dword intra_dc_threshold; - WARPPOINTS gmc_warp; - int coding_type; - - frame->img_out = NULL; - - if(XVID_VERSION_MAJOR(frame->version) != 1 || (stats && XVID_VERSION_MAJOR(stats->version) != 1)){ //v1.x.x - PROF_E(PROF_DECODE); - return XVID_ERR_VERSION; - } - - //start_global_timer(); - - low_delay_default = (frame->general & XVID_LOWDELAY); - if((frame->general & XVID_DISCONTINUITY)) - frames = 0; - /* -#ifdef XVID_CSP_SLICE - out_frm = (frame->output.csp == XVID_CSP_SLICE) ? &frame->output : NULL; -#endif - */ - - if(frame->length < 0){ - //decoder flush - int ret; - //if not decoding "low_delay/packed", and this isn't low_delay and - // we have a reference frame, then outout the reference frame - if(!(low_delay_default && packed_mode) && !low_delay && frames>0){ - //Output(&refn[0], frame, stats, last_coding_type); - frame->img_out = &refn[0]; - frames = 0; - ret = 0; - } else { - if (stats) stats->type = XVID_TYPE_NOTHING; - ret = XVID_ERR_END; - } - //stop_global_timer(); - PROF_E(PROF_DECODE); - return ret; - } - - bs.Init(frame->bitstream, frame->length); - - //XXX: 0x7f is only valid whilst decoding vfw xvid/divx5 avi's - if(low_delay_default && frame->length == 1 && bs.ShowBits(8) == 0x7f){ - //image_output(&refn[0], width, height, edged_width, (byte**)frame->output.plane, (unsigned int*)frame->output.stride, frame->output.csp, interlacing); - if(stats) - stats->type = XVID_TYPE_NOTHING; - PROF_E(PROF_DECODE); - return 1; //one byte consumed - } - - bool success = false; - bool output = false; - bool seen_something = false; - - /* - cur.Clear(width, height, edged_width, 0, 0, 0); - refn[0].Clear(width, height, edged_width, 0, 0, 0); - refn[1].Clear(width, height, edged_width, 0, 0, 0); - */ - -repeat: - - coding_type = BitstreamReadHeaders(&bs, rounding, &reduced_resolution, &quant, &fcode_forward, &fcode_backward, &intra_dc_threshold, &gmc_warp); - - //DPRINTF(XVID_DEBUG_HEADER, "coding_type=%i, packed=%i, time=%lli, time_pp=%i, time_bp=%i\n", coding_type, packed_mode, time, time_pp, time_bp); - - if(coding_type == -1){ - //nothing - if(success) - goto done; - if(stats) - stats->type = XVID_TYPE_NOTHING; - PROF_E(PROF_DECODE); - return bs.Pos()/8; - } - - if(coding_type == -2 || coding_type == -3){ - //vol and/or resize - - if(coding_type == -3) - Resize(); - /* - if(stats){ - stats->type = XVID_TYPE_VOL; - stats->data.vol.general = 0; - //XXX: if (interlacing) stats->data.vol.general |= ++INTERLACING; - stats->data.vol.width = width; - stats->data.vol.height = height; - stats->data.vol.par = aspect_ratio; - stats->data.vol.par_width = par_width; - stats->data.vol.par_height = par_height; - return bs.Pos()/8; //number of bytes consumed - } - */ - goto repeat; - } - p_bmv.x = p_bmv.y = p_fmv.y = p_fmv.y = 0; - - //packed_mode: special-N_VOP treament - if(packed_mode && coding_type == N_VOP){ - if(low_delay_default && frames > 0){ - //Output(&refn[0], frame, stats, last_coding_type); - frame->img_out = &refn[0]; - output = true; - } - //ignore otherwise - }else - if(coding_type != B_VOP){ - switch(coding_type){ - case I_VOP: - PROF_S(PROF_FRM_I); - I_Frame(&bs, reduced_resolution, quant, intra_dc_threshold); - PROF_E(PROF_FRM_I); - break; - case P_VOP: - P_Frame(&bs, rounding, reduced_resolution, quant, fcode_forward, intra_dc_threshold, NULL); - break; - case S_VOP: - //not called (or very rare) - P_Frame(&bs, rounding, reduced_resolution, quant, fcode_forward, intra_dc_threshold, &gmc_warp); - break; - case N_VOP: - //XXX: not_coded vops are not used for forward prediction we should not swap(last_mbs,mbs) - cur.Copy(&refn[0], edged_width, height); - break; - } - if(reduced_resolution) - cur.deblock_rrv(edged_width, mbs, (width + 31) / 32, (height + 31) / 32, mb_width, 16, 0); - - //note: for packed_mode, output is performed when the special-N_VOP is decoded - if(!(low_delay_default && packed_mode)){ - if(low_delay){ - //Output(&cur, frame, stats, coding_type); - frame->img_out = &cur; - output = true; - }else - if(frames > 0){ - //is the reference frame valid? - // output the reference frame - //Output(&refn[0], frame, stats, last_coding_type); - frame->img_out = &refn[1]; - output = true; - } - } - refn[0].Swap(&refn[1]); - cur.Swap(&refn[0]); - Swap(mbs, last_mbs); - last_reduced_resolution = reduced_resolution; - last_coding_type = coding_type; - - frames++; - seen_something = true; - }else{ - //B_VOP - if(low_delay){ - DPRINTF(XVID_DEBUG_ERROR, "warning: bvop found in low_delay==1 stream\n"); - low_delay = true; - } - - if(frames < 2){ - /* attemping to decode a bvop without atleast 2 reference frames */ - cur.Print(edged_width, height, 16, 16, "broken b-frame, mising ref frames"); - }else - if(time_pp <= time_bp){ - //this occurs when dx50_bvop_compatibility==0 sequences are decoded in vfw - cur.Print(edged_width, height, 16, 16, "broken b-frame"); - }else{ - B_Frame(&bs, quant, fcode_forward, fcode_backward); - } - //Output(&cur, frame, stats, coding_type); - frame->img_out = &cur; - output = true; - frames++; - } - - bs.ByteAlign(); - - //low_delay_default mode: repeat in packed_mode - if(low_delay_default && packed_mode && !output && !success){ - success = true; - goto repeat; - } -done: - //low_delay_default mode: if we've gotten here without outputting anything, - // then output the recently decoded frame, or print an error message - if(low_delay_default && !output){ - if(packed_mode && seen_something){ - //output the recently decoded frame - //Output(&refn[0], frame, stats, last_coding_type); - frame->img_out = &refn[0]; - }else{ - cur.Clear(width, height, edged_width, 0, 128, 128); - cur.Print(edged_width, height, 16, 16, "warning: nothing to output"); - cur.Print(edged_width, height, 16, 64, "bframe decoder lag"); - - //Output(&cur, frame, stats, P_VOP); - frame->img_out = &cur; - if(stats) - stats->type = XVID_TYPE_NOTHING; - } - } - - PROF_E(PROF_DECODE); - //number of bytes consumed - return bs.Pos() / 8; -} - -//---------------------------- - diff --git a/modules/xvid_dec/xvid_wce/decoder.h b/modules/xvid_dec/xvid_wce/decoder.h deleted file mode 100644 index aee49e0..0000000 --- a/modules/xvid_dec/xvid_wce/decoder.h +++ /dev/null @@ -1,269 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Decoder related header - - * - * Copyright(C) 2002-2003 Peter Ross - * - * 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: decoder.h,v 1.1.1.1 2005-07-13 14:36:13 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _DECODER_H_ -#define _DECODER_H_ - -#include "xvid.h" -#include "portab.h" -#include "global.h" -#include "image.h" -#include "vlc_codes.h" -#include "Interpolate8x8.h" - -/***************************************************************************** - * Structures - ****************************************************************************/ - -/* complexity estimation toggles */ -struct ESTIMATION{ - int method; - - int opaque; - int transparent; - int intra_cae; - int inter_cae; - int no_update; - int upsampling; - - int intra_blocks; - int inter_blocks; - int inter4v_blocks; - int gmc_blocks; - int not_coded_blocks; - - int dct_coefs; - int dct_lines; - int vlc_symbols; - int vlc_bits; - - int apm; - int npm; - int interpolate_mc_q; - int forw_back_mc_q; - int halfpel2; - int halfpel4; - - int sadct; - int quarterpel; - - ESTIMATION(){ - MemSet(this, 0, sizeof(ESTIMATION)); - } -}; - -//---------------------------- - -struct S_decoder{ -private: -#ifdef PROFILE - mutable C_profiler &prof; -#endif - - int Resize(); - -//---------------------------- - void SetEdges(IMAGE &img) const; - -//---------------------------- - void I_Frame(Bitstream * bs, bool reduced_resolution, int quant, int intra_dc_threshold); - void P_Frame(Bitstream * bs, int rounding, bool reduced_resolution, int quant, int fcode, int intra_dc_threshold, const WARPPOINTS *const gmc_warp); - void MBIntra(MACROBLOCK *pMB, dword x_pos, dword y_pos, dword acpred_flag, dword cbp, - Bitstream *bs, dword quant, dword intra_dc_threshold, dword bound, bool reduced_resolution); - - void mb_decode(const dword cbp, Bitstream * bs, byte * pY_Cur, byte * pU_Cur, byte * pV_Cur, bool reduced_resolution, const MACROBLOCK * pMB); - - void DecodeInterMacroBlock(const MACROBLOCK *pMB, dword x_pos, dword y_pos, dword cbp, Bitstream *bs, - bool rounding, bool reduced_resolution, int ref); - - void mbgmc(MACROBLOCK *pMB, dword x_pos, dword y_pos, dword fcode, dword cbp, Bitstream *bs, bool rounding); - - void BFrameInterpolateMBInter(const IMAGE &forward, const IMAGE &backward, const MACROBLOCK *pMB, dword x_pos, dword y_pos, Bitstream *bs, int direct); - - void B_Frame(Bitstream * bs, int quant, int fcode_forward, int fcode_backward); - void GetMotionVector(Bitstream *bs, int x, int y, int k, VECTOR *ret_mv, int fcode, int bound); - //void Output(IMAGE *img, xvid_dec_frame_t *frame, xvid_dec_stats_t *stats, int coding_type); - - int read_video_packet_header(Bitstream *bs, const int addbits, int *quant, int *fcode_forward, int *fcode_backward, int *intra_dc_threshold); - void read_vol_complexity_estimation_header(Bitstream * bs); - int BitstreamReadHeaders(Bitstream * bs, bool &rounding, bool *reduced_resolution, dword *quant, dword *fcode_forward, - dword *fcode_backward, dword *intra_dc_threshold, WARPPOINTS *gmc_warp); - void read_vop_complexity_estimation_header(Bitstream * bs, int coding_type); - - int get_coeff(Bitstream *bs, int *run, int *last, int intra, int short_video_header); - void get_intra_block(Bitstream * bs, int *block, int direction, int coeff); - void get_inter_block(Bitstream * bs, int *block, int direction); - - void idct_int32_init(); - void InverseDiscreteCosineTransform(int *block) const; - - friend int decoder_create(xvid_dec_create_t *create); - - int Init(xvid_dec_create_t *create); - -#ifdef PROFILE - void interpolate8x8_quarterpel(byte *cur, byte *refn, byte *refh, byte *refv, byte *refhv, dword x, dword y, int dx, int dy, dword stride, bool rounding){ - ::interpolate8x8_quarterpel(cur, refn, refh, refv, refhv, x, y, dx, dy, stride, rounding); - } - void interpolate16x16_switch(byte *cur, const byte *refn, dword x, dword y, int dx, int dy, dword stride, bool rounding){ - interpolate8x8_switch(cur, refn, x, y, dx, dy, stride, rounding); - interpolate8x8_switch(cur, refn, x+8, y, dx, dy, stride, rounding); - interpolate8x8_switch(cur, refn, x, y+8, dx, dy, stride, rounding); - interpolate8x8_switch(cur, refn, x+8, y+8, dx, dy, stride, rounding); - } - void interpolate8x8_switch(byte *cur, const byte *refn, dword x, dword y, int dx, int dy, dword stride, bool rounding){ - const byte *src = refn + ((y + (dy>>1)) * stride + x + (dx>>1)); - byte *dst = cur + (y * stride + x); - - int code = ((dx & 1) << 1) + (dy & 1); - //PROF_S(PROF_4+MIN(3, code)); - switch(code){ - case 0: - transfer8x8_copy(dst, src, stride); - break; - case 1: - interpolate8x8_halfpel_v(dst, src, stride, rounding); - break; - case 2: - interpolate8x8_halfpel_h(dst, src, stride, rounding); - break; - default: - interpolate8x8_halfpel_hv(dst, src, stride, rounding); - break; - } - //PROF_E(PROF_4+MIN(3, code)); - } -#endif -public: - S_decoder(xvid_dec_create_t *create); - ~S_decoder(); - //vol bitstream - int time_inc_resolution; - int fixed_time_inc; - dword time_inc_bits; - - dword shape; - dword quant_bits; - dword quant_type; - dword *mpeg_quant_matrices; - int quarterpel; - int complexity_estimation_disable; - ESTIMATION estimation; - - dword top_field_first; - dword alternate_vertical_scan; - - int aspect_ratio; - int par_width; - int par_height; - - int sprite_enable; - int sprite_warping_points; - int sprite_warping_accuracy; - int sprite_brightness_change; - - bool interlacing; - bool newpred_enable; - bool reduced_resolution_enable; - - /* The bitstream version if it's a XviD stream */ - int bs_version; - - /* image */ - - dword width; - dword height; - dword edged_width; - dword edged_height; - - IMAGE cur; - IMAGE refn[2]; /* 0 -- last I or P VOP */ - - /* 1 -- first I or P */ - IMAGE tmp; /* bframe interpolation, and post processing tmp buffer */ - IMAGE qtmp; /* quarter pel tmp buffer */ - - /* macroblock */ - - dword mb_width; - dword mb_height; - MACROBLOCK *mbs; - - //for B-frame & low_delay==0 - // XXX: should move frame based stuff into a DECODER_FRAMEINFO struct - MACROBLOCK *last_mbs; /* last MB */ - int last_coding_type; /* last coding type value */ - int frames; /* total frame number */ - VECTOR p_fmv, p_bmv; /* pred forward & backward motion vector */ - int64_t time; /* for record time */ - int64_t time_base; - int64_t last_time_base; - int64_t last_non_b_time; - dword time_pp; - dword time_bp; - bool fixed_dimensions; - bool scalability; - bool low_delay; //low_delay flage (1 means no B_VOP) - bool low_delay_default; //default value for low_delay flag - bool last_reduced_resolution; //last reduced_resolution value - bool packed_mode; //bframes packed bitstream? (1 = yes) - - //for GMC: central place for all parameters - - IMAGE gmc; /* gmc tmp buffer, remove for blockbased compensation */ - GMC_DATA gmc_data; - NEW_GMC_DATA new_gmc_data; - - /* -#ifdef XVID_CSP_SLICE - xvid_image_t* out_frm; //This is used for slice rendering -#endif - */ - - struct REVERSE_EVENT{ - byte len; - EVENT event; - }; - //decoding tables - REVERSE_EVENT DCT3D[2][4096]; - VLC coeff_VLC[2][2][64][64]; - - typedef int t_clip_val; - t_clip_val iclip[1024]; //clipping table - - void init_vlc_tables(); - int Decode(xvid_dec_frame_t * frame, xvid_dec_stats_t * stats); -}; - -/***************************************************************************** - * Decoder prototypes - ****************************************************************************/ - -void init_decoder(dword cpu_flags); - -int decoder_create(xvid_dec_create_t * param); - - -#endif diff --git a/modules/xvid_dec/xvid_wce/font.cpp b/modules/xvid_dec/xvid_wce/font.cpp deleted file mode 100644 index d8efc69..0000000 --- a/modules/xvid_dec/xvid_wce/font.cpp +++ /dev/null @@ -1,598 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Font rendering to frame buffer functions - - * - * Copyright(C) 2002-2003 Peter Ross - * - * 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: font.cpp,v 1.1.1.1 2005-07-13 14:36:13 jeanlf Exp $ - * - ****************************************************************************/ - -#include "image.h" - -#define FONT_WIDTH 4 -#define FONT_HEIGHT 6 - -//---------------------------- - -static const char ascii33[33][FONT_WIDTH*FONT_HEIGHT] = { - - /* ! */ - {0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,0,0, - 0,0,1,0}, - - /* " */ - {0,1,0,1, - 0,1,0,1, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0}, - - /* # */ - {0,1,1,0, - 1,1,1,1, - 0,1,1,0, - 0,1,1,0, - 1,1,1,1, - 0,1,1,0}, - - /* $ */ - {0,1,1,0, - 1,0,1,1, - 1,1,1,0, - 0,1,1,1, - 1,1,0,1, - 0,1,1,0}, - - /* % */ - {1,1,0,1, - 1,0,0,1, - 0,0,1,0, - 0,1,0,0, - 1,0,0,1, - 1,0,1,1}, - - /* & */ - {0,1,1,0, - 1,0,0,0, - 0,1,0,1, - 1,0,1,0, - 1,0,1,0, - 0,1,0,1}, - - /* ' */ - {0,0,1,0, - 0,0,1,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0}, - - /* ( */ - {0,0,1,0, - 0,1,0,0, - 0,1,0,0, - 0,1,0,0, - 0,1,0,0, - 0,0,1,0}, - - /* ) */ - {0,1,0,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,1,0,0}, - - /* * */ - {0,0,0,0, - 1,0,0,1, - 0,1,1,0, - 1,1,1,1, - 0,1,1,0, - 1,0,0,1}, - - /* + */ - {0,0,0,0, - 0,0,1,0, - 0,0,1,0, - 0,1,1,1, - 0,0,1,0, - 0,0,1,0}, - - /* , */ - {0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,1,1,0, - 0,0,1,0}, - - /* - */ - {0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 1,1,1,1, - 0,0,0,0, - 0,0,0,0}, - - /* . */ - {0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,1,1,0, - 0,1,1,0}, - - /* / */ - {0,0,0,1, - 0,0,0,1, - 0,0,1,0, - 0,1,0,0, - 1,0,0,0, - 1,0,0,0}, - - /* 0 */ - {0,1,1,0, - 1,0,0,1, - 1,0,1,1, - 1,1,0,1, - 1,0,0,1, - 0,1,1,0}, - - /* 1 */ - {0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0}, - - /* 2 */ - {0,1,1,0, - 1,0,0,1, - 0,0,1,0, - 0,1,0,0, - 1,0,0,0, - 1,1,1,1}, - - /* 3 */ - {0,1,1,0, - 1,0,0,1, - 0,0,1,0, - 0,0,0,1, - 1,0,0,1, - 0,1,1,0}, - - /* 4 */ - {0,0,1,0, - 0,1,1,0, - 1,0,1,0, - 1,1,1,1, - 0,0,1,0, - 0,0,1,0}, - - /* 5 */ - {1,1,1,1, - 1,0,0,0, - 1,1,1,0, - 0,0,0,1, - 1,0,0,1, - 0,1,1,0}, - - /* 6 */ - {0,1,1,1, - 1,0,0,0, - 1,1,1,0, - 1,0,0,1, - 1,0,0,1, - 0,1,1,0}, - - /* 7 */ - {1,1,1,0, - 0,0,0,1, - 0,0,0,1, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0}, - - /* 8 */ - {0,1,1,0, - 1,0,0,1, - 0,1,1,0, - 1,0,0,1, - 1,0,0,1, - 0,1,1,0}, - - /* 9 */ - {0,1,1,0, - 1,0,0,1, - 1,0,0,1, - 0,1,1,1, - 0,0,0,1, - 1,1,1,0}, - - /* : */ - {0,0,0,0, - 0,0,0,0, - 0,0,1,0, - 0,0,0,0, - 0,0,1,0, - 0,0,0,0}, - - /* ; */ - {0,0,0,0, - 0,0,1,0, - 0,0,0,0, - 0,0,0,0, - 0,1,1,0, - 0,0,1,0}, - - /* < */ - {0,0,0,1, - 0,0,1,0, - 0,1,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1}, - - /* = */ - {0,0,0,0, - 1,1,1,1, - 0,0,0,0, - 0,0,0,0, - 1,1,1,1, - 0,0,0,0}, - - /* > */ - {0,1,0,0, - 0,0,1,0, - 0,0,0,1, - 0,0,0,1, - 0,0,1,0, - 0,1,0,0}, - - /* ? */ - {0,1,1,0, - 1,0,0,1, - 0,0,1,0, - 0,0,1,0, - 0,0,0,0, - 0,0,1,0}, - - /* @ */ - {0,1,1,0, - 1,0,0,1, - 1,0,1,1, - 1,0,1,1, - 1,0,0,0, - 0,1,1,0}, - -}; - - -static const char ascii65[26][FONT_WIDTH*FONT_HEIGHT] = { - /* A */ - {0,1,1,0, - 1,0,0,1, - 1,0,0,1, - 1,1,1,1, - 1,0,0,1, - 1,0,0,1}, - - /* B */ - {1,1,1,0, - 1,0,0,1, - 1,1,1,0, - 1,0,0,1, - 1,0,0,1, - 1,1,1,0}, - - /* C */ - {0,1,1,0, - 1,0,0,1, - 1,0,0,0, - 1,0,0,0, - 1,0,0,1, - 0,1,1,0}, - - /* D */ - {1,1,0,0, - 1,0,1,0, - 1,0,0,1, - 1,0,0,1, - 1,0,1,0, - 1,1,0,0}, - - /* E */ - {1,1,1,1, - 1,0,0,0, - 1,1,1,0, - 1,0,0,0, - 1,0,0,0, - 1,1,1,1}, - - /* F */ - {1,1,1,1, - 1,0,0,0, - 1,1,1,0, - 1,0,0,0, - 1,0,0,0, - 1,0,0,0}, - - /* G */ - {0,1,1,1, - 1,0,0,0, - 1,0,1,1, - 1,0,0,1, - 1,0,0,1, - 0,1,1,0}, - - /* H */ - {1,0,0,1, - 1,0,0,1, - 1,1,1,1, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1}, - - /* I */ - {0,1,1,1, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,1,1,1}, - - /* J */ - {0,1,1,1, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 1,0,1,0, - 0,1,0,0}, - - /* K */ - {1,0,0,1, - 1,0,0,1, - 1,1,1,0, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1}, - - /* L */ - {1,0,0,0, - 1,0,0,0, - 1,0,0,0, - 1,0,0,0, - 1,0,0,0, - 1,1,1,1}, - - /* M */ - {1,0,0,1, - 1,1,1,1, - 1,1,1,1, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1}, - - /* N */ - {1,0,0,1, - 1,1,0,1, - 1,1,0,1, - 1,0,1,1, - 1,0,1,1, - 1,0,0,1}, - - /* 0 */ - {0,1,1,0, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1, - 0,1,1,0}, - - /* P */ - {1,1,1,0, - 1,0,0,1, - 1,1,1,0, - 1,0,0,0, - 1,0,0,0, - 1,0,0,0}, - - /* Q */ - {0,1,1,0, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1, - 1,0,1,0, - 0,1,0,1}, - - - /* R */ - {1,1,1,0, - 1,0,0,1, - 1,1,1,0, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1}, - - /* S */ - {0,1,1,0, - 1,0,0,1, - 0,1,0,0, - 0,0,1,0, - 1,0,0,1, - 0,1,1,0}, - - /* T */ - {0,1,1,1, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0}, - - /* U */ - {1,0,0,1, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1, - 1,1,1,1}, - - /* V */ - {1,0,0,1, - 1,0,0,1, - 1,0,0,1, - 0,1,1,0, - 0,1,1,0, - 0,1,1,0}, - - /* W */ - {1,0,0,1, - 1,0,0,1, - 1,0,0,1, - 1,1,1,1, - 1,1,1,1, - 1,0,0,1}, - - /* X */ - {1,0,0,1, - 1,0,0,1, - 0,1,1,0, - 1,0,0,1, - 1,0,0,1, - 1,0,0,1}, - - /* Y */ - {1,0,0,1, - 1,0,0,1, - 0,1,0,0, - 0,0,1,0, - 0,1,0,0, - 1,0,0,0}, - - /* Z */ - {1,1,1,1, - 0,0,0,1, - 0,0,1,0, - 0,1,0,0, - 1,0,0,0, - 1,1,1,1}, - -}; - - - -static const char ascii91[6][FONT_WIDTH*FONT_HEIGHT] = { - /* [ */ - {0,1,1,0, - 0,1,0,0, - 0,1,0,0, - 0,1,0,0, - 0,1,0,0, - 0,1,1,0}, - - /* '\' */ - {1,0,0,0, - 1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1, - 0,0,0,1}, - - /* ] */ - {0,1,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,0,1,0, - 0,1,1,0}, - - /* ^ */ - {0,1,0,1, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0}, - - /* _ */ - {0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 1,1,1,1}, - - /* ` */ - {0,1,0,0, - 0,0,1,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0, - 0,0,0,0} -}; - -//---------------------------- - -#define FONT_ZOOM 2 - -void IMAGE::draw_num(const int stride, const int height, const char * font, const int x, const int y){ - - for(int j = 0; j < FONT_ZOOM * FONT_HEIGHT && y+j < height; j++){ - for(int i = 0; i < FONT_ZOOM * FONT_WIDTH && x+i < stride; i++){ - if(font[(j/FONT_ZOOM)*FONT_WIDTH + (i/FONT_ZOOM)]){ - int offset = (y+j)*stride + (x+i); - int offset2 =((y+j)/2)*(stride/2) + ((x+i)/2); - IMAGE::y[offset] = 255; - IMAGE::u[offset2] = 127; - IMAGE::v[offset2] = 127; - } - } - } -} - -//---------------------------- - -void IMAGE::Print(int edged_width, int height, int x, int y, const char *buf){ - - int i; - - for(i = 0; buf[i]; i++) { - const char * font; - - if (buf[i] >= '!' && buf[i] <= '@') - font = ascii33[buf[i]-'!']; - else if (buf[i] >= 'A' && buf[i] <= 'Z') - font = ascii65[buf[i]-'A']; - else if (buf[i] >= '[' && buf[i] <= '`') - font = ascii91[buf[i]-'[']; - else if (buf[i] >= 'a' && buf[i] <= 'z') - font = ascii65[buf[i]-'a']; - else - continue; - draw_num(edged_width, height, font, x + i*FONT_ZOOM*(FONT_WIDTH+1), y); - } -} diff --git a/modules/xvid_dec/xvid_wce/global.h b/modules/xvid_dec/xvid_wce/global.h deleted file mode 100644 index 6f954fc..0000000 --- a/modules/xvid_dec/xvid_wce/global.h +++ /dev/null @@ -1,355 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Global definitions - - * - * Copyright(C) 2002 Michael Militzer - * - * 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: global.h,v 1.1.1.1 2005-07-13 14:36:14 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _GLOBAL_H_ -#define _GLOBAL_H_ - -#include "xvid.h" -#include "portab.h" - -//---------------------------- - -void MemSet(void *dst, byte c, dword len); -int MemCmp(const void *mem1, const void *mem2, dword len); -void MemCpy(void *dst, const void *src, dword len); - -template -inline void Swap(T &l, T &r){ T tmp = r; r = l; l = tmp; } - -#ifndef __SYMBIAN32__ - -enum TLeave{ ELeave }; -void *operator new(size_t sz, TLeave); -inline void operator delete(void *vp, TLeave){ operator delete(vp); } - -#endif - -//---------------------------- -// Fatal error - display message, and exit program immediately. -void Fatal(const char *msg, dword code = 0); - -//---------------------------- -#ifndef assert - -#ifdef NDEBUG -#define assert(exp) ((void)0) -#else - -#define assert(exp) if(!(exp)){\ - Fatal(#exp, __LINE__); } - -#endif -#endif - -//---------------------------- -/* --- macroblock modes --- */ - -#define MODE_INTER 0 -#define MODE_INTER_Q 1 -#define MODE_INTER4V 2 -#define MODE_INTRA 3 -#define MODE_INTRA_Q 4 -#define MODE_NOT_CODED 16 -#define MODE_NOT_CODED_GMC 17 - -/* --- bframe specific --- */ - -#define MODE_DIRECT 0 -#define MODE_INTERPOLATE 1 -#define MODE_BACKWARD 2 -#define MODE_FORWARD 3 -#define MODE_DIRECT_NONE_MV 4 -#define MODE_DIRECT_NO4V 5 - - -/* - * vop coding types - * intra, prediction, backward, sprite, not_coded - */ -#define I_VOP 0 -#define P_VOP 1 -#define B_VOP 2 -#define S_VOP 3 -#define N_VOP 4 - -//---------------------------- -// convert mpeg-4 coding type i/p/b/s_VOP to XVID_TYPE_xxx -inline int coding2type(int coding_type){ - return coding_type + 1; -} - -//---------------------------- -// convert XVID_TYPE_xxx to bitstream coding type i/p/b/s_VOP -inline int type2coding(int xvid_type){ - return xvid_type - 1; -} - - -typedef struct -{ - int x; - int y; -} -VECTOR; - - - -typedef struct -{ - VECTOR duv[3]; -} -WARPPOINTS; - -/* save all warping parameters for GMC once and for all, instead of - recalculating for every block. This is needed for encoding&decoding - When switching to incremental calculations, this will get much shorter -*/ - -/* we don't include WARPPOINTS wp here, but in FRAMEINFO itself */ - -struct GMC_DATA{ - int num_wp; /* [input]: 0=none, 1=translation, 2,3 = warping */ - /* a value of -1 means: "structure not initialized!" */ - int s; /* [input]: calc is done with 1/s pel resolution */ - - int W; - int H; - - int ss; - int smask; - int sigma; - - int r; - int rho; - - int i0s; - int j0s; - int i1s; - int j1s; - int i2s; - int j2s; - - int i1ss; - int j1ss; - int i2ss; - int j2ss; - - int alpha; - int beta; - int Ws; - int Hs; - - int dxF, dyF, dxG, dyG; - int Fo, Go; - int cFo, cGo; - - GMC_DATA(){ - MemSet(this, 0, sizeof(GMC_DATA)); - } -}; - -struct NEW_GMC_DATA{ - /* 0=none, 1=translation, 2,3 = warping - * a value of -1 means: "structure not initialized!" */ - int num_wp; - - /* {0,1,2,3} => {1/2,1/4,1/8,1/16} pel */ - int accuracy; - - /* sprite size * 16 */ - int sW, sH; - - /* gradient, calculated from warp points */ - int dU[2], dV[2], Uo, Vo, Uco, Vco; - - void (*predict_16x16)(const NEW_GMC_DATA * const This, - byte *dst, const byte *src, - int dststride, int srcstride, int x, int y, int rounding); - void (*predict_8x8) (const NEW_GMC_DATA * const This, - byte *uDst, const byte *uSrc, - byte *vDst, const byte *vSrc, - int dststride, int srcstride, int x, int y, int rounding); - void (*get_average_mv)(const NEW_GMC_DATA * const Dsp, VECTOR * const mv, - int x, int y, int qpel); - - NEW_GMC_DATA(){ - MemSet(this, 0, sizeof(NEW_GMC_DATA)); - } -}; - -//---------------------------- - -struct IMAGE: public C_xvid_image{ -private: - void draw_num(const int stride, const int height, const char * font, const int x, const int y); -public: - void Print(int edged_width, int height, int x, int y, const char *fmt); - void Swap(IMAGE *image2); - void Copy(const IMAGE * image2, dword edged_width, dword height); - void Clear(int width, int height, int edged_width, int y, int u, int v); - void deblock_rrv(int edged_width, const struct MACROBLOCK * mbs, int mb_width, int mb_height, int mb_stride, int block, int flags); - - inline void Null(){ - y = u = v = 0; - } -}; - -//---------------------------- - -struct Bitstream{ - dword bufa; - dword bufb; - dword buf; - dword pos; //bit position in currently cached 2 dwords (0-31) - dword *tail; - dword *start; - dword length; - dword initpos; - - void Init(const void *bitstream, dword length); - dword ShowBits(dword bits); - void get_matrix(byte *matrix); - void Skip(dword bits); - -//---------------------------- -// number of bits to next byte alignment - inline dword NumBitsToByteAlign() const{ - dword n = (32 - pos) & 7; - return n == 0 ? 8 : n; - } - dword ShowBitsFromByteAlign(int bits); - -//---------------------------- -// move forward to the next byte boundary - void ByteAlign(){ - dword remainder = pos & 7; - if (remainder) { - Skip(8 - remainder); - } - } - -//---------------------------- -// bitstream length (unit bits) - inline dword Pos() const{ - return((dword)(8*((dword)tail - (dword)start) + pos - initpos)); - } - - dword GetBits(const dword n); - -//---------------------------- -// read single bit from bitstream - inline dword GetBit(){ - return GetBits(1); - } - -//---------------------------- - - int GetMcbpcInter(); - int GetCbpy(int intra); - int GetMoveVector(int fcode); - -//---------------------------- - - int check_resync_marker(int addbits); - int bs_get_spritetrajectory(); - int get_mcbpc_intra(); - int get_dc_dif(dword dc_size); - int get_dc_size_lum(); - int get_dc_size_chrom(); -}; - - -#define MBPRED_SIZE 15 - - -struct MACROBLOCK{ - /* decoder/encoder */ - VECTOR mvs[4]; - - int pred_values[6][MBPRED_SIZE]; - int acpred_directions[6]; - - int mode; - int quant; /* absolute quant */ - - int field_dct; - int field_pred; - int field_for_top; - int field_for_bot; - - /* encoder specific */ - - VECTOR mv16; - VECTOR pmvs[4]; - VECTOR qmvs[4]; /* mvs in quarter pixel resolution */ - - int sad8[4]; /* SAD values for inter4v-VECTORs */ - int sad16; /* SAD value for inter-VECTOR */ - - int dquant; - int cbp; - - /* bframe stuff */ - - VECTOR b_mvs[4]; - VECTOR b_qmvs[4]; - - int mb_type; - - /* - * stuff for block based ME (needed for Qpel ME) - * backup of last integer ME vectors/sad - */ - - VECTOR amv; /* average motion vectors from GMC */ - int mcsel; - -/* This structure has become way to big! What to do? Split it up? */ - -}; - -//---------------------------- - -inline dword log2bin(dword value){ - int n = 0; - - while (value) { - value >>= 1; - n++; - } - return n; -} - -//---------------------------- - -/* useful macros */ - -#define MIN(X, Y) ((X)<(Y)?(X):(Y)) -#define MAX(X, Y) ((X)>(Y)?(X):(Y)) -#define ABS(X) (((X)>0)?(X):-(X)) -#define SIGN(X) (((X)>0)?1:-1) -#define CLIP(X,AMIN,AMAX) (((X)<(AMIN)) ? (AMIN) : ((X)>(AMAX)) ? (AMAX) : (X)) - -#endif /* _GLOBAL_H_ */ diff --git a/modules/xvid_dec/xvid_wce/gmc.cpp b/modules/xvid_dec/xvid_wce/gmc.cpp deleted file mode 100644 index 7a81329..0000000 --- a/modules/xvid_dec/xvid_wce/gmc.cpp +++ /dev/null @@ -1,396 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - GMC interpolation module - - * - * Copyright(C) 2002-2003 Pascal Massimino - * - * 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: gmc.cpp,v 1.1.1.1 2005-07-13 14:36:14 jeanlf Exp $ - * - ****************************************************************************/ - -#include "portab.h" -#include "global.h" -#include "gmc.h" - -/* ************************************************************ - * Pts = 2 or 3 - * - * Warning! *src is the global frame pointer (that is: adress - * of pixel 0,0), not the macroblock one. - * Conversely, *dst is the macroblock top-left adress. - */ -static void Predict_16x16_C(const NEW_GMC_DATA * const This, byte *dst, const byte *src, int dststride, int srcstride, int x, int y, int rounding){ - - const int W = This->sW; - const int H = This->sH; - const int rho = 3 - This->accuracy; - const int Rounder = ( (1<<7) - (rounding<<(2*rho)) ) << 16; - - const int dUx = This->dU[0]; - const int dVx = This->dV[0]; - const int dUy = This->dU[1]; - const int dVy = This->dV[1]; - - int Uo = This->Uo + 16*(dUy*y + dUx*x); - int Vo = This->Vo + 16*(dVy*y + dVx*x); - - int i, j; - - dst += 16; - for (j=16; j>0; --j) { - int U = Uo, V = Vo; - Uo += dUy; Vo += dVy; - for (i=-16; i<0; ++i) { - unsigned int f0, f1, ri = 16, rj = 16; - int Offset; - int u = ( U >> 16 ) << rho; - int v = ( V >> 16 ) << rho; - - U += dUx; V += dVx; - - if (u > 0 && u <= W) { ri = MTab[u&15]; Offset = u>>4; } - else if (u > W) Offset = W>>4; - else Offset = -1; - - if (v > 0 && v <= H) { rj = MTab[v&15]; Offset += (v>>4)*srcstride; } - else if (v > H) Offset += (H>>4)*srcstride; - else Offset -= srcstride; - - f0 = src[Offset + 0]; - f0 |= src[Offset + 1] << 16; - f1 = src[Offset + srcstride + 0]; - f1 |= src[Offset + srcstride + 1] << 16; - f0 = (ri*f0)>>16; - f1 = (ri*f1) & 0x0fff0000; - f0 |= f1; - f0 = (rj*f0 + Rounder) >> 24; - - dst[i] = (byte)f0; - } - dst += dststride; - } -} - -//---------------------------- - -static void Predict_8x8_C(const NEW_GMC_DATA * const This, byte *uDst, const byte *uSrc, - byte *vDst, const byte *vSrc, int dststride, int srcstride, int x, int y, int rounding){ - - const int W = This->sW >> 1; - const int H = This->sH >> 1; - const int rho = 3-This->accuracy; - const int Rounder = ( 128 - (rounding<<(2*rho)) ) << 16; - - const int dUx = This->dU[0]; - const int dVx = This->dV[0]; - const int dUy = This->dU[1]; - const int dVy = This->dV[1]; - - int Uo = This->Uco + 8*(dUy*y + dUx*x); - int Vo = This->Vco + 8*(dVy*y + dVx*x); - - int i, j; - - uDst += 8; - vDst += 8; - for (j=8; j>0; --j) { - int U = Uo, V = Vo; - Uo += dUy; Vo += dVy; - - for (i=-8; i<0; ++i) { - int Offset; - dword f0, f1, ri, rj; - int u, v; - - u = ( U >> 16 ) << rho; - v = ( V >> 16 ) << rho; - U += dUx; V += dVx; - - if (u > 0 && u <= W) { - ri = MTab[u&15]; - Offset = u>>4; - } else { - ri = 16; - if (u>W) Offset = W>>4; - else Offset = -1; - } - - if (v > 0 && v <= H) { - rj = MTab[v&15]; - Offset += (v>>4)*srcstride; - } else { - rj = 16; - if (v>H) Offset += (H>>4)*srcstride; - else Offset -= srcstride; - } - - f0 = uSrc[Offset + 0]; - f0 |= uSrc[Offset + 1] << 16; - f1 = uSrc[Offset + srcstride + 0]; - f1 |= uSrc[Offset + srcstride + 1] << 16; - f0 = (ri*f0)>>16; - f1 = (ri*f1) & 0x0fff0000; - f0 |= f1; - f0 = (rj*f0 + Rounder) >> 24; - - uDst[i] = (byte)f0; - - f0 = vSrc[Offset + 0]; - f0 |= vSrc[Offset + 1] << 16; - f1 = vSrc[Offset + srcstride + 0]; - f1 |= vSrc[Offset + srcstride + 1] << 16; - f0 = (ri*f0)>>16; - f1 = (ri*f1) & 0x0fff0000; - f0 |= f1; - f0 = (rj*f0 + Rounder) >> 24; - - vDst[i] = (byte)f0; - } - uDst += dststride; - vDst += dststride; - } -} - -//---------------------------- - -static void get_average_mv_C(const NEW_GMC_DATA * const Dsp, VECTOR * const mv, int x, int y, int qpel){ - - int i, j; - int vx = 0, vy = 0; - int uo = Dsp->Uo + 16*(Dsp->dU[1]*y + Dsp->dU[0]*x); - int vo = Dsp->Vo + 16*(Dsp->dV[1]*y + Dsp->dV[0]*x); - for (j=16; j>0; --j) - { - int U, V; - U = uo; uo += Dsp->dU[1]; - V = vo; vo += Dsp->dV[1]; - for (i=16; i>0; --i) - { - int u,v; - u = U >> 16; U += Dsp->dU[0]; vx += u; - v = V >> 16; V += Dsp->dV[0]; vy += v; - } - } - vx -= (256*x+120) << (5+Dsp->accuracy); /* 120 = 15*16/2 */ - vy -= (256*y+120) << (5+Dsp->accuracy); - - mv->x = RSHIFT( vx, 8+Dsp->accuracy - qpel ); - mv->y = RSHIFT( vy, 8+Dsp->accuracy - qpel ); -} - -//---------------------------- -/* ************************************************************ - * simplified version for 1 warp point - */ -static void Predict_1pt_16x16_C(const NEW_GMC_DATA * const This, byte *Dst, const byte *Src, int dststride, int srcstride, int x, int y, int rounding){ - - const int W = This->sW; - const int H = This->sH; - const int rho = 3-This->accuracy; - const int Rounder = ( 128 - (rounding<<(2*rho)) ) << 16; - - - int uo = This->Uo + (x<<8); /* ((16*x)<<4) */ - int vo = This->Vo + (y<<8); - const dword ri = MTab[uo & 15]; - const dword rj = MTab[vo & 15]; - int i, j; - - int Offset; - if ((dword)vo<=(dword)H) Offset = (vo>>4)*srcstride; - else if (vo>H) Offset = ( H>>4)*srcstride; - else Offset =-16*srcstride; - if ((dword)uo<=(dword)W) Offset += (uo>>4); - else if (uo>W) Offset += ( W>>4); - else Offset -= 16; - - Dst += 16; - - for(j=16; j>0; --j, Offset+=srcstride-16) - { - for(i=-16; i<0; ++i, ++Offset) - { - dword f0, f1; - f0 = Src[ Offset +0 ]; - f0 |= Src[ Offset +1 ] << 16; - f1 = Src[ Offset+srcstride +0 ]; - f1 |= Src[ Offset+srcstride +1 ] << 16; - f0 = (ri*f0)>>16; - f1 = (ri*f1) & 0x0fff0000; - f0 |= f1; - f0 = ( rj*f0 + Rounder ) >> 24; - Dst[i] = (byte)f0; - } - Dst += dststride; - } -} - -//---------------------------- - -static void Predict_1pt_8x8_C(const NEW_GMC_DATA * const This, byte *uDst, const byte *uSrc, - byte *vDst, const byte *vSrc, int dststride, int srcstride, int x, int y, int rounding){ - - const int W = This->sW >> 1; - const int H = This->sH >> 1; - const int rho = 3-This->accuracy; - const int Rounder = ( 128 - (rounding<<(2*rho)) ) << 16; - - int uo = This->Uco + (x<<7); - int vo = This->Vco + (y<<7); - const dword rri = MTab[uo & 15]; - const dword rrj = MTab[vo & 15]; - int i, j; - - int Offset; - if ((dword)vo<=(dword)H) Offset = (vo>>4)*srcstride; - else if (vo>H) Offset = ( H>>4)*srcstride; - else Offset =-8*srcstride; - if ((dword)uo<=(dword)W) Offset += (uo>>4); - else if (uo>W) Offset += (W>>4); - else Offset -= 8; - - uDst += 8; - vDst += 8; - for(j=8; j>0; --j, Offset+=srcstride-8) - { - for(i=-8; i<0; ++i, Offset++) - { - dword f0, f1; - f0 = uSrc[ Offset + 0 ]; - f0 |= uSrc[ Offset + 1 ] << 16; - f1 = uSrc[ Offset + srcstride + 0 ]; - f1 |= uSrc[ Offset + srcstride + 1 ] << 16; - f0 = (rri*f0)>>16; - f1 = (rri*f1) & 0x0fff0000; - f0 |= f1; - f0 = ( rrj*f0 + Rounder ) >> 24; - uDst[i] = (byte)f0; - - f0 = vSrc[ Offset + 0 ]; - f0 |= vSrc[ Offset + 1 ] << 16; - f1 = vSrc[ Offset + srcstride + 0 ]; - f1 |= vSrc[ Offset + srcstride + 1 ] << 16; - f0 = (rri*f0)>>16; - f1 = (rri*f1) & 0x0fff0000; - f0 |= f1; - f0 = ( rrj*f0 + Rounder ) >> 24; - vDst[i] = (byte)f0; - } - uDst += dststride; - vDst += dststride; - } -} - -//---------------------------- - -static void get_average_mv_1pt_C(const NEW_GMC_DATA *const Dsp, VECTOR * const mv, int x, int y, int qpel){ - - mv->x = RSHIFT(Dsp->Uo<y = RSHIFT(Dsp->Vo<sW = width << 4; - gmc->sH = height << 4; - gmc->accuracy = accuracy; - gmc->num_wp = nb_pts; - - //reduce the number of points, if possible - if(nb_pts<3 || (pts->duv[2].x==-pts->duv[1].y && pts->duv[2].y==pts->duv[1].x)){ - if(nb_pts<2 || (pts->duv[1].x==0 && pts->duv[1].y==0)){ - if(nb_pts<1 || (pts->duv[0].x==0 && pts->duv[0].y==0)){ - nb_pts = 0; - }else - nb_pts = 1; - }else - nb_pts = 2; - }else - nb_pts = 3; - - //now, nb_pts stores the actual number of points required for interpolation - if(nb_pts<=1){ - if(nb_pts==1){ - /* store as 4b fixed point */ - gmc->Uo = pts->duv[0].x << accuracy; - gmc->Vo = pts->duv[0].y << accuracy; - gmc->Uco = ((pts->duv[0].x>>1) | (pts->duv[0].x&1)) << accuracy; /* DIV2RND() */ - gmc->Vco = ((pts->duv[0].y>>1) | (pts->duv[0].y&1)) << accuracy; /* DIV2RND() */ - }else{ /* zero points?! */ - gmc->Uo = gmc->Vo = 0; - gmc->Uco = gmc->Vco = 0; - } - - gmc->predict_16x16 = Predict_1pt_16x16_C; - gmc->predict_8x8 = Predict_1pt_8x8_C; - gmc->get_average_mv = get_average_mv_1pt_C; - }else{ /* 2 or 3 points */ - const int rho = 3 - accuracy; /* = {3,2,1,0} for Acc={0,1,2,3} */ - int Alpha = log2bin(width-1); - int Ws = 1 << Alpha; - - gmc->dU[0] = 16*Ws + RDIV( 8*Ws*pts->duv[1].x, width ); /* dU/dx */ - gmc->dV[0] = RDIV( 8*Ws*pts->duv[1].y, width ); /* dV/dx */ - - /* disabled, because possibly buggy? */ - -#if 0 - if (nb_pts==2) { - gmc->dU[1] = -gmc->dV[0]; /* -Sin */ - gmc->dV[1] = gmc->dU[0] ; /* Cos */ - } - else -#endif - { - const int Beta = log2bin(height-1); - const int Hs = 1<dU[1] = RDIV( 8*Hs*pts->duv[2].x, height ); /* dU/dy */ - gmc->dV[1] = 16*Hs + RDIV( 8*Hs*pts->duv[2].y, height ); /* dV/dy */ - if (Beta>Alpha) { - gmc->dU[0] <<= (Beta-Alpha); - gmc->dV[0] <<= (Beta-Alpha); - Alpha = Beta; - Ws = Hs; - } - else { - gmc->dU[1] <<= Alpha - Beta; - gmc->dV[1] <<= Alpha - Beta; - } - } - /* upscale to 16b fixed-point */ - gmc->dU[0] <<= (16-Alpha - rho); - gmc->dU[1] <<= (16-Alpha - rho); - gmc->dV[0] <<= (16-Alpha - rho); - gmc->dV[1] <<= (16-Alpha - rho); - - gmc->Uo = ( pts->duv[0].x <<(16+ accuracy)) + (1<<15); - gmc->Vo = ( pts->duv[0].y <<(16+ accuracy)) + (1<<15); - gmc->Uco = ((pts->duv[0].x-1)<<(17+ accuracy)) + (1<<17); - gmc->Vco = ((pts->duv[0].y-1)<<(17+ accuracy)) + (1<<17); - gmc->Uco = (gmc->Uco + gmc->dU[0] + gmc->dU[1])>>2; - gmc->Vco = (gmc->Vco + gmc->dV[0] + gmc->dV[1])>>2; - - gmc->predict_16x16 = Predict_16x16_C; - gmc->predict_8x8 = Predict_8x8_C; - gmc->get_average_mv = get_average_mv_C; - } -} - -//---------------------------- \ No newline at end of file diff --git a/modules/xvid_dec/xvid_wce/gmc.h b/modules/xvid_dec/xvid_wce/gmc.h deleted file mode 100644 index 0cd5fe4..0000000 --- a/modules/xvid_dec/xvid_wce/gmc.h +++ /dev/null @@ -1,45 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - GMC interpolation module header - - * - * Copyright(C) 2002-2003 Pascal Massimino - * - * 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: gmc.h,v 1.1.1.1 2005-07-13 14:36:14 jeanlf Exp $ - * - ****************************************************************************/ - -#include "portab.h" -#include "global.h" - - -#define RDIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) -#define RSHIFT(a,b) ( (a)>0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b)) - -#define MLT(i) (((16-(i))<<16) + (i)) -static const dword MTab[16] = { - MLT( 0), MLT( 1), MLT( 2), MLT( 3), MLT( 4), MLT( 5), MLT( 6), MLT( 7), - MLT( 8), MLT( 9), MLT(10), MLT(11), MLT(12), MLT(13), MLT(14), MLT(15) -}; -#undef MLT - - -/* ************************************************************* - * Warning! It's Accuracy being passed, not 'resolution'! - */ -void generate_GMCparameters(int nb_pts, int accuracy, const WARPPOINTS *pts, int width, int height, NEW_GMC_DATA *gmc); - diff --git a/modules/xvid_dec/xvid_wce/image.cpp b/modules/xvid_dec/xvid_wce/image.cpp deleted file mode 100644 index cabab5b..0000000 --- a/modules/xvid_dec/xvid_wce/image.cpp +++ /dev/null @@ -1,356 +0,0 @@ -/************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Image management functions - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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: image.cpp,v 1.1.1.1 2005-07-13 14:36:14 jeanlf Exp $ - * - ****************************************************************************/ -//#include - -#include "portab.h" -#include "global.h" /* XVID_CSP_XXX's */ -#include "xvid.h" /* XVID_CSP_XXX's */ -#include "image.h" -#include "interpolate8x8.h" -#include "reduced.h" -#include "decoder.h" -#include "mem_align.h" - -#define SAFETY 64 -#define EDGE_SIZE2 (EDGE_SIZE/2) - -//---------------------------- - -int image_create(IMAGE * image, dword edged_width, dword edged_height){ - - const dword edged_width2 = edged_width / 2; - const dword edged_height2 = edged_height / 2; - - image->y = (unsigned char*)xvid_malloc(edged_width * (edged_height + 1) + SAFETY, CACHE_LINE); - if (image->y == NULL) { - return -1; - } - MemSet(image->y, 0, edged_width * (edged_height + 1) + SAFETY); - - image->u = (unsigned char*)xvid_malloc(edged_width2 * edged_height2 + SAFETY, CACHE_LINE); - if (image->u == NULL) { - xvid_free(image->y); - image->y = NULL; - return -1; - } - MemSet(image->u, 0, edged_width2 * edged_height2 + SAFETY); - - image->v = (unsigned char*)xvid_malloc(edged_width2 * edged_height2 + SAFETY, CACHE_LINE); - if (image->v == NULL) { - xvid_free(image->u); - image->u = NULL; - xvid_free(image->y); - image->y = NULL; - return -1; - } - MemSet(image->v, 0, edged_width2 * edged_height2 + SAFETY); - - image->y += EDGE_SIZE * edged_width + EDGE_SIZE; - image->u += EDGE_SIZE2 * edged_width2 + EDGE_SIZE2; - image->v += EDGE_SIZE2 * edged_width2 + EDGE_SIZE2; - - return 0; -} - -//---------------------------- - -void image_destroy(IMAGE * image, dword edged_width, dword edged_height){ - - const dword edged_width2 = edged_width / 2; - - if(image->y){ - xvid_free(image->y - (EDGE_SIZE * edged_width + EDGE_SIZE)); - image->y = NULL; - } - if(image->u){ - xvid_free(image->u - (EDGE_SIZE2 * edged_width2 + EDGE_SIZE2)); - image->u = NULL; - } - if(image->v){ - xvid_free(image->v - (EDGE_SIZE2 * edged_width2 + EDGE_SIZE2)); - image->v = NULL; - } -} - -//---------------------------- - -void IMAGE::Swap(IMAGE *image2){ - ::Swap(y, image2->y); - ::Swap(u, image2->u); - ::Swap(v, image2->v); -} - -//---------------------------- - -#ifdef _ARM_ - -extern"C" -void XVID_MemCpy(void *dst, const void *src, dword count); - -#else - -void XVID_MemCpy(void *dst, const void *src, dword count){ - assert(!(dword(dst)&3)); - assert(!(dword(count)&3)); -#ifdef USE_ARM_ASM - int t0, t1, t2, t3; - asm volatile( - "subs %2, %2, #16\n blt .mc_no16\n\t" - "\n.mc_loop16:\n\t" - //the order of regs in {} is not important, now it's ordered as to avoid compiler warnings - "ldmia %1!, {%6, %3, %5, %4}\n\t" - "stmia %0!, {%6, %3, %5, %4}\n\t" - "subs %2, %2, #16\n bge .mc_loop16\n\t" - "\n.mc_no16:\n\t" - "adds %2, %2, #16\n\t" - "beq .mc_end\n\t" - "\n.mc_loop4:\n\t" - "ldr %3, [%1], #4\n\t" - "str %3, [%0], #4\n\t" - "subs %2, %2, #4\n bne .mc_loop4\n\t" - "\n.mc_end:\n\t" - : "+r"(dst), "+r"(src), "+r"(count), "&=r"(t0), "&=r"(t1), "&=r"(t2), "&=r"(t3) - : - ); -#else - MemCpy(dst, src, count); -#endif -} - -#endif - -//--------------------------- - -void IMAGE::Copy(const IMAGE * image2, dword edged_width, dword height){ - XVID_MemCpy(y, image2->y, edged_width * height); - XVID_MemCpy(u, image2->u, edged_width * height / 4); - XVID_MemCpy(v, image2->v, edged_width * height / 4); -} - -//---------------------------- - -inline void XVID_Set16bytes(void *dst, dword val){ - assert(!(dword(dst)&3)); - val |= val<<8; - val |= val<<16; - ((dword*)dst)[0] = val; - ((dword*)dst)[1] = val; - ((dword*)dst)[2] = val; - ((dword*)dst)[3] = val; -} - -//--------------------------- - -inline void XVID_Set8bytes(void *dst, dword val){ - assert(!(dword(dst)&3)); - val |= val<<8; - val |= val<<16; - ((dword*)dst)[0] = val; - ((dword*)dst)[1] = val; -} - -//-------------------------- - -void S_decoder::SetEdges(IMAGE &img) const{ - - const dword edged_width2 = edged_width / 2; - - assert(EDGE_SIZE==16); - - byte *dst = img.y - (EDGE_SIZE + EDGE_SIZE * edged_width); - const byte *src = img.y; - - //according to the Standard Clause 7.6.4, padding is done starting at 16 - // * pixel width and height multiples - dword width = (S_decoder::width+15)&~15; - dword height = (S_decoder::height+15)&~15; - dword width2 = width/2; - - dword i; - for(i = 0; i < EDGE_SIZE; i++){ - XVID_Set16bytes(dst, *src); - XVID_MemCpy(dst + EDGE_SIZE, src, width); - XVID_Set16bytes(dst + edged_width - EDGE_SIZE, *(src + width - 1)); - dst += edged_width; - } - for(i = 0; i < height; i++){ - XVID_Set16bytes(dst, *src); - XVID_Set16bytes(dst + edged_width - EDGE_SIZE, src[width - 1]); - dst += edged_width; - src += edged_width; - } - - src -= edged_width; - for(i = 0; i < EDGE_SIZE; i++){ - XVID_Set16bytes(dst, *src); - XVID_MemCpy(dst + EDGE_SIZE, src, width); - XVID_Set16bytes(dst + edged_width - EDGE_SIZE, *(src + width - 1)); - dst += edged_width; - } - - //U - dst = img.u - (EDGE_SIZE2 + EDGE_SIZE2 * edged_width2); - src = img.u; - - for (i = 0; i < EDGE_SIZE2; i++) { - XVID_Set8bytes(dst, *src); - XVID_MemCpy(dst + EDGE_SIZE2, src, width2); - XVID_Set8bytes(dst + edged_width2 - EDGE_SIZE2, *(src + width2 - 1)); - dst += edged_width2; - } - - for (i = 0; i < height / 2; i++) { - XVID_Set8bytes(dst, *src); - XVID_Set8bytes(dst + edged_width2 - EDGE_SIZE2, src[width2 - 1]); - dst += edged_width2; - src += edged_width2; - } - src -= edged_width2; - for (i = 0; i < EDGE_SIZE2; i++) { - XVID_Set8bytes(dst, *src); - XVID_MemCpy(dst + EDGE_SIZE2, src, width2); - XVID_Set8bytes(dst + edged_width2 - EDGE_SIZE2, *(src + width2 - 1)); - dst += edged_width2; - } - - //V - dst = img.v - (EDGE_SIZE2 + EDGE_SIZE2 * edged_width2); - src = img.v; - - for(i = 0; i < EDGE_SIZE2; i++){ - XVID_Set8bytes(dst, *src); - XVID_MemCpy(dst + EDGE_SIZE2, src, width2); - XVID_Set8bytes(dst + edged_width2 - EDGE_SIZE2, *(src + width2 - 1)); - dst += edged_width2; - } - - for(i = 0; i < height / 2; i++){ - XVID_Set8bytes(dst, *src); - XVID_Set8bytes(dst + edged_width2 - EDGE_SIZE2, src[width2 - 1]); - dst += edged_width2; - src += edged_width2; - } - src -= edged_width2; - for(i = 0; i < EDGE_SIZE2; i++){ - XVID_Set8bytes(dst, *src); - XVID_MemCpy(dst + EDGE_SIZE2, src, width2); - XVID_Set8bytes(dst + edged_width2 - EDGE_SIZE2, *(src + width2 - 1)); - dst += edged_width2; - } -} - -//---------------------------- - -void IMAGE::Clear(int width, int height, int edged_width, int y, int u, int v){ - - byte * p; - int i; - - p = IMAGE::y; - for(i = 0; i < height; i++){ - MemSet(p, y, width); - p += edged_width; - } - - p = IMAGE::u; - for(i = 0; i < height/2; i++){ - MemSet(p, u, width/2); - p += edged_width/2; - } - - p = IMAGE::v; - for(i = 0; i < height/2; i++){ - MemSet(p, v, width/2); - p += edged_width/2; - } -} - -//---------------------------- -/* reduced resolution deblocking filter - block = block size (16=rrv, 8=full resolution) - flags = XVID_DEC_YDEBLOCK|XVID_DEC_UVDEBLOCK -*/ -void IMAGE::deblock_rrv(int edged_width, const MACROBLOCK * mbs, int mb_width, int mb_height, int mb_stride, int block, int flags){ - - const int edged_width2 = edged_width /2; - const int nblocks = block / 8; //skals code uses 8pixel block uints - int i,j; - - for (j = 1; j < mb_height*2; j++) //horizontal deblocking - for (i = 0; i < mb_width*2; i++) - { - if(mbs[(j-1)/2*mb_stride + (i/2)].mode != MODE_NOT_CODED || - mbs[(j+0)/2*mb_stride + (i/2)].mode != MODE_NOT_CODED) - { - hfilter_31(IMAGE::y + (j*block - 1)*edged_width + i*block, - IMAGE::y + (j*block + 0)*edged_width + i*block, nblocks); - } - } - - for (j = 0; j < mb_height*2; j++) // vertical deblocking - for (i = 1; i < mb_width*2; i++) - { - if (mbs[(j/2)*mb_stride + (i-1)/2].mode != MODE_NOT_CODED || - mbs[(j/2)*mb_stride + (i+0)/2].mode != MODE_NOT_CODED) - { - vfilter_31(IMAGE::y + (j*block)*edged_width + i*block - 1, - IMAGE::y + (j*block)*edged_width + i*block + 0, - edged_width, nblocks); - } - } - - - //chroma - - for (j = 1; j < mb_height; j++) //orizontal deblocking - for (i = 0; i < mb_width; i++) - { - if (mbs[(j-1)*mb_stride + i].mode != MODE_NOT_CODED || - mbs[(j+0)*mb_stride + i].mode != MODE_NOT_CODED) - { - hfilter_31(IMAGE::u + (j*block - 1)*edged_width2 + i*block, - IMAGE::u + (j*block + 0)*edged_width2 + i*block, nblocks); - hfilter_31(IMAGE::v + (j*block - 1)*edged_width2 + i*block, - IMAGE::v + (j*block + 0)*edged_width2 + i*block, nblocks); - } - } - - for (j = 0; j < mb_height; j++) //ertical deblocking - for (i = 1; i < mb_width; i++) - { - if (mbs[j*mb_stride + i - 1].mode != MODE_NOT_CODED || - mbs[j*mb_stride + i + 0].mode != MODE_NOT_CODED) - { - vfilter_31(IMAGE::u + (j*block)*edged_width2 + i*block - 1, - IMAGE::u + (j*block)*edged_width2 + i*block + 0, - edged_width2, nblocks); - vfilter_31(IMAGE::v + (j*block)*edged_width2 + i*block - 1, - IMAGE::v + (j*block)*edged_width2 + i*block + 0, - edged_width2, nblocks); - } - } -} - -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/image.h b/modules/xvid_dec/xvid_wce/image.h deleted file mode 100644 index 7224724..0000000 --- a/modules/xvid_dec/xvid_wce/image.h +++ /dev/null @@ -1,37 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Image related header - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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: image.h,v 1.1.1.1 2005-07-13 14:36:14 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _IMAGE_H_ -#define _IMAGE_H_ - -#include "portab.h" -#include "global.h" -#include "xvid.h" - -int image_create(IMAGE * image, dword edged_width, dword edged_height); -void image_destroy(IMAGE * image, dword edged_width, dword edged_height); - - -#endif /* _IMAGE_H_ */ diff --git a/modules/xvid_dec/xvid_wce/interpolate8x8.cpp b/modules/xvid_dec/xvid_wce/interpolate8x8.cpp deleted file mode 100644 index 93c8140..0000000 --- a/modules/xvid_dec/xvid_wce/interpolate8x8.cpp +++ /dev/null @@ -1,872 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - 8x8 block-based halfpel interpolation - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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: interpolate8x8.cpp,v 1.1.1.1 2005-07-13 14:36:15 jeanlf Exp $ - * - ****************************************************************************/ - -#include "portab.h" -#include "global.h" -#include "interpolate8x8.h" - -//---------------------------- - -void interpolate8x8_switch(byte *cur, const byte *refn, dword x, dword y, int dx, int dy, dword stride, bool rounding){ - - const byte *src = refn + ((y + (dy>>1)) * stride + x + (dx>>1)); - byte *dst = cur + (y * stride + x); - - switch(((dx & 1) << 1) + (dy & 1)){ - case 0: - transfer8x8_copy(dst, src, stride); - break; - case 1: - interpolate8x8_halfpel_v(dst, src, stride, rounding); - break; - case 2: - interpolate8x8_halfpel_h(dst, src, stride, rounding); - break; - default: - interpolate8x8_halfpel_hv(dst, src, stride, rounding); - break; - } -} - -//---------------------------- - -void interpolate8x8_quarterpel(byte *cur, byte *refn, byte *refh, byte *refv, byte *refhv, dword x, dword y, int dx, int dy, dword stride, bool rounding){ - - const int xRef = x*4 + dx; - const int yRef = y*4 + dy; - - byte *src, *dst; - byte *halfpel_h, *halfpel_v, *halfpel_hv; - int x_int, y_int, x_frac, y_frac; - - x_int = xRef/4; - if(xRef < 0 && xRef % 4) - x_int--; - - x_frac = xRef - (4*x_int); - - y_int = yRef/4; - if (yRef < 0 && yRef % 4) - y_int--; - - y_frac = yRef - (4*y_int); - - src = refn + y_int * stride + x_int; - halfpel_h = refh; - halfpel_v = refv; - halfpel_hv = refhv; - - dst = cur + y * stride + x; - - switch((y_frac << 2) | (x_frac)) { - - case 0: - transfer8x8_copy(dst, src, stride); - break; - - case 1: - interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(dst, src, halfpel_h, stride, rounding, 8); - break; - - case 2: - interpolate8x8_lowpass_h(dst, src, stride, rounding); - break; - - case 3: - interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(dst, src + 1, halfpel_h, stride, rounding, 8); - break; - - case 4: - interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding); - interpolate8x8_avg2(dst, src, halfpel_v, stride, rounding, 8); - break; - - case 5: - interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding, 9); - interpolate8x8_lowpass_v(halfpel_hv, halfpel_v, stride, rounding); - interpolate8x8_avg2(dst, halfpel_v, halfpel_hv, stride, rounding, 8); - break; - - case 6: - interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding); - interpolate8x8_avg2(dst, halfpel_h, halfpel_hv, stride, rounding, 8); - break; - - case 7: - interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src + 1, halfpel_h, stride, rounding, 9); - interpolate8x8_lowpass_v(halfpel_hv, halfpel_v, stride, rounding); - interpolate8x8_avg2(dst, halfpel_v, halfpel_hv, stride, rounding, 8); - break; - - case 8: - interpolate8x8_lowpass_v(dst, src, stride, rounding); - break; - - case 9: - interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding, 9); - interpolate8x8_lowpass_v(dst, halfpel_v, stride, rounding); - break; - - case 10: - interpolate8x8_lowpass_hv(dst, halfpel_h, src, stride, rounding); - break; - - case 11: - interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src + 1, halfpel_h, stride, rounding, 9); - interpolate8x8_lowpass_v(dst, halfpel_v, stride, rounding); - break; - - case 12: - interpolate8x8_lowpass_v(halfpel_v, src, stride, rounding); - interpolate8x8_avg2(dst, src+stride, halfpel_v, stride, rounding, 8); - break; - - case 13: - interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding, 9); - interpolate8x8_lowpass_v(halfpel_hv, halfpel_v, stride, rounding); - interpolate8x8_avg2(dst, halfpel_v+stride, halfpel_hv, stride, rounding, 8); - break; - - case 14: - interpolate8x8_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding); - interpolate8x8_avg2(dst, halfpel_h+stride, halfpel_hv, stride, rounding, 8); - break; - - case 15: - interpolate8x8_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src + 1, halfpel_h, stride, rounding, 9); - interpolate8x8_lowpass_v(halfpel_hv, halfpel_v, stride, rounding); - interpolate8x8_avg2(dst, halfpel_hv, halfpel_v + stride, stride, rounding, 8); - break; - } -} - -//---------------------------- - -void interpolate16x16_quarterpel(byte *cur, byte *refn, byte *refh, byte *refv, byte *refhv, dword x, dword y, int dx, int dy, dword stride, bool rounding){ - - const int xRef = x*4 + dx; - const int yRef = y*4 + dy; - - byte *src, *dst; - byte *halfpel_h, *halfpel_v, *halfpel_hv; - int x_int, y_int, x_frac, y_frac; - - x_int = xRef/4; - if (xRef < 0 && xRef % 4) - x_int--; - - x_frac = xRef - (4*x_int); - - y_int = yRef/4; - if (yRef < 0 && yRef % 4) - y_int--; - - y_frac = yRef - (4*y_int); - - src = refn + y_int * stride + x_int; - halfpel_h = refh; - halfpel_v = refv; - halfpel_hv = refhv; - - dst = cur + y * stride + x; - - switch((y_frac << 2) | (x_frac)){ - case 0: - transfer16x16_copy(dst, src, stride); - break; - - case 1: - interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(dst, src, halfpel_h, stride, rounding, 8); - interpolate8x8_avg2(dst+8, src+8, halfpel_h+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, src+8*stride, halfpel_h+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, src+8*stride+8, halfpel_h+8*stride+8, stride, rounding, 8); - break; - - case 2: - interpolate16x16_lowpass_h(dst, src, stride, rounding); - break; - - case 3: - interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(dst, src + 1, halfpel_h, stride, rounding, 8); - interpolate8x8_avg2(dst+8, src + 8 + 1, halfpel_h+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, src + 8*stride + 1, halfpel_h+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, src+8*stride+8 + 1, halfpel_h+8*stride+8, stride, rounding, 8); - break; - - case 4: - interpolate16x16_lowpass_v(halfpel_v, src, stride, rounding); - interpolate8x8_avg2(dst, src, halfpel_v, stride, rounding, 8); - interpolate8x8_avg2(dst+8, src+8, halfpel_v+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, src+8*stride, halfpel_v+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, src+8*stride+8, halfpel_v+8*stride+8, stride, rounding, 8); - break; - - case 5: - interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8, src + 8, halfpel_h+8, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride, src + 8*stride, halfpel_h+8*stride, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride+8, src+8*stride+8, halfpel_h+8*stride+8, stride, rounding, 9); - - interpolate16x16_lowpass_v(halfpel_hv, halfpel_v, stride, rounding); - interpolate8x8_avg2(dst, halfpel_hv, halfpel_v, stride, rounding, 8); - interpolate8x8_avg2(dst+8, halfpel_hv+8, halfpel_v+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, halfpel_hv+8*stride, halfpel_v+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, halfpel_hv+8*stride+8, halfpel_v+8*stride+8, stride, rounding, 8); - break; - - case 6: - interpolate16x16_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding); - interpolate8x8_avg2(dst, halfpel_h, halfpel_hv, stride, rounding, 8); - interpolate8x8_avg2(dst+8, halfpel_h+8, halfpel_hv+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, halfpel_h+8*stride, halfpel_hv+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, halfpel_h+8*stride+8, halfpel_hv+8*stride+8, stride, rounding, 8); - break; - - case 7: - interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src+1, halfpel_h, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8, src+1 + 8, halfpel_h+8, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride, src+1 + 8*stride, halfpel_h+8*stride, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride+8, src+1+8*stride+8, halfpel_h+8*stride+8, stride, rounding, 9); - - interpolate16x16_lowpass_v(halfpel_hv, halfpel_v, stride, rounding); - interpolate8x8_avg2(dst, halfpel_hv, halfpel_v, stride, rounding, 8); - interpolate8x8_avg2(dst+8, halfpel_hv+8, halfpel_v+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, halfpel_hv+8*stride, halfpel_v+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, halfpel_hv+8*stride+8, halfpel_v+8*stride+8, stride, rounding, 8); - break; - - case 8: - interpolate16x16_lowpass_v(dst, src, stride, rounding); - break; - - case 9: - interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8, src + 8, halfpel_h+8, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride, src + 8*stride, halfpel_h+8*stride, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride+8, src+8*stride+8, halfpel_h+8*stride+8, stride, rounding, 9); - interpolate16x16_lowpass_v(dst, halfpel_v, stride, rounding); - break; - - case 10: - interpolate16x16_lowpass_hv(dst, halfpel_h, src, stride, rounding); - break; - - case 11: - interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src+1, halfpel_h, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8, src+1 + 8, halfpel_h+8, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride, src+1 + 8*stride, halfpel_h+8*stride, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride+8, src+1+8*stride+8, halfpel_h+8*stride+8, stride, rounding, 9); - interpolate16x16_lowpass_v(dst, halfpel_v, stride, rounding); - break; - - case 12: - interpolate16x16_lowpass_v(halfpel_v, src, stride, rounding); - interpolate8x8_avg2(dst, src+stride, halfpel_v, stride, rounding, 8); - interpolate8x8_avg2(dst+8, src+stride+8, halfpel_v+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, src+stride+8*stride, halfpel_v+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, src+stride+8*stride+8, halfpel_v+8*stride+8, stride, rounding, 8); - break; - - case 13: - interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src, halfpel_h, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8, src + 8, halfpel_h+8, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride, src + 8*stride, halfpel_h+8*stride, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride+8, src+8*stride+8, halfpel_h+8*stride+8, stride, rounding, 9); - - interpolate16x16_lowpass_v(halfpel_hv, halfpel_v, stride, rounding); - interpolate8x8_avg2(dst, halfpel_hv, halfpel_v+stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8, halfpel_hv+8, halfpel_v+stride+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, halfpel_hv+8*stride, halfpel_v+stride+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, halfpel_hv+8*stride+8, halfpel_v+stride+8*stride+8, stride, rounding, 8); - break; - - case 14: - interpolate16x16_lowpass_hv(halfpel_hv, halfpel_h, src, stride, rounding); - interpolate8x8_avg2(dst, halfpel_h+stride, halfpel_hv, stride, rounding, 8); - interpolate8x8_avg2(dst+8, halfpel_h+stride+8, halfpel_hv+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, halfpel_h+stride+8*stride, halfpel_hv+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, halfpel_h+stride+8*stride+8, halfpel_hv+8*stride+8, stride, rounding, 8); - break; - - case 15: - interpolate16x16_lowpass_h(halfpel_h, src, stride, rounding); - interpolate8x8_avg2(halfpel_v, src+1, halfpel_h, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8, src+1 + 8, halfpel_h+8, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride, src+1 + 8*stride, halfpel_h+8*stride, stride, rounding, 9); - interpolate8x8_avg2(halfpel_v+8*stride+8, src+1+8*stride+8, halfpel_h+8*stride+8, stride, rounding, 9); - - interpolate16x16_lowpass_v(halfpel_hv, halfpel_v, stride, rounding); - interpolate8x8_avg2(dst, halfpel_hv, halfpel_v+stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8, halfpel_hv+8, halfpel_v+stride+8, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride, halfpel_hv+8*stride, halfpel_v+stride+8*stride, stride, rounding, 8); - interpolate8x8_avg2(dst+8*stride+8, halfpel_hv+8*stride+8, halfpel_v+stride+8*stride+8, stride, rounding, 8); - break; - } -} - -//---------------------------- - -void interpolate8x8_avg2(byte *dst, const byte *src1, const byte *src2, dword stride, bool rounding, dword height){ - - const int round = 1 - rounding; - for(dword i = 0; i < height; i++){ - dst[0] = (src1[0] + src2[0] + round) >> 1; - dst[1] = (src1[1] + src2[1] + round) >> 1; - dst[2] = (src1[2] + src2[2] + round) >> 1; - dst[3] = (src1[3] + src2[3] + round) >> 1; - dst[4] = (src1[4] + src2[4] + round) >> 1; - dst[5] = (src1[5] + src2[5] + round) >> 1; - dst[6] = (src1[6] + src2[6] + round) >> 1; - dst[7] = (src1[7] + src2[7] + round) >> 1; - - dst += stride; - src1 += stride; - src2 += stride; - } -} - -//---------------------------- - -#ifndef _ARM_ - -void interpolate8x8_halfpel_h(byte *dst, const byte *src, dword stride, bool rounding){ - -#if defined USE_ARM_ASM && 1 - int y, tmp, tmp1, tmp2, tmp3; - if(rounding){ - asm volatile( - "mov %7, #8\n\t" - "\n.ihh_loop:\n\t" - "ldrb %2, [%1, #8]\n\t" - //7+8 - "ldrb %3, [%1, #7]\n\t" - "add %4, %2, %3\n\t" - "mov %4, %4, asr #1\n\t" - //6+7 - "ldrb %2, [%1, #6]\n\t" - "add %5, %2, %3\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - //5+6 - "ldrb %3, [%1, #5]\n\t" - "add %5, %2, %3\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - //4+5 - "ldrb %2, [%1, #4]\n\t" - "add %5, %2, %3\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - - "str %4, [%0, #4]\n\t" - - //3+4 - "ldrb %3, [%1, #3]\n\t" - "add %4, %2, %3\n\t" - "mov %4, %4, asr #1\n\t" - //2+3 - "ldrb %2, [%1, #2]\n\t" - "add %5, %2, %3\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - //1+2 - "ldrb %3, [%1, #1]\n\t" - "add %5, %2, %3\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - //0+1 - "ldrb %2, [%1, #0]\n\t" - "add %5, %2, %3\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - - "str %4, [%0, #0]\n\t" - - "add %0, %0, %6\n add %1, %1, %6\n\t" - "subs %7, %7, #1\n bne .ihh_loop\n\t" - : "+r"(dst), "+r"(src), "&=r"(tmp), "&=r"(tmp1), "&=r"(tmp2), "&=r"(tmp3) - : "r"(stride), "%r"(y) - ); - }else{ - asm volatile( - "mov %7, #8\n\t" - "\n.ihh_loop1:\n\t" - "ldrb %2, [%1, #8]\n\t" - //7+8 - "ldrb %3, [%1, #7]\n\t" - "add %4, %2, %3\n\t" - "add %4, %4, #1\n\t" - "mov %4, %4, asr #1\n\t" - //6+7 - "ldrb %2, [%1, #6]\n\t" - "add %5, %2, %3\n\t" - "add %5, %5, #1\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - //5+6 - "ldrb %3, [%1, #5]\n\t" - "add %5, %2, %3\n\t" - "add %5, %5, #1\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - //4+5 - "ldrb %2, [%1, #4]\n\t" - "add %5, %2, %3\n\t" - "add %5, %5, #1\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - - "str %4, [%0, #4]\n\t" - - //3+4 - "ldrb %3, [%1, #3]\n\t" - "add %4, %2, %3\n\t" - "add %4, %4, #1\n\t" - "mov %4, %4, asr #1\n\t" - //2+3 - "ldrb %2, [%1, #2]\n\t" - "add %5, %2, %3\n\t" - "add %5, %5, #1\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - //1+2 - "ldrb %3, [%1, #1]\n\t" - "add %5, %2, %3\n\t" - "add %5, %5, #1\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - //0+1 - "ldrb %2, [%1, #0]\n\t" - "add %5, %2, %3\n\t" - "add %5, %5, #1\n\t" - "mov %5, %5, asr #1\n\t" - "orr %4, %5, %4, asl #8\n\t" - - "str %4, [%0, #0]\n\t" - - "add %0, %0, %6\n add %1, %1, %6\n\t" - "subs %7, %7, #1\n bne .ihh_loop1\n\t" - : "+r"(dst), "+r"(src), "&=r"(tmp), "&=r"(tmp1), "&=r"(tmp2), "&=r"(tmp3) - : "r"(stride), "%r"(y) - ); - } -#else - if(rounding){ - for(dword j = 0; j < 8*stride; j+=stride){ - dst[j + 0] = byte((src[j + 0] + src[j + 1] )>>1); - dst[j + 1] = byte((src[j + 1] + src[j + 2] )>>1); - dst[j + 2] = byte((src[j + 2] + src[j + 3] )>>1); - dst[j + 3] = byte((src[j + 3] + src[j + 4] )>>1); - dst[j + 4] = byte((src[j + 4] + src[j + 5] )>>1); - dst[j + 5] = byte((src[j + 5] + src[j + 6] )>>1); - dst[j + 6] = byte((src[j + 6] + src[j + 7] )>>1); - dst[j + 7] = byte((src[j + 7] + src[j + 8] )>>1); - } - }else{ - for(dword j = 0; j < 8*stride; j+=stride){ - //forward or backwards? Who knows ... - dst[j + 0] = byte((src[j + 0] + src[j + 1] + 1)>>1); - dst[j + 1] = byte((src[j + 1] + src[j + 2] + 1)>>1); - dst[j + 2] = byte((src[j + 2] + src[j + 3] + 1)>>1); - dst[j + 3] = byte((src[j + 3] + src[j + 4] + 1)>>1); - dst[j + 4] = byte((src[j + 4] + src[j + 5] + 1)>>1); - dst[j + 5] = byte((src[j + 5] + src[j + 6] + 1)>>1); - dst[j + 6] = byte((src[j + 6] + src[j + 7] + 1)>>1); - dst[j + 7] = byte((src[j + 7] + src[j + 8] + 1)>>1); - } - } -#endif -} - -#endif - -//---------------------------- - -#ifndef _ARM_ - -void interpolate8x8_halfpel_v(byte *dst, const byte *src, dword stride, bool rounding){ - -#if defined USE_ARM_ASM && 1 - int y, tmp, tmp1, tmp2, tmp3, tmp4; - if(rounding){ - asm volatile( - "mov %7, #8\n\t" - "\n.ihv_loop:\n\t" - "add %5, %1, %6\n\t" - //3 - "ldrb %2, [%1, #3]\n ldrb %3, [%5, #3]\n\t" - "add %4, %2, %3\n mov %4, %4, asr #1\n\t" - //2 - "ldrb %2, [%1, #2]\n ldrb %3, [%5, #2]\n\t" - "add %2, %2, %3\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - //1 - "ldrb %2, [%1, #1]\n ldrb %3, [%5, #1]\n\t" - "add %2, %2, %3\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - //0 - "ldrb %2, [%1, #0]\n ldrb %3, [%5, #0]\n\t" - "add %2, %2, %3\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - - "str %4, [%0, #0]\n\t" - - //7 - "ldrb %2, [%1, #7]\n ldrb %3, [%5, #7]\n\t" - "add %4, %2, %3\n mov %4, %4, asr #1\n\t" - //6 - "ldrb %2, [%1, #6]\n ldrb %3, [%5, #6]\n\t" - "add %2, %2, %3\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - //5 - "ldrb %2, [%1, #5]\n ldrb %3, [%5, #5]\n\t" - "add %2, %2, %3\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - //4 - "ldrb %2, [%1, #4]\n ldrb %3, [%5, #4]\n\t" - "add %2, %2, %3\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - - "str %4, [%0, #4]\n\t" - - "add %0, %0, %6\n add %1, %1, %6\n\t" - "subs %7, %7, #1\n bne .ihv_loop\n\t" - : "+r"(dst), "+r"(src), "&=r"(tmp), "&=r"(tmp1), "&=r"(tmp2), "&=r"(tmp3) - : "r"(stride), "%r"(y) - ); - }else{ - asm volatile( - "mov %7, #8\n\t" - "\n.ihv_loop1:\n\t" - "add %5, %1, %6\n\t" - //3 - "ldrb %2, [%1, #3]\n ldrb %3, [%5, #3]\n\t" - "add %4, %2, %3\n add %4, %4, #1\n mov %4, %4, asr #1\n\t" - //2 - "ldrb %2, [%1, #2]\n ldrb %3, [%5, #2]\n\t" - "add %2, %2, %3\n add %2, %2, #1\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - //1 - "ldrb %2, [%1, #1]\n ldrb %3, [%5, #1]\n\t" - "add %2, %2, %3\n add %2, %2, #1\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - //0 - "ldrb %2, [%1, #0]\n ldrb %3, [%5, #0]\n\t" - "add %2, %2, %3\n add %2, %2, #1\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - - "str %4, [%0, #0]\n\t" - - //7 - "ldrb %2, [%1, #7]\n ldrb %3, [%5, #7]\n\t" - "add %4, %2, %3\n add %4, %4, #1\n mov %4, %4, asr #1\n\t" - //6 - "ldrb %2, [%1, #6]\n ldrb %3, [%5, #6]\n\t" - "add %2, %2, %3\n add %2, %2, #1\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - //5 - "ldrb %2, [%1, #5]\n ldrb %3, [%5, #5]\n\t" - "add %2, %2, %3\n add %2, %2, #1\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - //4 - "ldrb %2, [%1, #4]\n ldrb %3, [%5, #4]\n\t" - "add %2, %2, %3\n add %2, %2, #1\n mov %2, %2, asr #1\n\t" - "orr %4, %2, %4, asl #8\n\t" - - "str %4, [%0, #4]\n\t" - - "add %0, %0, %6\n add %1, %1, %6\n\t" - "subs %7, %7, #1\n bne .ihv_loop1\n\t" - : "+r"(dst), "+r"(src), "&=r"(tmp), "&=r"(tmp1), "&=r"(tmp2), "&=r"(tmp3) - : "r"(stride), "%r"(y) - ); - } -#else - if(rounding){ - for(dword j = 0; j < 8*stride; j+=stride){ /* forward is better. Some automatic prefetch perhaps. */ - dst[j + 0] = byte((src[j + 0] + src[j + stride + 0] )>>1); - dst[j + 1] = byte((src[j + 1] + src[j + stride + 1] )>>1); - dst[j + 2] = byte((src[j + 2] + src[j + stride + 2] )>>1); - dst[j + 3] = byte((src[j + 3] + src[j + stride + 3] )>>1); - dst[j + 4] = byte((src[j + 4] + src[j + stride + 4] )>>1); - dst[j + 5] = byte((src[j + 5] + src[j + stride + 5] )>>1); - dst[j + 6] = byte((src[j + 6] + src[j + stride + 6] )>>1); - dst[j + 7] = byte((src[j + 7] + src[j + stride + 7] )>>1); - } - }else{ - for(dword j = 0; j < 8*stride; j+=stride){ - dst[j + 0] = byte((src[j + 0] + src[j + stride + 0] + 1)>>1); - dst[j + 1] = byte((src[j + 1] + src[j + stride + 1] + 1)>>1); - dst[j + 2] = byte((src[j + 2] + src[j + stride + 2] + 1)>>1); - dst[j + 3] = byte((src[j + 3] + src[j + stride + 3] + 1)>>1); - dst[j + 4] = byte((src[j + 4] + src[j + stride + 4] + 1)>>1); - dst[j + 5] = byte((src[j + 5] + src[j + stride + 5] + 1)>>1); - dst[j + 6] = byte((src[j + 6] + src[j + stride + 6] + 1)>>1); - dst[j + 7] = byte((src[j + 7] + src[j + stride + 7] + 1)>>1); - } - } -#endif -} -#endif - -//---------------------------- - -#ifndef _ARM_ //PPC - -#ifndef USE_ARM_ASM //implemented in asm for ARM - -void interpolate8x8_halfpel_hv(byte *dst, const byte *src, dword stride, bool rounding){ - - if(rounding){ - for(dword j = 0; j < 8*stride; j+=stride){ - dst[j + 0] = (byte)((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +1)>>2); - dst[j + 1] = (byte)((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +1)>>2); - dst[j + 2] = (byte)((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +1)>>2); - dst[j + 3] = (byte)((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +1)>>2); - dst[j + 4] = (byte)((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +1)>>2); - dst[j + 5] = (byte)((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +1)>>2); - dst[j + 6] = (byte)((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +1)>>2); - dst[j + 7] = (byte)((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +1)>>2); - } - }else{ - for(dword j = 0; j < 8*stride; j+=stride){ - dst[j + 0] = (byte)((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +2)>>2); - dst[j + 1] = (byte)((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +2)>>2); - dst[j + 2] = (byte)((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +2)>>2); - dst[j + 3] = (byte)((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +2)>>2); - dst[j + 4] = (byte)((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +2)>>2); - dst[j + 5] = (byte)((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +2)>>2); - dst[j + 6] = (byte)((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +2)>>2); - dst[j + 7] = (byte)((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +2)>>2); - } - } -} -#endif -#endif - -//---------------------------- - -void interpolate16x16_lowpass_h(byte *dst, byte *src, int stride, int rounding){ - - int round_add = 16 - rounding; - for(int i = 0; i < 17; i++){ - - dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255); - dst[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255); - dst[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255); - - dst[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255); - dst[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255); - dst[5] = CLIP(((20 * (src[5] + src[6]) - 3 * (((src[4] + src[7])<<1) - (src[3] + src[8])) - (src[2] + src[9]) + round_add) >> 5), 0, 255); - dst[6] = CLIP(((20 * (src[6] + src[7]) - 3 * (((src[5] + src[8])<<1) - (src[4] + src[9])) - (src[3] + src[10]) + round_add) >> 5), 0, 255); - dst[7] = CLIP(((20 * (src[7] + src[8]) - 3 * (((src[6] + src[9])<<1) - (src[5] + src[10])) - (src[4] + src[11]) + round_add) >> 5), 0, 255); - dst[8] = CLIP(((20 * (src[8] + src[9]) - 3 * (((src[7] + src[10])<<1) - (src[6] + src[11])) - (src[5] + src[12]) + round_add) >> 5), 0, 255); - dst[9] = CLIP(((20 * (src[9] + src[10]) - 3 * (((src[8] + src[11])<<1) - (src[7] + src[12])) - (src[6] + src[13]) + round_add) >> 5), 0, 255); - dst[10] = CLIP(((20 * (src[10] + src[11]) - 3 * (((src[9] + src[12])<<1) - (src[8] + src[13])) - (src[7] + src[14]) + round_add) >> 5), 0, 255); - dst[11] = CLIP(((20 * (src[11] + src[12]) - 3 * (((src[10] + src[13])<<1) - (src[9] + src[14])) - (src[8] + src[15]) + round_add) >> 5), 0, 255); - dst[12] = CLIP(((20 * (src[12] + src[13]) - 3 * (((src[11] + src[14])<<1) - (src[10] + src[15])) - (src[9] + src[16]) + round_add) >> 5), 0, 255); - - dst[13] = CLIP(((20 * (src[13] + src[14]) + (src[16]<<1) + 3 * (src[11] - ((src[12] + src[15]) << 1)) - src[10] + round_add) >> 5), 0, 255); - dst[14] = CLIP(((19 * src[15] + 20 * src[14] + 3 * (src[12] - src[16] - (src[13] << 1)) - src[11] + round_add) >> 5), 0, 255); - dst[15] = CLIP(((23 * src[15] + 7 * ((src[16]<<1) - src[14]) + 3 * src[13] - src[12] + round_add) >> 5), 0, 255); - - dst += stride; - src += stride; - } -} - -//---------------------------- - -void interpolate8x8_lowpass_h(byte *dst, byte *src, int stride, int rounding){ - - int round_add = 16 - rounding; - for(int i = 0; i < 9; i++){ - - dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255); - dst[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255); - dst[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255); - dst[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255); - dst[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255); - dst[5] = CLIP(((20 * (src[5] + src[6]) + (src[8]<<1) + 3 * (src[3] - ((src[4] + src[7]) << 1)) - src[2] + round_add) >> 5), 0, 255); - dst[6] = CLIP(((19 * src[7] + 20 * src[6] + 3 * (src[4] - src[8] - (src[5] << 1)) - src[3] + round_add) >> 5), 0, 255); - dst[7] = CLIP(((23 * src[7] + 7 * ((src[8]<<1) - src[6]) + 3 * src[5] - src[4] + round_add) >> 5), 0, 255); - - dst += stride; - src += stride; - } -} - -//---------------------------- - -void interpolate16x16_lowpass_v(byte *dst, byte *src, int stride, int rounding){ - - int round_add = 16 - rounding; - for(int i = 0; i < 17; i++){ - int src0 = src[0]; - int src1 = src[stride]; - int src2 = src[2 * stride]; - int src3 = src[3 * stride]; - int src4 = src[4 * stride]; - int src5 = src[5 * stride]; - int src6 = src[6 * stride]; - int src7 = src[7 * stride]; - int src8 = src[8 * stride]; - int src9 = src[9 * stride]; - int src10 = src[10 * stride]; - int src11 = src[11 * stride]; - int src12 = src[12 * stride]; - int src13 = src[13 * stride]; - int src14 = src[14 * stride]; - int src15 = src[15 * stride]; - int src16 = src[16 * stride]; - - - dst[0] = CLIP(((7 * ((src0<<1) - src2) + 23 * src1 + 3 * src3 - src4 + round_add) >> 5), 0, 255); - dst[stride] = CLIP(((19 * src1 + 20 * src2 - src5 + 3 * (src4 - src0 - (src3<<1)) + round_add) >> 5), 0, 255); - dst[2*stride] = CLIP(((20 * (src2 + src3) + (src0<<1) + 3 * (src5 - ((src1 + src4)<<1)) - src6 + round_add) >> 5), 0, 255); - - dst[3*stride] = CLIP(((20 * (src3 + src4) + 3 * ((src6 + src1) - ((src2 + src5)<<1)) - (src0 + src7) + round_add) >> 5), 0, 255); - dst[4*stride] = CLIP(((20 * (src4 + src5) - 3 * (((src3 + src6)<<1) - (src2 + src7)) - (src1 + src8) + round_add) >> 5), 0, 255); - dst[5*stride] = CLIP(((20 * (src5 + src6) - 3 * (((src4 + src7)<<1) - (src3 + src8)) - (src2 + src9) + round_add) >> 5), 0, 255); - dst[6*stride] = CLIP(((20 * (src6 + src7) - 3 * (((src5 + src8)<<1) - (src4 + src9)) - (src3 + src10) + round_add) >> 5), 0, 255); - dst[7*stride] = CLIP(((20 * (src7 + src8) - 3 * (((src6 + src9)<<1) - (src5 + src10)) - (src4 + src11) + round_add) >> 5), 0, 255); - dst[8*stride] = CLIP(((20 * (src8 + src9) - 3 * (((src7 + src10)<<1) - (src6 + src11)) - (src5 + src12) + round_add) >> 5), 0, 255); - dst[9*stride] = CLIP(((20 * (src9 + src10) - 3 * (((src8 + src11)<<1) - (src7 + src12)) - (src6 + src13) + round_add) >> 5), 0, 255); - dst[10*stride] = CLIP(((20 * (src10 + src11) - 3 * (((src9 + src12)<<1) - (src8 + src13)) - (src7 + src14) + round_add) >> 5), 0, 255); - dst[11*stride] = CLIP(((20 * (src11 + src12) - 3 * (((src10 + src13)<<1) - (src9 + src14)) - (src8 + src15) + round_add) >> 5), 0, 255); - dst[12*stride] = CLIP(((20 * (src12 + src13) - 3 * (((src11 + src14)<<1) - (src10 + src15)) - (src9 + src16) + round_add) >> 5), 0, 255); - - dst[13*stride] = CLIP(((20 * (src13 + src14) + (src16<<1) + 3 * (src11 - ((src12 + src15) << 1)) - src10 + round_add) >> 5), 0, 255); - dst[14*stride] = CLIP(((19 * src15 + 20 * src14 + 3 * (src12 - src16 - (src13 << 1)) - src11 + round_add) >> 5), 0, 255); - dst[15*stride] = CLIP(((23 * src15 + 7 * ((src16<<1) - src14) + 3 * src13 - src12 + round_add) >> 5), 0, 255); - - dst++; - src++; - } -} - -//---------------------------- - -void interpolate8x8_lowpass_v(byte *dst, byte *src, int stride, int rounding){ - - int round_add = 16 - rounding; - for(int i = 0; i < 9; i++){ - int src0 = src[0]; - int src1 = src[stride]; - int src2 = src[2 * stride]; - int src3 = src[3 * stride]; - int src4 = src[4 * stride]; - int src5 = src[5 * stride]; - int src6 = src[6 * stride]; - int src7 = src[7 * stride]; - int src8 = src[8 * stride]; - - dst[0] = CLIP(((7 * ((src0<<1) - src2) + 23 * src1 + 3 * src3 - src4 + round_add) >> 5), 0, 255); - dst[stride] = CLIP(((19 * src1 + 20 * src2 - src5 + 3 * (src4 - src0 - (src3 << 1)) + round_add) >> 5), 0, 255); - dst[2 * stride] = CLIP(((20 * (src2 + src3) + (src0<<1) + 3 * (src5 - ((src1 + src4) <<1 )) - src6 + round_add) >> 5), 0, 255); - dst[3 * stride] = CLIP(((20 * (src3 + src4) + 3 * ((src6 + src1) - ((src2 + src5)<<1)) - (src0 + src7) + round_add) >> 5), 0, 255); - dst[4 * stride] = CLIP(((20 * (src4 + src5) + 3 * ((src2 + src7) - ((src3 + src6)<<1)) - (src1 + src8) + round_add) >> 5), 0, 255); - dst[5 * stride] = CLIP(((20 * (src5 + src6) + (src8<<1) + 3 * (src3 - ((src4 + src7) << 1)) - src2 + round_add) >> 5), 0, 255); - dst[6 * stride] = CLIP(((19 * src7 + 20 * src6 - src3 + 3 * (src4 - src8 - (src5 << 1)) + round_add) >> 5), 0, 255); - dst[7 * stride] = CLIP(((7 * ((src8<<1) - src6) + 23 * src7 + 3 * src5 - src4 + round_add) >> 5), 0, 255); - - dst++; - src++; - } -} - -//---------------------------- - -void interpolate16x16_lowpass_hv(byte *dst1, byte *dst2, byte *src, int stride, int rounding){ - - byte round_add = 16 - rounding; - byte *h_ptr = dst2; - for(int i = 0; i < 17; i++){ - - h_ptr[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255); - h_ptr[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255); - h_ptr[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255); - - h_ptr[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255); - h_ptr[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255); - h_ptr[5] = CLIP(((20 * (src[5] + src[6]) - 3 * (((src[4] + src[7])<<1) - (src[3] + src[8])) - (src[2] + src[9]) + round_add) >> 5), 0, 255); - h_ptr[6] = CLIP(((20 * (src[6] + src[7]) - 3 * (((src[5] + src[8])<<1) - (src[4] + src[9])) - (src[3] + src[10]) + round_add) >> 5), 0, 255); - h_ptr[7] = CLIP(((20 * (src[7] + src[8]) - 3 * (((src[6] + src[9])<<1) - (src[5] + src[10])) - (src[4] + src[11]) + round_add) >> 5), 0, 255); - h_ptr[8] = CLIP(((20 * (src[8] + src[9]) - 3 * (((src[7] + src[10])<<1) - (src[6] + src[11])) - (src[5] + src[12]) + round_add) >> 5), 0, 255); - h_ptr[9] = CLIP(((20 * (src[9] + src[10]) - 3 * (((src[8] + src[11])<<1) - (src[7] + src[12])) - (src[6] + src[13]) + round_add) >> 5), 0, 255); - h_ptr[10] = CLIP(((20 * (src[10] + src[11]) - 3 * (((src[9] + src[12])<<1) - (src[8] + src[13])) - (src[7] + src[14]) + round_add) >> 5), 0, 255); - h_ptr[11] = CLIP(((20 * (src[11] + src[12]) - 3 * (((src[10] + src[13])<<1) - (src[9] + src[14])) - (src[8] + src[15]) + round_add) >> 5), 0, 255); - h_ptr[12] = CLIP(((20 * (src[12] + src[13]) - 3 * (((src[11] + src[14])<<1) - (src[10] + src[15])) - (src[9] + src[16]) + round_add) >> 5), 0, 255); - - h_ptr[13] = CLIP(((20 * (src[13] + src[14]) + (src[16]<<1) + 3 * (src[11] - ((src[12] + src[15]) << 1)) - src[10] + round_add) >> 5), 0, 255); - h_ptr[14] = CLIP(((19 * src[15] + 20 * src[14] + 3 * (src[12] - src[16] - (src[13] << 1)) - src[11] + round_add) >> 5), 0, 255); - h_ptr[15] = CLIP(((23 * src[15] + 7 * ((src[16]<<1) - src[14]) + 3 * src[13] - src[12] + round_add) >> 5), 0, 255); - - h_ptr += stride; - src += stride; - } - interpolate16x16_lowpass_v(dst1, dst2, stride, rounding); - -} - -//---------------------------- - -void interpolate8x8_lowpass_hv(byte *dst1, byte *dst2, byte *src, int stride, int rounding){ - - byte round_add = 16 - rounding; - byte *h_ptr = dst2; - for(int i = 0; i < 9; i++){ - - h_ptr[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255); - h_ptr[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255); - h_ptr[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255); - h_ptr[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255); - h_ptr[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255); - h_ptr[5] = CLIP(((20 * (src[5] + src[6]) + (src[8]<<1) + 3 * (src[3] - ((src[4] + src[7]) << 1)) - src[2] + round_add) >> 5), 0, 255); - h_ptr[6] = CLIP(((19 * src[7] + 20 * src[6] + 3 * (src[4] - src[8] - (src[5] << 1)) - src[3] + round_add) >> 5), 0, 255); - h_ptr[7] = CLIP(((23 * src[7] + 7 * ((src[8]<<1) - src[6]) + 3 * src[5] - src[4] + round_add) >> 5), 0, 255); - - h_ptr += stride; - src += stride; - } - interpolate8x8_lowpass_v(dst1, dst2, stride, rounding); -} - -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/interpolate8x8.h b/modules/xvid_dec/xvid_wce/interpolate8x8.h deleted file mode 100644 index 54a3d3e..0000000 --- a/modules/xvid_dec/xvid_wce/interpolate8x8.h +++ /dev/null @@ -1,107 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Interpolation related header - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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: interpolate8x8.h,v 1.1.1.1 2005-07-13 14:36:15 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _INTERPOLATE8X8_H_ -#define _INTERPOLATE8X8_H_ - -#include "mem_transfer.h" - -typedef void (INTERPOLATE8X8)(byte *dst, const byte *src, dword stride, bool rounding); -typedef INTERPOLATE8X8 *INTERPOLATE8X8_PTR; - -typedef void (INTERPOLATE8X8_AVG2)(byte *dst, const byte *src1, const byte *src2, dword stride, bool rounding, dword height); -typedef INTERPOLATE8X8_AVG2 *INTERPOLATE8X8_AVG2_PTR; - -typedef void (INTERPOLATE8X8_AVG4)(byte *dst, const byte *src1, const byte *src2, const byte *src3, const byte *src4, dword stride, bool rounding); -typedef INTERPOLATE8X8_AVG4 *INTERPOLATE8X8_AVG4_PTR; - -typedef void (INTERPOLATE_LOWPASS) (byte *dst, - byte *src, - int stride, - int rounding); - -typedef INTERPOLATE_LOWPASS *INTERPOLATE_LOWPASS_PTR; - -typedef void (INTERPOLATE_LOWPASS_HV) (byte *dst1, - byte *dst2, - byte *src, - int stride, - int rounding); - -typedef INTERPOLATE_LOWPASS_HV *INTERPOLATE_LOWPASS_HV_PTR; - -typedef void (INTERPOLATE8X8_6TAP_LOWPASS)(byte *dst, byte *src, int stride, bool rounding); - -typedef INTERPOLATE8X8_6TAP_LOWPASS *INTERPOLATE8X8_6TAP_LOWPASS_PTR; - -#ifdef _ARM_ //PPC -extern"C"{ -#endif - -INTERPOLATE8X8 interpolate8x8_halfpel_h; -INTERPOLATE8X8 interpolate8x8_halfpel_hv; -INTERPOLATE8X8 interpolate8x8_halfpel_v; - -#ifdef _ARM_ -} -#endif - - -INTERPOLATE8X8_AVG2 interpolate8x8_avg2; - -INTERPOLATE_LOWPASS interpolate8x8_lowpass_h; -INTERPOLATE_LOWPASS interpolate8x8_lowpass_v; - -INTERPOLATE_LOWPASS interpolate16x16_lowpass_h; -INTERPOLATE_LOWPASS interpolate16x16_lowpass_v; - -INTERPOLATE_LOWPASS_HV interpolate8x8_lowpass_hv; -INTERPOLATE_LOWPASS_HV interpolate16x16_lowpass_hv; - -//---------------------------- -// Notes: -// x, y is always multiply of 4, so writing to 'cur' is always dword aligned -// stride is always multiply of 4 -void interpolate8x8_switch(byte *cur, const byte *refn, dword x, dword y, int dx, int dy, dword stride, bool rounding); - -inline void interpolate16x16_switch(byte *cur, const byte *refn, dword x, dword y, int dx, int dy, dword stride, bool rounding){ - - interpolate8x8_switch(cur, refn, x, y, dx, dy, stride, rounding); - interpolate8x8_switch(cur, refn, x+8, y, dx, dy, stride, rounding); - interpolate8x8_switch(cur, refn, x, y+8, dx, dy, stride, rounding); - interpolate8x8_switch(cur, refn, x+8, y+8, dx, dy, stride, rounding); -} - -inline void interpolate32x32_switch(byte *cur, const byte *refn, dword x, dword y, int dx, int dy, dword stride, bool rounding){ - interpolate16x16_switch(cur, refn, x, y, dx, dy, stride, rounding); - interpolate16x16_switch(cur, refn, x+16, y, dx, dy, stride, rounding); - interpolate16x16_switch(cur, refn, x, y+16, dx, dy, stride, rounding); - interpolate16x16_switch(cur, refn, x+16, y+16, dx, dy, stride, rounding); -} - -void interpolate8x8_quarterpel(byte *cur, byte *refn, byte *refh, byte *refv, byte *refhv, dword x, dword y, int dx, int dy, dword stride, bool rounding); -void interpolate16x16_quarterpel(byte *cur, byte *refn, byte *refh, byte *refv, byte *refhv, dword x, dword y, int dx, int dy, dword stride, bool rounding); - -#endif diff --git a/modules/xvid_dec/xvid_wce/mbcoding.cpp b/modules/xvid_dec/xvid_wce/mbcoding.cpp deleted file mode 100644 index 31b4e28..0000000 --- a/modules/xvid_dec/xvid_wce/mbcoding.cpp +++ /dev/null @@ -1,936 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - MB coding - - * - * Copyright (C) 2002 Michael Militzer - * - * 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: mbcoding.cpp,v 1.1.1.1 2005-07-13 14:36:15 jeanlf Exp $ - * - ****************************************************************************/ - -#include "portab.h" -#include "global.h" -#include "bitstream.h" -#include "vlc_codes.h" - -//---------------------------- -/***************************************************************************** - * VLC tables and other constant arrays - ****************************************************************************/ - -struct VLC_TABLE{ - VLC vlc; - EVENT event; -}; - -static const VLC_TABLE coeff_tab[2][102] = { - /* intra = 0 */ - { - {{ 2, 2}, {0, 0, 1}}, - {{15, 4}, {0, 0, 2}}, - {{21, 6}, {0, 0, 3}}, - {{23, 7}, {0, 0, 4}}, - {{31, 8}, {0, 0, 5}}, - {{37, 9}, {0, 0, 6}}, - {{36, 9}, {0, 0, 7}}, - {{33, 10}, {0, 0, 8}}, - {{32, 10}, {0, 0, 9}}, - {{ 7, 11}, {0, 0, 10}}, - {{ 6, 11}, {0, 0, 11}}, - {{32, 11}, {0, 0, 12}}, - {{ 6, 3}, {0, 1, 1}}, - {{20, 6}, {0, 1, 2}}, - {{30, 8}, {0, 1, 3}}, - {{15, 10}, {0, 1, 4}}, - {{33, 11}, {0, 1, 5}}, - {{80, 12}, {0, 1, 6}}, - {{14, 4}, {0, 2, 1}}, - {{29, 8}, {0, 2, 2}}, - {{14, 10}, {0, 2, 3}}, - {{81, 12}, {0, 2, 4}}, - {{13, 5}, {0, 3, 1}}, - {{35, 9}, {0, 3, 2}}, - {{13, 10}, {0, 3, 3}}, - {{12, 5}, {0, 4, 1}}, - {{34, 9}, {0, 4, 2}}, - {{82, 12}, {0, 4, 3}}, - {{11, 5}, {0, 5, 1}}, - {{12, 10}, {0, 5, 2}}, - {{83, 12}, {0, 5, 3}}, - {{19, 6}, {0, 6, 1}}, - {{11, 10}, {0, 6, 2}}, - {{84, 12}, {0, 6, 3}}, - {{18, 6}, {0, 7, 1}}, - {{10, 10}, {0, 7, 2}}, - {{17, 6}, {0, 8, 1}}, - {{ 9, 10}, {0, 8, 2}}, - {{16, 6}, {0, 9, 1}}, - {{ 8, 10}, {0, 9, 2}}, - {{22, 7}, {0, 10, 1}}, - {{85, 12}, {0, 10, 2}}, - {{21, 7}, {0, 11, 1}}, - {{20, 7}, {0, 12, 1}}, - {{28, 8}, {0, 13, 1}}, - {{27, 8}, {0, 14, 1}}, - {{33, 9}, {0, 15, 1}}, - {{32, 9}, {0, 16, 1}}, - {{31, 9}, {0, 17, 1}}, - {{30, 9}, {0, 18, 1}}, - {{29, 9}, {0, 19, 1}}, - {{28, 9}, {0, 20, 1}}, - {{27, 9}, {0, 21, 1}}, - {{26, 9}, {0, 22, 1}}, - {{34, 11}, {0, 23, 1}}, - {{35, 11}, {0, 24, 1}}, - {{86, 12}, {0, 25, 1}}, - {{87, 12}, {0, 26, 1}}, - {{ 7, 4}, {1, 0, 1}}, - {{25, 9}, {1, 0, 2}}, - {{ 5, 11}, {1, 0, 3}}, - {{15, 6}, {1, 1, 1}}, - {{ 4, 11}, {1, 1, 2}}, - {{14, 6}, {1, 2, 1}}, - {{13, 6}, {1, 3, 1}}, - {{12, 6}, {1, 4, 1}}, - {{19, 7}, {1, 5, 1}}, - {{18, 7}, {1, 6, 1}}, - {{17, 7}, {1, 7, 1}}, - {{16, 7}, {1, 8, 1}}, - {{26, 8}, {1, 9, 1}}, - {{25, 8}, {1, 10, 1}}, - {{24, 8}, {1, 11, 1}}, - {{23, 8}, {1, 12, 1}}, - {{22, 8}, {1, 13, 1}}, - {{21, 8}, {1, 14, 1}}, - {{20, 8}, {1, 15, 1}}, - {{19, 8}, {1, 16, 1}}, - {{24, 9}, {1, 17, 1}}, - {{23, 9}, {1, 18, 1}}, - {{22, 9}, {1, 19, 1}}, - {{21, 9}, {1, 20, 1}}, - {{20, 9}, {1, 21, 1}}, - {{19, 9}, {1, 22, 1}}, - {{18, 9}, {1, 23, 1}}, - {{17, 9}, {1, 24, 1}}, - {{ 7, 10}, {1, 25, 1}}, - {{ 6, 10}, {1, 26, 1}}, - {{ 5, 10}, {1, 27, 1}}, - {{ 4, 10}, {1, 28, 1}}, - {{36, 11}, {1, 29, 1}}, - {{37, 11}, {1, 30, 1}}, - {{38, 11}, {1, 31, 1}}, - {{39, 11}, {1, 32, 1}}, - {{88, 12}, {1, 33, 1}}, - {{89, 12}, {1, 34, 1}}, - {{90, 12}, {1, 35, 1}}, - {{91, 12}, {1, 36, 1}}, - {{92, 12}, {1, 37, 1}}, - {{93, 12}, {1, 38, 1}}, - {{94, 12}, {1, 39, 1}}, - {{95, 12}, {1, 40, 1}} - }, - /* intra = 1 */ - { - {{ 2, 2}, {0, 0, 1}}, - {{15, 4}, {0, 0, 3}}, - {{21, 6}, {0, 0, 6}}, - {{23, 7}, {0, 0, 9}}, - {{31, 8}, {0, 0, 10}}, - {{37, 9}, {0, 0, 13}}, - {{36, 9}, {0, 0, 14}}, - {{33, 10}, {0, 0, 17}}, - {{32, 10}, {0, 0, 18}}, - {{ 7, 11}, {0, 0, 21}}, - {{ 6, 11}, {0, 0, 22}}, - {{32, 11}, {0, 0, 23}}, - {{ 6, 3}, {0, 0, 2}}, - {{20, 6}, {0, 1, 2}}, - {{30, 8}, {0, 0, 11}}, - {{15, 10}, {0, 0, 19}}, - {{33, 11}, {0, 0, 24}}, - {{80, 12}, {0, 0, 25}}, - {{14, 4}, {0, 1, 1}}, - {{29, 8}, {0, 0, 12}}, - {{14, 10}, {0, 0, 20}}, - {{81, 12}, {0, 0, 26}}, - {{13, 5}, {0, 0, 4}}, - {{35, 9}, {0, 0, 15}}, - {{13, 10}, {0, 1, 7}}, - {{12, 5}, {0, 0, 5}}, - {{34, 9}, {0, 4, 2}}, - {{82, 12}, {0, 0, 27}}, - {{11, 5}, {0, 2, 1}}, - {{12, 10}, {0, 2, 4}}, - {{83, 12}, {0, 1, 9}}, - {{19, 6}, {0, 0, 7}}, - {{11, 10}, {0, 3, 4}}, - {{84, 12}, {0, 6, 3}}, - {{18, 6}, {0, 0, 8}}, - {{10, 10}, {0, 4, 3}}, - {{17, 6}, {0, 3, 1}}, - {{ 9, 10}, {0, 8, 2}}, - {{16, 6}, {0, 4, 1}}, - {{ 8, 10}, {0, 5, 3}}, - {{22, 7}, {0, 1, 3}}, - {{85, 12}, {0, 1, 10}}, - {{21, 7}, {0, 2, 2}}, - {{20, 7}, {0, 7, 1}}, - {{28, 8}, {0, 1, 4}}, - {{27, 8}, {0, 3, 2}}, - {{33, 9}, {0, 0, 16}}, - {{32, 9}, {0, 1, 5}}, - {{31, 9}, {0, 1, 6}}, - {{30, 9}, {0, 2, 3}}, - {{29, 9}, {0, 3, 3}}, - {{28, 9}, {0, 5, 2}}, - {{27, 9}, {0, 6, 2}}, - {{26, 9}, {0, 7, 2}}, - {{34, 11}, {0, 1, 8}}, - {{35, 11}, {0, 9, 2}}, - {{86, 12}, {0, 2, 5}}, - {{87, 12}, {0, 7, 3}}, - {{ 7, 4}, {1, 0, 1}}, - {{25, 9}, {0, 11, 1}}, - {{ 5, 11}, {1, 0, 6}}, - {{15, 6}, {1, 1, 1}}, - {{ 4, 11}, {1, 0, 7}}, - {{14, 6}, {1, 2, 1}}, - {{13, 6}, {0, 5, 1}}, - {{12, 6}, {1, 0, 2}}, - {{19, 7}, {1, 5, 1}}, - {{18, 7}, {0, 6, 1}}, - {{17, 7}, {1, 3, 1}}, - {{16, 7}, {1, 4, 1}}, - {{26, 8}, {1, 9, 1}}, - {{25, 8}, {0, 8, 1}}, - {{24, 8}, {0, 9, 1}}, - {{23, 8}, {0, 10, 1}}, - {{22, 8}, {1, 0, 3}}, - {{21, 8}, {1, 6, 1}}, - {{20, 8}, {1, 7, 1}}, - {{19, 8}, {1, 8, 1}}, - {{24, 9}, {0, 12, 1}}, - {{23, 9}, {1, 0, 4}}, - {{22, 9}, {1, 1, 2}}, - {{21, 9}, {1, 10, 1}}, - {{20, 9}, {1, 11, 1}}, - {{19, 9}, {1, 12, 1}}, - {{18, 9}, {1, 13, 1}}, - {{17, 9}, {1, 14, 1}}, - {{ 7, 10}, {0, 13, 1}}, - {{ 6, 10}, {1, 0, 5}}, - {{ 5, 10}, {1, 1, 3}}, - {{ 4, 10}, {1, 2, 2}}, - {{36, 11}, {1, 3, 2}}, - {{37, 11}, {1, 4, 2}}, - {{38, 11}, {1, 15, 1}}, - {{39, 11}, {1, 16, 1}}, - {{88, 12}, {0, 14, 1}}, - {{89, 12}, {1, 0, 8}}, - {{90, 12}, {1, 5, 2}}, - {{91, 12}, {1, 6, 2}}, - {{92, 12}, {1, 17, 1}}, - {{93, 12}, {1, 18, 1}}, - {{94, 12}, {1, 19, 1}}, - {{95, 12}, {1, 20, 1}} - } -}; - -//---------------------------- -/* constants taken from momusys/vm_common/inlcude/max_level.h */ -static const byte max_level[2][2][64] = { - { - /* intra = 0, last = 0 */ - { - 12, 6, 4, 3, 3, 3, 3, 2, - 2, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - }, - /* intra = 0, last = 1 */ - { - 3, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - } - }, - { - /* intra = 1, last = 0 */ - { - 27, 10, 5, 4, 3, 3, 3, 3, - 2, 2, 1, 1, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - }, - /* intra = 1, last = 1 */ - { - 8, 3, 2, 2, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - } - } -}; - -//---------------------------- - -static const byte max_run[2][2][64] = { - { - /* intra = 0, last = 0 */ - { - 0, 26, 10, 6, 2, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - /* intra = 0, last = 1 */ - { - 0, 40, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - } - }, - { - /* intra = 1, last = 0 */ - { - 0, 14, 9, 7, 3, 2, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - /* intra = 1, last = 1 */ - { - 0, 20, 6, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - } - } -}; - -/****************************************************************** - * encoder tables * - ******************************************************************/ - -static const VLC sprite_trajectory_len[15] = { - { 0x00 , 2}, - { 0x02 , 3}, { 0x03, 3}, { 0x04, 3}, { 0x05, 3}, { 0x06, 3}, - { 0x0E , 4}, { 0x1E, 5}, { 0x3E, 6}, { 0x7E, 7}, { 0xFE, 8}, - { 0x1FE, 9}, {0x3FE,10}, {0x7FE,11}, {0xFFE,12} }; - - -/****************************************************************** - * decoder tables * - ******************************************************************/ - -static const VLC mcbpc_intra_table[64] = { - {-1, 0}, {20, 6}, {36, 6}, {52, 6}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, - {19, 3}, {19, 3}, {19, 3}, {19, 3}, {19, 3}, {19, 3}, {19, 3}, {19, 3}, - {35, 3}, {35, 3}, {35, 3}, {35, 3}, {35, 3}, {35, 3}, {35, 3}, {35, 3}, - {51, 3}, {51, 3}, {51, 3}, {51, 3}, {51, 3}, {51, 3}, {51, 3}, {51, 3}, - {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, - {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, - {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, - {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1}, {3, 1} -}; - -//---------------------------- - -static const VLC mcbpc_inter_table[257] = { - {VLC_ERROR, 0}, {255, 9}, {52, 9}, {36, 9}, {20, 9}, {49, 9}, {35, 8}, {35, 8}, - {19, 8}, {19, 8}, {50, 8}, {50, 8}, {51, 7}, {51, 7}, {51, 7}, {51, 7}, - {34, 7}, {34, 7}, {34, 7}, {34, 7}, {18, 7}, {18, 7}, {18, 7}, {18, 7}, - {33, 7}, {33, 7}, {33, 7}, {33, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {48, 6}, {48, 6}, {48, 6}, {48, 6}, {48, 6}, {48, 6}, {48, 6}, {48, 6}, - {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, - {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, - {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, - {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, - {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, - {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, - {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, - {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, - {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, - {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, - {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, - {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, - {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, - {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, - {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, - {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, - {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, - {0, 1} -}; - -//---------------------------- - -static const VLC cbpy_table[64] = { - {-1, 0}, {-1, 0}, {6, 6}, {9, 6}, {8, 5}, {8, 5}, {4, 5}, {4, 5}, - {2, 5}, {2, 5}, {1, 5}, {1, 5}, {0, 4}, {0, 4}, {0, 4}, {0, 4}, - {12, 4}, {12, 4}, {12, 4}, {12, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, - {14, 4}, {14, 4}, {14, 4}, {14, 4}, {5, 4}, {5, 4}, {5, 4}, {5, 4}, - {13, 4}, {13, 4}, {13, 4}, {13, 4}, {3, 4}, {3, 4}, {3, 4}, {3, 4}, - {11, 4}, {11, 4}, {11, 4}, {11, 4}, {7, 4}, {7, 4}, {7, 4}, {7, 4}, - {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, - {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2} -}; - -//---------------------------- - -static const VLC TMNMVtab0[] = { - {3, 4}, {-3, 4}, {2, 3}, {2, 3}, {-2, 3}, {-2, 3}, {1, 2}, - {1, 2}, {1, 2}, {1, 2}, {-1, 2}, {-1, 2}, {-1, 2}, {-1, 2} -}; - -//---------------------------- - -static const VLC TMNMVtab1[] = { - {12, 10}, {-12, 10}, {11, 10}, {-11, 10}, - {10, 9}, {10, 9}, {-10, 9}, {-10, 9}, - {9, 9}, {9, 9}, {-9, 9}, {-9, 9}, - {8, 9}, {8, 9}, {-8, 9}, {-8, 9}, - {7, 7}, {7, 7}, {7, 7}, {7, 7}, - {7, 7}, {7, 7}, {7, 7}, {7, 7}, - {-7, 7}, {-7, 7}, {-7, 7}, {-7, 7}, - {-7, 7}, {-7, 7}, {-7, 7}, {-7, 7}, - {6, 7}, {6, 7}, {6, 7}, {6, 7}, - {6, 7}, {6, 7}, {6, 7}, {6, 7}, - {-6, 7}, {-6, 7}, {-6, 7}, {-6, 7}, - {-6, 7}, {-6, 7}, {-6, 7}, {-6, 7}, - {5, 7}, {5, 7}, {5, 7}, {5, 7}, - {5, 7}, {5, 7}, {5, 7}, {5, 7}, - {-5, 7}, {-5, 7}, {-5, 7}, {-5, 7}, - {-5, 7}, {-5, 7}, {-5, 7}, {-5, 7}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {-4, 6}, {-4, 6}, {-4, 6}, {-4, 6}, - {-4, 6}, {-4, 6}, {-4, 6}, {-4, 6}, - {-4, 6}, {-4, 6}, {-4, 6}, {-4, 6}, - {-4, 6}, {-4, 6}, {-4, 6}, {-4, 6} -}; - -//---------------------------- - -static const VLC TMNMVtab2[] = { - {32, 12}, {-32, 12}, {31, 12}, {-31, 12}, - {30, 11}, {30, 11}, {-30, 11}, {-30, 11}, - {29, 11}, {29, 11}, {-29, 11}, {-29, 11}, - {28, 11}, {28, 11}, {-28, 11}, {-28, 11}, - {27, 11}, {27, 11}, {-27, 11}, {-27, 11}, - {26, 11}, {26, 11}, {-26, 11}, {-26, 11}, - {25, 11}, {25, 11}, {-25, 11}, {-25, 11}, - {24, 10}, {24, 10}, {24, 10}, {24, 10}, - {-24, 10}, {-24, 10}, {-24, 10}, {-24, 10}, - {23, 10}, {23, 10}, {23, 10}, {23, 10}, - {-23, 10}, {-23, 10}, {-23, 10}, {-23, 10}, - {22, 10}, {22, 10}, {22, 10}, {22, 10}, - {-22, 10}, {-22, 10}, {-22, 10}, {-22, 10}, - {21, 10}, {21, 10}, {21, 10}, {21, 10}, - {-21, 10}, {-21, 10}, {-21, 10}, {-21, 10}, - {20, 10}, {20, 10}, {20, 10}, {20, 10}, - {-20, 10}, {-20, 10}, {-20, 10}, {-20, 10}, - {19, 10}, {19, 10}, {19, 10}, {19, 10}, - {-19, 10}, {-19, 10}, {-19, 10}, {-19, 10}, - {18, 10}, {18, 10}, {18, 10}, {18, 10}, - {-18, 10}, {-18, 10}, {-18, 10}, {-18, 10}, - {17, 10}, {17, 10}, {17, 10}, {17, 10}, - {-17, 10}, {-17, 10}, {-17, 10}, {-17, 10}, - {16, 10}, {16, 10}, {16, 10}, {16, 10}, - {-16, 10}, {-16, 10}, {-16, 10}, {-16, 10}, - {15, 10}, {15, 10}, {15, 10}, {15, 10}, - {-15, 10}, {-15, 10}, {-15, 10}, {-15, 10}, - {14, 10}, {14, 10}, {14, 10}, {14, 10}, - {-14, 10}, {-14, 10}, {-14, 10}, {-14, 10}, - {13, 10}, {13, 10}, {13, 10}, {13, 10}, - {-13, 10}, {-13, 10}, {-13, 10}, {-13, 10} -}; - -//---------------------------- - -static const VLC dc_lum_tab[] = { - {0, 0}, {4, 3}, {3, 3}, {0, 3}, - {2, 2}, {2, 2}, {1, 2}, {1, 2}, -}; - -//--------------------------- -#define LEVELOFFSET 32 - -int Bitstream::bs_get_spritetrajectory(){ - - for(int i = 0; i < 12; i++){ - if((int)ShowBits(sprite_trajectory_len[i].len) == sprite_trajectory_len[i].code){ - Skip(sprite_trajectory_len[i].len); - return i; - } - } - return -1; -} - -//---------------------------- - -void S_decoder::init_vlc_tables(){ - - dword i, j, intra, last, run, run_esc, level, level_esc, escape, escape_len, offset; - - for (intra = 0; intra < 2; intra++) - for (i = 0; i < 4096; i++) - DCT3D[intra][i].event.level = 0; - - for (intra = 0; intra < 2; intra++) { - for (last = 0; last < 2; last++) { - for (run = 0; run < 63 + last; run++) { - for (level = 0; level < (dword)(32 << intra); level++) { - offset = !intra * LEVELOFFSET; - coeff_VLC[intra][last][level + offset][run].len = 128; - } - } - } - } - - for (intra = 0; intra < 2; intra++) { - for (i = 0; i < 102; i++) { - offset = !intra * LEVELOFFSET; - - for (j = 0; j < (dword)(1 << (12 - coeff_tab[intra][i].vlc.len)); j++) { - DCT3D[intra][(coeff_tab[intra][i].vlc.code << (12 - coeff_tab[intra][i].vlc.len)) | j].len = coeff_tab[intra][i].vlc.len; - DCT3D[intra][(coeff_tab[intra][i].vlc.code << (12 - coeff_tab[intra][i].vlc.len)) | j].event = coeff_tab[intra][i].event; - } - - coeff_VLC[intra][coeff_tab[intra][i].event.last][coeff_tab[intra][i].event.level + offset][coeff_tab[intra][i].event.run].code - = coeff_tab[intra][i].vlc.code << 1; - coeff_VLC[intra][coeff_tab[intra][i].event.last][coeff_tab[intra][i].event.level + offset][coeff_tab[intra][i].event.run].len - = coeff_tab[intra][i].vlc.len + 1; - - if (!intra) { - coeff_VLC[intra][coeff_tab[intra][i].event.last][offset - coeff_tab[intra][i].event.level][coeff_tab[intra][i].event.run].code - = (coeff_tab[intra][i].vlc.code << 1) | 1; - coeff_VLC[intra][coeff_tab[intra][i].event.last][offset - coeff_tab[intra][i].event.level][coeff_tab[intra][i].event.run].len - = coeff_tab[intra][i].vlc.len + 1; - } - } - } - - for (intra = 0; intra < 2; intra++) { - for (last = 0; last < 2; last++) { - for (run = 0; run < 63 + last; run++) { - for (level = 1; level < (dword)(32 << intra); level++) { - - if (level <= max_level[intra][last][run] && run <= max_run[intra][last][level]) - continue; - - offset = !intra * LEVELOFFSET; - level_esc = level - max_level[intra][last][run]; - run_esc = run - 1 - max_run[intra][last][level]; - - if (level_esc <= max_level[intra][last][run] && run <= max_run[intra][last][level_esc]) { - escape = ESCAPE1; - escape_len = 7 + 1; - run_esc = run; - } else { - if (run_esc <= max_run[intra][last][level] && level <= max_level[intra][last][run_esc]) { - escape = ESCAPE2; - escape_len = 7 + 2; - level_esc = level; - } else { - if (!intra) { - coeff_VLC[intra][last][level + offset][run].code - = (ESCAPE3 << 21) | (last << 20) | (run << 14) | (1 << 13) | ((level & 0xfff) << 1) | 1; - coeff_VLC[intra][last][level + offset][run].len = 30; - coeff_VLC[intra][last][offset - level][run].code - = (ESCAPE3 << 21) | (last << 20) | (run << 14) | (1 << 13) | ((-(int)level & 0xfff) << 1) | 1; - coeff_VLC[intra][last][offset - level][run].len = 30; - } - continue; - } - } - - coeff_VLC[intra][last][level + offset][run].code - = (escape << coeff_VLC[intra][last][level_esc + offset][run_esc].len) - | coeff_VLC[intra][last][level_esc + offset][run_esc].code; - coeff_VLC[intra][last][level + offset][run].len - = coeff_VLC[intra][last][level_esc + offset][run_esc].len + escape_len; - - if (!intra) { - coeff_VLC[intra][last][offset - level][run].code - = (escape << coeff_VLC[intra][last][level_esc + offset][run_esc].len) - | coeff_VLC[intra][last][level_esc + offset][run_esc].code | 1; - coeff_VLC[intra][last][offset - level][run].len - = coeff_VLC[intra][last][level_esc + offset][run_esc].len + escape_len; - } - } - - if (!intra) { - coeff_VLC[intra][last][0][run].code - = (ESCAPE3 << 21) | (last << 20) | (run << 14) | (1 << 13) | ((-32 & 0xfff) << 1) | 1; - coeff_VLC[intra][last][0][run].len = 30; - } - } - } - } - - /* init sprite_trajectory tables - * even if GMC is not specified (it might be used later...) */ - /* - { - dword k; - int l; - sprite_trajectory_code[0+16384].code = 0; - sprite_trajectory_code[0+16384].len = 0; - for (k=0;k<14;k++) { - int limit = (1<>= 3; - - Skip(mcbpc_intra_table[index].len); - - return mcbpc_intra_table[index].code; - -} - -//---------------------------- - -int Bitstream::GetMcbpcInter(){ - - dword index = MIN(ShowBits(9), 256); - Skip(mcbpc_inter_table[index].len); - - return mcbpc_inter_table[index].code; -} - -//---------------------------- - -int Bitstream::GetCbpy(int intra){ - - dword index = ShowBits(6); - Skip(cbpy_table[index].len); - int cbpy = cbpy_table[index].code; - if(!intra) - cbpy = 15 - cbpy; - return cbpy; -} - -//---------------------------- - -static int get_mv_data(Bitstream * bs){ - - if(bs->GetBit()) - return 0; - - dword index = bs->ShowBits(12); - - if(index >= 512){ - index = (index >> 8) - 2; - bs->Skip(TMNMVtab0[index].len); - return TMNMVtab0[index].code; - } - - if (index >= 128) { - index = (index >> 2) - 32; - bs->Skip(TMNMVtab1[index].len); - return TMNMVtab1[index].code; - } - - index -= 4; - - bs->Skip(TMNMVtab2[index].len); - return TMNMVtab2[index].code; -} - -//---------------------------- - -int Bitstream::GetMoveVector(int fcode){ - - int scale_fac = 1 << (fcode - 1); - int data = get_mv_data(this); - - if(scale_fac == 1 || data == 0) - return data; - - int res = GetBits(fcode - 1); - int mv = ((ABS(data) - 1) * scale_fac) + res + 1; - - return data < 0 ? -mv : mv; -} - -//---------------------------- - -int Bitstream::get_dc_dif(dword dc_size){ - - int code = GetBits(dc_size); - int msb = code >> (dc_size - 1); - - if (msb == 0) - return (-1 * (code ^ ((1 << dc_size) - 1))); - - return code; - -} - -//---------------------------- - -int Bitstream::get_dc_size_lum(){ - - int code = ShowBits(11); - - for(int i = 11; i > 3; i--) { - if (code == 1) { - Skip(i); - return i + 1; - } - code >>= 1; - } - - Skip(dc_lum_tab[code].len); - return dc_lum_tab[code].code; - -} - -//---------------------------- - -int Bitstream::get_dc_size_chrom(){ - - dword code, i; - - code = ShowBits(12); - - for (i = 12; i > 2; i--) { - if (code == 1) { - Skip(i); - return i; - } - code >>= 1; - } - - return 3 - GetBits(2); - -} - -//---------------------------- - -int S_decoder::get_coeff(Bitstream *bs, int *run, int *last, int intra, int short_video_header){ - - dword mode; - int level; - REVERSE_EVENT *reverse_event; - - if(short_video_header) /* inter-VLCs will be used for both intra and inter blocks */ - intra = 0; - - if(bs->ShowBits(7) != ESCAPE){ - reverse_event = &DCT3D[intra][bs->ShowBits(12)]; - - if((level = reverse_event->event.level) == 0) - goto error; - - *last = reverse_event->event.last; - *run = reverse_event->event.run; - - bs->Skip(reverse_event->len); - - return bs->GetBits(1) ? -level : level; - } - - bs->Skip(7); - - if(short_video_header){ - //escape mode 4 - H.263 type, only used if short_video_header = 1 - *last = bs->GetBit(); - *run = bs->GetBits(6); - level = bs->GetBits(8); - if (level == 0 || level == 128) - DPRINTF(XVID_DEBUG_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d\n", level); - return (level << 24) >> 24; - } - - mode = bs->ShowBits(2); - if(mode < 3){ - bs->Skip((mode == 2) ? 2 : 1); - - reverse_event = &DCT3D[intra][bs->ShowBits(12)]; - - if((level = reverse_event->event.level) == 0) - goto error; - *last = reverse_event->event.last; - *run = reverse_event->event.run; - bs->Skip(reverse_event->len); - - if(mode < 2) /* first escape mode, level is offset */ - level += max_level[intra][*last][*run]; - else /* second escape mode, run is offset */ - *run += max_run[intra][*last][level] + 1; - return bs->GetBits(1) ? -level : level; - } - //third escape mode - fixed length codes - bs->Skip(2); - *last = bs->GetBits(1); - *run = bs->GetBits(6); - bs->Skip(1); //marker - level = bs->GetBits(12); - bs->Skip(1); //marker - - return (level << 20) >> 20; - -error: - *run = VLC_ERROR; - return 0; -} - -//---------------------------- - -void S_decoder::get_intra_block(Bitstream *bs, int *block, int direction, int coeff){ - - const dword *scan = scan_tables[direction]; - int last; - do{ - int run; - int level = get_coeff(bs, &run, &last, 1, 0); - if(run == -1){ - DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run"); - break; - } - coeff += run; - block[scan[coeff]] = level; - - //DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[coeff], level); - - if(level < -2047 || level > 2047){ - DPRINTF(XVID_DEBUG_ERROR,"warning: intra_overflow %i\n", level); - } - coeff++; - } while(!last); -} - -//---------------------------- - -void S_decoder::get_inter_block(Bitstream * bs, int *block, int direction){ - - const dword *scan = scan_tables[direction]; - int p = 0; - int last; - do{ - int run; - int level = get_coeff(bs, &run, &last, 0, 0); - if(run == -1){ - DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run"); - break; - } - p += run; - block[scan[p]] = level; - - //DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[p], level); - - if(level < -2047 || level > 2047){ - DPRINTF(XVID_DEBUG_ERROR,"warning: inter overflow %i\n", level); - } - p++; - } while(!last); -} - -//---------------------------- - diff --git a/modules/xvid_dec/xvid_wce/mbprediction.cpp b/modules/xvid_dec/xvid_wce/mbprediction.cpp deleted file mode 100644 index c816b6a..0000000 --- a/modules/xvid_dec/xvid_wce/mbprediction.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Prediction module - - * - * Copyright (C) 2001-2003 Michael Militzer - * 2001-2003 Peter Ross - * - * 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: mbprediction.cpp,v 1.1.1.1 2005-07-13 14:36:15 jeanlf Exp $ - * - ****************************************************************************/ - -#include "global.h" -#include "mbprediction.h" - -//---------------------------- - -#if 0 - -#define Divide(a,b) (((a)>0) ? ((a)+((b)>>1))/(b) : ((a)-((b)>>1))/(b)) - -#else - -#define RET_DIV(a, N) return (a*N+32768) >> 16; -#define RET_SHR(a, N, S) return (a+N) >> S; - -static int Divide(int a, int b){ - switch(b){ - case 1: return a; - case 2: return a >> 1; - case 4: RET_SHR(a, 2, 2); - case 8: RET_SHR(a, 4, 3); - case 16: RET_SHR(a, 8, 4); - case 32: RET_SHR(a, 16, 5); - case 3: RET_DIV(a, 21845); - case 5: RET_DIV(a, 13107); - case 6: RET_DIV(a, 10923); - case 7: RET_DIV(a, 9362); - case 9: RET_DIV(a, 7282); - case 10: RET_DIV(a, 6554); - case 11: RET_DIV(a, 5958); - case 12: RET_DIV(a, 5461); - case 13: RET_DIV(a, 5041); - case 14: RET_DIV(a, 4681); - case 15: RET_DIV(a, 4369); - case 17: RET_DIV(a, 3855); - case 18: RET_DIV(a, 3641); - case 19: RET_DIV(a, 3449); - case 20: RET_DIV(a, 3277); - case 21: RET_DIV(a, 3121); - case 22: RET_DIV(a, 2979); - case 23: RET_DIV(a, 2849); - case 24: RET_DIV(a, 2731); - case 25: RET_DIV(a, 2621); - case 26: RET_DIV(a, 2521); - case 27: RET_DIV(a, 2427); - case 28: RET_DIV(a, 2341); - case 29: RET_DIV(a, 2260); - case 30: RET_DIV(a, 2185); - case 31: RET_DIV(a, 2114); - } - return ((a>0) ? (a+(b>>1))/b : (a-(b>>1))/b); -} -#endif - -//---------------------------- - -inline int rescale(int predict_quant, int current_quant, int coeff){ - - if(!coeff) - return 0; - return Divide(coeff * predict_quant, current_quant); -} - -//---------------------------- - -static const int default_acdc_values[15] = { - 1024, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 -}; - -//---------------------------- -/* get dc/ac prediction direction for a single block and place - predictor values into MB->pred_values[j][..] -*/ -void predict_acdc(MACROBLOCK *pMBs, dword x, dword y, dword mb_width, dword block, int qcoeff[64], dword current_quant, int iDcScaler, int predictors[8], int bound){ - - const int mbpos = (y * mb_width) + x; - int *left, *top, *diag, *current; - - int left_quant = current_quant; - int top_quant = current_quant; - - const int *pLeft = default_acdc_values; - const int *pTop = default_acdc_values; - const int *pDiag = default_acdc_values; - - dword index = x + y * mb_width; /* current macroblock */ - int *acpred_direction = &pMBs[index].acpred_directions[block]; - dword i; - - left = top = diag = current = 0; - - /* grab left,top and diag macroblocks */ - - /* left macroblock */ - - if (x && mbpos >= bound + 1 && - (pMBs[index - 1].mode == MODE_INTRA || - pMBs[index - 1].mode == MODE_INTRA_Q)) { - - left = pMBs[index - 1].pred_values[0]; - left_quant = pMBs[index - 1].quant; - } - /* top macroblock */ - - if (mbpos >= bound + (int)mb_width && - (pMBs[index - mb_width].mode == MODE_INTRA || - pMBs[index - mb_width].mode == MODE_INTRA_Q)) { - - top = pMBs[index - mb_width].pred_values[0]; - top_quant = pMBs[index - mb_width].quant; - } - /* diag macroblock */ - - if (x && mbpos >= bound + (int)mb_width + 1 && - (pMBs[index - 1 - mb_width].mode == MODE_INTRA || - pMBs[index - 1 - mb_width].mode == MODE_INTRA_Q)) { - - diag = pMBs[index - 1 - mb_width].pred_values[0]; - } - - current = pMBs[index].pred_values[0]; - - /* now grab pLeft, pTop, pDiag _blocks_ */ - - switch(block){ - case 0: - if(left) - pLeft = left + MBPRED_SIZE; - if(top) - pTop = top + (MBPRED_SIZE << 1); - if(diag) - pDiag = diag + 3 * MBPRED_SIZE; - break; - - case 1: - pLeft = current; - left_quant = current_quant; - if(top){ - pTop = top + 3 * MBPRED_SIZE; - pDiag = top + (MBPRED_SIZE << 1); - } - break; - - case 2: - if(left){ - pLeft = left + 3 * MBPRED_SIZE; - pDiag = left + MBPRED_SIZE; - } - pTop = current; - top_quant = current_quant; - break; - - case 3: - pLeft = current + (MBPRED_SIZE << 1); - left_quant = current_quant; - pTop = current + MBPRED_SIZE; - top_quant = current_quant; - pDiag = current; - break; - - case 4: - if(left) - pLeft = left + (MBPRED_SIZE << 2); - if(top) - pTop = top + (MBPRED_SIZE << 2); - if(diag) - pDiag = diag + (MBPRED_SIZE << 2); - break; - - case 5: - if(left) - pLeft = left + 5 * MBPRED_SIZE; - if(top) - pTop = top + 5 * MBPRED_SIZE; - if(diag) - pDiag = diag + 5 * MBPRED_SIZE; - break; - } - - /* - * determine ac prediction direction & ac/dc predictor place rescaled ac/dc - * predictions into predictors[] for later use - */ - - if(ABS(pLeft[0] - pDiag[0]) < ABS(pDiag[0] - pTop[0])){ - //vertical - *acpred_direction = 1; - predictors[0] = Divide(pTop[0], iDcScaler); - for(i = 1; i < 8; i++) - predictors[i] = rescale(top_quant, current_quant, pTop[i]); - }else{ - //horizontal - *acpred_direction = 2; - predictors[0] = Divide(pLeft[0], iDcScaler); - for(i = 1; i < 8; i++) - predictors[i] = rescale(left_quant, current_quant, pLeft[i + 7]); - } -} - -//---------------------------- -/* decoder: add predictors to dct_codes[] and - store current coeffs to pred_values[] for future prediction -*/ -void add_acdc(MACROBLOCK *pMB, dword block, int dct_codes[64], dword iDcScaler, int predictors[8]){ - - byte acpred_direction = pMB->acpred_directions[block]; - int *pCurrent = pMB->pred_values[block]; - - DPRINTF(XVID_DEBUG_COEFF,"predictor[0] %i\n", predictors[0]); - - dct_codes[0] += predictors[0]; /* dc prediction */ - pCurrent[0] = dct_codes[0] * iDcScaler; - - if(acpred_direction == 1){ - for(int i = 1; i < 8; i++){ - int level = dct_codes[i] + predictors[i]; - //DPRINTF(XVID_DEBUG_COEFF,"predictor[%i] %i\n",i, predictors[i]); - dct_codes[i] = level; - pCurrent[i] = level; - pCurrent[i + 7] = dct_codes[i * 8]; - } - }else - if(acpred_direction == 2){ - for(int i = 1; i < 8; i++){ - int level = dct_codes[i * 8] + predictors[i]; - //DPRINTF(XVID_DEBUG_COEFF,"predictor[%i] %i\n",i*8, predictors[i]); - dct_codes[i * 8] = level; - pCurrent[i + 7] = level; - pCurrent[i] = dct_codes[i]; - } - }else{ - for(int i = 1; i < 8; i++) { - pCurrent[i] = dct_codes[i]; - pCurrent[i + 7] = dct_codes[i * 8]; - } - } -} - -//---------------------------- - -static const VECTOR zeroMV = { 0, 0 }; - -VECTOR get_pmv2(const MACROBLOCK * const mbs, const int mb_width, const int bound, const int x, const int y, const int block){ - - int lx, ly, lz; /* left */ - int tx, ty, tz; /* top */ - int rx, ry, rz; /* top-right */ - int lpos, tpos, rpos; - int num_cand = 0, last_cand = 1; - - VECTOR pmv[4]; /* left neighbour, top neighbour, top-right neighbour */ - - switch(block){ - case 0: - lx = x - 1; ly = y; lz = 1; - tx = x; ty = y - 1; tz = 2; - rx = x + 1; ry = y - 1; rz = 2; - break; - case 1: - lx = x; ly = y; lz = 0; - tx = x; ty = y - 1; tz = 3; - rx = x + 1; ry = y - 1; rz = 2; - break; - case 2: - lx = x - 1; ly = y; lz = 3; - tx = x; ty = y; tz = 0; - rx = x; ry = y; rz = 1; - break; - default: - lx = x; ly = y; lz = 2; - tx = x; ty = y; tz = 0; - rx = x; ry = y; rz = 1; - } - - lpos = lx + ly * mb_width; - rpos = rx + ry * mb_width; - tpos = tx + ty * mb_width; - - if(lpos >= bound && lx >= 0){ - num_cand++; - pmv[1] = mbs[lpos].mvs[lz]; - }else - pmv[1] = zeroMV; - - if(tpos >= bound){ - num_cand++; - last_cand = 2; - pmv[2] = mbs[tpos].mvs[tz]; - }else - pmv[2] = zeroMV; - - if(rpos >= bound && rx < mb_width){ - num_cand++; - last_cand = 3; - pmv[3] = mbs[rpos].mvs[rz]; - }else - pmv[3] = zeroMV; - - //if there're more than one candidate, we return the median vector - if(num_cand > 1){ - //set median - pmv[0].x = - MIN(MAX(pmv[1].x, pmv[2].x), - MIN(MAX(pmv[2].x, pmv[3].x), MAX(pmv[1].x, pmv[3].x))); - pmv[0].y = - MIN(MAX(pmv[1].y, pmv[2].y), - MIN(MAX(pmv[2].y, pmv[3].y), MAX(pmv[1].y, pmv[3].y))); - return pmv[0]; - } - - return pmv[last_cand]; //no point calculating median mv -} - -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/mbprediction.h b/modules/xvid_dec/xvid_wce/mbprediction.h deleted file mode 100644 index 89348b9..0000000 --- a/modules/xvid_dec/xvid_wce/mbprediction.h +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Prediction header - - * - * Copyright(C) 2002-2003 xvid team - * - * 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: mbprediction.h,v 1.1.1.1 2005-07-13 14:36:15 jeanlf Exp $ - * - ****************************************************************************/ - - -#ifndef _MBPREDICTION_H_ -#define _MBPREDICTION_H_ - -#include "portab.h" -#include "decoder.h" -#include "global.h" - -#define MIN(X, Y) ((X)<(Y)?(X):(Y)) -#define MAX(X, Y) ((X)>(Y)?(X):(Y)) - -/* very large value */ -#define MV_MAX_ERROR (4096 * 256) - -#define MVequal(A,B) ( ((A).x)==((B).x) && ((A).y)==((B).y) ) - -void add_acdc(MACROBLOCK *pMB, dword block, int dct_codes[64], dword iDcScaler, int predictors[8]); - -void predict_acdc(MACROBLOCK * pMBs, dword x, dword y, dword mb_width, dword block, int qcoeff[64], dword current_quant, int iDcScaler, int predictors[8], int bound); - -VECTOR -get_pmv2(const MACROBLOCK * const mbs, - const int mb_width, - const int bound, - const int x, - const int y, - const int block); - -#endif /* _MBPREDICTION_H_ */ diff --git a/modules/xvid_dec/xvid_wce/mem_align.cpp b/modules/xvid_dec/xvid_wce/mem_align.cpp deleted file mode 100644 index c865859..0000000 --- a/modules/xvid_dec/xvid_wce/mem_align.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Aligned Memory Allocator - - * - * Copyright(C) 2002-2003 Edouard Gomez - * - * 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_align.cpp,v 1.3 2010-02-23 16:23:32 jeanlf Exp $ - * - ****************************************************************************/ - -#include "mem_align.h" -#include "global.h" - -#ifdef __SYMBIAN32__ -#include -#endif - -/***************************************************************************** - * xvid_malloc - * - * This function allocates 'size' bytes (usable by the user) on the heap and - * takes care of the requested 'alignment'. - * In order to align the allocated memory block, the xvid_malloc allocates - * 'size' bytes + 'alignment' bytes. So try to keep alignment very small - * when allocating small pieces of memory. - * - * NB : a block allocated by xvid_malloc _must_ be freed with xvid_free - * (the libc free will return an error) - * - * Returned value : - NULL on error - * - Pointer to the allocated aligned block - * - ****************************************************************************/ - -#include "Rules.h" - -void *xvid_malloc(long size, dword alignment){ - - byte *mem_ptr; - - - if (!alignment) { - - /* We have not to satisfy any alignment */ - //mem_ptr = (byte*)gf_malloc(size + 1); - //mem_ptr = new(ELeave) byte[size+1]; - mem_ptr = new byte[size+1]; - if(mem_ptr) { - - /* Store (mem_ptr - "real allocated memory") in *(mem_ptr-1) */ - *mem_ptr = (byte)1; - - /* Return the mem_ptr pointer */ - return ((void *)(mem_ptr+1)); - } - } else { - byte *tmp; - - /* Allocate the required size memory + alignment so we - * can realign the data if necessary */ - //tmp = (byte *) gf_malloc(size + alignment); - //tmp = new(ELeave) byte[size + alignment]; - tmp = new byte[size + alignment]; - if(tmp) { - - /* Align the tmp pointer */ - mem_ptr = - (byte *) ((dword)(tmp + alignment - 1) & (~(dword)(alignment - 1))); - - /* Special case where gf_malloc have already satisfied the alignment - * We must add alignment to mem_ptr because we must store - * (mem_ptr - tmp) in *(mem_ptr-1) - * If we do not add alignment to mem_ptr then *(mem_ptr-1) points - * to a forbidden memory space */ - if (mem_ptr == tmp) - mem_ptr += alignment; - - /* (mem_ptr - tmp) is stored in *(mem_ptr-1) so we are able to retrieve - * the real gf_malloc block allocated and free it in xvid_free */ - *(mem_ptr - 1) = (byte) (mem_ptr - tmp); - - /* Return the aligned pointer */ - return ((void *)mem_ptr); - } - } - return 0; -} - -/***************************************************************************** - * xvid_free - * - * Free a previously 'xvid_malloc' allocated block. Does not free NULL - * references. - * - * Returned value : None. - * - ****************************************************************************/ - -void xvid_free(void *mem_ptr){ - - if(!mem_ptr) - return; - - /* Aligned pointer */ - byte *ptr = (byte*)mem_ptr; - - /* *(ptr - 1) holds the offset to the real allocated block - * we sub that offset os we free the real pointer */ - ptr -= *(ptr - 1); - - /* Free the memory */ - //free(ptr); - delete[] ptr; -} - -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/mem_align.h b/modules/xvid_dec/xvid_wce/mem_align.h deleted file mode 100644 index 752dc06..0000000 --- a/modules/xvid_dec/xvid_wce/mem_align.h +++ /dev/null @@ -1,35 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Aligned Memory Allocator header - - * - * Copyright(C) 2002-2003 Edouard Gomez - * - * 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_align.h,v 1.1.1.1 2005-07-13 14:36:15 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _MEM_ALIGN_H_ -#define _MEM_ALIGN_H_ - -#include "portab.h" -#include "Rules.h" - -void *xvid_malloc(long size, dword alignment); -void xvid_free(void *mem_ptr); - -#endif /* _MEM_ALIGN_H_ */ diff --git a/modules/xvid_dec/xvid_wce/mem_transfer.cpp b/modules/xvid_dec/xvid_wce/mem_transfer.cpp deleted file mode 100644 index a5a2b67..0000000 --- a/modules/xvid_dec/xvid_wce/mem_transfer.cpp +++ /dev/null @@ -1,281 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - 8bit<->16bit transfer - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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 - -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 -#include - -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 - -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 -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/mem_transfer.h b/modules/xvid_dec/xvid_wce/mem_transfer.h deleted file mode 100644 index 225d643..0000000 --- a/modules/xvid_dec/xvid_wce/mem_transfer.h +++ /dev/null @@ -1,61 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - 8<->16 bit buffer transfer header - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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.h,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _MEM_TRANSFER_H -#define _MEM_TRANSFER_H - -#include "Rules.h" - -/***************************************************************************** - * transfer16to8 API - ****************************************************************************/ -void transfer_16to8copy(byte *dst, const int *src, dword stride); - -/***************************************************************************** - * transfer16to8 + addition op API - ****************************************************************************/ -void transfer_16to8add(byte *dst, const int *src, dword stride); - -/***************************************************************************** - * transfer8to8 + no op - ****************************************************************************/ -#ifdef _ARM_ -extern"C" -#endif -void transfer8x8_copy(byte *const dst, const byte * const src, const dword stride); - -//---------------------------- - -inline void transfer16x16_copy(byte * const dst, const byte * const src, const dword stride){ - - transfer8x8_copy(dst, src, stride); - transfer8x8_copy(dst + 8, src + 8, stride); - transfer8x8_copy(dst + 8*stride, src + 8*stride, stride); - transfer8x8_copy(dst + 8*stride + 8, src + 8*stride + 8, stride); -} - -//---------------------------- - -#endif diff --git a/modules/xvid_dec/xvid_wce/note b/modules/xvid_dec/xvid_wce/note deleted file mode 100644 index 2e50121..0000000 --- a/modules/xvid_dec/xvid_wce/note +++ /dev/null @@ -1,4 +0,0 @@ -This is not original version of XviD codec. -To obtain official source code for XviD, please visit www.xvid.org. -This is a modified version of the original software. - diff --git a/modules/xvid_dec/xvid_wce/portab.h b/modules/xvid_dec/xvid_wce/portab.h deleted file mode 100644 index 48af417..0000000 --- a/modules/xvid_dec/xvid_wce/portab.h +++ /dev/null @@ -1,166 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Portable macros, types and inlined assembly - - * - * Copyright(C) 2002 Michael Militzer - * 2002-2003 Peter Ross - * 2002-2003 Edouard Gomez - * - * 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: portab.h,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _PORTAB_H_ -#define _PORTAB_H_ - -#include "Rules.h" - -#define ARCH_IS_LITTLE_ENDIAN -#define ARCH_IS_GENERIC - - -/***************************************************************************** - * Common things - ****************************************************************************/ - -/* Buffer size for msvc implementation because it outputs to DebugOutput */ -#ifdef _DEBUG -extern dword xvid_debug; -#define DPRINTF_BUF_SZ 1024 -#endif - -/***************************************************************************** - * Types used in XviD sources - ****************************************************************************/ - -/*---------------------------------------------------------------------------- - | For MSVC - *---------------------------------------------------------------------------*/ - -//#if defined(_MSC_VER) || defined (__WATCOMC__) -#define int64_t int - -/*---------------------------------------------------------------------------- - | For all other compilers, use the standard header file - | (compiler should be ISO C99 compatible, perhaps ISO C89 is enough) - *---------------------------------------------------------------------------*/ - -//#endif - -/***************************************************************************** - * Some things that are only architecture dependant - ****************************************************************************/ - -#define CACHE_LINE 32 - -/***************************************************************************** - * MSVC compiler specific macros, functions - ****************************************************************************/ - -#ifdef _MSC_VER - -/*---------------------------------------------------------------------------- - | Common msvc stuff - *---------------------------------------------------------------------------*/ - - /* - * This function must be declared/defined all the time because MSVC does - * not support C99 variable arguments macros. - * - * Btw, if the MS compiler does its job well, it should remove the nop - * DPRINTF function when not compiling in _DEBUG mode - */ -#if defined _DEBUG && defined _WINDOWS - -void DPRINTF(int level, char *fmt, int p=0); - -#else - -inline void DPRINTF(int level, char *fmt, int p=0){} - -#endif - - -/***************************************************************************** - * GNU CC compiler stuff - ****************************************************************************/ - -#elif defined __GNUC__ || defined __ICC /* Compiler test */ - -/*---------------------------------------------------------------------------- - | Common gcc stuff - *---------------------------------------------------------------------------*/ - -/* - * As gcc is (mostly) C99 compliant, we define DPRINTF only if it's realy needed - * and it's a macro calling fprintf directly - */ -# ifdef _DEBUG - - /* Needed for all debuf fprintf calls */ -# include -# include - - inline void DPRINTF(int level, char *format, int p=0){ - va_list args; - va_start(args, format); - if(xvid_debug & level){ - vfprintf(stderr, format, args); - } - } - -# else /* _DEBUG */ -inline void DPRINTF(int level, char *format, int p=0) {} -# endif /* _DEBUG */ - -#else //Compiler test - - /* - * Ok we know nothing about the compiler, so we fallback to ANSI C - * features, so every compiler should be happy and compile the code. - * - * This is (mostly) equivalent to ARCH_IS_GENERIC. - */ - -#ifdef _DEBUG - /* Needed for all debuf fprintf calls */ -# include -# include - -static __inline void DPRINTF(int level, char *format, int p=0){ - va_list args; - va_start(args, format); - if(xvid_debug & level) { - vfprintf(stderr, format, args); - } -} - -# else //_DEBUG -inline void DPRINTF(int level, char *format, int p=0){} -#endif //_DEBUG - -#define ByteSwap(a) \ - ((a) = ((a) << 24) | (((a) & 0xff00) << 8) | (((a) >> 8) & 0xff00) | (((a) >> 24) & 0xff)) - -#define DECLARE_ALIGNED_MATRIX(name, sizex, sizey, type, alignment) \ - type name[(sizex)*(sizey)] - -#endif //Compiler test - - -#endif /* PORTAB_H */ diff --git a/modules/xvid_dec/xvid_wce/qpel.inl b/modules/xvid_dec/xvid_wce/qpel.inl deleted file mode 100644 index e4a6b74..0000000 --- a/modules/xvid_dec/xvid_wce/qpel.inl +++ /dev/null @@ -1,146 +0,0 @@ -static void FUNC_H(byte *Dst, const byte *Src, int H, int BpS, int Rnd){ - while(H-->0) { - int i, k; - int Sums[SIZE] = { 0 }; - for(i=0; i<=SIZE; ++i) - for(k=0; k> 5; - if (C<0) C = 0; else if (C>255) C = 255; - STORE(Dst[i], C); - } - Src += BpS; - Dst += BpS; - } -} - -static void FUNC_V(byte *Dst, const byte *Src, int W, int BpS, int Rnd){ - while(W-->0) { - int i, k; - int Sums[SIZE] = { 0 }; - const byte *S = Src++; - byte *D = Dst++; - for(i=0; i<=SIZE; ++i) { - for(k=0; k>5; - if (C<0) C = 0; else if (C>255) C = 255; - STORE(D[0], C); - D += BpS; - } - } -} - -static -void FUNC_HA(byte *Dst, const byte *Src, int H, int BpS, int Rnd) -{ - while(H-->0) { - int i, k; - int Sums[SIZE] = { 0 }; - for(i=0; i<=SIZE; ++i) - for(k=0; k> 5; - if (C<0) C = 0; else if (C>255) C = 255; - C = (C+Src[i]+1-Rnd) >> 1; - STORE(Dst[i], C); - } - Src += BpS; - Dst += BpS; - } -} - -static -void FUNC_HA_UP(byte *Dst, const byte *Src, int H, int BpS, int Rnd) -{ - while(H-->0) { - int i, k; - int Sums[SIZE] = { 0 }; - for(i=0; i<=SIZE; ++i) - for(k=0; k> 5; - if (C<0) C = 0; else if (C>255) C = 255; - C = (C+Src[i+1]+1-Rnd) >> 1; - STORE(Dst[i], C); - } - Src += BpS; - Dst += BpS; - } -} - -static -void FUNC_VA(byte *Dst, const byte *Src, int W, int BpS, int Rnd) -{ - while(W-->0) { - int i, k; - int Sums[SIZE] = { 0 }; - const byte *S = Src; - byte *D = Dst; - - for(i=0; i<=SIZE; ++i) { - for(k=0; k>5; - if (C<0) C = 0; else if (C>255) C = 255; - C = ( C+S[0]+1-Rnd ) >> 1; - STORE(D[0], C); - D += BpS; - S += BpS; - } - Src++; - Dst++; - } -} - -static -void FUNC_VA_UP(byte *Dst, const byte *Src, int W, int BpS, int Rnd) -{ - while(W-->0) { - int i, k; - int Sums[SIZE] = { 0 }; - const byte *S = Src; - byte *D = Dst; - - for(i=0; i<=SIZE; ++i) { - for(k=0; k>5; - if (C<0) C = 0; else if (C>255) C = 255; - C = ( C+S[0]+1-Rnd ) >> 1; - STORE(D[0], C); - D += BpS; - S += BpS; - } - Dst++; - Src++; - } -} - -#undef STORE -#undef FUNC_H -#undef FUNC_V -#undef FUNC_HA -#undef FUNC_VA -#undef FUNC_HA_UP -#undef FUNC_VA_UP diff --git a/modules/xvid_dec/xvid_wce/qpel_tab.cpp b/modules/xvid_dec/xvid_wce/qpel_tab.cpp deleted file mode 100644 index a9352d8..0000000 --- a/modules/xvid_dec/xvid_wce/qpel_tab.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "portab.h" - -//---------------------------- -// Quarterpel FIR definition - -static const int FIR_Tab_16[17][16] = { - { 14, -3, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 23, 19, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { -7, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -7 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 19, 23 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 2, -3, 14 } -}; - -static const int FIR_Tab_8[9][8] = { - { 14, -3, 2, -1, 0, 0, 0, 0 }, - { 23, 19, -6, 3, -1, 0, 0, 0 }, - { -7, 20, 20, -6, 3, -1, 0, 0 }, - { 3, -6, 20, 20, -6, 3, -1, 0 }, - { -1, 3, -6, 20, 20, -6, 3, -1 }, - { 0, -1, 3, -6, 20, 20, -6, 3 }, - { 0, 0, -1, 3, -6, 20, 20, -7 }, - { 0, 0, 0, -1, 3, -6, 19, 23 }, - { 0, 0, 0, 0, -1, 2, -3, 14 } -}; - - -//---------------------------- - -/* Implementation - ****************************************************************************/ - -/* 16x? filters */ - -#define SIZE 16 -#define TABLE FIR_Tab_16 - -#define STORE(d,s) (d) = (s) -#define FUNC_H H_Pass_16_C -#define FUNC_V V_Pass_16_C -#define FUNC_HA H_Pass_Avrg_16_C -#define FUNC_VA V_Pass_Avrg_16_C -#define FUNC_HA_UP H_Pass_Avrg_Up_16_C -#define FUNC_VA_UP V_Pass_Avrg_Up_16_C - -#include "qpel.inl" - -/* note: B-frame always uses Rnd=0... */ -#define STORE(d,s) (d) = ( (s)+(d)+1 ) >> 1 -#define FUNC_H H_Pass_16_Add_C -#define FUNC_V V_Pass_16_Add_C -#define FUNC_HA H_Pass_Avrg_16_Add_C -#define FUNC_VA V_Pass_Avrg_16_Add_C -#define FUNC_HA_UP H_Pass_Avrg_Up_16_Add_C -#define FUNC_VA_UP V_Pass_Avrg_Up_16_Add_C - -#include "qpel.inl" - -#undef SIZE -#undef TABLE - -/* 8x? filters */ - -#define SIZE 8 -#define TABLE FIR_Tab_8 - -#define STORE(d,s) (d) = (s) -#define FUNC_H H_Pass_8_C -#define FUNC_V V_Pass_8_C -#define FUNC_HA H_Pass_Avrg_8_C -#define FUNC_VA V_Pass_Avrg_8_C -#define FUNC_HA_UP H_Pass_Avrg_Up_8_C -#define FUNC_VA_UP V_Pass_Avrg_Up_8_C - -#include "qpel.inl" - -/* note: B-frame always uses Rnd=0... */ -#define STORE(d,s) (d) = ( (s)+(d)+1 ) >> 1 -#define FUNC_H H_Pass_8_Add_C -#define FUNC_V V_Pass_8_Add_C -#define FUNC_HA H_Pass_Avrg_8_Add_C -#define FUNC_VA V_Pass_Avrg_8_Add_C -#define FUNC_HA_UP H_Pass_Avrg_Up_8_Add_C -#define FUNC_VA_UP V_Pass_Avrg_Up_8_Add_C - -#include "qpel.inl" - -#undef SIZE -#undef TABLE - -//---------------------------- - diff --git a/modules/xvid_dec/xvid_wce/quant.h b/modules/xvid_dec/xvid_wce/quant.h deleted file mode 100644 index 629076f..0000000 --- a/modules/xvid_dec/xvid_wce/quant.h +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - (de)Quantization related header - - * - * Copyright(C) 2003 Edouard Gomez - * - * 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: quant.h,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _QUANT_H_ -#define _QUANT_H_ - -#include "portab.h" - -/***************************************************************************** - * Common API for Intra (de)Quant functions - ****************************************************************************/ - -typedef void (quant_intraFunc)(int *coeff, const int *data, dword quant, dword dcscalar, const dword *mpeg_quant_matrices); - -typedef quant_intraFunc *quant_intraFuncPtr; - -/* DeQuant functions */ -quant_intraFunc dequant_h263_intra; -quant_intraFunc dequant_mpeg_intra; - -/***************************************************************************** - * Common API for Inter (de)Quant functions - ****************************************************************************/ - -typedef void (quant_interFunc)(int *coeff, const int* data, dword quant, const dword *mpeg_quant_matrices); - -typedef quant_interFunc *quant_interFuncPtr; - -quant_interFunc dequant_h263_inter; -quant_interFunc dequant_mpeg_inter; - -#endif /* _QUANT_H_ */ diff --git a/modules/xvid_dec/xvid_wce/quant_h263.cpp b/modules/xvid_dec/xvid_wce/quant_h263.cpp deleted file mode 100644 index 8eb36be..0000000 --- a/modules/xvid_dec/xvid_wce/quant_h263.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - MPEG4 Quantization H263 implementation - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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: quant_h263.cpp,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#include "global.h" -#include "quant.h" - -//---------------------------- -/* dequantize intra-block & clamp to [-2048,2047] - */ -void dequant_h263_intra(int *data, const int *coeff, dword quant, dword dcscalar, const dword *mpeg_quant_matrices){ - - const int quant_m_2 = quant << 1; - const int quant_add = (quant & 1 ? quant : quant - 1); - - data[0] = *coeff++ * dcscalar; - if(data[0] < -2048){ - data[0] = -2048; - }//else - if(data[0] > 2047){ - data[0] = 2047; - } - for(int i = 1; i < 64; i++){ - int acLevel = *coeff++; - - if(acLevel == 0){ - data[i] = 0; - }else - if(acLevel < 0){ - acLevel = quant_m_2 * -acLevel + quant_add; - data[i] = (acLevel <= 2048 ? -acLevel : -2048); - }else{ - acLevel = quant_m_2 * acLevel + quant_add; - data[i] = (acLevel <= 2047 ? acLevel : 2047); - } - } -} - -//---------------------------- -/* dequantize inter-block & clamp to [-2048,2047] - */ - -void dequant_h263_inter(int *data, const int *coeff, dword quant, const dword *mpeg_quant_matrices){ - - const dword quant_m_2 = quant << 1; - const dword quant_add = (quant & 1 ? quant : quant - 1); - - for(int i = 0; i < 64; i++){ - int acLevel = *coeff++; - - if(acLevel == 0){ - data[i] = 0; - }else - if(acLevel < 0){ - acLevel = acLevel * quant_m_2 - quant_add; - data[i] = (acLevel >= -2048 ? acLevel : -2048); - }else{ - acLevel = acLevel * quant_m_2 + quant_add; - data[i] = (acLevel <= 2047 ? acLevel : 2047); - } - } -} - -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/quant_matrix.cpp b/modules/xvid_dec/xvid_wce/quant_matrix.cpp deleted file mode 100644 index e2ac83c..0000000 --- a/modules/xvid_dec/xvid_wce/quant_matrix.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Quantization matrix management code - - * - * Copyright(C) 2002 Michael Militzer - * 2002 Peter Ross - * - * 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: quant_matrix.cpp,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#include "quant_matrix.h" - -#define FIX(X) (((X)==1) ? 0xFFFF : ((1UL << 16) / (X) + 1)) -#define FIXL(X) ((1UL << 16) / (X) - 1) - -/***************************************************************************** - * Default matrices - ****************************************************************************/ - -static const byte default_intra_matrix[64] = { - 8, 17, 18, 19, 21, 23, 25, 27, - 17, 18, 19, 21, 23, 25, 27, 28, - 20, 21, 22, 23, 24, 26, 28, 30, - 21, 22, 23, 24, 26, 28, 30, 32, - 22, 23, 24, 26, 28, 30, 32, 35, - 23, 24, 26, 28, 30, 32, 35, 38, - 25, 26, 28, 30, 32, 35, 38, 41, - 27, 28, 30, 32, 35, 38, 41, 45 -}; - -//---------------------------- - -static const byte default_inter_matrix[64] = { - 16, 17, 18, 19, 20, 21, 22, 23, - 17, 18, 19, 20, 21, 22, 23, 24, - 18, 19, 20, 21, 22, 23, 24, 25, - 19, 20, 21, 22, 23, 24, 26, 27, - 20, 21, 22, 23, 25, 26, 27, 28, - 21, 22, 23, 24, 26, 27, 28, 30, - 22, 23, 24, 26, 27, 28, 30, 31, - 23, 24, 25, 27, 28, 30, 31, 33 -}; - -//---------------------------- - -const byte *get_default_intra_matrix(){ - return default_intra_matrix; -} - -//---------------------------- - -const byte *get_default_inter_matrix(){ - return default_inter_matrix; -} - -//---------------------------- - -void set_intra_matrix(dword *mpeg_quant_matrices, const byte *matrix){ - - dword *intra_matrix = mpeg_quant_matrices + 0*64; - dword *intra_matrix1 = mpeg_quant_matrices + 1*64; - dword *intra_matrix_fix = mpeg_quant_matrices + 2*64; - dword *intra_matrix_fixl = mpeg_quant_matrices + 3*64; - - for(int i = 0; i < 64; i++) { - intra_matrix[i] = (!i) ? 8 : matrix[i]; - intra_matrix1[i] = (intra_matrix[i]>>1); - intra_matrix1[i] += ((intra_matrix[i] == 1) ? 1: 0); - intra_matrix_fix[i] = FIX(intra_matrix[i]); - intra_matrix_fixl[i] = FIXL(intra_matrix[i]); - } -} - -//---------------------------- - -void set_inter_matrix(dword *mpeg_quant_matrices, const byte *matrix){ - - dword *inter_matrix = mpeg_quant_matrices + 4*64; - dword *inter_matrix1 = mpeg_quant_matrices + 5*64; - dword *inter_matrix_fix = mpeg_quant_matrices + 6*64; - dword *inter_matrix_fixl = mpeg_quant_matrices + 7*64; - - for(int i = 0; i < 64; i++){ - inter_matrix1[i] = ((inter_matrix[i] = matrix[i])>>1); - inter_matrix1[i] += ((inter_matrix[i] == 1) ? 1: 0); - inter_matrix_fix[i] = FIX(inter_matrix[i]); - inter_matrix_fixl[i] = FIXL(inter_matrix[i]); - } -} - -//---------------------------- - -void init_mpeg_matrix(dword *mpeg_quant_matrices){ - - set_intra_matrix(mpeg_quant_matrices, default_intra_matrix); - set_inter_matrix(mpeg_quant_matrices, default_inter_matrix); -} - -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/quant_matrix.h b/modules/xvid_dec/xvid_wce/quant_matrix.h deleted file mode 100644 index f0c0c11..0000000 --- a/modules/xvid_dec/xvid_wce/quant_matrix.h +++ /dev/null @@ -1,44 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Quantization matrix management header - - * - * Copyright(C) 2002 Michael Militzer - * 2002 Peter Ross - * - * 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: quant_matrix.h,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _QUANT_MATRIX_H_ -#define _QUANT_MATRIX_H_ - -#include "portab.h" -#include "Rules.h" - -void init_mpeg_matrix(dword *mpeg_quant_matrices); - -void set_intra_matrix(dword *mpeg_quant_matrices, const byte *matrix); -void set_inter_matrix(dword *mpeg_quant_matrices, const byte *matrix); - -inline const dword *get_intra_matrix(const dword *mpeg_quant_matrices){ return (mpeg_quant_matrices + 0*64); } -inline const dword *get_inter_matrix(const dword *mpeg_quant_matrices){ return(mpeg_quant_matrices + 4*64); } - -const byte *get_default_intra_matrix(void); -const byte *get_default_inter_matrix(void); - -#endif /* _QUANT_MATRIX_H_ */ diff --git a/modules/xvid_dec/xvid_wce/quant_mpeg.cpp b/modules/xvid_dec/xvid_wce/quant_mpeg.cpp deleted file mode 100644 index 7e0e67e..0000000 --- a/modules/xvid_dec/xvid_wce/quant_mpeg.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - MPEG4 Quantization related header - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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: quant_mpeg.cpp,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#include "global.h" -#include "quant.h" -#include "quant_matrix.h" - -//---------------------------- -/* dequantize intra-block & clamp to [-2048,2047] - * - * data[i] = (coeff[i] * default_intra_matrix[i] * quant2) >> 4; - */ -void dequant_mpeg_intra(int *data, const int *coeff, dword quant, dword dcscalar, const dword *mpeg_quant_matrices){ - - const dword *intra_matrix = get_intra_matrix(mpeg_quant_matrices); - - data[0] = coeff[0] * dcscalar; - if(data[0] < -2048){ - data[0] = -2048; - }else - if(data[0] > 2047){ - data[0] = 2047; - } - - for(int i = 1; i < 64; i++){ - if(coeff[i] == 0){ - data[i] = 0; - }else - if(coeff[i] < 0){ - int level = -coeff[i]; - - level = (level * intra_matrix[i] * quant) >> 3; - data[i] = (level <= 2048 ? -level : -2048); - }else{ - dword level = coeff[i]; - - level = (level * intra_matrix[i] * quant) >> 3; - data[i] = (level <= 2047 ? level : 2047); - } - } -} - -//---------------------------- -/* dequantize inter-block & clamp to [-2048,2047] - * data = ((2 * coeff + SIGN(coeff)) * inter_matrix[i] * quant) / 16 - */ - -void dequant_mpeg_inter(int *data, const int *coeff, dword quant, const dword *mpeg_quant_matrices){ - - dword sum = 0; - const dword *inter_matrix = get_inter_matrix(mpeg_quant_matrices); - - for(int i = 0; i < 64; i++){ - if(coeff[i] == 0){ - data[i] = 0; - }else - if(coeff[i] < 0){ - int level = -coeff[i]; - - level = ((2 * level + 1) * inter_matrix[i] * quant) >> 4; - data[i] = (level <= 2048 ? -level : -2048); - }else{ - dword level = coeff[i]; - level = ((2 * level + 1) * inter_matrix[i] * quant) >> 4; - data[i] = (level <= 2047 ? level : 2047); - } - sum ^= data[i]; - } - /* mismatch control */ - if ((sum & 1) == 0) { - data[63] ^= 1; - } -} - -//---------------------------- - diff --git a/modules/xvid_dec/xvid_wce/reduced.cpp b/modules/xvid_dec/xvid_wce/reduced.cpp deleted file mode 100644 index 9a0bb72..0000000 --- a/modules/xvid_dec/xvid_wce/reduced.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * Reduced-Resolution utilities - * - * Copyright(C) 2002 Pascal Massimino - * - * This file is part of XviD, a free MPEG-4 video encoder/decoder - * - * XviD 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 - * - * Under section 8 of the GNU General Public License, the copyright - * holders of XVID explicitly forbid distribution in the following - * countries: - * - * - Japan - * - United States of America - * - * Linking XviD statically or dynamically with other modules is making a - * combined work based on XviD. Thus, the terms and conditions of the - * GNU General Public License cover the whole combination. - * - * As a special exception, the copyright holders of XviD give you - * permission to link XviD with independent modules that communicate with - * XviD solely through the VFW1.1 and DShow interfaces, regardless of the - * license terms of these independent modules, and to copy and distribute - * the resulting combined work under terms of your choice, provided that - * every copy of the combined work is accompanied by a complete copy of - * the source code of XviD (the version of XviD used to produce the - * combined work), being distributed under the terms of the GNU General - * Public License plus this exception. An independent module is a module - * which is not derived from or based on XviD. - * - * Note that people who make modified versions of XviD are not obligated - * to grant this special exception for their modified versions; it is - * their choice whether to do so. The GNU General Public License gives - * permission to release a modified version without this exception; this - * exception also makes it possible to release a modified version which - * carries forward this exception. - * - * $Id: reduced.cpp,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#include "portab.h" -#include "global.h" -#include "reduced.h" - -/*---------------------------------------------------------------------------- - * Upsampling (1/3/3/1) filter - *--------------------------------------------------------------------------*/ - -#define ADD(dst,src) (dst) = CLIP((dst)+(src), 0, 255) - -inline void Filter_31(byte *Dst1, byte *Dst2, const int *Src1, const int *Src2){ - - /* Src[] is assumed to be >=0. So we can use ">>2" instead of "/2" */ - int a = (3*Src1[0]+ Src2[0]+2) >> 2; - int b = ( Src1[0]+3*Src2[0]+2) >> 2; - Dst1[0] = CLIP(a, 0, 255); - Dst2[0] = CLIP(b, 0, 255); -} - -//---------------------------- - -inline void Filter_9331(byte *Dst1, byte *Dst2, const int *Src1, const int *Src2){ - - /* Src[] is assumed to be >=0. So we can use ">>4" instead of "/16" */ - int a = (9*Src1[0]+ 3*Src1[1]+ 3*Src2[0] + 1*Src2[1] + 8) >> 4; - int b = (3*Src1[0]+ 9*Src1[1]+ 1*Src2[0] + 3*Src2[1] + 8) >> 4; - int c = (3*Src1[0]+ 1*Src1[1]+ 9*Src2[0] + 3*Src2[1] + 8) >> 4; - int d = (1*Src1[0]+ 3*Src1[1]+ 3*Src2[0] + 9*Src2[1] + 8) >> 4; - Dst1[0] = CLIP(a, 0, 255); - Dst1[1] = CLIP(b, 0, 255); - Dst2[0] = CLIP(c, 0, 255); - Dst2[1] = CLIP(d, 0, 255); -} - -//---------------------------- - -void copy_upsampled_8x8_16to8(byte *Dst, const int *Src, int BpS){ - int x, y; - - Dst[0] = CLIP(Src[0], 0, 255); - for(x=0; x<7; ++x) - Filter_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); - Dst[15] = CLIP(Src[7], 0, 255); - Dst += BpS; - for(y=0; y<7; ++y) { - byte *const Dst2 = Dst + BpS; - Filter_31(Dst, Dst2, Src, Src+8); - for(x=0; x<7; ++x) - Filter_9331(Dst+2*x+1, Dst2+2*x+1, Src+x, Src+x+8); - Filter_31(Dst+15, Dst2+15, Src+7, Src+7+8); - Src += 8; - Dst += 2*BpS; - } - Dst[0] = CLIP(Src[0], 0, 255); - for(x=0; x<7; ++x) Filter_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); - Dst[15] = CLIP(Src[7], 0, 255); -} - -//---------------------------- - -inline void Filter_Add_31(byte *Dst1, byte *Dst2, const int *Src1, const int *Src2){ - - /* Here, we must use "/4", since Src[] is in [-256, 255] */ - int a = (3*Src1[0]+ Src2[0] + 2) / 4; - int b = ( Src1[0]+3*Src2[0] + 2) / 4; - ADD(Dst1[0], a); - ADD(Dst2[0], b); -} - -//---------------------------- - -inline void Filter_Add_9331(byte *Dst1, byte *Dst2, const int *Src1, const int *Src2){ - - int a = (9*Src1[0]+ 3*Src1[1]+ 3*Src2[0] + 1*Src2[1] + 8) / 16; - int b = (3*Src1[0]+ 9*Src1[1]+ 1*Src2[0] + 3*Src2[1] + 8) / 16; - int c = (3*Src1[0]+ 1*Src1[1]+ 9*Src2[0] + 3*Src2[1] + 8) / 16; - int d = (1*Src1[0]+ 3*Src1[1]+ 3*Src2[0] + 9*Src2[1] + 8) / 16; - ADD(Dst1[0], a); - ADD(Dst1[1], b); - ADD(Dst2[0], c); - ADD(Dst2[1], d); -} - -//---------------------------- - -void add_upsampled_8x8_16to8(byte *Dst, const int *Src, const int BpS){ - - int x, y; - - ADD(Dst[0], Src[0]); - for(x=0; x<7; ++x) - Filter_Add_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); - ADD(Dst[15], Src[7]); - Dst += BpS; - for(y=0; y<7; ++y) { - byte *const Dst2 = Dst + BpS; - Filter_Add_31(Dst, Dst2, Src, Src+8); - for(x=0; x<7; ++x) - Filter_Add_9331(Dst+2*x+1, Dst2+2*x+1, Src+x, Src+x+8); - Filter_Add_31(Dst+15, Dst2+15, Src+7, Src+7+8); - Src += 8; - Dst += 2*BpS; - } - ADD(Dst[0], Src[0]); - for(x=0; x<7; ++x) Filter_Add_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); - ADD(Dst[15], Src[7]); -} -#undef ADD - -/*---------------------------------------------------------------------------- - * horizontal and vertical deblocking - *--------------------------------------------------------------------------*/ - -void hfilter_31(byte *Src1, byte *Src2, int Nb_Blks){ - - Nb_Blks *= 8; - while(Nb_Blks-->0) { - byte a = ( 3*Src1[0] + 1*Src2[0] + 2 ) >> 2; - byte b = ( 1*Src1[0] + 3*Src2[0] + 2 ) >> 2; - *Src1++ = a; - *Src2++ = b; - } -} - -//---------------------------- - -void vfilter_31(byte *Src1, byte *Src2, const int BpS, int Nb_Blks){ - Nb_Blks *= 8; - while(Nb_Blks-->0) { - byte a = ( 3*Src1[0] + 1*Src2[0] + 2 ) >> 2; - byte b = ( 1*Src1[0] + 3*Src2[0] + 2 ) >> 2; - *Src1 = a; - *Src2 = b; - Src1 += BpS; - Src2 += BpS; - } -} - -//---------------------------- diff --git a/modules/xvid_dec/xvid_wce/reduced.h b/modules/xvid_dec/xvid_wce/reduced.h deleted file mode 100644 index 9ab7177..0000000 --- a/modules/xvid_dec/xvid_wce/reduced.h +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Reduced VOP header - - * - * Copyright(C) 2002 Pascal Massimino - * - * 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: reduced.h,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _REDUCED_H_ -#define _REDUCED_H_ - -#include "portab.h" - -/* decoding */ -typedef void (COPY_UPSAMPLED_8X8_16TO8)(byte *Dst, const int *Src, int BpS); -typedef void (ADD_UPSAMPLED_8X8_16TO8)(byte *Dst, const int *Src, int BpS); - -/* deblocking: Note: "Nb"_Blks is the number of 8-pixels blocks to process */ -typedef void HFILTER_31(byte *Src1, byte *Src2, int Nb_Blks); -typedef void VFILTER_31(byte *Src1, byte *Src2, int BpS, int Nb_Blks); - -/* encoding: WARNING! These read 1 pixel outside of the input 16x16 block! */ -typedef void FILTER_18X18_TO_8X8(int *Dst, const byte *Src, int BpS); -typedef void FILTER_DIFF_18X18_TO_8X8(int *Dst, const byte *Src, int BpS); - - -extern COPY_UPSAMPLED_8X8_16TO8 copy_upsampled_8x8_16to8; -extern ADD_UPSAMPLED_8X8_16TO8 add_upsampled_8x8_16to8; - -extern VFILTER_31 vfilter_31; - -extern HFILTER_31 hfilter_31; - -/* rrv motion vector scale-up */ -#define RRV_MV_SCALEUP(a) ( (a)>0 ? 2*(a)-1 : (a)<0 ? 2*(a)+1 : (a) ) - -#endif /* _REDUCED_H_ */ diff --git a/modules/xvid_dec/xvid_wce/vlc_codes.h b/modules/xvid_dec/xvid_wce/vlc_codes.h deleted file mode 100644 index a802063..0000000 --- a/modules/xvid_dec/xvid_wce/vlc_codes.h +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Variable Length Code header - - * - * Copyright(C) 2002 Michael Militzer - * - * 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: vlc_codes.h,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ -#ifndef _VLC_CODES_H_ -#define _VLC_CODES_H_ - -#include "portab.h" - -#define VLC_ERROR (-1) - -#define ESCAPE 3 -#define ESCAPE1 6 -#define ESCAPE2 14 -#define ESCAPE3 15 - -struct VLC{ - int code; - byte len; -}; - -struct EVENT{ - byte last; - byte run; - char level; -}; - - - -#endif /* _VLC_CODES_H */ diff --git a/modules/xvid_dec/xvid_wce/xvid.cpp b/modules/xvid_dec/xvid_wce/xvid.cpp deleted file mode 100644 index 924d77a..0000000 --- a/modules/xvid_dec/xvid_wce/xvid.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - Native API implementation - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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: xvid.cpp,v 1.1.1.1 2005-07-13 14:36:16 jeanlf Exp $ - * - ****************************************************************************/ - -#include "xvid.h" -#include "decoder.h" -#include "interpolate8x8.h" -#include "reduced.h" -#include "mem_transfer.h" -#include "quant.h" - -#ifdef _DEBUG -dword xvid_debug = 0; -#endif - -/***************************************************************************** - * XviD Init Entry point - * - * Well this function initialize all internal function pointers according - * to the CPU features forced by the library client or autodetected (depending - * on the XVID_CPU_FORCE flag). It also initializes vlc coding tables and all - * image colorspace transformation tables. - * - * Returned value : XVID_ERR_OK - * + API_VERSION in the input XVID_INIT_PARAM structure - * + core build " " " " " - * - ****************************************************************************/ - - -static int xvid_gbl_init(xvid_gbl_init_t * init){ - //unsigned int cpu_flags; - - if (XVID_VERSION_MAJOR(init->version) != 1) - return XVID_ERR_VERSION; - -#if defined(_DEBUG) - xvid_debug = init->debug; -#endif - - return 0; -} - -/***************************************************************************** - * XviD Global Entry point - * - * Well this function initialize all internal function pointers according - * to the CPU features forced by the library client or autodetected (depending - * on the XVID_CPU_FORCE flag). It also initializes vlc coding tables and all - * image colorspace transformation tables. - * - ****************************************************************************/ - -int xvid_global(void *handle, int opt, void *param1, void *param2){ - - switch(opt){ - case XVID_GBL_INIT : - return xvid_gbl_init((xvid_gbl_init_t*)param1); - /* - case XVID_GBL_INFO : - return xvid_gbl_info((xvid_gbl_info_t*)param1); - case XVID_GBL_CONVERT: - return xvid_gbl_convert((xvid_gbl_convert_t*)param1); - */ - - default : - return XVID_ERR_FAIL; - } -} - -/***************************************************************************** - * XviD Native decoder entry point - * - * This function is just a wrapper to all the option cases. - * - * Returned values : XVID_ERR_FAIL when opt is invalid - * else returns the wrapped function result - * - ****************************************************************************/ -int xvid_decore(void *handle, int opt, void *param1, void *param2){ - - switch (opt) { - case XVID_DEC_CREATE: - return decoder_create((xvid_dec_create_t *) param1); - - case XVID_DEC_DESTROY: - delete (S_decoder*)handle; - return 0; - - case XVID_DEC_DECODE: - return ((S_decoder*)handle)->Decode((xvid_dec_frame_t *) param1, (xvid_dec_stats_t*) param2); - - default: - return XVID_ERR_FAIL; - } -} - -//---------------------------- - -extern const dword scan_tables[3][64]; -const dword scan_tables[3][64] = { - /* zig_zag_scan */ - { 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63}, - - /* horizontal_scan */ - { 0, 1, 2, 3, 8, 9, 16, 17, - 10, 11, 4, 5, 6, 7, 15, 14, - 13, 12, 19, 18, 24, 25, 32, 33, - 26, 27, 20, 21, 22, 23, 28, 29, - 30, 31, 34, 35, 40, 41, 48, 49, - 42, 43, 36, 37, 38, 39, 44, 45, - 46, 47, 50, 51, 56, 57, 58, 59, - 52, 53, 54, 55, 60, 61, 62, 63}, - - /* vertical_scan */ - { 0, 8, 16, 24, 1, 9, 2, 10, - 17, 25, 32, 40, 48, 56, 57, 49, - 41, 33, 26, 18, 3, 11, 4, 12, - 19, 27, 34, 42, 50, 58, 35, 43, - 51, 59, 20, 28, 5, 13, 6, 14, - 21, 29, 36, 44, 52, 60, 37, 45, - 53, 61, 22, 30, 7, 15, 23, 31, - 38, 46, 54, 62, 39, 47, 55, 63} -}; - -//---------------------------- - -#ifdef WIN32 -# include -# include - -#ifdef _DEBUG -# define snprintf _snprintf -# define vsnprintf _vsnprintf - -void DPRINTF(int level, char *fmt, int p){ - if(xvid_debug & level){ - //va_list args; - char buf[DPRINTF_BUF_SZ]; - //va_start(args, fmt); - //vsprintf(buf, fmt, args); - sprintf(buf, fmt, p); - OutputDebugString(buf); - //fprintf(stderr, "%s", buf); - } -} -#endif - -#elif defined _WINDOWS - -inline void DPRINTF(int level, char *fmt, int p){ -} - -#endif - -//---------------------------- - diff --git a/modules/xvid_dec/xvid_wce/xvid.h b/modules/xvid_dec/xvid_wce/xvid.h deleted file mode 100644 index 29eb1eb..0000000 --- a/modules/xvid_dec/xvid_wce/xvid.h +++ /dev/null @@ -1,502 +0,0 @@ -/***************************************************************************** - * - * XVID MPEG-4 VIDEO CODEC - * - XviD Main header file - - * - * Copyright(C) 2001-2003 Peter Ross - * - * 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: xvid.h,v 1.2 2006-12-13 15:12:27 jeanlf Exp $ - * - ****************************************************************************/ - -#ifndef _XVID_H_ -#define _XVID_H_ - -#ifdef __cplusplus -extern "C" { -#endif - - -#include "Rules.h" - - -#ifdef PROFILE -#include -#define PROF_S(n) prof.MarkS(n) -#define PROF_E(n) prof.MarkE(n) - -enum{ - PROF_TICK, - PROF_CONV, - PROF_UPD, - PROF_DECODE, - PROF_DRAWTXT, - PROF_FRM_I, - PROF_FRM_P, - PROF_BINT_MBI, - PROF_FRM_B, - PROF_0, - PROF_1, - PROF_2, - PROF_3, - PROF_4, - PROF_5, - PROF_6, - PROF_7, -}; - -#else -#define PROF_S(n) -#define PROF_E(n) -#endif - -#ifdef __MARM__ -//#define USE_ARM_ASM -#endif - -/***************************************************************************** - * versioning - ****************************************************************************/ - -/* versioning - version takes the form "$major.$minor.$patch" - $patch is incremented when there is no api change - $minor is incremented when the api is changed, but remains backwards compatible - $major is incremented when the api is changed significantly - - when initialising an xvid structure, you must always zero it, and set the version field. - memset(&struct,0,sizeof(struct)); - struct.version = XVID_VERSION; - - XVID_UNSTABLE is defined only during development. - */ - -#define XVID_MAKE_VERSION(a,b,c) ((((a)&0xff)<<16) | (((b)&0xff)<<8) | ((c)&0xff)) -#define XVID_VERSION_MAJOR(a) ((char)(((a)>>16) & 0xff)) -#define XVID_VERSION_MINOR(a) ((char)(((a)>> 8) & 0xff)) -#define XVID_VERSION_PATCH(a) ((char)(((a)>> 0) & 0xff)) - -#define XVID_MAKE_API(a,b) ((((a)&0xff)<<16) | (((b)&0xff)<<0)) -#define XVID_API_MAJOR(a) (((a)>>16) & 0xff) -#define XVID_API_MINOR(a) (((a)>> 0) & 0xff) - -#define XVID_VERSION XVID_MAKE_VERSION(1,0,-127) -#define XVID_API XVID_MAKE_API(4, 0) - -#define EDGE_SIZE 16 - -#define XVID_UNSTABLE - -/* Bitstream Version - * this will be writen into the bitstream to allow easy detection of xvid - * encoder bugs in the decoder, without this it might not possible to - * automatically distinquish between a file which has been encoded with an - * old & buggy XVID from a file which has been encoded with a bugfree version - * see the infamous interlacing bug ... - * - * this MUST be increased if an encoder bug is fixed, increasing it too often - * doesnt hurt but not increasing it could cause difficulty for decoders in the - * future - */ -#define XVID_BS_VERSION "0023" - - -/***************************************************************************** - * error codes - ****************************************************************************/ - - /* all functions return values <0 indicate error */ - -#define XVID_ERR_FAIL -1 /* general fault */ -#define XVID_ERR_MEMORY -2 /* memory allocation error */ -#define XVID_ERR_FORMAT -3 /* file format error */ -#define XVID_ERR_VERSION -4 /* structure version not supported */ -#define XVID_ERR_END -5 /* encoder only; end of stream reached */ - - - -/***************************************************************************** - * xvid_image_t - ****************************************************************************/ - -/* colorspace values */ - -//#define XVID_CSP_USER (1<< 0) /* 4:2:0 planar */ -//#define XVID_CSP_I420 (1<< 1) /* 4:2:0 packed(planar win32) */ -//#define XVID_CSP_YV12 (1<< 2) /* 4:2:0 packed(planar win32) */ -//#define XVID_CSP_YUY2 (1<< 3) /* 4:2:2 packed */ -//#define XVID_CSP_UYVY (1<< 4) /* 4:2:2 packed */ -//#define XVID_CSP_YVYU (1<< 5) /* 4:2:2 packed */ -//#define XVID_CSP_BGRA (1<< 6) /* 32-bit bgra packed */ -//#define XVID_CSP_ABGR (1<< 7) /* 32-bit abgr packed */ -//#define XVID_CSP_RGBA (1<< 8) /* 32-bit rgba packed */ -//#define XVID_CSP_BGR (1<< 9) /* 24-bit bgr packed */ -//#define XVID_CSP_RGB555 (1<<10) /* 16-bit rgb555 packed */ -//#define XVID_CSP_RGB565 (1<<11) /* 16-bit rgb565 packed */ -//#define XVID_CSP_SLICE (1<<12) /* decoder only: 4:2:0 planar, per slice rendering */ -//#define XVID_CSP_INTERNAL (1<<13) /* decoder only: 4:2:0 planar, returns ptrs to internal buffers */ -//#define XVID_CSP_NULL (1<<14) /* decoder only: dont output anything */ -//#define XVID_CSP_VFLIP (1<<31) /* vertical flip mask */ - -/* xvid_image_t - for non-planar colorspaces use only plane[0] and stride[0] - four plane reserved for alpha*/ -/* -typedef struct { - int csp; // [in] colorspace; or with XVID_CSP_VFLIP to perform vertical flip - void *plane; // [in] image plane ptrs - int stride; // [in] image stride; "bytes per row" -} xvid_image_t; -*/ - -/* video-object-sequence profiles */ -#define XVID_PROFILE_S_L0 0x08 /* simple */ -#define XVID_PROFILE_S_L1 0x01 -#define XVID_PROFILE_S_L2 0x02 -#define XVID_PROFILE_S_L3 0x03 -#define XVID_PROFILE_ARTS_L1 0x91 /* advanced realtime simple */ -#define XVID_PROFILE_ARTS_L2 0x92 -#define XVID_PROFILE_ARTS_L3 0x93 -#define XVID_PROFILE_ARTS_L4 0x94 -#define XVID_PROFILE_AS_L0 0xf0 /* advanced simple */ -#define XVID_PROFILE_AS_L1 0xf1 -#define XVID_PROFILE_AS_L2 0xf2 -#define XVID_PROFILE_AS_L3 0xf3 -#define XVID_PROFILE_AS_L4 0xf4 - -/* aspect ratios */ -#define XVID_PAR_11_VGA 1 /* 1:1 vga (square), default if AR is not precised (ie: ==0) */ -#define XVID_PAR_43_PAL 2 /* 4:3 pal (12:11 625-line) */ -#define XVID_PAR_43_NTSC 3 /* 4:3 ntsc (10:11 525-line) */ -#define XVID_PAR_169_PAL 4 /* 16:9 pal (16:11 625-line) */ -#define XVID_PAR_169_NTSC 5 /* 16:9 ntsc (40:33 525-line) */ -#define XVID_PAR_EXT 15 /* extended par; use par_width, par_height */ - -/* frame type flags */ -#define XVID_TYPE_VOL -1 /* decoder only: vol was decoded */ -#define XVID_TYPE_NOTHING 0 /* decoder only (encoder stats): nothing was decoded/encoded */ -#define XVID_TYPE_AUTO 0 /* encoder: automatically determine coding type */ -#define XVID_TYPE_IVOP 1 /* intra frame */ -#define XVID_TYPE_PVOP 2 /* predicted frame */ -#define XVID_TYPE_BVOP 3 /* bidirectionally encoded */ -#define XVID_TYPE_SVOP 4 /* predicted+sprite frame */ - - -/***************************************************************************** - * xvid_global() - ****************************************************************************/ - -/* cpu_flags definitions (make sure to sync this with cpuid.asm for ia32) */ - -//#define XVID_CPU_FORCE (1<<31) /* force passed cpu flags */ -//#define XVID_CPU_ASM (1<< 7) /* native assembly */ -/* ARCH_IS_IA32 */ -//#define XVID_CPU_MMX (1<< 0) /* mmx : pentiumMMX,k6 */ -//#define XVID_CPU_MMXEXT (1<< 1) /* mmx-ext : pentium2, athlon */ -//#define XVID_CPU_SSE (1<< 2) /* sse : pentium3, athlonXP */ -//#define XVID_CPU_SSE2 (1<< 3) /* sse2 : pentium4, athlon64 */ -//#define XVID_CPU_3DNOW (1<< 4) /* 3dnow : k6-2 */ -//#define XVID_CPU_3DNOWEXT (1<< 5) /* 3dnow-ext : athlon */ -//#define XVID_CPU_TSC (1<< 6) /* tsc : Pentium */ -/* ARCH_IS_PPC */ -//#define XVID_CPU_ALTIVEC (1<< 0) /* altivec */ - - -#define XVID_DEBUG_ERROR (1<< 0) -#define XVID_DEBUG_STARTCODE (1<< 1) -#define XVID_DEBUG_HEADER (1<< 2) -#define XVID_DEBUG_TIMECODE (1<< 3) -#define XVID_DEBUG_MB (1<< 4) -#define XVID_DEBUG_COEFF (1<< 5) -#define XVID_DEBUG_MV (1<< 6) -#define XVID_DEBUG_RC (1<< 7) -#define XVID_DEBUG_DEBUG (1<<31) - -/* XVID_GBL_INIT param1 */ -typedef struct { - int version; - unsigned int cpu_flags; /* [in:opt] zero = autodetect cpu; XVID_CPU_FORCE|{cpu features} = force cpu features */ - int debug; /* [in:opt] debug level */ -} xvid_gbl_init_t; - - -/* XVID_GBL_INFO param1 */ -#if 0 -typedef struct { - int version; - int actual_version; // [out] returns the actual xvidcore version - const char * build; // [out] if !null, points to description of this xvid core build - unsigned int cpu_flags; // [out] detected cpu features - int num_threads; // [out] detected number of cpus/threads -} xvid_gbl_info_t; -#endif - - -#define XVID_GBL_INIT 0 /* initialize xvidcore; must be called before using xvid_decore, or xvid_encore) */ -//#define XVID_GBL_INFO 1 /* return some info about xvidcore, and the host computer */ -//#define XVID_GBL_CONVERT 2 /* colorspace conversion utility */ - -int xvid_global(void *handle, int opt, void *param1, void *param2); - - -class C_xvid_image{ -public: - byte *y; - byte *u; - byte *v; - - C_xvid_image(): - y(NULL), - u(NULL), - v(NULL) - {} -}; - -void * InitCodec(dword sx, dword sy, dword fcc); -void CloseCodec(void *handle); -//int DecodeFrame(void *handle, const void *buf, dword sz_in, byte **y, byte **u, byte **v, dword *pitch); -int DecodeFrame(void *handle, const void *buf, dword sz_in, byte *&y, byte *&u, byte *&v, dword &pitch); - -/***************************************************************************** - * xvid_decore() - ****************************************************************************/ - -#define XVID_DEC_CREATE 0 /* create decore instance; return 0 on success */ -#define XVID_DEC_DESTROY 1 /* destroy decore instance: return 0 on success */ -#define XVID_DEC_DECODE 2 /* decode a frame: returns number of bytes consumed >= 0 */ - -int xvid_decore(void *handle, int opt, void *param1, void *param2); - -/* XVID_DEC_CREATE param 1 - image width & height may be specified here when the dimensions are - known in advance. */ -typedef struct { - int version; - int width; /* [in:opt] image width */ - int height; /* [in:opt] image width */ - void *handle; /* [out] decore context handle */ -#ifdef PROFILE - C_profiler *prof; -#endif -} xvid_dec_create_t; - - -/* XVID_DEC_DECODE param1 */ -/* general flags */ -#define XVID_LOWDELAY (1<<0) /* lowdelay mode */ -#define XVID_DISCONTINUITY (1<<1) /* indicates break in stream */ - -typedef struct { - int version; - int general; /* [in:opt] general flags */ - const void *bitstream; /* [in] bitstream (read from)*/ - int length; /* [in] bitstream length */ - //xvid_image_t output; /* [in] output image (written to) */ - const C_xvid_image *img_out; -} xvid_dec_frame_t; - - -/* XVID_DEC_DECODE param2 :: optional */ -typedef struct -{ - int version; - - int type; /* [out] output data type */ - union { - struct { /* type>0 {XVID_TYPE_IVOP,XVID_TYPE_PVOP,XVID_TYPE_BVOP,XVID_TYPE_SVOP} */ - int general; /* [out] flags */ - int time_base; /* [out] time base */ - int time_increment; /* [out] time increment */ - - /* XXX: external deblocking stuff */ - int * qscale; /* [out] pointer to quantizer table */ - int qscale_stride; /* [out] quantizer scale stride */ - - } vop; - struct { /* XVID_TYPE_VOL */ - int general; /* [out] flags */ - int width; /* [out] width */ - int height; /* [out] height */ - int par; /* [out] picture aspect ratio (refer to XVID_PAR_xxx above) */ - int par_width; /* [out] aspect ratio width */ - int par_height; /* [out] aspect ratio height */ - } vol; - } data; -} xvid_dec_stats_t; - - - -#define XVID_ZONE_QUANT (1<<0) -#define XVID_ZONE_WEIGHT (1<<1) - -typedef struct -{ - int frame; - int mode; - int increment; - int base; -} xvid_enc_zone_t; - - - -/***************************************************************************** - xvid plugin system -- internals - - xvidcore will call XVID_PLG_INFO and XVID_PLG_CREATE during XVID_ENC_CREATE - before encoding each frame xvidcore will call XVID_PLG_BEFORE - after encoding each frame xvidcore will call XVID_PLG_AFTER - xvidcore will call XVID_PLG_DESTROY during XVID_ENC_DESTROY - ****************************************************************************/ - - -#define XVID_PLG_CREATE (1<<0) -#define XVID_PLG_DESTROY (1<<1) -#define XVID_PLG_INFO (1<<2) -#define XVID_PLG_BEFORE (1<<3) -#define XVID_PLG_FRAME (1<<4) -#define XVID_PLG_AFTER (1<<5) - -/* xvid_plg_info_t.flags */ -#define XVID_REQORIGINAL (1<<0) /* plugin requires a copy of the original (uncompressed) image */ -#define XVID_REQPSNR (1<<1) /* plugin requires psnr between the uncompressed and compressed image*/ -#define XVID_REQDQUANTS (1<<2) /* plugin requires access to the dquant table */ - - -typedef struct -{ - int version; - int flags; /* [in:opt] plugin flags */ -} xvid_plg_info_t; - - -typedef struct -{ - int version; - - int num_zones; /* [out] */ - xvid_enc_zone_t * zones; /* [out] */ - - int width; /* [out] */ - int height; /* [out] */ - int mb_width; /* [out] */ - int mb_height; /* [out] */ - int fincr; /* [out] */ - int fbase; /* [out] */ - - void * param; /* [out] */ -} xvid_plg_create_t; - - -typedef struct -{ - int version; - - int num_frames; /* [out] total frame encoded */ -} xvid_plg_destroy_t; - - - -/***************************************************************************** - xvid plugin system -- external - - the application passes xvid an array of "xvid_plugin_t" at XVID_ENC_CREATE. the array - indicates the plugin function pointer and plugin-specific data. - xvidcore handles the rest. example: - - xvid_enc_create_t create; - xvid_enc_plugin_t plugins[2]; - - plugins[0].func = xvid_psnr_func; - plugins[0].param = NULL; - plugins[1].func = xvid_cbr_func; - plugins[1].param = &cbr_data; - - create.num_plugins = 2; - create.plugins = plugins; - - ****************************************************************************/ - -typedef int (xvid_plugin_func)(void * handle, int opt, void * param1, void * param2); - -typedef struct -{ - xvid_plugin_func * func; - void * param; -} xvid_enc_plugin_t; - - -xvid_plugin_func xvid_plugin_single; /* single-pass rate control */ -xvid_plugin_func xvid_plugin_2pass1; /* two-pass rate control: first pass */ -xvid_plugin_func xvid_plugin_2pass2; /* two-pass rate control: second pass */ - -xvid_plugin_func xvid_plugin_lumimasking; /* lumimasking */ - -xvid_plugin_func xvid_plugin_psnr; /* write psnr values to stdout */ -xvid_plugin_func xvid_plugin_dump; /* dump before and after yuvpgms */ - - -/* single pass rate control - * CBR and Constant quantizer modes */ -typedef struct -{ - int version; - - int bitrate; /* [in] bits per second */ - int reaction_delay_factor; /* [in] */ - int averaging_period; /* [in] */ - int buffer; /* [in] */ -} xvid_plugin_single_t; - - -typedef struct { - int version; - - char * filename; -} xvid_plugin_2pass1_t; - - -#define XVID_PAYBACK_BIAS 0 /* payback with bias */ -#define XVID_PAYBACK_PROP 1 /* payback proportionally */ - -typedef struct { - int version; - - int bitrate; /* [in] bits per second */ - char * filename; /* [in] first pass stats filename */ - - int keyframe_boost; /* [in] keyframe boost percentage: [0..100] */ - int curve_compression_high; /* [in] percentage of compression performed on the high part of the curve (above average) */ - int curve_compression_low; /* [in] percentage of compression performed on the low part of the curve (below average) */ - int overflow_control_strength;/* [in] Payback delay expressed in number of frames */ - int max_overflow_improvement; /* [in] percentage of allowed range for a frame that gets bigger because of overflow bonus */ - int max_overflow_degradation; /* [in] percentage of allowed range for a frame that gets smaller because of overflow penalty */ - - int kfreduction; /* [in] maximum bitrate reduction applied to an iframe under the kfthreshold distance limit */ - int kfthreshold; /* [in] if an iframe is closer to the next iframe than this distance, a quantity of bits - * is substracted from its bit allocation. The reduction is computed as multiples of - * kfreduction/kthreshold. It reaches kfreduction when the distance == kfthreshold, - * 0 for 1