965 |
uv_dx = pMB->mvs[0].x; |
uv_dx = pMB->mvs[0].x; |
966 |
uv_dy = pMB->mvs[0].y; |
uv_dy = pMB->mvs[0].y; |
967 |
|
|
968 |
uv_dx = (uv_dx & 3) ? (uv_dx >> 1) | 1 : uv_dx / 2; |
if (dec->quarterpel) |
969 |
uv_dy = (uv_dy & 3) ? (uv_dy >> 1) | 1 : uv_dy / 2; |
{ |
970 |
|
uv_dx /= 2; |
971 |
|
uv_dy /= 2; |
972 |
|
} |
973 |
|
|
974 |
|
uv_dx = (uv_dx >> 1) + roundtab_79[uv_dx & 0x3]; |
975 |
|
uv_dy = (uv_dy >> 1) + roundtab_79[uv_dy & 0x3]; |
976 |
} else { |
} else { |
977 |
int sum; |
int sum; |
978 |
|
|
979 |
|
if(dec->quarterpel) |
980 |
|
sum = (pMB->mvs[0].x / 2) + (pMB->mvs[1].x / 2) + (pMB->mvs[2].x / 2) + (pMB->mvs[3].x / 2); |
981 |
|
else |
982 |
sum = pMB->mvs[0].x + pMB->mvs[1].x + pMB->mvs[2].x + pMB->mvs[3].x; |
sum = pMB->mvs[0].x + pMB->mvs[1].x + pMB->mvs[2].x + pMB->mvs[3].x; |
|
uv_dx = |
|
|
(sum == |
|
|
0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + |
|
|
(ABS(sum) / 16) * 2)); |
|
983 |
|
|
984 |
|
uv_dx = (sum >> 3) + roundtab_76[sum & 0xf]; |
985 |
|
|
986 |
|
if(dec->quarterpel) |
987 |
|
sum = (pMB->mvs[0].y / 2) + (pMB->mvs[1].y / 2) + (pMB->mvs[2].y / 2) + (pMB->mvs[3].y / 2); |
988 |
|
else |
989 |
sum = pMB->mvs[0].y + pMB->mvs[1].y + pMB->mvs[2].y + pMB->mvs[3].y; |
sum = pMB->mvs[0].y + pMB->mvs[1].y + pMB->mvs[2].y + pMB->mvs[3].y; |
990 |
uv_dy = |
|
991 |
(sum == |
uv_dy = (sum >> 3) + roundtab_76[sum & 0xf]; |
|
0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + |
|
|
(ABS(sum) / 16) * 2)); |
|
992 |
} |
} |
993 |
|
|
994 |
start_timer(); |
start_timer(); |
995 |
|
if(dec->quarterpel) { |
996 |
|
interpolate16x16_quarterpel(dec->cur.y, dec->refn[ref].y, dec->refh.y, dec->refh.y + 64, |
997 |
|
dec->refh.y + 128, 16*x_pos, 16*y_pos, |
998 |
|
pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); |
999 |
|
} |
1000 |
|
else { |
1001 |
interpolate8x8_switch(dec->cur.y, dec->refn[ref].y, 16 * x_pos, 16 * y_pos, |
interpolate8x8_switch(dec->cur.y, dec->refn[ref].y, 16 * x_pos, 16 * y_pos, |
1002 |
pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); |
pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); |
1003 |
interpolate8x8_switch(dec->cur.y, dec->refn[ref].y, 16 * x_pos + 8, |
interpolate8x8_switch(dec->cur.y, dec->refn[ref].y, 16*x_pos + 8, 16*y_pos, |
1004 |
16 * y_pos, pMB->mvs[1].x, pMB->mvs[1].y, stride, 0); |
pMB->mvs[1].x, pMB->mvs[1].y, stride, 0); |
1005 |
interpolate8x8_switch(dec->cur.y, dec->refn[ref].y, 16 * x_pos, |
interpolate8x8_switch(dec->cur.y, dec->refn[ref].y, 16*x_pos, 16*y_pos + 8, |
1006 |
16 * y_pos + 8, pMB->mvs[2].x, pMB->mvs[2].y, stride, |
pMB->mvs[2].x, pMB->mvs[2].y, stride, 0); |
1007 |
0); |
interpolate8x8_switch(dec->cur.y, dec->refn[ref].y, 16*x_pos + 8, 16*y_pos + 8, |
1008 |
interpolate8x8_switch(dec->cur.y, dec->refn[ref].y, 16 * x_pos + 8, |
pMB->mvs[3].x, pMB->mvs[3].y, stride, 0); |
1009 |
16 * y_pos + 8, pMB->mvs[3].x, pMB->mvs[3].y, stride, |
} |
1010 |
0); |
|
1011 |
interpolate8x8_switch(dec->cur.u, dec->refn[ref].u, 8 * x_pos, 8 * y_pos, |
interpolate8x8_switch(dec->cur.u, dec->refn[ref].u, 8 * x_pos, 8 * y_pos, |
1012 |
uv_dx, uv_dy, stride2, 0); |
uv_dx, uv_dy, stride2, 0); |
1013 |
interpolate8x8_switch(dec->cur.v, dec->refn[ref].v, 8 * x_pos, 8 * y_pos, |
interpolate8x8_switch(dec->cur.v, dec->refn[ref].v, 8 * x_pos, 8 * y_pos, |
1094 |
uv_dx = pMB->mvs[0].x; |
uv_dx = pMB->mvs[0].x; |
1095 |
uv_dy = pMB->mvs[0].y; |
uv_dy = pMB->mvs[0].y; |
1096 |
|
|
|
uv_dx = (uv_dx & 3) ? (uv_dx >> 1) | 1 : uv_dx / 2; |
|
|
uv_dy = (uv_dy & 3) ? (uv_dy >> 1) | 1 : uv_dy / 2; |
|
|
|
|
1097 |
b_uv_dx = pMB->b_mvs[0].x; |
b_uv_dx = pMB->b_mvs[0].x; |
1098 |
b_uv_dy = pMB->b_mvs[0].y; |
b_uv_dy = pMB->b_mvs[0].y; |
1099 |
|
|
1100 |
b_uv_dx = (uv_dx & 3) ? (uv_dx >> 1) | 1 : uv_dx / 2; |
if (dec->quarterpel) |
1101 |
b_uv_dy = (uv_dy & 3) ? (uv_dy >> 1) | 1 : uv_dy / 2; |
{ |
1102 |
|
uv_dx /= 2; |
1103 |
|
uv_dy /= 2; |
1104 |
|
|
1105 |
|
b_uv_dx /= 2; |
1106 |
|
b_uv_dy /= 2; |
1107 |
|
} |
1108 |
|
|
1109 |
|
uv_dx = (uv_dx >> 1) + roundtab_79[uv_dx & 0x3]; |
1110 |
|
uv_dy = (uv_dy >> 1) + roundtab_79[uv_dy & 0x3]; |
1111 |
|
|
1112 |
|
b_uv_dx = (b_uv_dx >> 1) + roundtab_79[b_uv_dx & 0x3]; |
1113 |
|
b_uv_dy = (b_uv_dy >> 1) + roundtab_79[b_uv_dy & 0x3]; |
1114 |
} else { |
} else { |
1115 |
int sum; |
int sum; |
1116 |
|
|
1117 |
|
if(dec->quarterpel) |
1118 |
|
sum = (pMB->mvs[0].x / 2) + (pMB->mvs[1].x / 2) + (pMB->mvs[2].x / 2) + (pMB->mvs[3].x / 2); |
1119 |
|
else |
1120 |
sum = pMB->mvs[0].x + pMB->mvs[1].x + pMB->mvs[2].x + pMB->mvs[3].x; |
sum = pMB->mvs[0].x + pMB->mvs[1].x + pMB->mvs[2].x + pMB->mvs[3].x; |
|
uv_dx = |
|
|
(sum == |
|
|
0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + |
|
|
(ABS(sum) / 16) * 2)); |
|
1121 |
|
|
1122 |
|
uv_dx = (sum >> 3) + roundtab_76[sum & 0xf]; |
1123 |
|
|
1124 |
|
if(dec->quarterpel) |
1125 |
|
sum = (pMB->mvs[0].y / 2) + (pMB->mvs[1].y / 2) + (pMB->mvs[2].y / 2) + (pMB->mvs[3].y / 2); |
1126 |
|
else |
1127 |
sum = pMB->mvs[0].y + pMB->mvs[1].y + pMB->mvs[2].y + pMB->mvs[3].y; |
sum = pMB->mvs[0].y + pMB->mvs[1].y + pMB->mvs[2].y + pMB->mvs[3].y; |
1128 |
uv_dy = |
|
1129 |
(sum == |
uv_dy = (sum >> 3) + roundtab_76[sum & 0xf]; |
1130 |
0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + |
|
1131 |
(ABS(sum) / 16) * 2)); |
|
1132 |
|
if(dec->quarterpel) |
1133 |
sum = |
sum = (pMB->b_mvs[0].x / 2) + (pMB->b_mvs[1].x / 2) + (pMB->b_mvs[2].x / 2) + (pMB->b_mvs[3].x / 2); |
1134 |
pMB->b_mvs[0].x + pMB->b_mvs[1].x + pMB->b_mvs[2].x + |
else |
1135 |
pMB->b_mvs[3].x; |
sum = pMB->b_mvs[0].x + pMB->b_mvs[1].x + pMB->b_mvs[2].x + pMB->b_mvs[3].x; |
1136 |
b_uv_dx = |
|
1137 |
(sum == |
b_uv_dx = (sum >> 3) + roundtab_76[sum & 0xf]; |
1138 |
0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + |
|
1139 |
(ABS(sum) / 16) * 2)); |
if(dec->quarterpel) |
1140 |
|
sum = (pMB->b_mvs[0].y / 2) + (pMB->b_mvs[1].y / 2) + (pMB->b_mvs[2].y / 2) + (pMB->b_mvs[3].y / 2); |
1141 |
sum = |
else |
1142 |
pMB->b_mvs[0].y + pMB->b_mvs[1].y + pMB->b_mvs[2].y + |
sum = pMB->b_mvs[0].y + pMB->b_mvs[1].y + pMB->b_mvs[2].y + pMB->b_mvs[3].y; |
1143 |
pMB->b_mvs[3].y; |
|
1144 |
b_uv_dy = |
b_uv_dy = (sum >> 3) + roundtab_76[sum & 0xf]; |
|
(sum == |
|
|
0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + |
|
|
(ABS(sum) / 16) * 2)); |
|
1145 |
} |
} |
1146 |
|
|
1147 |
|
|
1148 |
start_timer(); |
start_timer(); |
1149 |
|
if(dec->quarterpel) { |
1150 |
|
if((pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q)) |
1151 |
|
interpolate16x16_quarterpel(dec->cur.y, forward.y, dec->refh.y, dec->refh.y + 64, |
1152 |
|
dec->refh.y + 128, 16*x_pos, 16*y_pos, |
1153 |
|
pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); |
1154 |
|
else { |
1155 |
|
interpolate8x8_quarterpel(dec->cur.y, forward.y, dec->refh.y, dec->refh.y + 64, |
1156 |
|
dec->refh.y + 128, 16*x_pos, 16*y_pos, |
1157 |
|
pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); |
1158 |
|
interpolate8x8_quarterpel(dec->cur.y, forward.y, dec->refh.y, dec->refh.y + 64, |
1159 |
|
dec->refh.y + 128, 16*x_pos + 8, 16*y_pos, |
1160 |
|
pMB->mvs[1].x, pMB->mvs[1].y, stride, 0); |
1161 |
|
interpolate8x8_quarterpel(dec->cur.y, forward.y, dec->refh.y, dec->refh.y + 64, |
1162 |
|
dec->refh.y + 128, 16*x_pos, 16*y_pos + 8, |
1163 |
|
pMB->mvs[2].x, pMB->mvs[2].y, stride, 0); |
1164 |
|
interpolate8x8_quarterpel(dec->cur.y, forward.y, dec->refh.y, dec->refh.y + 64, |
1165 |
|
dec->refh.y + 128, 16*x_pos + 8, 16*y_pos + 8, |
1166 |
|
pMB->mvs[3].x, pMB->mvs[3].y, stride, 0); |
1167 |
|
} |
1168 |
|
} |
1169 |
|
else { |
1170 |
interpolate8x8_switch(dec->cur.y, forward.y, 16 * x_pos, 16 * y_pos, |
interpolate8x8_switch(dec->cur.y, forward.y, 16 * x_pos, 16 * y_pos, |
1171 |
pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); |
pMB->mvs[0].x, pMB->mvs[0].y, stride, 0); |
1172 |
interpolate8x8_switch(dec->cur.y, forward.y, 16 * x_pos + 8, 16 * y_pos, |
interpolate8x8_switch(dec->cur.y, forward.y, 16 * x_pos + 8, 16 * y_pos, |
1176 |
interpolate8x8_switch(dec->cur.y, forward.y, 16 * x_pos + 8, |
interpolate8x8_switch(dec->cur.y, forward.y, 16 * x_pos + 8, |
1177 |
16 * y_pos + 8, pMB->mvs[3].x, pMB->mvs[3].y, stride, |
16 * y_pos + 8, pMB->mvs[3].x, pMB->mvs[3].y, stride, |
1178 |
0); |
0); |
1179 |
|
} |
1180 |
|
|
1181 |
interpolate8x8_switch(dec->cur.u, forward.u, 8 * x_pos, 8 * y_pos, uv_dx, |
interpolate8x8_switch(dec->cur.u, forward.u, 8 * x_pos, 8 * y_pos, uv_dx, |
1182 |
uv_dy, stride2, 0); |
uv_dy, stride2, 0); |
1183 |
interpolate8x8_switch(dec->cur.v, forward.v, 8 * x_pos, 8 * y_pos, uv_dx, |
interpolate8x8_switch(dec->cur.v, forward.v, 8 * x_pos, 8 * y_pos, uv_dx, |
1184 |
uv_dy, stride2, 0); |
uv_dy, stride2, 0); |
1185 |
|
|
1186 |
|
|
1187 |
|
if(dec->quarterpel) { |
1188 |
|
if((pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q)) |
1189 |
|
interpolate16x16_quarterpel(dec->refn[2].y, backward.y, dec->refh.y, dec->refh.y + 64, |
1190 |
|
dec->refh.y + 128, 16*x_pos, 16*y_pos, |
1191 |
|
pMB->b_mvs[0].x, pMB->b_mvs[0].y, stride, 0); |
1192 |
|
else { |
1193 |
|
interpolate8x8_quarterpel(dec->refn[2].y, backward.y, dec->refh.y, dec->refh.y + 64, |
1194 |
|
dec->refh.y + 128, 16*x_pos, 16*y_pos, |
1195 |
|
pMB->b_mvs[0].x, pMB->b_mvs[0].y, stride, 0); |
1196 |
|
interpolate8x8_quarterpel(dec->refn[2].y, backward.y, dec->refh.y, dec->refh.y + 64, |
1197 |
|
dec->refh.y + 128, 16*x_pos + 8, 16*y_pos, |
1198 |
|
pMB->b_mvs[1].x, pMB->b_mvs[1].y, stride, 0); |
1199 |
|
interpolate8x8_quarterpel(dec->refn[2].y, backward.y, dec->refh.y, dec->refh.y + 64, |
1200 |
|
dec->refh.y + 128, 16*x_pos, 16*y_pos + 8, |
1201 |
|
pMB->b_mvs[2].x, pMB->b_mvs[2].y, stride, 0); |
1202 |
|
interpolate8x8_quarterpel(dec->refn[2].y, backward.y, dec->refh.y, dec->refh.y + 64, |
1203 |
|
dec->refh.y + 128, 16*x_pos + 8, 16*y_pos + 8, |
1204 |
|
pMB->b_mvs[3].x, pMB->b_mvs[3].y, stride, 0); |
1205 |
|
} |
1206 |
|
} |
1207 |
|
else { |
1208 |
interpolate8x8_switch(dec->refn[2].y, backward.y, 16 * x_pos, 16 * y_pos, |
interpolate8x8_switch(dec->refn[2].y, backward.y, 16 * x_pos, 16 * y_pos, |
1209 |
pMB->b_mvs[0].x, pMB->b_mvs[0].y, stride, 0); |
pMB->b_mvs[0].x, pMB->b_mvs[0].y, stride, 0); |
1210 |
interpolate8x8_switch(dec->refn[2].y, backward.y, 16 * x_pos + 8, |
interpolate8x8_switch(dec->refn[2].y, backward.y, 16 * x_pos + 8, |
1216 |
interpolate8x8_switch(dec->refn[2].y, backward.y, 16 * x_pos + 8, |
interpolate8x8_switch(dec->refn[2].y, backward.y, 16 * x_pos + 8, |
1217 |
16 * y_pos + 8, pMB->b_mvs[3].x, pMB->b_mvs[3].y, |
16 * y_pos + 8, pMB->b_mvs[3].x, pMB->b_mvs[3].y, |
1218 |
stride, 0); |
stride, 0); |
1219 |
|
} |
1220 |
|
|
1221 |
interpolate8x8_switch(dec->refn[2].u, backward.u, 8 * x_pos, 8 * y_pos, |
interpolate8x8_switch(dec->refn[2].u, backward.u, 8 * x_pos, 8 * y_pos, |
1222 |
b_uv_dx, b_uv_dy, stride2, 0); |
b_uv_dx, b_uv_dy, stride2, 0); |
1223 |
interpolate8x8_switch(dec->refn[2].v, backward.v, 8 * x_pos, 8 * y_pos, |
interpolate8x8_switch(dec->refn[2].v, backward.v, 8 * x_pos, 8 * y_pos, |
1226 |
interpolate8x8_avg2(dec->cur.y + (16 * y_pos * stride) + 16 * x_pos, |
interpolate8x8_avg2(dec->cur.y + (16 * y_pos * stride) + 16 * x_pos, |
1227 |
dec->cur.y + (16 * y_pos * stride) + 16 * x_pos, |
dec->cur.y + (16 * y_pos * stride) + 16 * x_pos, |
1228 |
dec->refn[2].y + (16 * y_pos * stride) + 16 * x_pos, |
dec->refn[2].y + (16 * y_pos * stride) + 16 * x_pos, |
1229 |
stride, 0); |
stride, 1, 8); |
1230 |
|
|
1231 |
interpolate8x8_avg2(dec->cur.y + (16 * y_pos * stride) + 16 * x_pos + 8, |
interpolate8x8_avg2(dec->cur.y + (16 * y_pos * stride) + 16 * x_pos + 8, |
1232 |
dec->cur.y + (16 * y_pos * stride) + 16 * x_pos + 8, |
dec->cur.y + (16 * y_pos * stride) + 16 * x_pos + 8, |
1233 |
dec->refn[2].y + (16 * y_pos * stride) + 16 * x_pos + 8, |
dec->refn[2].y + (16 * y_pos * stride) + 16 * x_pos + 8, |
1234 |
stride, 0); |
stride, 1, 8); |
1235 |
|
|
1236 |
interpolate8x8_avg2(dec->cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos, |
interpolate8x8_avg2(dec->cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos, |
1237 |
dec->cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos, |
dec->cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos, |
1238 |
dec->refn[2].y + ((16 * y_pos + 8) * stride) + 16 * x_pos, |
dec->refn[2].y + ((16 * y_pos + 8) * stride) + 16 * x_pos, |
1239 |
stride, 0); |
stride, 1, 8); |
1240 |
|
|
1241 |
interpolate8x8_avg2(dec->cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, |
interpolate8x8_avg2(dec->cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, |
1242 |
dec->cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, |
dec->cur.y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, |
1243 |
dec->refn[2].y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, |
dec->refn[2].y + ((16 * y_pos + 8) * stride) + 16 * x_pos + 8, |
1244 |
stride, 0); |
stride, 1, 8); |
1245 |
|
|
1246 |
interpolate8x8_avg2(dec->cur.u + (8 * y_pos * stride2) + 8 * x_pos, |
interpolate8x8_avg2(dec->cur.u + (8 * y_pos * stride2) + 8 * x_pos, |
1247 |
dec->cur.u + (8 * y_pos * stride2) + 8 * x_pos, |
dec->cur.u + (8 * y_pos * stride2) + 8 * x_pos, |
1248 |
dec->refn[2].u + (8 * y_pos * stride2) + 8 * x_pos, |
dec->refn[2].u + (8 * y_pos * stride2) + 8 * x_pos, |
1249 |
stride2, 0); |
stride2, 1, 8); |
1250 |
|
|
1251 |
interpolate8x8_avg2(dec->cur.v + (8 * y_pos * stride2) + 8 * x_pos, |
interpolate8x8_avg2(dec->cur.v + (8 * y_pos * stride2) + 8 * x_pos, |
1252 |
dec->cur.v + (8 * y_pos * stride2) + 8 * x_pos, |
dec->cur.v + (8 * y_pos * stride2) + 8 * x_pos, |
1253 |
dec->refn[2].v + (8 * y_pos * stride2) + 8 * x_pos, |
dec->refn[2].v + (8 * y_pos * stride2) + 8 * x_pos, |
1254 |
stride2, 0); |
stride2, 1, 8); |
1255 |
|
|
1256 |
stop_comp_timer(); |
stop_comp_timer(); |
1257 |
|
|
1533 |
uint32_t intra_dc_threshold; |
uint32_t intra_dc_threshold; |
1534 |
VECTOR gmc_mv[5]; |
VECTOR gmc_mv[5]; |
1535 |
uint32_t vop_type; |
uint32_t vop_type; |
1536 |
|
int success = 0; |
1537 |
|
|
1538 |
start_global_timer(); |
start_global_timer(); |
1539 |
|
|
1541 |
|
|
1542 |
BitstreamInit(&bs, frame->bitstream, frame->length); |
BitstreamInit(&bs, frame->bitstream, frame->length); |
1543 |
|
|
|
#ifdef BFRAMES_DEC |
|
1544 |
// XXX: 0x7f is only valid whilst decoding vfw xvid/divx5 avi's |
// XXX: 0x7f is only valid whilst decoding vfw xvid/divx5 avi's |
1545 |
if(BitstreamShowBits(&bs, 8) == 0x7f) |
if(frame->length == 1 && BitstreamShowBits(&bs, 8) == 0x7f) |
1546 |
{ |
{ |
1547 |
if (stats) |
if (stats) |
1548 |
stats->notify = XVID_DEC_VOP; |
stats->notify = XVID_DEC_VOP; |
1549 |
frame->length = 1; |
frame->length = 1; |
1550 |
image_output(&dec->cur, dec->width, dec->height, dec->edged_width, |
image_output(&dec->refn[0], dec->width, dec->height, dec->edged_width, |
1551 |
frame->image, frame->stride, frame->colorspace, dec->interlacing); |
frame->image, frame->stride, frame->colorspace, dec->interlacing); |
1552 |
|
emms(); |
1553 |
return XVID_ERR_OK; |
return XVID_ERR_OK; |
1554 |
} |
} |
|
#endif |
|
1555 |
|
|
1556 |
|
start: |
1557 |
// add by chenm001 <chenm001@163.com> |
// add by chenm001 <chenm001@163.com> |
1558 |
// for support B-frame to reference last 2 frame |
// for support B-frame to reference last 2 frame |
1559 |
dec->frames++; |
dec->frames++; |
1565 |
|
|
1566 |
DPRINTF(DPRINTF_HEADER, "vop_type=%i", vop_type); |
DPRINTF(DPRINTF_HEADER, "vop_type=%i", vop_type); |
1567 |
|
|
1568 |
|
if (vop_type == -1 && success) |
1569 |
|
goto done; |
1570 |
|
|
1571 |
if (vop_type == -2 || vop_type == -3) |
if (vop_type == -2 || vop_type == -3) |
1572 |
{ |
{ |
1573 |
if (vop_type == -3) |
if (vop_type == -3) |
1637 |
default: |
default: |
1638 |
if (stats) |
if (stats) |
1639 |
stats->notify = 0; |
stats->notify = 0; |
|
return XVID_ERR_FAIL; |
|
|
} |
|
1640 |
|
|
1641 |
#ifdef BFRAMES_DEC_DEBUG |
emms(); |
1642 |
if (frame->length != BitstreamPos(&bs) / 8){ |
return XVID_ERR_FAIL; |
|
DEBUG2("InLen/UseLen",frame->length, BitstreamPos(&bs) / 8); |
|
1643 |
} |
} |
|
#endif |
|
|
frame->length = BitstreamPos(&bs) / 8; |
|
1644 |
|
|
1645 |
|
BitstreamByteAlign(&bs); |
1646 |
|
|
1647 |
#ifdef BFRAMES_DEC |
#ifdef BFRAMES_DEC |
1648 |
// test if no B_VOP |
// test if no B_VOP |
1649 |
if (dec->low_delay || dec->frames == 0) { |
if (dec->low_delay || dec->frames == 0 || ((dec->packed_mode) && !(frame->length > BitstreamPos(&bs) / 8))) { |
1650 |
#endif |
#endif |
1651 |
image_output(&dec->cur, dec->width, dec->height, dec->edged_width, |
image_output(&dec->cur, dec->width, dec->height, dec->edged_width, |
1652 |
frame->image, frame->stride, frame->colorspace, dec->interlacing); |
frame->image, frame->stride, frame->colorspace, dec->interlacing); |
1653 |
|
|
1654 |
#ifdef BFRAMES_DEC |
#ifdef BFRAMES_DEC |
1655 |
} else { |
} else { |
1656 |
if (dec->frames >= 1) { |
if (dec->frames >= 1 && !(dec->packed_mode)) { |
1657 |
start_timer(); |
start_timer(); |
1658 |
if ((vop_type == I_VOP || vop_type == P_VOP || vop_type == S_VOP)) { |
if ((vop_type == I_VOP || vop_type == P_VOP || vop_type == S_VOP)) { |
1659 |
image_output(&dec->refn[0], dec->width, dec->height, |
image_output(&dec->refn[0], dec->width, dec->height, |
1685 |
mb_swap(&dec->mbs, &dec->last_mbs); |
mb_swap(&dec->mbs, &dec->last_mbs); |
1686 |
} |
} |
1687 |
|
|
1688 |
|
success = 1; |
1689 |
|
|
1690 |
|
if (frame->length > BitstreamPos(&bs) / 8) // multiple vops packed together |
1691 |
|
goto start; |
1692 |
|
|
1693 |
|
done : |
1694 |
|
|
1695 |
|
frame->length = BitstreamPos(&bs) / 8; |
1696 |
|
|
1697 |
if (stats) |
if (stats) |
1698 |
{ |
{ |
1699 |
stats->notify = XVID_DEC_VOP; |
stats->notify = XVID_DEC_VOP; |