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

Diff of /xvidcore/src/encoder.c

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

revision 1.126, Fri Feb 24 08:46:22 2006 UTC revision 1.127, Fri Feb 24 14:18:59 2006 UTC
# Line 1709  Line 1709 
1709    
1710          if (pEnc->num_threads > 0) {          if (pEnc->num_threads > 0) {
1711                  /* multithreaded motion estimation - dispatch threads */                  /* multithreaded motion estimation - dispatch threads */
1712    
1713                    void * status;
1714                  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;
1715    
1716                  for (k = 0; k < pEnc->num_threads; k++) {                  for (k = 0; k < pEnc->num_threads; k++) {
# Line 1726  Line 1728 
1728                          pEnc->motionData[k].RefQ = pEnc->vInterH.u + 16*k*pParam->edged_width;                          pEnc->motionData[k].RefQ = pEnc->vInterH.u + 16*k*pParam->edged_width;
1729                  }                  }
1730    
1731                  for (k = 0; k < pEnc->num_threads; k++) {                  for (k = 1; k < pEnc->num_threads; k++) {
1732                          pthread_create(&pEnc->motionData[k].handle, NULL,                          pthread_create(&pEnc->motionData[k].handle, NULL,
1733                                  (void*)MotionEstimateSMP, (void*)&pEnc->motionData[k]);                                  (void*)MotionEstimateSMP, (void*)&pEnc->motionData[k]);
1734                  }                  }
1735    
1736                    MotionEstimateSMP(&pEnc->motionData[0]);
1737    
1738                    for (k = 1; k < pEnc->num_threads; k++) {
1739                            pthread_join(pEnc->motionData[k].handle, &status);
1740                    }
1741    
1742                    current->fcode = 0;
1743                    for (k = 0; k < pEnc->num_threads; k++) {
1744                            current->sStat.iMvSum += pEnc->motionData[k].mvSum;
1745                            current->sStat.iMvCount += pEnc->motionData[k].mvCount;
1746                            if (pEnc->motionData[k].minfcode > current->fcode)
1747                                    current->fcode = pEnc->motionData[k].minfcode;
1748                    }
1749    
1750          } else {          } else {
1751                  /* regular ME */                  /* regular ME */
1752    
# Line 1745  Line 1762 
1762          BitstreamWriteVopHeader(bs, &pEnc->mbParam, current, 1, current->mbs[0].quant);          BitstreamWriteVopHeader(bs, &pEnc->mbParam, current, 1, current->mbs[0].quant);
1763    
1764          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();  
                 }  
   
1765                  for (x = 0; x < mb_width; x++) {                  for (x = 0; x < mb_width; x++) {
1766                          MACROBLOCK *pMB = &current->mbs[x + y * pParam->mb_width];                          MACROBLOCK *pMB = &current->mbs[x + y * pParam->mb_width];
1767                          int skip_possible;                          int skip_possible;
# Line 1863  Line 1872 
1872                  }                  }
1873          }          }
1874    
         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;  
                 }  
         }  
   
1875          emms();          emms();
1876          updateFcode(&current->sStat, pEnc);          updateFcode(&current->sStat, pEnc);
1877    
# Line 2005  Line 2002 
2002    
2003          frame->fcode = frame->bcode = pEnc->current->fcode;          frame->fcode = frame->bcode = pEnc->current->fcode;
2004    
2005            start_timer();
2006          if (pEnc->num_threads > 0) {          if (pEnc->num_threads > 0) {
2007                    void * status;
2008                  int k;                  int k;
2009                  /* multithreaded motion estimation - dispatch threads */                  /* multithreaded motion estimation - dispatch threads */
2010                  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 2030 
2030                          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;
2031                  }                  }
2032    
2033                  for (k = 0; k < pEnc->num_threads; k++) {                  for (k = 1; k < pEnc->num_threads; k++) {
2034                          pthread_create(&pEnc->motionData[k].handle, NULL,                          pthread_create(&pEnc->motionData[k].handle, NULL,
2035                                  (void*)SMPMotionEstimationBVOP, (void*)&pEnc->motionData[k]);                                  (void*)SMPMotionEstimationBVOP, (void*)&pEnc->motionData[k]);
2036                  }                  }
2037    
2038                    SMPMotionEstimationBVOP(&pEnc->motionData[0]);
2039    
2040                    for (k = 1; k < pEnc->num_threads; k++) {
2041                            pthread_join(pEnc->motionData[k].handle, &status);
2042                    }
2043    
2044                    frame->fcode = frame->bcode = 0;
2045                    for (k = 0; k < pEnc->num_threads; k++) {
2046                            if (pEnc->motionData[k].minfcode > frame->fcode)
2047                                    frame->fcode = pEnc->motionData[k].minfcode;
2048                            if (pEnc->motionData[k].minbcode > frame->bcode)
2049                                    frame->bcode = pEnc->motionData[k].minbcode;
2050                    }
2051          } else {          } else {
                 start_timer();  
2052                  MotionEstimationBVOP(&pEnc->mbParam, frame,                  MotionEstimationBVOP(&pEnc->mbParam, frame,
2053                                                           ((int32_t)(pEnc->current->stamp - frame->stamp)),                              /* time_bp */                                                           ((int32_t)(pEnc->current->stamp - frame->stamp)),                              /* time_bp */
2054                                                           ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)),    /* time_pp */                                                           ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)),    /* time_pp */
# Line 2044  Line 2056 
2056                                                           &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,                                                           &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,
2057                                                           pEnc->current, b_ref, &pEnc->vInterH,                                                           pEnc->current, b_ref, &pEnc->vInterH,
2058                                                           &pEnc->vInterV, &pEnc->vInterHV);                                                           &pEnc->vInterV, &pEnc->vInterHV);
                 stop_motion_timer();  
2059          }          }
2060            stop_motion_timer();
2061    
2062          set_timecodes(frame, pEnc->reference,pEnc->mbParam.fbase);          set_timecodes(frame, pEnc->reference,pEnc->mbParam.fbase);
2063          BitstreamWriteVopHeader(bs, &pEnc->mbParam, frame, 1, frame->quant);          BitstreamWriteVopHeader(bs, &pEnc->mbParam, frame, 1, frame->quant);
# Line 2059  Line 2071 
2071          frame->sStat.kblks = frame->sStat.ublks = 0;          frame->sStat.kblks = frame->sStat.ublks = 0;
2072    
2073          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();  
                 }  
   
2074                  for (x = 0; x < pEnc->mbParam.mb_width; x++) {                  for (x = 0; x < pEnc->mbParam.mb_width; x++) {
2075                          MACROBLOCK * const mb = &frame->mbs[x + y * pEnc->mbParam.mb_width];                          MACROBLOCK * const mb = &frame->mbs[x + y * pEnc->mbParam.mb_width];
2076    
# Line 2110  Line 2114 
2114                          stop_coding_timer();                          stop_coding_timer();
2115                  }                  }
2116          }          }
   
         if (pEnc->num_threads > 0) {  
                 void * status;  
                 int k;  
                 for (k = 0; k < pEnc->num_threads; k++) {  
                         pthread_join(pEnc->motionData[k].handle, &status);  
                 }  
         }  
   
2117          emms();          emms();
2118    
2119          BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */          BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */

Legend:
Removed from v.1.126  
changed lines
  Added in v.1.127

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