39 |
* MinChen <chenm001@163.com> |
* MinChen <chenm001@163.com> |
40 |
* 14.04.2002 added FrameCodeB() |
* 14.04.2002 added FrameCodeB() |
41 |
* |
* |
42 |
* $Id: encoder.c,v 1.54 2002-07-11 00:15:59 chenm001 Exp $ |
* $Id: encoder.c,v 1.60 2002-07-21 03:41:44 suxen_drol Exp $ |
43 |
* |
* |
44 |
****************************************************************************/ |
****************************************************************************/ |
45 |
|
|
212 |
if (pParam->max_key_interval == 0) |
if (pParam->max_key_interval == 0) |
213 |
pParam->max_key_interval = 10 * pParam->fincr / pParam->fbase; |
pParam->max_key_interval = 10 * pParam->fincr / pParam->fbase; |
214 |
|
|
|
|
|
215 |
pEnc = (Encoder *) xvid_malloc(sizeof(Encoder), CACHE_LINE); |
pEnc = (Encoder *) xvid_malloc(sizeof(Encoder), CACHE_LINE); |
216 |
if (pEnc == NULL) |
if (pEnc == NULL) |
217 |
return XVID_ERR_MEMORY; |
return XVID_ERR_MEMORY; |
236 |
|
|
237 |
pEnc->mbParam.m_quant_type = H263_QUANT; |
pEnc->mbParam.m_quant_type = H263_QUANT; |
238 |
|
|
239 |
|
#ifdef _SMP |
240 |
|
pEnc->mbParam.num_threads = MIN(pParam->num_threads, MAXNUMTHREADS); |
241 |
|
#endif |
242 |
|
|
243 |
pEnc->sStat.fMvPrevSigma = -1; |
pEnc->sStat.fMvPrevSigma = -1; |
244 |
|
|
245 |
/* Fill rate control parameters */ |
/* Fill rate control parameters */ |
344 |
pEnc->global = pParam->global; |
pEnc->global = pParam->global; |
345 |
pEnc->mbParam.max_bframes = pParam->max_bframes; |
pEnc->mbParam.max_bframes = pParam->max_bframes; |
346 |
pEnc->bquant_ratio = pParam->bquant_ratio; |
pEnc->bquant_ratio = pParam->bquant_ratio; |
347 |
|
pEnc->frame_drop_ratio = pParam->frame_drop_ratio; |
348 |
pEnc->bframes = NULL; |
pEnc->bframes = NULL; |
349 |
|
|
350 |
if (pEnc->mbParam.max_bframes > 0) { |
if (pEnc->mbParam.max_bframes > 0) { |
422 |
pEnc->mbParam.m_seconds = 0; |
pEnc->mbParam.m_seconds = 0; |
423 |
pEnc->mbParam.m_ticks = 0; |
pEnc->mbParam.m_ticks = 0; |
424 |
pEnc->m_framenum = 0; |
pEnc->m_framenum = 0; |
425 |
|
pEnc->last_pframe = 1; |
426 |
#endif |
#endif |
427 |
|
|
428 |
pParam->handle = (void *) pEnc; |
pParam->handle = (void *) pEnc; |
1600 |
} else { |
} else { |
1601 |
|
|
1602 |
#ifdef _SMP |
#ifdef _SMP |
1603 |
if (NUMTHREADS > 1) |
if (pEnc->mbParam.num_threads > 1) |
1604 |
bIntra = |
bIntra = |
1605 |
SMP_MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
SMP_MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
1606 |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
1607 |
iLimit); |
iLimit); |
1608 |
else |
else |
1609 |
#endif |
#endif |
|
|
|
1610 |
bIntra = |
bIntra = |
1611 |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
1612 |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
1613 |
iLimit); |
iLimit); |
1614 |
|
|
|
|
|
1615 |
} |
} |
1616 |
stop_motion_timer(); |
stop_motion_timer(); |
1617 |
|
|
1723 |
|
|
1724 |
pEnc->sStat.fMvPrevSigma = fSigma; |
pEnc->sStat.fMvPrevSigma = fSigma; |
1725 |
|
|
1726 |
|
#ifdef BFRAMES |
1727 |
|
/* frame drop code */ |
1728 |
|
// DPRINTF(DPRINTF_DEBUG, "kmu %i %i %i", pEnc->sStat.kblks, pEnc->sStat.mblks, pEnc->sStat.ublks); |
1729 |
|
if (pEnc->sStat.kblks + pEnc->sStat.mblks <= |
1730 |
|
(pEnc->frame_drop_ratio * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height) / 100) |
1731 |
|
{ |
1732 |
|
pEnc->sStat.kblks = pEnc->sStat.mblks = 0; |
1733 |
|
pEnc->sStat.ublks = pEnc->mbParam.mb_width * pEnc->mbParam.mb_height; |
1734 |
|
|
1735 |
|
BitstreamReset(bs); |
1736 |
|
BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 0); |
1737 |
|
|
1738 |
|
// copy reference frame details into the current frame |
1739 |
|
pEnc->current->quant = pEnc->reference->quant; |
1740 |
|
pEnc->current->motion_flags = pEnc->reference->motion_flags; |
1741 |
|
pEnc->current->rounding_type = pEnc->reference->rounding_type; |
1742 |
|
pEnc->current->fcode = pEnc->reference->fcode; |
1743 |
|
pEnc->current->bcode = pEnc->reference->bcode; |
1744 |
|
image_copy(&pEnc->current->image, &pEnc->reference->image, pEnc->mbParam.edged_width, pEnc->mbParam.height); |
1745 |
|
memcpy(pEnc->current->mbs, pEnc->reference->mbs, sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height); |
1746 |
|
|
1747 |
|
} |
1748 |
|
#endif |
1749 |
|
|
1750 |
*pBits = BitstreamPos(bs) - *pBits; |
*pBits = BitstreamPos(bs) - *pBits; |
1751 |
|
|
1752 |
|
#ifdef BFRAMES |
1753 |
|
pEnc->time_pp = ((int32_t)pEnc->mbParam.fbase - (int32_t)pEnc->last_pframe + (int32_t)pEnc->mbParam.m_ticks) % (int32_t)pEnc->mbParam.fbase; |
1754 |
|
|
1755 |
|
pEnc->last_pframe = pEnc->mbParam.m_ticks; |
1756 |
|
#endif |
1757 |
return 0; // inter |
return 0; // inter |
1758 |
} |
} |
1759 |
|
|
1809 |
stop_inter_timer(); |
stop_inter_timer(); |
1810 |
|
|
1811 |
start_timer(); |
start_timer(); |
1812 |
MotionEstimationBVOP(&pEnc->mbParam, frame, pEnc->reference->mbs, f_ref, |
MotionEstimationBVOP(&pEnc->mbParam, frame, |
1813 |
|
((int32_t)pEnc->mbParam.fbase + (int32_t)pEnc->mbParam.m_ticks + 1 - (int32_t)pEnc->last_pframe) % pEnc->mbParam.fbase, |
1814 |
|
pEnc->time_pp, |
1815 |
|
pEnc->reference->mbs, f_ref, |
1816 |
&pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
&pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
1817 |
pEnc->current->mbs, b_ref, &pEnc->vInterH, |
pEnc->current->mbs, b_ref, &pEnc->vInterH, |
1818 |
&pEnc->vInterV, &pEnc->vInterHV); |
&pEnc->vInterV, &pEnc->vInterHV); |
1878 |
|
|
1879 |
if ((mb->mode == MODE_INTERPOLATE || mb->mode == MODE_DIRECT) |
if ((mb->mode == MODE_INTERPOLATE || mb->mode == MODE_DIRECT) |
1880 |
&& mb->cbp == 0 && mb->mvs[0].x == 0 && mb->mvs[0].y == 0) { |
&& mb->cbp == 0 && mb->mvs[0].x == 0 && mb->mvs[0].y == 0) { |
1881 |
mb->mode = 5; // skipped |
mb->mode = MODE_DIRECT_NONE_MV; // skipped |
1882 |
} |
} |
1883 |
|
|
1884 |
if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_FORWARD) { |
if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_FORWARD) { |