1 |
|
// 14.04.2002 added FrameCodeB() |
2 |
|
|
3 |
#include <stdlib.h> |
#include <stdlib.h> |
4 |
#include <stdio.h> |
#include <stdio.h> |
5 |
#include <math.h> |
#include <math.h> |
80 |
pParam->fincr = (int)(pParam->fincr / div); |
pParam->fincr = (int)(pParam->fincr / div); |
81 |
} |
} |
82 |
|
|
83 |
if (pParam->bitrate <= 0) |
if (pParam->rc_bitrate <= 0) |
84 |
pParam->bitrate = 900000; |
pParam->rc_bitrate = 900000; |
85 |
|
|
86 |
|
if (pParam->rc_reaction_delay_factor <= 0) |
87 |
|
pParam->rc_reaction_delay_factor = 16; |
88 |
|
|
89 |
|
if (pParam->rc_averaging_period <= 0) |
90 |
|
pParam->rc_averaging_period = 100; |
91 |
|
|
92 |
if (pParam->rc_buffersize <= 0) |
if (pParam->rc_buffer <= 0) |
93 |
pParam->rc_buffersize = 16; |
pParam->rc_buffer = 100; |
94 |
|
|
95 |
if ((pParam->min_quantizer <= 0) || (pParam->min_quantizer > 31)) |
if ((pParam->min_quantizer <= 0) || (pParam->min_quantizer > 31)) |
96 |
pParam->min_quantizer = 1; |
pParam->min_quantizer = 1; |
124 |
|
|
125 |
pEnc->mbParam.quant = 4; |
pEnc->mbParam.quant = 4; |
126 |
|
|
127 |
pEnc->bitrate = pParam->bitrate; |
pEnc->bitrate = pParam->rc_bitrate; |
128 |
|
|
129 |
pEnc->iFrameNum = 0; |
pEnc->iFrameNum = 0; |
130 |
pEnc->iMaxKeyInterval = pParam->max_key_interval; |
pEnc->iMaxKeyInterval = pParam->max_key_interval; |
148 |
image_create(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || |
image_create(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || |
149 |
image_create(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || |
image_create(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || |
150 |
image_create(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || |
image_create(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || |
151 |
|
#ifdef _DEBUG |
152 |
|
image_create(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || |
153 |
|
#endif |
154 |
(pEnc->pMBs = xvid_malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height, CACHE_LINE)) == NULL) |
(pEnc->pMBs = xvid_malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height, CACHE_LINE)) == NULL) |
155 |
{ |
{ |
156 |
image_destroy(&pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
160 |
image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
161 |
image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
162 |
image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
163 |
|
#ifdef _DEBUG |
164 |
|
image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
165 |
|
#endif |
166 |
if (pEnc) |
if (pEnc) |
167 |
{ |
{ |
168 |
xvid_free(pEnc); |
xvid_free(pEnc); |
178 |
|
|
179 |
pParam->handle = (void *)pEnc; |
pParam->handle = (void *)pEnc; |
180 |
|
|
181 |
if (pParam->bitrate) |
if (pParam->rc_bitrate) |
182 |
{ |
{ |
183 |
RateControlInit(pParam->bitrate, pParam->rc_buffersize, pParam->fbase * 1000 / pParam->fincr, |
RateControlInit(pParam->rc_bitrate, pParam->rc_reaction_delay_factor, |
184 |
|
pParam->rc_averaging_period, pParam->rc_buffer, pParam->fbase * 1000 / pParam->fincr, |
185 |
pParam->max_quantizer, pParam->min_quantizer); |
pParam->max_quantizer, pParam->min_quantizer); |
186 |
} |
} |
187 |
|
|
205 |
image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
206 |
image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
207 |
image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
208 |
|
#ifdef _DEBUG |
209 |
|
image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
210 |
|
#endif |
211 |
xvid_free(pEnc); |
xvid_free(pEnc); |
212 |
|
|
213 |
return XVID_ERR_OK; |
return XVID_ERR_OK; |
219 |
Bitstream bs; |
Bitstream bs; |
220 |
uint32_t bits; |
uint32_t bits; |
221 |
uint16_t write_vol_header = 0; |
uint16_t write_vol_header = 0; |
222 |
|
#ifdef _DEBUG |
223 |
|
float psnr; |
224 |
|
uint8_t temp[100]; |
225 |
|
#endif |
226 |
|
|
227 |
start_global_timer(); |
start_global_timer(); |
228 |
|
|
245 |
|
|
246 |
EMMS(); |
EMMS(); |
247 |
|
|
248 |
|
#ifdef _DEBUG |
249 |
|
image_copy(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.height); |
250 |
|
#endif |
251 |
|
|
252 |
BitstreamInit(&bs, pFrame->bitstream, 0); |
BitstreamInit(&bs, pFrame->bitstream, 0); |
253 |
|
|
254 |
if (pFrame->quant == 0) |
if (pFrame->quant == 0) |
349 |
RateControlUpdate(pEnc->mbParam.quant, pFrame->length, pFrame->intra); |
RateControlUpdate(pEnc->mbParam.quant, pFrame->length, pFrame->intra); |
350 |
} |
} |
351 |
|
|
352 |
|
#ifdef _DEBUG |
353 |
|
psnr = image_psnr(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width, |
354 |
|
pEnc->mbParam.width, pEnc->mbParam.height); |
355 |
|
|
356 |
|
sprintf(temp, "PSNR: %f\n", psnr); |
357 |
|
DEBUG(temp); |
358 |
|
#endif |
359 |
|
|
360 |
pEnc->iFrameNum++; |
pEnc->iFrameNum++; |
361 |
image_swap(&pEnc->sCurrent, &pEnc->sReference); |
image_swap(&pEnc->sCurrent, &pEnc->sReference); |
362 |
|
|
823 |
|
|
824 |
return 0; // inter |
return 0; // inter |
825 |
} |
} |
826 |
|
|
827 |
|
|
828 |
|
|
829 |
|
/* |
830 |
|
static void FrameCodeB(Encoder * pEnc, FRAMEINFO * frame, Bitstream * bs, uint32_t *pBits) |
831 |
|
{ |
832 |
|
int16_t dct_codes[6][64]; |
833 |
|
int16_t qcoeff[6][64]; |
834 |
|
uint32_t x, y; |
835 |
|
VECTOR forward; |
836 |
|
VECTOR backward; |
837 |
|
|
838 |
|
IMAGE *f_ref = &pEnc->reference->image; |
839 |
|
IMAGE *b_ref = &pEnc->current->image; |
840 |
|
|
841 |
|
// forward |
842 |
|
image_setedges(f_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, pEnc->mbParam.height); |
843 |
|
start_timer(); |
844 |
|
image_interpolate(f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
845 |
|
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, 0); |
846 |
|
stop_inter_timer(); |
847 |
|
|
848 |
|
// backward |
849 |
|
image_setedges(b_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, pEnc->mbParam.height); |
850 |
|
start_timer(); |
851 |
|
image_interpolate(b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
852 |
|
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, 0); |
853 |
|
stop_inter_timer(); |
854 |
|
|
855 |
|
start_timer(); |
856 |
|
MotionEstimationBVOP(&pEnc->mbParam, frame, |
857 |
|
pEnc->reference->mbs, f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
858 |
|
pEnc->current->mbs, b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV); |
859 |
|
|
860 |
|
stop_motion_timer(); |
861 |
|
|
862 |
|
if (test_quant_type(&pEnc->mbParam, pEnc->current)) |
863 |
|
{ |
864 |
|
BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type); |
865 |
|
} |
866 |
|
|
867 |
|
frame->coding_type = B_VOP; |
868 |
|
BitstreamWriteVopHeader(bs, B_VOP, frame->tick, 0, |
869 |
|
frame->quant, frame->fcode, frame->bcode); |
870 |
|
|
871 |
|
*pBits = BitstreamPos(bs); |
872 |
|
|
873 |
|
pEnc->sStat.iTextBits = 0; |
874 |
|
pEnc->sStat.iMvSum = 0; |
875 |
|
pEnc->sStat.iMvCount = 0; |
876 |
|
pEnc->sStat.kblks = pEnc->sStat.mblks = pEnc->sStat.ublks = 0; |
877 |
|
|
878 |
|
|
879 |
|
for (y = 0; y < pEnc->mbParam.mb_height; y++) |
880 |
|
{ |
881 |
|
// reset prediction |
882 |
|
|
883 |
|
forward.x = 0; |
884 |
|
forward.y = 0; |
885 |
|
backward.x = 0; |
886 |
|
backward.y = 0; |
887 |
|
|
888 |
|
for (x = 0; x < pEnc->mbParam.mb_width; x++) |
889 |
|
{ |
890 |
|
MACROBLOCK * f_mb = &pEnc->reference->mbs[x + y * pEnc->mbParam.mb_width]; |
891 |
|
MACROBLOCK * b_mb = &pEnc->current->mbs[x + y * pEnc->mbParam.mb_width]; |
892 |
|
MACROBLOCK * mb = &frame->mbs[x + y * pEnc->mbParam.mb_width]; |
893 |
|
|
894 |
|
// decoder ignores mb when refence block is INTER(0,0), CBP=0 |
895 |
|
if (mb->mode == MODE_NOT_CODED) |
896 |
|
{ |
897 |
|
mb->mvs[0].x = 0; |
898 |
|
mb->mvs[0].y = 0; |
899 |
|
continue; |
900 |
|
} |
901 |
|
|
902 |
|
MBMotionCompensationBVOP(&pEnc->mbParam, mb, x, y, &frame->image, |
903 |
|
f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
904 |
|
b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
905 |
|
dct_codes); |
906 |
|
|
907 |
|
mb->quant = frame->quant; |
908 |
|
mb->cbp = MBTransQuantInter(&pEnc->mbParam, frame, x, y, dct_codes, qcoeff); |
909 |
|
//mb->cbp = MBTransQuantBVOP(&pEnc->mbParam, x, y, dct_codes, qcoeff, &frame->image, frame->quant); |
910 |
|
|
911 |
|
|
912 |
|
if ((mb->mode == MODE_INTERPOLATE || mb->mode == MODE_DIRECT) && |
913 |
|
mb->cbp == 0 && |
914 |
|
mb->mvs[0].x == 0 && |
915 |
|
mb->mvs[0].y == 0) |
916 |
|
{ |
917 |
|
mb->mode = 5; // skipped |
918 |
|
} |
919 |
|
|
920 |
|
if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_FORWARD) |
921 |
|
{ |
922 |
|
mb->pmvs[0].x = mb->mvs[0].x - forward.x; |
923 |
|
mb->pmvs[0].y = mb->mvs[0].y - forward.y; |
924 |
|
forward.x = mb->mvs[0].x; |
925 |
|
forward.y = mb->mvs[0].y; |
926 |
|
} |
927 |
|
|
928 |
|
if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_BACKWARD) |
929 |
|
{ |
930 |
|
mb->b_pmvs[0].x = mb->b_mvs[0].x - backward.x; |
931 |
|
mb->b_pmvs[0].y = mb->b_mvs[0].y - backward.y; |
932 |
|
backward.x = mb->b_mvs[0].x; |
933 |
|
backward.y = mb->b_mvs[0].y; |
934 |
|
} |
935 |
|
|
936 |
|
// printf("[%i %i] M=%i CBP=%i MVX=%i MVY=%i %i,%i %i,%i\n", x, y, pMB->mode, pMB->cbp, pMB->mvs[0].x, bmb->pmvs[0].x, bmb->pmvs[0].y, forward.x, forward.y); |
937 |
|
|
938 |
|
start_timer(); |
939 |
|
MBCodingBVOP(frame, mb, qcoeff, bs, &pEnc->sStat); |
940 |
|
stop_coding_timer(); |
941 |
|
} |
942 |
|
} |
943 |
|
|
944 |
|
emms(); |
945 |
|
|
946 |
|
// TODO: dynamic fcode/bcode ??? |
947 |
|
|
948 |
|
*pBits = BitstreamPos(bs) - *pBits; |
949 |
|
|
950 |
|
} |
951 |
|
|
952 |
|
*/ |