[svn] / trunk / xvidcore / src / encoder.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/encoder.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 419, Thu Sep 5 21:02:19 2002 UTC revision 815, Tue Feb 4 22:00:44 2003 UTC
# Line 3  Line 3 
3   *  XVID MPEG-4 VIDEO CODEC   *  XVID MPEG-4 VIDEO CODEC
4   *  - Encoder main module -   *  - Encoder main module -
5   *   *
6   *  Copyright(C) 2002 Michael Militzer   *  Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7     *               2002 Peter Ross <pross@xvid.org>
8     *               2002 Daniel Smith <danielsmith@astroboymail.com>
9   *   *
10   *  This program is an implementation of a part of one or more MPEG-4   *  This file is part of XviD, a free MPEG-4 video encoder/decoder
  *  Video tools as specified in ISO/IEC 14496-2 standard.  Those intending  
  *  to use this software module in hardware or software products are  
  *  advised that its use may infringe existing patents or copyrights, and  
  *  any such use would be at such party's own risk.  The original  
  *  developer of this software module and his/her company, and subsequent  
  *  editors and their companies, will have no liability for use of this  
  *  software or modifications or derivatives thereof.  
11   *   *
12   *  This program is free software; you can redistribute it and/or modify   *  XviD is free software; you can redistribute it and/or modify it
13   *  it under the terms of the GNU General Public License as published by   *  under the terms of the GNU General Public License as published by
14   *  the Free Software Foundation; either version 2 of the License, or   *  the Free Software Foundation; either version 2 of the License, or
15   *  (at your option) any later version.   *  (at your option) any later version.
16   *   *
# Line 28  Line 23 
23   *  along with this program; if not, write to the Free Software   *  along with this program; if not, write to the Free Software
24   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
25   *   *
26   * $Id: encoder.c,v 1.81 2002-09-05 21:02:19 chl Exp $   *  Under section 8 of the GNU General Public License, the copyright
27     *  holders of XVID explicitly forbid distribution in the following
28     *  countries:
29     *
30     *    - Japan
31     *    - United States of America
32     *
33     *  Linking XviD statically or dynamically with other modules is making a
34     *  combined work based on XviD.  Thus, the terms and conditions of the
35     *  GNU General Public License cover the whole combination.
36     *
37     *  As a special exception, the copyright holders of XviD give you
38     *  permission to link XviD with independent modules that communicate with
39     *  XviD solely through the VFW1.1 and DShow interfaces, regardless of the
40     *  license terms of these independent modules, and to copy and distribute
41     *  the resulting combined work under terms of your choice, provided that
42     *  every copy of the combined work is accompanied by a complete copy of
43     *  the source code of XviD (the version of XviD used to produce the
44     *  combined work), being distributed under the terms of the GNU General
45     *  Public License plus this exception.  An independent module is a module
46     *  which is not derived from or based on XviD.
47     *
48     *  Note that people who make modified versions of XviD are not obligated
49     *  to grant this special exception for their modified versions; it is
50     *  their choice whether to do so.  The GNU General Public License gives
51     *  permission to release a modified version without this exception; this
52     *  exception also makes it possible to release a modified version which
53     *  carries forward this exception.
54     *
55     * $Id: encoder.c,v 1.90 2003-02-04 22:00:44 edgomez Exp $
56   *   *
57   ****************************************************************************/   ****************************************************************************/
58    
# Line 54  Line 78 
78  #include "quant/quant_matrix.h"  #include "quant/quant_matrix.h"
79  #include "utils/mem_align.h"  #include "utils/mem_align.h"
80    
 #ifdef _SMP  
 #include "motion/smp_motion_est.h"  
 #endif  
81  /*****************************************************************************  /*****************************************************************************
82   * Local macros   * Local macros
83   ****************************************************************************/   ****************************************************************************/
# Line 215  Line 236 
236    
237          pEnc->mbParam.m_quant_type = H263_QUANT;          pEnc->mbParam.m_quant_type = H263_QUANT;
238    
 #ifdef _SMP  
         pEnc->mbParam.num_threads = MIN(pParam->num_threads, MAXNUMTHREADS);  
 #endif  
   
239          pEnc->sStat.fMvPrevSigma = -1;          pEnc->sStat.fMvPrevSigma = -1;
240    
241          /* Fill rate control parameters */          /* Fill rate control parameters */
# Line 257  Line 274 
274          image_null(&pEnc->reference->image);          image_null(&pEnc->reference->image);
275          image_null(&pEnc->vInterH);          image_null(&pEnc->vInterH);
276          image_null(&pEnc->vInterV);          image_null(&pEnc->vInterV);
         image_null(&pEnc->vInterVf);  
277          image_null(&pEnc->vInterHV);          image_null(&pEnc->vInterHV);
         image_null(&pEnc->vInterHVf);  
278    
279  #ifdef _DEBUG_PSNR  #ifdef _DEBUG_PSNR
280          if (image_create          if (image_create
# Line 284  Line 299 
299                   pEnc->mbParam.edged_height) < 0)                   pEnc->mbParam.edged_height) < 0)
300                  goto xvid_err_memory3;                  goto xvid_err_memory3;
301          if (image_create          if (image_create
                 (&pEnc->vInterVf, pEnc->mbParam.edged_width,  
                  pEnc->mbParam.edged_height) < 0)  
                 goto xvid_err_memory3;  
         if (image_create  
302                  (&pEnc->vInterHV, pEnc->mbParam.edged_width,                  (&pEnc->vInterHV, pEnc->mbParam.edged_width,
303                   pEnc->mbParam.edged_height) < 0)                   pEnc->mbParam.edged_height) < 0)
304                  goto xvid_err_memory3;                  goto xvid_err_memory3;
         if (image_create  
                 (&pEnc->vInterHVf, pEnc->mbParam.edged_width,  
                  pEnc->mbParam.edged_height) < 0)  
                 goto xvid_err_memory3;  
305    
306          pParam->handle = (void *) pEnc;          pParam->handle = (void *) pEnc;
307    
# Line 328  Line 335 
335                                    pEnc->mbParam.edged_height);                                    pEnc->mbParam.edged_height);
336          image_destroy(&pEnc->vInterV, pEnc->mbParam.edged_width,          image_destroy(&pEnc->vInterV, pEnc->mbParam.edged_width,
337                                    pEnc->mbParam.edged_height);                                    pEnc->mbParam.edged_height);
         image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width,  
                                   pEnc->mbParam.edged_height);  
338          image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width,          image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width,
339                                    pEnc->mbParam.edged_height);                                    pEnc->mbParam.edged_height);
         image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width,  
                                   pEnc->mbParam.edged_height);  
340    
341    xvid_err_memory2:    xvid_err_memory2:
342          xvid_free(pEnc->current->mbs);          xvid_free(pEnc->current->mbs);
# Line 375  Line 378 
378                                    pEnc->mbParam.edged_height);                                    pEnc->mbParam.edged_height);
379          image_destroy(&pEnc->vInterV, pEnc->mbParam.edged_width,          image_destroy(&pEnc->vInterV, pEnc->mbParam.edged_width,
380                                    pEnc->mbParam.edged_height);                                    pEnc->mbParam.edged_height);
         image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width,  
                                   pEnc->mbParam.edged_height);  
381          image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width,          image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width,
382                                    pEnc->mbParam.edged_height);                                    pEnc->mbParam.edged_height);
         image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width,  
                                   pEnc->mbParam.edged_height);  
383    
384  #ifdef _DEBUG_PSNR  #ifdef _DEBUG_PSNR
385          image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width,          image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width,
# Line 560  Line 559 
559          emms();          emms();
560    
561          if (pFrame->quant == 0) {          if (pFrame->quant == 0) {
562                  RateControlUpdate(&pEnc->rate_control, pEnc->current->quant,                  RateControlUpdate(&pEnc->rate_control, (int16_t)pEnc->current->quant,
563                                                    pFrame->length, pFrame->intra);                                                    pFrame->length, pFrame->intra);
564          }          }
565  #ifdef _DEBUG_PSNR  #ifdef _DEBUG_PSNR
# Line 637  Line 636 
636                  return;                  return;
637          }          }
638    
639          pEnc->current->fcode =          pEnc->current->fcode = (hint->rawhints != 0) ?
640                  (hint->rawhints) ? hint->mvhint.fcode : BitstreamGetBits(&bs,                  (uint32_t)hint->mvhint.fcode : BitstreamGetBits(&bs, FCODEBITS);
                                                                                                                                  FCODEBITS);  
641    
642          length = pEnc->current->fcode + 5;          length = pEnc->current->fcode + 5;
643          high = 1 << (length - 1);          high = 1 << (length - 1);
# Line 654  Line 652 
652                          VECTOR tmp;                          VECTOR tmp;
653                          int vec;                          int vec;
654    
655                          pMB->mode =                          pMB->mode = (hint->rawhints != 0) ?
656                                  (hint->rawhints) ? bhint->mode : BitstreamGetBits(&bs,                                  (uint32_t)bhint->mode : BitstreamGetBits(&bs, MODEBITS);
                                                                                                                                   MODEBITS);  
657    
658                          pMB->mode = (pMB->mode == MODE_INTER_Q) ? MODE_INTER : pMB->mode;                          pMB->mode = (pMB->mode == MODE_INTER_Q) ? MODE_INTER : pMB->mode;
659                          pMB->mode = (pMB->mode == MODE_INTRA_Q) ? MODE_INTRA : pMB->mode;                          pMB->mode = (pMB->mode == MODE_INTRA_Q) ? MODE_INTRA : pMB->mode;
660    
661                          if (pMB->mode == MODE_INTER) {                          if (pMB->mode == MODE_INTER) {
662                                  tmp.x =                                  tmp.x = (hint->rawhints) ?
663                                          (hint->rawhints) ? bhint->mvs[0].x : BitstreamGetBits(&bs,                                          bhint->mvs[0].x : (int)BitstreamGetBits(&bs, length);
664                                                                                                                                                    length);                                  tmp.y = (hint->rawhints) ?
665                                  tmp.y =                                          bhint->mvs[0].y : (int)BitstreamGetBits(&bs, length);
                                         (hint->rawhints) ? bhint->mvs[0].y : BitstreamGetBits(&bs,  
                                                                                                                                                   length);  
666                                  tmp.x -= (tmp.x >= high) ? high * 2 : 0;                                  tmp.x -= (tmp.x >= high) ? high * 2 : 0;
667                                  tmp.y -= (tmp.y >= high) ? high * 2 : 0;                                  tmp.y -= (tmp.y >= high) ? high * 2 : 0;
668    
# Line 681  Line 676 
676                                  }                                  }
677                          } else if (pMB->mode == MODE_INTER4V) {                          } else if (pMB->mode == MODE_INTER4V) {
678                                  for (vec = 0; vec < 4; ++vec) {                                  for (vec = 0; vec < 4; ++vec) {
679                                          tmp.x =                                          tmp.x = (hint->rawhints) ?
680                                                  (hint->rawhints) ? bhint->mvs[vec].                                                  bhint->mvs[vec].x : (int)BitstreamGetBits(&bs, length);
681                                                  x : BitstreamGetBits(&bs, length);                                          tmp.y = (hint->rawhints) ?
682                                          tmp.y =                                                  bhint->mvs[vec].y : (int)BitstreamGetBits(&bs, length);
                                                 (hint->rawhints) ? bhint->mvs[vec].  
                                                 y : BitstreamGetBits(&bs, length);  
683                                          tmp.x -= (tmp.x >= high) ? high * 2 : 0;                                          tmp.x -= (tmp.x >= high) ? high * 2 : 0;
684                                          tmp.y -= (tmp.y >= high) ? high * 2 : 0;                                          tmp.y -= (tmp.y >= high) ? high * 2 : 0;
685    
# Line 697  Line 690 
690                                          pMB->pmvs[vec].x = pMB->mvs[vec].x - pred.x;                                          pMB->pmvs[vec].x = pMB->mvs[vec].x - pred.x;
691                                          pMB->pmvs[vec].y = pMB->mvs[vec].y - pred.y;                                          pMB->pmvs[vec].y = pMB->mvs[vec].y - pred.y;
692                                  }                                  }
693                          } else                          // intra / stuffing / not_coded                          } else                          /* intra / stuffing / not_coded */
694                          {                          {
695                                  for (vec = 0; vec < 4; ++vec) {                                  for (vec = 0; vec < 4; ++vec) {
696                                          pMB->mvs[vec].x = pMB->mvs[vec].y = 0;                                          pMB->mvs[vec].x = pMB->mvs[vec].y = 0;
# Line 870  Line 863 
863                  HintedMEGet(pEnc, 1);                  HintedMEGet(pEnc, 1);
864          }          }
865    
866          return 1;                                       // intra          return 1;                                       /* intra */
867  }  }
868    
869    
# Line 889  Line 882 
882          DECLARE_ALIGNED_MATRIX(qcoeff, 6, 64, int16_t, CACHE_LINE);          DECLARE_ALIGNED_MATRIX(qcoeff, 6, 64, int16_t, CACHE_LINE);
883    
884          int iLimit;          int iLimit;
885          int x, y, k;          unsigned int x, y;
886          int iSearchRange;          int iSearchRange;
887          int bIntra;          int bIntra;
888    
# Line 898  Line 891 
891    
892          start_timer();          start_timer();
893          image_setedges(pRef, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height,          image_setedges(pRef, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height,
894                                     pEnc->mbParam.width, pEnc->mbParam.height,                                     pEnc->mbParam.width, pEnc->mbParam.height);
                                    pEnc->current->global_flags & XVID_INTERLACING);  
895          stop_edges_timer();          stop_edges_timer();
896    
897          pEnc->mbParam.m_rounding_type = 1 - pEnc->mbParam.m_rounding_type;          pEnc->mbParam.m_rounding_type = 1 - pEnc->mbParam.m_rounding_type;
# Line 927  Line 919 
919                  HintedMESet(pEnc, &bIntra);                  HintedMESet(pEnc, &bIntra);
920          } else {          } else {
921    
 #ifdef _SMP  
         if (pEnc->mbParam.num_threads > 1)  
                 bIntra =  
                         SMP_MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference,  
                                                  &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV,  
                                                  iLimit);  
         else  
 #endif  
922                  bIntra =                  bIntra =
923                          MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference,                          MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference,
924                           &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV,                           &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV,
# Line 1053  Line 1037 
1037          iSearchRange = 1 << (3 + pEnc->mbParam.m_fcode);          iSearchRange = 1 << (3 + pEnc->mbParam.m_fcode);
1038    
1039          if ((fSigma > iSearchRange / 3)          if ((fSigma > iSearchRange / 3)
1040                  && (pEnc->mbParam.m_fcode <= 3))        // maximum search range 128                  && (pEnc->mbParam.m_fcode <= 3))        /* maximum search range 128 */
1041          {          {
1042                  pEnc->mbParam.m_fcode++;                  pEnc->mbParam.m_fcode++;
1043                  iSearchRange *= 2;                  iSearchRange *= 2;
1044          } else if ((fSigma < iSearchRange / 6)          } else if ((fSigma < iSearchRange / 6)
1045                             && (pEnc->sStat.fMvPrevSigma >= 0)                             && (pEnc->sStat.fMvPrevSigma >= 0)
1046                             && (pEnc->sStat.fMvPrevSigma < iSearchRange / 6)                             && (pEnc->sStat.fMvPrevSigma < iSearchRange / 6)
1047                             && (pEnc->mbParam.m_fcode >= 2))     // minimum search range 16                             && (pEnc->mbParam.m_fcode >= 2))     /* minimum search range 16 */
1048          {          {
1049                  pEnc->mbParam.m_fcode--;                  pEnc->mbParam.m_fcode--;
1050                  iSearchRange /= 2;                  iSearchRange /= 2;
# Line 1070  Line 1054 
1054    
1055          *pBits = BitstreamPos(bs) - *pBits;          *pBits = BitstreamPos(bs) - *pBits;
1056    
1057          return 0;                                       // inter          return 0;                                       /* inter */
1058    
1059  }  }

Legend:
Removed from v.419  
changed lines
  Added in v.815

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4