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.96 2003-03-04 10:55:21 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++) { |
764 |
pEnc->bframenum_head = pEnc->bframenum_tail = 0; |
pEnc->bframenum_head = pEnc->bframenum_tail = 0; |
765 |
|
|
766 |
/* write an empty marker to the bitstream. |
/* write an empty marker to the bitstream. |
|
|
|
767 |
for divx5 decoder compatibility, this marker must consist |
for divx5 decoder compatibility, this marker must consist |
768 |
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 |
769 |
indentical to the future-referece frame. |
indentical to the future-referece frame. |
776 |
pEnc->bframenum_head, pEnc->bframenum_tail, |
pEnc->bframenum_head, pEnc->bframenum_tail, |
777 |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
778 |
|
|
|
|
|
779 |
tmp = pEnc->current->seconds; |
tmp = pEnc->current->seconds; |
780 |
pEnc->current->seconds = 0; /* force time_base = 0 */ |
pEnc->current->seconds = 0; /* force time_base = 0 */ |
781 |
|
|
875 |
/* That disabled line of code was supposed to inform VirtualDub |
/* That disabled line of code was supposed to inform VirtualDub |
876 |
* that the frame was a dummy delay frame - now disabled (thx god :-) |
* that the frame was a dummy delay frame - now disabled (thx god :-) |
877 |
*/ |
*/ |
878 |
/* BitstreamPutBits(&bs, 0x7f, 8); */ |
//BitstreamPutBits(&bs, 0x7f, 8); |
879 |
pFrame->intra = 5; |
pFrame->intra = 5; |
880 |
|
|
881 |
if (pResult) { |
if (pResult) { |
897 |
pResult->mblks = 0; |
pResult->mblks = 0; |
898 |
pResult->ublks = 0; |
pResult->ublks = 0; |
899 |
} |
} |
|
|
|
900 |
} else { |
} else { |
901 |
|
|
902 |
if (pResult) { |
if (pResult) { |
983 |
|
|
984 |
pMB->dquant = iDQtab[temp_dquants[OFFSET(x, y)] + 2]; |
pMB->dquant = iDQtab[temp_dquants[OFFSET(x, y)] + 2]; |
985 |
} |
} |
|
|
|
986 |
#undef OFFSET |
#undef OFFSET |
987 |
} |
} |
|
|
|
988 |
xvid_free(temp_dquants); |
xvid_free(temp_dquants); |
989 |
} |
} |
|
|
|
990 |
} |
} |
991 |
|
|
992 |
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
996 |
|
|
997 |
if (pEnc->iFrameNum == 0 || pEnc->bframenum_dx50bvop >= 0 || |
if (pEnc->iFrameNum == 0 || pEnc->bframenum_dx50bvop >= 0 || |
998 |
(mode < 0 && pEnc->mbParam.iMaxKeyInterval > 0 && |
(mode < 0 && pEnc->mbParam.iMaxKeyInterval > 0 && |
999 |
pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval)) |
pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval)) { |
|
{ |
|
1000 |
mode = I_VOP; |
mode = I_VOP; |
1001 |
}else{ |
}else{ |
1002 |
mode = MEanalysis(&pEnc->reference->image, pEnc->current, |
mode = MEanalysis(&pEnc->reference->image, pEnc->current, |
1003 |
&pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, |
&pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval, |
1004 |
(mode < 0) ? pEnc->iFrameNum : 0, |
(/*mode < 0*/1/*hack*/) ? pEnc->iFrameNum : 0, |
1005 |
bframes_count++); |
bframes_count++, pFrame->bframe_threshold); |
1006 |
} |
} |
1007 |
|
|
1008 |
if (mode == I_VOP) { |
if (mode == I_VOP) { |
1614 |
pEnc->mbParam.width, pEnc->mbParam.height); |
pEnc->mbParam.width, pEnc->mbParam.height); |
1615 |
stop_edges_timer(); |
stop_edges_timer(); |
1616 |
} |
} |
|
|
|
1617 |
pEnc->iFrameNum = 0; |
pEnc->iFrameNum = 0; |
1618 |
pEnc->mbParam.m_rounding_type = 1; |
pEnc->mbParam.m_rounding_type = 1; |
1619 |
pEnc->current->rounding_type = pEnc->mbParam.m_rounding_type; |
pEnc->current->rounding_type = pEnc->mbParam.m_rounding_type; |
1711 |
mb_height = (pEnc->mbParam.height + 31) / 32; |
mb_height = (pEnc->mbParam.height + 31) / 32; |
1712 |
} |
} |
1713 |
|
|
|
|
|
1714 |
start_timer(); |
start_timer(); |
1715 |
image_setedges(pRef, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
image_setedges(pRef, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
1716 |
pEnc->mbParam.width, pEnc->mbParam.height); |
pEnc->mbParam.width, pEnc->mbParam.height); |
2132 |
|
|
2133 |
|
|
2134 |
stop_motion_timer(); |
stop_motion_timer(); |
|
|
|
2135 |
/* |
/* |
2136 |
if (test_quant_type(&pEnc->mbParam, pEnc->current)) { |
if (test_quant_type(&pEnc->mbParam, pEnc->current)) { |
2137 |
BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type); |
BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type); |