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.76.2.6 2002-09-29 15:56:21 chl Exp $ |
* $Id: encoder.c,v 1.76.2.10 2002-10-03 08:24:27 syskin Exp $ |
43 |
* |
* |
44 |
****************************************************************************/ |
****************************************************************************/ |
45 |
|
|
411 |
pEnc->queue_size = 0; |
pEnc->queue_size = 0; |
412 |
|
|
413 |
pEnc->mbParam.m_stamp = 0; |
pEnc->mbParam.m_stamp = 0; |
414 |
; |
|
415 |
pEnc->m_framenum = 0; |
pEnc->m_framenum = 0; |
416 |
|
pEnc->current->stamp = 0; |
417 |
|
pEnc->reference->stamp = 0; |
418 |
|
|
419 |
pParam->handle = (void *) pEnc; |
pParam->handle = (void *) pEnc; |
420 |
|
|
744 |
if (pEnc->bframenum_head > 0) { |
if (pEnc->bframenum_head > 0) { |
745 |
pEnc->bframenum_head = pEnc->bframenum_tail = 0; |
pEnc->bframenum_head = pEnc->bframenum_tail = 0; |
746 |
|
|
747 |
|
/* write an empty marker to the bitstream. |
748 |
|
|
749 |
|
for divx5 decoder compatibility, this marker must consist |
750 |
|
of a not-coded p-vop, with a time_base of zero, and time_increment |
751 |
|
indentical to the future-referece frame. |
752 |
|
*/ |
753 |
|
|
754 |
if ((pEnc->global & XVID_GLOBAL_PACKED)) { |
if ((pEnc->global & XVID_GLOBAL_PACKED)) { |
755 |
|
int tmp; |
756 |
|
|
757 |
DPRINTF(DPRINTF_DEBUG,"*** EMPTY bf: head=%i tail=%i queue: head=%i tail=%i size=%i", |
DPRINTF(DPRINTF_DEBUG,"*** EMPTY bf: head=%i tail=%i queue: head=%i tail=%i size=%i", |
758 |
pEnc->bframenum_head, pEnc->bframenum_tail, |
pEnc->bframenum_head, pEnc->bframenum_tail, |
759 |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
760 |
|
|
|
set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); |
|
|
BitstreamWriteVopHeader(&bs, &pEnc->mbParam, pEnc->current, 0); |
|
761 |
BitstreamPad(&bs); |
BitstreamPad(&bs); |
762 |
BitstreamPutBits(&bs, 0x7f, 8); |
|
763 |
|
tmp = pEnc->current->seconds; |
764 |
|
pEnc->current->seconds = 0; /* force time_base = 0 */ |
765 |
|
BitstreamWriteVopHeader(&bs, &pEnc->mbParam, pEnc->current, 0); |
766 |
|
pEnc->current->seconds = tmp; |
767 |
|
|
768 |
pFrame->length = BitstreamLength(&bs); |
pFrame->length = BitstreamLength(&bs); |
769 |
pFrame->intra = 0; |
pFrame->intra = 0; |
825 |
pEnc->queue_head = (pEnc->queue_head + 1) % pEnc->mbParam.max_bframes; |
pEnc->queue_head = (pEnc->queue_head + 1) % pEnc->mbParam.max_bframes; |
826 |
pEnc->queue_size--; |
pEnc->queue_size--; |
827 |
|
|
828 |
} else if (BitstreamPos(&bs) == 0) { |
} else { |
829 |
|
|
830 |
|
/* if nothing was encoded, write an 'ignore this frame' flag |
831 |
|
to the bitstream */ |
832 |
|
|
833 |
|
if (BitstreamPos(&bs) == 0) { |
834 |
|
|
835 |
DPRINTF(DPRINTF_DEBUG,"*** SKIP bf: head=%i tail=%i queue: head=%i tail=%i size=%i", |
DPRINTF(DPRINTF_DEBUG,"*** SKIP bf: head=%i tail=%i queue: head=%i tail=%i size=%i", |
836 |
pEnc->bframenum_head, pEnc->bframenum_tail, |
pEnc->bframenum_head, pEnc->bframenum_tail, |
837 |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
838 |
|
|
839 |
|
BitstreamPutBits(&bs, 0x7f, 8); |
840 |
pFrame->intra = 0; |
pFrame->intra = 0; |
841 |
|
} |
|
set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); |
|
|
BitstreamWriteVopHeader(&bs, &pEnc->mbParam, pEnc->current, 0); // write N_VOP |
|
|
BitstreamPad(&bs); |
|
|
pFrame->length = BitstreamLength(&bs); |
|
|
|
|
|
return XVID_ERR_OK; |
|
|
|
|
|
} else { |
|
842 |
|
|
843 |
pFrame->length = BitstreamLength(&bs); |
pFrame->length = BitstreamLength(&bs); |
844 |
return XVID_ERR_OK; |
return XVID_ERR_OK; |
1120 |
pEnc->current->motion_flags = pFrame->motion; |
pEnc->current->motion_flags = pFrame->motion; |
1121 |
pEnc->mbParam.hint = &pFrame->hint; |
pEnc->mbParam.hint = &pFrame->hint; |
1122 |
|
|
1123 |
|
inc_frame_num(pEnc); |
1124 |
|
|
1125 |
/* disable alternate scan flag if interlacing is not enabled */ |
/* disable alternate scan flag if interlacing is not enabled */ |
1126 |
if ((pEnc->current->global_flags & XVID_ALTERNATESCAN) && |
if ((pEnc->current->global_flags & XVID_ALTERNATESCAN) && |
1127 |
!(pEnc->current->global_flags & XVID_INTERLACING)) |
!(pEnc->current->global_flags & XVID_INTERLACING)) |
1256 |
DEBUG(temp); |
DEBUG(temp); |
1257 |
#endif |
#endif |
1258 |
|
|
|
inc_frame_num(pEnc); |
|
1259 |
pEnc->iFrameNum++; |
pEnc->iFrameNum++; |
1260 |
|
|
1261 |
stop_global_timer(); |
stop_global_timer(); |
1613 |
start_timer(); |
start_timer(); |
1614 |
if (pEnc->current->global_flags & XVID_HINTEDME_SET) { |
if (pEnc->current->global_flags & XVID_HINTEDME_SET) { |
1615 |
HintedMESet(pEnc, &bIntra); |
HintedMESet(pEnc, &bIntra); |
1616 |
if (bIntra == 0) MotionEstimationHinted(&pEnc->mbParam, pEnc->current, pEnc->reference, |
if (bIntra == 0) { |
1617 |
|
pEnc->current->fcode = FindFcode(&pEnc->mbParam, pEnc->current); |
1618 |
|
MotionEstimationHinted(&pEnc->mbParam, pEnc->current, pEnc->reference, |
1619 |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV); |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV); |
1620 |
|
} |
1621 |
|
|
1622 |
} else { |
} else { |
1623 |
|
|