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.8 2002-09-30 14:16:02 chl Exp $ |
* $Id: encoder.c,v 1.76.2.9 2002-10-02 12:57:25 suxen_drol Exp $ |
43 |
* |
* |
44 |
****************************************************************************/ |
****************************************************************************/ |
45 |
|
|
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; |