140 |
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 || |
141 |
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 || |
142 |
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 || |
143 |
|
#ifdef _DEBUG |
144 |
|
image_create(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 || |
145 |
|
#endif |
146 |
(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) |
147 |
{ |
{ |
148 |
image_destroy(&pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
152 |
image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
153 |
image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
154 |
image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
155 |
|
#ifdef _DEBUG |
156 |
|
image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
157 |
|
#endif |
158 |
if (pEnc) |
if (pEnc) |
159 |
{ |
{ |
160 |
xvid_free(pEnc); |
xvid_free(pEnc); |
172 |
|
|
173 |
if (pParam->bitrate) |
if (pParam->bitrate) |
174 |
{ |
{ |
175 |
RateControlInit(pParam->bitrate, pParam->rc_buffersize, pParam->fbase * 100 / pParam->fincr, |
RateControlInit(pParam->bitrate, pParam->rc_buffersize, pParam->fbase * 1000 / pParam->fincr, |
176 |
pParam->max_quantizer, pParam->min_quantizer); |
pParam->max_quantizer, pParam->min_quantizer); |
177 |
} |
} |
178 |
|
|
196 |
image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
197 |
image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
198 |
image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
199 |
|
#ifdef _DEBUG |
200 |
|
image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height); |
201 |
|
#endif |
202 |
xvid_free(pEnc); |
xvid_free(pEnc); |
203 |
|
|
204 |
return XVID_ERR_OK; |
return XVID_ERR_OK; |
210 |
Bitstream bs; |
Bitstream bs; |
211 |
uint32_t bits; |
uint32_t bits; |
212 |
uint16_t write_vol_header = 0; |
uint16_t write_vol_header = 0; |
213 |
|
#ifdef _DEBUG |
214 |
|
float psnr; |
215 |
|
uint8_t temp[100]; |
216 |
|
#endif |
217 |
|
|
218 |
start_global_timer(); |
start_global_timer(); |
219 |
|
|
236 |
|
|
237 |
EMMS(); |
EMMS(); |
238 |
|
|
239 |
|
#ifdef _DEBUG |
240 |
|
image_copy(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.height); |
241 |
|
#endif |
242 |
|
|
243 |
BitstreamInit(&bs, pFrame->bitstream, 0); |
BitstreamInit(&bs, pFrame->bitstream, 0); |
244 |
|
|
245 |
if (pFrame->quant == 0) |
if (pFrame->quant == 0) |
340 |
RateControlUpdate(pEnc->mbParam.quant, pFrame->length, pFrame->intra); |
RateControlUpdate(pEnc->mbParam.quant, pFrame->length, pFrame->intra); |
341 |
} |
} |
342 |
|
|
343 |
|
#ifdef _DEBUG |
344 |
|
psnr = image_psnr(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width, |
345 |
|
pEnc->mbParam.width, pEnc->mbParam.height); |
346 |
|
|
347 |
|
sprintf(temp, "PSNR: %f\n", psnr); |
348 |
|
DEBUG(temp); |
349 |
|
#endif |
350 |
|
|
351 |
pEnc->iFrameNum++; |
pEnc->iFrameNum++; |
352 |
image_swap(&pEnc->sCurrent, &pEnc->sReference); |
image_swap(&pEnc->sCurrent, &pEnc->sReference); |
353 |
|
|
377 |
} |
} |
378 |
|
|
379 |
|
|
|
static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits) |
|
|
{ |
|
|
|
|
|
DECLARE_ALIGNED_MATRIX(dct_codes, 6, 64, int16_t, CACHE_LINE); |
|
|
DECLARE_ALIGNED_MATRIX(qcoeff, 6, 64, int16_t, CACHE_LINE); |
|
|
|
|
|
uint16_t x, y; |
|
|
|
|
|
pEnc->iFrameNum = 0; |
|
|
pEnc->mbParam.rounding_type = 1; |
|
|
pEnc->mbParam.coding_type = I_VOP; |
|
|
|
|
|
BitstreamWriteVolHeader(bs, &pEnc->mbParam); |
|
|
BitstreamWriteVopHeader(bs, &pEnc->mbParam); |
|
|
|
|
|
*pBits = BitstreamPos(bs); |
|
|
|
|
|
pEnc->sStat.iTextBits = 0; |
|
|
pEnc->sStat.kblks = pEnc->mbParam.mb_width * pEnc->mbParam.mb_height; |
|
|
pEnc->sStat.mblks = pEnc->sStat.ublks = 0; |
|
|
|
|
|
for (y = 0; y < pEnc->mbParam.mb_height; y++) |
|
|
for (x = 0; x < pEnc->mbParam.mb_width; x++) |
|
|
{ |
|
|
MACROBLOCK *pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width]; |
|
|
|
|
|
CodeIntraMB(pEnc, pMB); |
|
|
|
|
|
MBTransQuantIntra(&pEnc->mbParam, pMB, x, y, dct_codes, qcoeff, &pEnc->sCurrent); |
|
|
|
|
|
start_timer(); |
|
|
MBPrediction(&pEnc->mbParam, x, y, pEnc->mbParam.mb_width, qcoeff, pEnc->pMBs); |
|
|
stop_prediction_timer(); |
|
|
|
|
|
start_timer(); |
|
|
MBCoding(&pEnc->mbParam, pMB, qcoeff, bs, &pEnc->sStat); |
|
|
stop_coding_timer(); |
|
|
} |
|
|
|
|
|
emms(); |
|
|
|
|
|
*pBits = BitstreamPos(bs) - *pBits; |
|
|
pEnc->sStat.fMvPrevSigma = -1; |
|
|
pEnc->sStat.iMvSum = 0; |
|
|
pEnc->sStat.iMvCount = 0; |
|
|
pEnc->mbParam.fixed_code = 2; |
|
|
|
|
|
return 1; // intra |
|
|
} |
|
|
|
|
|
|
|
380 |
#define FCODEBITS 3 |
#define FCODEBITS 3 |
381 |
#define MODEBITS 5 |
#define MODEBITS 5 |
382 |
|
|
578 |
} |
} |
579 |
|
|
580 |
|
|
581 |
|
static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits) |
582 |
|
{ |
583 |
|
|
584 |
|
DECLARE_ALIGNED_MATRIX(dct_codes, 6, 64, int16_t, CACHE_LINE); |
585 |
|
DECLARE_ALIGNED_MATRIX(qcoeff, 6, 64, int16_t, CACHE_LINE); |
586 |
|
|
587 |
|
uint16_t x, y; |
588 |
|
|
589 |
|
pEnc->iFrameNum = 0; |
590 |
|
pEnc->mbParam.rounding_type = 1; |
591 |
|
pEnc->mbParam.coding_type = I_VOP; |
592 |
|
|
593 |
|
BitstreamWriteVolHeader(bs, &pEnc->mbParam); |
594 |
|
BitstreamWriteVopHeader(bs, &pEnc->mbParam); |
595 |
|
|
596 |
|
*pBits = BitstreamPos(bs); |
597 |
|
|
598 |
|
pEnc->sStat.iTextBits = 0; |
599 |
|
pEnc->sStat.kblks = pEnc->mbParam.mb_width * pEnc->mbParam.mb_height; |
600 |
|
pEnc->sStat.mblks = pEnc->sStat.ublks = 0; |
601 |
|
|
602 |
|
for (y = 0; y < pEnc->mbParam.mb_height; y++) |
603 |
|
for (x = 0; x < pEnc->mbParam.mb_width; x++) |
604 |
|
{ |
605 |
|
MACROBLOCK *pMB = &pEnc->pMBs[x + y * pEnc->mbParam.mb_width]; |
606 |
|
|
607 |
|
CodeIntraMB(pEnc, pMB); |
608 |
|
|
609 |
|
MBTransQuantIntra(&pEnc->mbParam, pMB, x, y, dct_codes, qcoeff, &pEnc->sCurrent); |
610 |
|
|
611 |
|
start_timer(); |
612 |
|
MBPrediction(&pEnc->mbParam, x, y, pEnc->mbParam.mb_width, qcoeff, pEnc->pMBs); |
613 |
|
stop_prediction_timer(); |
614 |
|
|
615 |
|
start_timer(); |
616 |
|
MBCoding(&pEnc->mbParam, pMB, qcoeff, bs, &pEnc->sStat); |
617 |
|
stop_coding_timer(); |
618 |
|
} |
619 |
|
|
620 |
|
emms(); |
621 |
|
|
622 |
|
*pBits = BitstreamPos(bs) - *pBits; |
623 |
|
pEnc->sStat.fMvPrevSigma = -1; |
624 |
|
pEnc->sStat.iMvSum = 0; |
625 |
|
pEnc->sStat.iMvCount = 0; |
626 |
|
pEnc->mbParam.fixed_code = 2; |
627 |
|
|
628 |
|
if (pEnc->mbParam.global_flags & XVID_HINTEDME_GET) |
629 |
|
{ |
630 |
|
HintedMEGet(pEnc, 1); |
631 |
|
} |
632 |
|
|
633 |
|
return 1; // intra |
634 |
|
} |
635 |
|
|
636 |
|
|
637 |
#define INTRA_THRESHOLD 0.5 |
#define INTRA_THRESHOLD 0.5 |
638 |
|
|
639 |
static int FrameCodeP(Encoder * pEnc, Bitstream * bs, uint32_t *pBits, bool force_inter, bool vol_header) |
static int FrameCodeP(Encoder * pEnc, Bitstream * bs, uint32_t *pBits, bool force_inter, bool vol_header) |
690 |
|
|
691 |
if (bIntra == 1) |
if (bIntra == 1) |
692 |
{ |
{ |
|
if (pEnc->mbParam.global_flags & XVID_HINTEDME_GET) |
|
|
{ |
|
|
HintedMEGet(pEnc, 1); |
|
|
} |
|
693 |
return FrameCodeI(pEnc, bs, pBits); |
return FrameCodeI(pEnc, bs, pBits); |
694 |
} |
} |
695 |
|
|