[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 1682, Fri Feb 24 08:46:22 2006 UTC revision 1693, Fri Mar 3 11:54:58 2006 UTC
# Line 21  Line 21 
21   *  along with this program ; if not, write to the Free Software   *  along with this program ; if not, write to the Free Software
22   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23   *   *
24   * $Id: encoder.c,v 1.126 2006-02-24 08:46:22 syskin Exp $   * $Id: encoder.c,v 1.128 2006-03-03 11:54:58 syskin Exp $
25   *   *
26   ****************************************************************************/   ****************************************************************************/
27    
# Line 662  Line 662 
662                  xvid_free(pEnc->temp_dquants);                  xvid_free(pEnc->temp_dquants);
663          }          }
664    
665            if ((pEnc->mbParam.plugin_flags & XVID_REQLAMBDA)) {
666                    xvid_free(pEnc->temp_lambda);
667            }
668    
669          if (pEnc->num_plugins>0) {          if (pEnc->num_plugins>0) {
670                  xvid_plg_destroy_t pdestroy;                  xvid_plg_destroy_t pdestroy;
# Line 1709  Line 1712 
1712    
1713          if (pEnc->num_threads > 0) {          if (pEnc->num_threads > 0) {
1714                  /* multithreaded motion estimation - dispatch threads */                  /* multithreaded motion estimation - dispatch threads */
1715    
1716                    void * status;
1717                  int rows_per_thread = (pParam->mb_height + pEnc->num_threads - 1)/pEnc->num_threads;                  int rows_per_thread = (pParam->mb_height + pEnc->num_threads - 1)/pEnc->num_threads;
1718    
1719                  for (k = 0; k < pEnc->num_threads; k++) {                  for (k = 0; k < pEnc->num_threads; k++) {
# Line 1726  Line 1731 
1731                          pEnc->motionData[k].RefQ = pEnc->vInterH.u + 16*k*pParam->edged_width;                          pEnc->motionData[k].RefQ = pEnc->vInterH.u + 16*k*pParam->edged_width;
1732                  }                  }
1733    
1734                  for (k = 0; k < pEnc->num_threads; k++) {                  for (k = 1; k < pEnc->num_threads; k++) {
1735                          pthread_create(&pEnc->motionData[k].handle, NULL,                          pthread_create(&pEnc->motionData[k].handle, NULL,
1736                                  (void*)MotionEstimateSMP, (void*)&pEnc->motionData[k]);                                  (void*)MotionEstimateSMP, (void*)&pEnc->motionData[k]);
1737                  }                  }
1738    
1739                    MotionEstimateSMP(&pEnc->motionData[0]);
1740    
1741                    for (k = 1; k < pEnc->num_threads; k++) {
1742                            pthread_join(pEnc->motionData[k].handle, &status);
1743                    }
1744    
1745                    current->fcode = 0;
1746                    for (k = 0; k < pEnc->num_threads; k++) {
1747                            current->sStat.iMvSum += pEnc->motionData[k].mvSum;
1748                            current->sStat.iMvCount += pEnc->motionData[k].mvCount;
1749                            if (pEnc->motionData[k].minfcode > current->fcode)
1750                                    current->fcode = pEnc->motionData[k].minfcode;
1751                    }
1752    
1753          } else {          } else {
1754                  /* regular ME */                  /* regular ME */
1755    
# Line 1745  Line 1765 
1765          BitstreamWriteVopHeader(bs, &pEnc->mbParam, current, 1, current->mbs[0].quant);          BitstreamWriteVopHeader(bs, &pEnc->mbParam, current, 1, current->mbs[0].quant);
1766    
1767          for (y = 0; y < mb_height; y++) {          for (y = 0; y < mb_height; y++) {
   
                 if (pEnc->num_threads > 0) {  
                         /* in multithreaded encoding, only proceed with a row of macroblocks  
                                 if ME finished with that row */  
                         while (pEnc->motionData[y%pEnc->num_threads].complete_count_self[y/pEnc->num_threads] != mb_width)  
                                 sched_yield();  
                 }  
   
1768                  for (x = 0; x < mb_width; x++) {                  for (x = 0; x < mb_width; x++) {
1769                          MACROBLOCK *pMB = &current->mbs[x + y * pParam->mb_width];                          MACROBLOCK *pMB = &current->mbs[x + y * pParam->mb_width];
1770                          int skip_possible;                          int skip_possible;
# Line 1863  Line 1875 
1875                  }                  }
1876          }          }
1877    
         if (pEnc->num_threads > 0) {  
                 void * status;  
                 for (k = 0; k < pEnc->num_threads; k++) {  
                         pthread_join(pEnc->motionData[k].handle, &status);  
                 }  
   
                 for (k = 0; k < pEnc->num_threads; k++) {  
                         current->sStat.iMvSum += pEnc->motionData[k].mvSum;  
                         current->sStat.iMvCount += pEnc->motionData[k].mvCount;  
                 }  
         }  
   
1878          emms();          emms();
1879          updateFcode(&current->sStat, pEnc);          updateFcode(&current->sStat, pEnc);
1880    
# Line 2005  Line 2005 
2005    
2006          frame->fcode = frame->bcode = pEnc->current->fcode;          frame->fcode = frame->bcode = pEnc->current->fcode;
2007    
2008            start_timer();
2009          if (pEnc->num_threads > 0) {          if (pEnc->num_threads > 0) {
2010                    void * status;
2011                  int k;                  int k;
2012                  /* multithreaded motion estimation - dispatch threads */                  /* multithreaded motion estimation - dispatch threads */
2013                  int rows_per_thread = (pEnc->mbParam.mb_height + pEnc->num_threads - 1)/pEnc->num_threads;                  int rows_per_thread = (pEnc->mbParam.mb_height + pEnc->num_threads - 1)/pEnc->num_threads;
# Line 2031  Line 2033 
2033                          pEnc->motionData[k].RefQ = pEnc->vInterH.u + 16*k*pEnc->mbParam.edged_width;                          pEnc->motionData[k].RefQ = pEnc->vInterH.u + 16*k*pEnc->mbParam.edged_width;
2034                  }                  }
2035    
2036                  for (k = 0; k < pEnc->num_threads; k++) {                  for (k = 1; k < pEnc->num_threads; k++) {
2037                          pthread_create(&pEnc->motionData[k].handle, NULL,                          pthread_create(&pEnc->motionData[k].handle, NULL,
2038                                  (void*)SMPMotionEstimationBVOP, (void*)&pEnc->motionData[k]);                                  (void*)SMPMotionEstimationBVOP, (void*)&pEnc->motionData[k]);
2039                  }                  }
2040    
2041                    SMPMotionEstimationBVOP(&pEnc->motionData[0]);
2042    
2043                    for (k = 1; k < pEnc->num_threads; k++) {
2044                            pthread_join(pEnc->motionData[k].handle, &status);
2045                    }
2046    
2047                    frame->fcode = frame->bcode = 0;
2048                    for (k = 0; k < pEnc->num_threads; k++) {
2049                            if (pEnc->motionData[k].minfcode > frame->fcode)
2050                                    frame->fcode = pEnc->motionData[k].minfcode;
2051                            if (pEnc->motionData[k].minbcode > frame->bcode)
2052                                    frame->bcode = pEnc->motionData[k].minbcode;
2053                    }
2054          } else {          } else {
                 start_timer();  
2055                  MotionEstimationBVOP(&pEnc->mbParam, frame,                  MotionEstimationBVOP(&pEnc->mbParam, frame,
2056                                                           ((int32_t)(pEnc->current->stamp - frame->stamp)),                              /* time_bp */                                                           ((int32_t)(pEnc->current->stamp - frame->stamp)),                              /* time_bp */
2057                                                           ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)),    /* time_pp */                                                           ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)),    /* time_pp */
# Line 2044  Line 2059 
2059                                                           &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,                                                           &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,
2060                                                           pEnc->current, b_ref, &pEnc->vInterH,                                                           pEnc->current, b_ref, &pEnc->vInterH,
2061                                                           &pEnc->vInterV, &pEnc->vInterHV);                                                           &pEnc->vInterV, &pEnc->vInterHV);
                 stop_motion_timer();  
2062          }          }
2063            stop_motion_timer();
2064    
2065          set_timecodes(frame, pEnc->reference,pEnc->mbParam.fbase);          set_timecodes(frame, pEnc->reference,pEnc->mbParam.fbase);
2066          BitstreamWriteVopHeader(bs, &pEnc->mbParam, frame, 1, frame->quant);          BitstreamWriteVopHeader(bs, &pEnc->mbParam, frame, 1, frame->quant);
# Line 2059  Line 2074 
2074          frame->sStat.kblks = frame->sStat.ublks = 0;          frame->sStat.kblks = frame->sStat.ublks = 0;
2075    
2076          for (y = 0; y < pEnc->mbParam.mb_height; y++) {          for (y = 0; y < pEnc->mbParam.mb_height; y++) {
   
                 if (pEnc->num_threads > 0) {  
                         /* in multithreaded encoding, only proceed with a row of macroblocks  
                                 if ME finished with that row */  
                         while (pEnc->motionData[y%pEnc->num_threads].complete_count_self[y/pEnc->num_threads] != pEnc->mbParam.mb_width)  
                                 sched_yield();  
                 }  
   
2077                  for (x = 0; x < pEnc->mbParam.mb_width; x++) {                  for (x = 0; x < pEnc->mbParam.mb_width; x++) {
2078                          MACROBLOCK * const mb = &frame->mbs[x + y * pEnc->mbParam.mb_width];                          MACROBLOCK * const mb = &frame->mbs[x + y * pEnc->mbParam.mb_width];
2079    
# Line 2110  Line 2117 
2117                          stop_coding_timer();                          stop_coding_timer();
2118                  }                  }
2119          }          }
   
         if (pEnc->num_threads > 0) {  
                 void * status;  
                 int k;  
                 for (k = 0; k < pEnc->num_threads; k++) {  
                         pthread_join(pEnc->motionData[k].handle, &status);  
                 }  
         }  
   
2120          emms();          emms();
2121    
2122          BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */          BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */

Legend:
Removed from v.1682  
changed lines
  Added in v.1693

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