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> |
816 |
|
|
817 |
return 0; // inter |
return 0; // inter |
818 |
} |
} |
819 |
|
|
820 |
|
|
821 |
|
|
822 |
|
/* |
823 |
|
static void FrameCodeB(Encoder * pEnc, FRAMEINFO * frame, Bitstream * bs, uint32_t *pBits) |
824 |
|
{ |
825 |
|
int16_t dct_codes[6][64]; |
826 |
|
int16_t qcoeff[6][64]; |
827 |
|
uint32_t x, y; |
828 |
|
VECTOR forward; |
829 |
|
VECTOR backward; |
830 |
|
|
831 |
|
IMAGE *f_ref = &pEnc->reference->image; |
832 |
|
IMAGE *b_ref = &pEnc->current->image; |
833 |
|
|
834 |
|
// forward |
835 |
|
image_setedges(f_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, pEnc->mbParam.height); |
836 |
|
start_timer(); |
837 |
|
image_interpolate(f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
838 |
|
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, 0); |
839 |
|
stop_inter_timer(); |
840 |
|
|
841 |
|
// backward |
842 |
|
image_setedges(b_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, pEnc->mbParam.height); |
843 |
|
start_timer(); |
844 |
|
image_interpolate(b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
845 |
|
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, 0); |
846 |
|
stop_inter_timer(); |
847 |
|
|
848 |
|
start_timer(); |
849 |
|
MotionEstimationBVOP(&pEnc->mbParam, frame, |
850 |
|
pEnc->reference->mbs, f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
851 |
|
pEnc->current->mbs, b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV); |
852 |
|
|
853 |
|
stop_motion_timer(); |
854 |
|
|
855 |
|
if (test_quant_type(&pEnc->mbParam, pEnc->current)) |
856 |
|
{ |
857 |
|
BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type); |
858 |
|
} |
859 |
|
|
860 |
|
frame->coding_type = B_VOP; |
861 |
|
BitstreamWriteVopHeader(bs, B_VOP, frame->tick, 0, |
862 |
|
frame->quant, frame->fcode, frame->bcode); |
863 |
|
|
864 |
|
*pBits = BitstreamPos(bs); |
865 |
|
|
866 |
|
pEnc->sStat.iTextBits = 0; |
867 |
|
pEnc->sStat.iMvSum = 0; |
868 |
|
pEnc->sStat.iMvCount = 0; |
869 |
|
pEnc->sStat.kblks = pEnc->sStat.mblks = pEnc->sStat.ublks = 0; |
870 |
|
|
871 |
|
|
872 |
|
for (y = 0; y < pEnc->mbParam.mb_height; y++) |
873 |
|
{ |
874 |
|
// reset prediction |
875 |
|
|
876 |
|
forward.x = 0; |
877 |
|
forward.y = 0; |
878 |
|
backward.x = 0; |
879 |
|
backward.y = 0; |
880 |
|
|
881 |
|
for (x = 0; x < pEnc->mbParam.mb_width; x++) |
882 |
|
{ |
883 |
|
MACROBLOCK * f_mb = &pEnc->reference->mbs[x + y * pEnc->mbParam.mb_width]; |
884 |
|
MACROBLOCK * b_mb = &pEnc->current->mbs[x + y * pEnc->mbParam.mb_width]; |
885 |
|
MACROBLOCK * mb = &frame->mbs[x + y * pEnc->mbParam.mb_width]; |
886 |
|
|
887 |
|
// decoder ignores mb when refence block is INTER(0,0), CBP=0 |
888 |
|
if (mb->mode == MODE_NOT_CODED) |
889 |
|
{ |
890 |
|
mb->mvs[0].x = 0; |
891 |
|
mb->mvs[0].y = 0; |
892 |
|
continue; |
893 |
|
} |
894 |
|
|
895 |
|
MBMotionCompensationBVOP(&pEnc->mbParam, mb, x, y, &frame->image, |
896 |
|
f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
897 |
|
b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
898 |
|
dct_codes); |
899 |
|
|
900 |
|
mb->quant = frame->quant; |
901 |
|
mb->cbp = MBTransQuantInter(&pEnc->mbParam, frame, x, y, dct_codes, qcoeff); |
902 |
|
//mb->cbp = MBTransQuantBVOP(&pEnc->mbParam, x, y, dct_codes, qcoeff, &frame->image, frame->quant); |
903 |
|
|
904 |
|
|
905 |
|
if ((mb->mode == MODE_INTERPOLATE || mb->mode == MODE_DIRECT) && |
906 |
|
mb->cbp == 0 && |
907 |
|
mb->mvs[0].x == 0 && |
908 |
|
mb->mvs[0].y == 0) |
909 |
|
{ |
910 |
|
mb->mode = 5; // skipped |
911 |
|
} |
912 |
|
|
913 |
|
if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_FORWARD) |
914 |
|
{ |
915 |
|
mb->pmvs[0].x = mb->mvs[0].x - forward.x; |
916 |
|
mb->pmvs[0].y = mb->mvs[0].y - forward.y; |
917 |
|
forward.x = mb->mvs[0].x; |
918 |
|
forward.y = mb->mvs[0].y; |
919 |
|
} |
920 |
|
|
921 |
|
if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_BACKWARD) |
922 |
|
{ |
923 |
|
mb->b_pmvs[0].x = mb->b_mvs[0].x - backward.x; |
924 |
|
mb->b_pmvs[0].y = mb->b_mvs[0].y - backward.y; |
925 |
|
backward.x = mb->b_mvs[0].x; |
926 |
|
backward.y = mb->b_mvs[0].y; |
927 |
|
} |
928 |
|
|
929 |
|
// 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); |
930 |
|
|
931 |
|
start_timer(); |
932 |
|
MBCodingBVOP(frame, mb, qcoeff, bs, &pEnc->sStat); |
933 |
|
stop_coding_timer(); |
934 |
|
} |
935 |
|
} |
936 |
|
|
937 |
|
emms(); |
938 |
|
|
939 |
|
// TODO: dynamic fcode/bcode ??? |
940 |
|
|
941 |
|
*pBits = BitstreamPos(bs) - *pBits; |
942 |
|
|
943 |
|
} |
944 |
|
|
945 |
|
*/ |