26 |
* along with this program; if not, write to the Free Software |
* along with this program; if not, write to the Free Software |
27 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
28 |
* |
* |
29 |
* $Id: encoder.c,v 1.95 2003-02-19 21:30:52 edgomez Exp $ |
* $Id: encoder.c,v 1.98 2003-04-08 11:04:06 syskin Exp $ |
30 |
* |
* |
31 |
****************************************************************************/ |
****************************************************************************/ |
32 |
|
|
116 |
{ |
{ |
117 |
Encoder *pEnc; |
Encoder *pEnc; |
118 |
int i; |
int i; |
|
|
|
119 |
pParam->handle = NULL; |
pParam->handle = NULL; |
120 |
|
|
121 |
ENC_CHECK(pParam); |
ENC_CHECK(pParam); |
365 |
|
|
366 |
pEnc->queue = NULL; |
pEnc->queue = NULL; |
367 |
|
|
|
|
|
368 |
if (pEnc->mbParam.max_bframes > 0) { |
if (pEnc->mbParam.max_bframes > 0) { |
369 |
int n; |
int n; |
370 |
|
|
417 |
|
|
418 |
xvid_err_memory5: |
xvid_err_memory5: |
419 |
|
|
|
|
|
420 |
if (pEnc->mbParam.max_bframes > 0) { |
if (pEnc->mbParam.max_bframes > 0) { |
421 |
|
|
422 |
for (i = 0; i < pEnc->mbParam.max_bframes; i++) { |
for (i = 0; i < pEnc->mbParam.max_bframes; i++) { |
524 |
xvid_free(pEnc->queue); |
xvid_free(pEnc->queue); |
525 |
} |
} |
526 |
|
|
|
|
|
527 |
if (pEnc->mbParam.max_bframes > 0) { |
if (pEnc->mbParam.max_bframes > 0) { |
528 |
|
|
529 |
for (i = 0; i < pEnc->mbParam.max_bframes; i++) { |
for (i = 0; i < pEnc->mbParam.max_bframes; i++) { |
752 |
pResult->ublks = pEnc->current->sStat.ublks; |
pResult->ublks = pEnc->current->sStat.ublks; |
753 |
} |
} |
754 |
|
|
755 |
|
emms(); |
756 |
|
|
757 |
|
if (pFrame->quant == 0) { |
758 |
|
RateControlUpdate(&pEnc->rate_control, pEnc->current->quant, |
759 |
|
pFrame->length, pFrame->intra); |
760 |
|
} |
761 |
|
|
762 |
if (input_valid) |
if (input_valid) |
763 |
queue_image(pEnc, pFrame); |
queue_image(pEnc, pFrame); |
764 |
|
|
771 |
pEnc->bframenum_head = pEnc->bframenum_tail = 0; |
pEnc->bframenum_head = pEnc->bframenum_tail = 0; |
772 |
|
|
773 |
/* write an empty marker to the bitstream. |
/* write an empty marker to the bitstream. |
|
|
|
774 |
for divx5 decoder compatibility, this marker must consist |
for divx5 decoder compatibility, this marker must consist |
775 |
of a not-coded p-vop, with a time_base of zero, and time_increment |
of a not-coded p-vop, with a time_base of zero, and time_increment |
776 |
indentical to the future-referece frame. |
indentical to the future-referece frame. |
783 |
pEnc->bframenum_head, pEnc->bframenum_tail, |
pEnc->bframenum_head, pEnc->bframenum_tail, |
784 |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
785 |
|
|
|
|
|
786 |
tmp = pEnc->current->seconds; |
tmp = pEnc->current->seconds; |
787 |
pEnc->current->seconds = 0; /* force time_base = 0 */ |
pEnc->current->seconds = 0; /* force time_base = 0 */ |
788 |
|
|
801 |
pResult->ublks = pEnc->current->sStat.ublks; |
pResult->ublks = pEnc->current->sStat.ublks; |
802 |
} |
} |
803 |
|
|
804 |
|
emms(); |
805 |
|
|
806 |
|
if (pFrame->quant == 0) { |
807 |
|
RateControlUpdate(&pEnc->rate_control, pEnc->current->quant, |
808 |
|
pFrame->length, pFrame->intra); |
809 |
|
} |
810 |
|
|
811 |
if (input_valid) |
if (input_valid) |
812 |
queue_image(pEnc, pFrame); |
queue_image(pEnc, pFrame); |
813 |
|
|
889 |
/* That disabled line of code was supposed to inform VirtualDub |
/* That disabled line of code was supposed to inform VirtualDub |
890 |
* that the frame was a dummy delay frame - now disabled (thx god :-) |
* that the frame was a dummy delay frame - now disabled (thx god :-) |
891 |
*/ |
*/ |
892 |
/* BitstreamPutBits(&bs, 0x7f, 8); */ |
//BitstreamPutBits(&bs, 0x7f, 8); |
893 |
pFrame->intra = 5; |
pFrame->intra = 5; |
894 |
|
|
895 |
if (pResult) { |
if (pResult) { |
911 |
pResult->mblks = 0; |
pResult->mblks = 0; |
912 |
pResult->ublks = 0; |
pResult->ublks = 0; |
913 |
} |
} |
|
|
|
914 |
} else { |
} else { |
915 |
|
|
916 |
if (pResult) { |
if (pResult) { |
997 |
|
|
998 |
pMB->dquant = iDQtab[temp_dquants[OFFSET(x, y)] + 2]; |
pMB->dquant = iDQtab[temp_dquants[OFFSET(x, y)] + 2]; |
999 |
} |
} |
|
|
|
1000 |
#undef OFFSET |
#undef OFFSET |
1001 |
} |
} |
|
|
|
1002 |
xvid_free(temp_dquants); |
xvid_free(temp_dquants); |
1003 |
} |
} |
|
|
|
1004 |
} |
} |
1005 |
|
|
1006 |
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
1010 |
|
|
1011 |
if (pEnc->iFrameNum == 0 || pEnc->bframenum_dx50bvop >= 0 || |
if (pEnc->iFrameNum == 0 || pEnc->bframenum_dx50bvop >= 0 || |
1012 |
(mode < 0 && pEnc->mbParam.iMaxKeyInterval > 0 && |
(mode < 0 && pEnc->mbParam.iMaxKeyInterval > 0 && |
1013 |
pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval)) |
pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval)) { |
|
{ |
|
1014 |
mode = I_VOP; |
mode = I_VOP; |
1015 |
}else{ |
}else{ |
1016 |
mode = MEanalysis(&pEnc->reference->image, pEnc->current, |
mode = MEanalysis(&pEnc->reference->image, pEnc->current, |
1017 |
&pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, |
&pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, |
1018 |
(mode < 0) ? pEnc->iFrameNum : 0, |
(/*mode < 0*/1/*hack*/) ? pEnc->iFrameNum : 0, |
1019 |
bframes_count++); |
bframes_count++, 0 /*pFrame->bframe_threshold*/); |
1020 |
} |
} |
1021 |
|
|
1022 |
if (mode == I_VOP) { |
if (mode == I_VOP) { |
1628 |
pEnc->mbParam.width, pEnc->mbParam.height); |
pEnc->mbParam.width, pEnc->mbParam.height); |
1629 |
stop_edges_timer(); |
stop_edges_timer(); |
1630 |
} |
} |
|
|
|
1631 |
pEnc->iFrameNum = 0; |
pEnc->iFrameNum = 0; |
1632 |
pEnc->mbParam.m_rounding_type = 1; |
pEnc->mbParam.m_rounding_type = 1; |
1633 |
pEnc->current->rounding_type = pEnc->mbParam.m_rounding_type; |
pEnc->current->rounding_type = pEnc->mbParam.m_rounding_type; |
1725 |
mb_height = (pEnc->mbParam.height + 31) / 32; |
mb_height = (pEnc->mbParam.height + 31) / 32; |
1726 |
} |
} |
1727 |
|
|
|
|
|
1728 |
start_timer(); |
start_timer(); |
1729 |
image_setedges(pRef, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
image_setedges(pRef, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
1730 |
pEnc->mbParam.width, pEnc->mbParam.height); |
pEnc->mbParam.width, pEnc->mbParam.height); |
2146 |
|
|
2147 |
|
|
2148 |
stop_motion_timer(); |
stop_motion_timer(); |
|
|
|
2149 |
/* |
/* |
2150 |
if (test_quant_type(&pEnc->mbParam, pEnc->current)) { |
if (test_quant_type(&pEnc->mbParam, pEnc->current)) { |
2151 |
BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type); |
BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type); |