You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1125 lines
46KB

  1. /*
  2. * Intel Indeo 3 (IV31, IV32, etc.) video decoder for ffmpeg
  3. * written, produced, and directed by Alan Smithee
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <unistd.h>
  25. #include "avcodec.h"
  26. #include "dsputil.h"
  27. #include "bytestream.h"
  28. #include "indeo3data.h"
  29. typedef struct
  30. {
  31. uint8_t *Ybuf;
  32. uint8_t *Ubuf;
  33. uint8_t *Vbuf;
  34. unsigned int the_buf_size;
  35. unsigned short y_w, y_h;
  36. unsigned short uv_w, uv_h;
  37. } YUVBufs;
  38. typedef struct Indeo3DecodeContext {
  39. AVCodecContext *avctx;
  40. int width, height;
  41. AVFrame frame;
  42. uint8_t *buf;
  43. YUVBufs iv_frame[2];
  44. YUVBufs *cur_frame;
  45. YUVBufs *ref_frame;
  46. uint8_t *ModPred;
  47. uint8_t *corrector_type;
  48. } Indeo3DecodeContext;
  49. static const uint8_t corrector_type_0[24] = {
  50. 195, 159, 133, 115, 101, 93, 87, 77,
  51. 195, 159, 133, 115, 101, 93, 87, 77,
  52. 128, 79, 79, 79, 79, 79, 79, 79
  53. };
  54. static const uint8_t corrector_type_2[8] = { 9, 7, 6, 8, 5, 4, 3, 2 };
  55. static av_cold int build_modpred(Indeo3DecodeContext *s)
  56. {
  57. int i, j;
  58. if (!(s->ModPred = av_malloc(8 * 128)))
  59. return AVERROR(ENOMEM);
  60. for (i=0; i < 128; ++i) {
  61. s->ModPred[i+0*128] = i > 126 ? 254 : 2*(i + 1 - ((i + 1) % 2));
  62. s->ModPred[i+1*128] = i == 7 ? 20 :
  63. i == 119 ||
  64. i == 120 ? 236 : 2*(i + 2 - ((i + 1) % 3));
  65. s->ModPred[i+2*128] = i > 125 ? 248 : 2*(i + 2 - ((i + 2) % 4));
  66. s->ModPred[i+3*128] = 2*(i + 1 - ((i - 3) % 5));
  67. s->ModPred[i+4*128] = i == 8 ? 20 : 2*(i + 1 - ((i - 3) % 6));
  68. s->ModPred[i+5*128] = 2*(i + 4 - ((i + 3) % 7));
  69. s->ModPred[i+6*128] = i > 123 ? 240 : 2*(i + 4 - ((i + 4) % 8));
  70. s->ModPred[i+7*128] = 2*(i + 5 - ((i + 4) % 9));
  71. }
  72. if (!(s->corrector_type = av_malloc(24 * 256)))
  73. return AVERROR(ENOMEM);
  74. for (i=0; i < 24; ++i) {
  75. for (j=0; j < 256; ++j) {
  76. s->corrector_type[i*256+j] = j < corrector_type_0[i] ? 1 :
  77. j < 248 || (i == 16 && j == 248) ? 0 :
  78. corrector_type_2[j - 248];
  79. }
  80. }
  81. return 0;
  82. }
  83. static void iv_Decode_Chunk(Indeo3DecodeContext *s, uint8_t *cur,
  84. uint8_t *ref, int width, int height, const uint8_t *buf1,
  85. long fflags2, const uint8_t *hdr,
  86. const uint8_t *buf2, int min_width_160);
  87. static av_cold int iv_alloc_frames(Indeo3DecodeContext *s)
  88. {
  89. int luma_width, luma_height, luma_pixels, chroma_width, chroma_height,
  90. chroma_pixels, i;
  91. unsigned int bufsize;
  92. luma_width = (s->width + 3) & (~3);
  93. luma_height = (s->height + 3) & (~3);
  94. chroma_width = ((luma_width >> 2) + 3) & (~3);
  95. chroma_height = ((luma_height>> 2) + 3) & (~3);
  96. luma_pixels = luma_width * luma_height;
  97. chroma_pixels = chroma_width * chroma_height;
  98. bufsize = luma_pixels * 2 + luma_width * 3 +
  99. (chroma_pixels + chroma_width) * 4;
  100. if(!(s->buf = av_malloc(bufsize)))
  101. return AVERROR(ENOMEM);
  102. s->iv_frame[0].y_w = s->iv_frame[1].y_w = luma_width;
  103. s->iv_frame[0].y_h = s->iv_frame[1].y_h = luma_height;
  104. s->iv_frame[0].uv_w = s->iv_frame[1].uv_w = chroma_width;
  105. s->iv_frame[0].uv_h = s->iv_frame[1].uv_h = chroma_height;
  106. s->iv_frame[0].the_buf_size = bufsize;
  107. s->iv_frame[0].Ybuf = s->buf + luma_width;
  108. i = luma_pixels + luma_width * 2;
  109. s->iv_frame[1].Ybuf = s->buf + i;
  110. i += (luma_pixels + luma_width);
  111. s->iv_frame[0].Ubuf = s->buf + i;
  112. i += (chroma_pixels + chroma_width);
  113. s->iv_frame[1].Ubuf = s->buf + i;
  114. i += (chroma_pixels + chroma_width);
  115. s->iv_frame[0].Vbuf = s->buf + i;
  116. i += (chroma_pixels + chroma_width);
  117. s->iv_frame[1].Vbuf = s->buf + i;
  118. for(i = 1; i <= luma_width; i++)
  119. s->iv_frame[0].Ybuf[-i] = s->iv_frame[1].Ybuf[-i] =
  120. s->iv_frame[0].Ubuf[-i] = 0x80;
  121. for(i = 1; i <= chroma_width; i++) {
  122. s->iv_frame[1].Ubuf[-i] = 0x80;
  123. s->iv_frame[0].Vbuf[-i] = 0x80;
  124. s->iv_frame[1].Vbuf[-i] = 0x80;
  125. s->iv_frame[1].Vbuf[chroma_pixels+i-1] = 0x80;
  126. }
  127. return 0;
  128. }
  129. static av_cold void iv_free_func(Indeo3DecodeContext *s)
  130. {
  131. av_free(s->buf);
  132. av_free(s->ModPred);
  133. av_free(s->corrector_type);
  134. }
  135. static unsigned long iv_decode_frame(Indeo3DecodeContext *s,
  136. const uint8_t *buf, int buf_size)
  137. {
  138. unsigned int hdr_width, hdr_height,
  139. chroma_width, chroma_height;
  140. unsigned long fflags1, fflags2, fflags3, offs1, offs2, offs3, offs;
  141. const uint8_t *hdr_pos, *buf_pos;
  142. buf_pos = buf;
  143. buf_pos += 18;
  144. fflags1 = bytestream_get_le16(&buf_pos);
  145. fflags3 = bytestream_get_le32(&buf_pos);
  146. fflags2 = *buf_pos++;
  147. buf_pos += 3;
  148. hdr_height = bytestream_get_le16(&buf_pos);
  149. hdr_width = bytestream_get_le16(&buf_pos);
  150. if(avcodec_check_dimensions(NULL, hdr_width, hdr_height))
  151. return -1;
  152. chroma_height = ((hdr_height >> 2) + 3) & 0x7ffc;
  153. chroma_width = ((hdr_width >> 2) + 3) & 0x7ffc;
  154. offs1 = bytestream_get_le32(&buf_pos);
  155. offs2 = bytestream_get_le32(&buf_pos);
  156. offs3 = bytestream_get_le32(&buf_pos);
  157. buf_pos += 4;
  158. hdr_pos = buf_pos;
  159. if(fflags3 == 0x80) return 4;
  160. if(fflags1 & 0x200) {
  161. s->cur_frame = s->iv_frame + 1;
  162. s->ref_frame = s->iv_frame;
  163. } else {
  164. s->cur_frame = s->iv_frame;
  165. s->ref_frame = s->iv_frame + 1;
  166. }
  167. buf_pos = buf + 16 + offs1;
  168. offs = bytestream_get_le32(&buf_pos);
  169. iv_Decode_Chunk(s, s->cur_frame->Ybuf, s->ref_frame->Ybuf, hdr_width,
  170. hdr_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
  171. FFMIN(hdr_width, 160));
  172. if (!(s->avctx->flags & CODEC_FLAG_GRAY))
  173. {
  174. buf_pos = buf + 16 + offs2;
  175. offs = bytestream_get_le32(&buf_pos);
  176. iv_Decode_Chunk(s, s->cur_frame->Vbuf, s->ref_frame->Vbuf, chroma_width,
  177. chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
  178. FFMIN(chroma_width, 40));
  179. buf_pos = buf + 16 + offs3;
  180. offs = bytestream_get_le32(&buf_pos);
  181. iv_Decode_Chunk(s, s->cur_frame->Ubuf, s->ref_frame->Ubuf, chroma_width,
  182. chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
  183. FFMIN(chroma_width, 40));
  184. }
  185. return 8;
  186. }
  187. typedef struct {
  188. long xpos;
  189. long ypos;
  190. long width;
  191. long height;
  192. long split_flag;
  193. long split_direction;
  194. long usl7;
  195. } ustr_t;
  196. #define LV1_CHECK(buf1,rle_v3,lv1,lp2) \
  197. if((lv1 & 0x80) != 0) { \
  198. if(rle_v3 != 0) \
  199. rle_v3 = 0; \
  200. else { \
  201. rle_v3 = 1; \
  202. buf1 -= 2; \
  203. } \
  204. } \
  205. lp2 = 4;
  206. #define RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) \
  207. if(rle_v3 == 0) { \
  208. rle_v2 = *buf1; \
  209. rle_v1 = 1; \
  210. if(rle_v2 > 32) { \
  211. rle_v2 -= 32; \
  212. rle_v1 = 0; \
  213. } \
  214. rle_v3 = 1; \
  215. } \
  216. buf1--;
  217. #define LP2_CHECK(buf1,rle_v3,lp2) \
  218. if(lp2 == 0 && rle_v3 != 0) \
  219. rle_v3 = 0; \
  220. else { \
  221. buf1--; \
  222. rle_v3 = 1; \
  223. }
  224. #define RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) \
  225. rle_v2--; \
  226. if(rle_v2 == 0) { \
  227. rle_v3 = 0; \
  228. buf1 += 2; \
  229. } \
  230. lp2 = 4;
  231. static void iv_Decode_Chunk(Indeo3DecodeContext *s,
  232. uint8_t *cur, uint8_t *ref, int width, int height,
  233. const uint8_t *buf1, long fflags2, const uint8_t *hdr,
  234. const uint8_t *buf2, int min_width_160)
  235. {
  236. uint8_t bit_buf;
  237. unsigned long bit_pos, lv, lv1, lv2;
  238. long *width_tbl, width_tbl_arr[10];
  239. const signed char *ref_vectors;
  240. uint8_t *cur_frm_pos, *ref_frm_pos, *cp, *cp2;
  241. uint32_t *cur_lp, *ref_lp;
  242. const uint32_t *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2];
  243. uint8_t *correction_type_sp[2];
  244. ustr_t strip_tbl[20], *strip;
  245. int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width,
  246. rle_v1, rle_v2, rle_v3;
  247. unsigned short res;
  248. bit_buf = 0;
  249. ref_vectors = NULL;
  250. width_tbl = width_tbl_arr + 1;
  251. i = (width < 0 ? width + 3 : width)/4;
  252. for(j = -1; j < 8; j++)
  253. width_tbl[j] = i * j;
  254. strip = strip_tbl;
  255. for(region_160_width = 0; region_160_width < (width - min_width_160); region_160_width += min_width_160);
  256. strip->ypos = strip->xpos = 0;
  257. for(strip->width = min_width_160; width > strip->width; strip->width *= 2);
  258. strip->height = height;
  259. strip->split_direction = 0;
  260. strip->split_flag = 0;
  261. strip->usl7 = 0;
  262. bit_pos = 0;
  263. rle_v1 = rle_v2 = rle_v3 = 0;
  264. while(strip >= strip_tbl) {
  265. if(bit_pos <= 0) {
  266. bit_pos = 8;
  267. bit_buf = *buf1++;
  268. }
  269. bit_pos -= 2;
  270. cmd = (bit_buf >> bit_pos) & 0x03;
  271. if(cmd == 0) {
  272. strip++;
  273. memcpy(strip, strip-1, sizeof(ustr_t));
  274. strip->split_flag = 1;
  275. strip->split_direction = 0;
  276. strip->height = (strip->height > 8 ? ((strip->height+8)>>4)<<3 : 4);
  277. continue;
  278. } else if(cmd == 1) {
  279. strip++;
  280. memcpy(strip, strip-1, sizeof(ustr_t));
  281. strip->split_flag = 1;
  282. strip->split_direction = 1;
  283. strip->width = (strip->width > 8 ? ((strip->width+8)>>4)<<3 : 4);
  284. continue;
  285. } else if(cmd == 2) {
  286. if(strip->usl7 == 0) {
  287. strip->usl7 = 1;
  288. ref_vectors = NULL;
  289. continue;
  290. }
  291. } else if(cmd == 3) {
  292. if(strip->usl7 == 0) {
  293. strip->usl7 = 1;
  294. ref_vectors = (const signed char*)buf2 + (*buf1 * 2);
  295. buf1++;
  296. continue;
  297. }
  298. }
  299. cur_frm_pos = cur + width * strip->ypos + strip->xpos;
  300. if((blks_width = strip->width) < 0)
  301. blks_width += 3;
  302. blks_width >>= 2;
  303. blks_height = strip->height;
  304. if(ref_vectors != NULL) {
  305. ref_frm_pos = ref + (ref_vectors[0] + strip->ypos) * width +
  306. ref_vectors[1] + strip->xpos;
  307. } else
  308. ref_frm_pos = cur_frm_pos - width_tbl[4];
  309. if(cmd == 2) {
  310. if(bit_pos <= 0) {
  311. bit_pos = 8;
  312. bit_buf = *buf1++;
  313. }
  314. bit_pos -= 2;
  315. cmd = (bit_buf >> bit_pos) & 0x03;
  316. if(cmd == 0 || ref_vectors != NULL) {
  317. for(lp1 = 0; lp1 < blks_width; lp1++) {
  318. for(i = 0, j = 0; i < blks_height; i++, j += width_tbl[1])
  319. ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)ref_frm_pos)[j];
  320. cur_frm_pos += 4;
  321. ref_frm_pos += 4;
  322. }
  323. } else if(cmd != 1)
  324. return;
  325. } else {
  326. k = *buf1 >> 4;
  327. j = *buf1 & 0x0f;
  328. buf1++;
  329. lv = j + fflags2;
  330. if((lv - 8) <= 7 && (k == 0 || k == 3 || k == 10)) {
  331. cp2 = s->ModPred + ((lv - 8) << 7);
  332. cp = ref_frm_pos;
  333. for(i = 0; i < blks_width << 2; i++) {
  334. int v = *cp >> 1;
  335. *(cp++) = cp2[v];
  336. }
  337. }
  338. if(k == 1 || k == 4) {
  339. lv = (hdr[j] & 0xf) + fflags2;
  340. correction_type_sp[0] = s->corrector_type + (lv << 8);
  341. correction_lp[0] = correction + (lv << 8);
  342. lv = (hdr[j] >> 4) + fflags2;
  343. correction_lp[1] = correction + (lv << 8);
  344. correction_type_sp[1] = s->corrector_type + (lv << 8);
  345. } else {
  346. correctionloworder_lp[0] = correctionloworder_lp[1] = correctionloworder + (lv << 8);
  347. correctionhighorder_lp[0] = correctionhighorder_lp[1] = correctionhighorder + (lv << 8);
  348. correction_type_sp[0] = correction_type_sp[1] = s->corrector_type + (lv << 8);
  349. correction_lp[0] = correction_lp[1] = correction + (lv << 8);
  350. }
  351. switch(k) {
  352. case 1:
  353. case 0: /********** CASE 0 **********/
  354. for( ; blks_height > 0; blks_height -= 4) {
  355. for(lp1 = 0; lp1 < blks_width; lp1++) {
  356. for(lp2 = 0; lp2 < 4; ) {
  357. k = *buf1++;
  358. cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2];
  359. ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2];
  360. switch(correction_type_sp[0][k]) {
  361. case 0:
  362. *cur_lp = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  363. lp2++;
  364. break;
  365. case 1:
  366. res = ((le2me_16(((unsigned short *)(ref_lp))[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1;
  367. ((unsigned short *)cur_lp)[0] = le2me_16(res);
  368. res = ((le2me_16(((unsigned short *)(ref_lp))[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1;
  369. ((unsigned short *)cur_lp)[1] = le2me_16(res);
  370. buf1++;
  371. lp2++;
  372. break;
  373. case 2:
  374. if(lp2 == 0) {
  375. for(i = 0, j = 0; i < 2; i++, j += width_tbl[1])
  376. cur_lp[j] = ref_lp[j];
  377. lp2 += 2;
  378. }
  379. break;
  380. case 3:
  381. if(lp2 < 2) {
  382. for(i = 0, j = 0; i < (3 - lp2); i++, j += width_tbl[1])
  383. cur_lp[j] = ref_lp[j];
  384. lp2 = 3;
  385. }
  386. break;
  387. case 8:
  388. if(lp2 == 0) {
  389. RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  390. if(rle_v1 == 1 || ref_vectors != NULL) {
  391. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  392. cur_lp[j] = ref_lp[j];
  393. }
  394. RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  395. break;
  396. } else {
  397. rle_v1 = 1;
  398. rle_v2 = *buf1 - 1;
  399. }
  400. case 5:
  401. LP2_CHECK(buf1,rle_v3,lp2)
  402. case 4:
  403. for(i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1])
  404. cur_lp[j] = ref_lp[j];
  405. lp2 = 4;
  406. break;
  407. case 7:
  408. if(rle_v3 != 0)
  409. rle_v3 = 0;
  410. else {
  411. buf1--;
  412. rle_v3 = 1;
  413. }
  414. case 6:
  415. if(ref_vectors != NULL) {
  416. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  417. cur_lp[j] = ref_lp[j];
  418. }
  419. lp2 = 4;
  420. break;
  421. case 9:
  422. lv1 = *buf1++;
  423. lv = (lv1 & 0x7F) << 1;
  424. lv += (lv << 8);
  425. lv += (lv << 16);
  426. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  427. cur_lp[j] = lv;
  428. LV1_CHECK(buf1,rle_v3,lv1,lp2)
  429. break;
  430. default:
  431. return;
  432. }
  433. }
  434. cur_frm_pos += 4;
  435. ref_frm_pos += 4;
  436. }
  437. cur_frm_pos += ((width - blks_width) * 4);
  438. ref_frm_pos += ((width - blks_width) * 4);
  439. }
  440. break;
  441. case 4:
  442. case 3: /********** CASE 3 **********/
  443. if(ref_vectors != NULL)
  444. return;
  445. flag1 = 1;
  446. for( ; blks_height > 0; blks_height -= 8) {
  447. for(lp1 = 0; lp1 < blks_width; lp1++) {
  448. for(lp2 = 0; lp2 < 4; ) {
  449. k = *buf1++;
  450. cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
  451. ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
  452. switch(correction_type_sp[lp2 & 0x01][k]) {
  453. case 0:
  454. cur_lp[width_tbl[1]] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  455. if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
  456. cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  457. else
  458. cur_lp[0] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  459. lp2++;
  460. break;
  461. case 1:
  462. res = ((le2me_16(((unsigned short *)ref_lp)[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1;
  463. ((unsigned short *)cur_lp)[width_tbl[2]] = le2me_16(res);
  464. res = ((le2me_16(((unsigned short *)ref_lp)[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1;
  465. ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
  466. if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
  467. cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  468. else
  469. cur_lp[0] = cur_lp[width_tbl[1]];
  470. buf1++;
  471. lp2++;
  472. break;
  473. case 2:
  474. if(lp2 == 0) {
  475. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  476. cur_lp[j] = *ref_lp;
  477. lp2 += 2;
  478. }
  479. break;
  480. case 3:
  481. if(lp2 < 2) {
  482. for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])
  483. cur_lp[j] = *ref_lp;
  484. lp2 = 3;
  485. }
  486. break;
  487. case 6:
  488. lp2 = 4;
  489. break;
  490. case 7:
  491. if(rle_v3 != 0)
  492. rle_v3 = 0;
  493. else {
  494. buf1--;
  495. rle_v3 = 1;
  496. }
  497. lp2 = 4;
  498. break;
  499. case 8:
  500. if(lp2 == 0) {
  501. RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  502. if(rle_v1 == 1) {
  503. for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
  504. cur_lp[j] = ref_lp[j];
  505. }
  506. RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  507. break;
  508. } else {
  509. rle_v2 = (*buf1) - 1;
  510. rle_v1 = 1;
  511. }
  512. case 5:
  513. LP2_CHECK(buf1,rle_v3,lp2)
  514. case 4:
  515. for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])
  516. cur_lp[j] = *ref_lp;
  517. lp2 = 4;
  518. break;
  519. case 9:
  520. av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
  521. lv1 = *buf1++;
  522. lv = (lv1 & 0x7F) << 1;
  523. lv += (lv << 8);
  524. lv += (lv << 16);
  525. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  526. cur_lp[j] = lv;
  527. LV1_CHECK(buf1,rle_v3,lv1,lp2)
  528. break;
  529. default:
  530. return;
  531. }
  532. }
  533. cur_frm_pos += 4;
  534. }
  535. cur_frm_pos += (((width * 2) - blks_width) * 4);
  536. flag1 = 0;
  537. }
  538. break;
  539. case 10: /********** CASE 10 **********/
  540. if(ref_vectors == NULL) {
  541. flag1 = 1;
  542. for( ; blks_height > 0; blks_height -= 8) {
  543. for(lp1 = 0; lp1 < blks_width; lp1 += 2) {
  544. for(lp2 = 0; lp2 < 4; ) {
  545. k = *buf1++;
  546. cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
  547. ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
  548. lv1 = ref_lp[0];
  549. lv2 = ref_lp[1];
  550. if(lp2 == 0 && flag1 != 0) {
  551. #ifdef WORDS_BIGENDIAN
  552. lv1 = lv1 & 0xFF00FF00;
  553. lv1 = (lv1 >> 8) | lv1;
  554. lv2 = lv2 & 0xFF00FF00;
  555. lv2 = (lv2 >> 8) | lv2;
  556. #else
  557. lv1 = lv1 & 0x00FF00FF;
  558. lv1 = (lv1 << 8) | lv1;
  559. lv2 = lv2 & 0x00FF00FF;
  560. lv2 = (lv2 << 8) | lv2;
  561. #endif
  562. }
  563. switch(correction_type_sp[lp2 & 0x01][k]) {
  564. case 0:
  565. cur_lp[width_tbl[1]] = le2me_32(((le2me_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1);
  566. cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(lv2) >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1);
  567. if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
  568. cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  569. cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  570. } else {
  571. cur_lp[0] = cur_lp[width_tbl[1]];
  572. cur_lp[1] = cur_lp[width_tbl[1]+1];
  573. }
  574. lp2++;
  575. break;
  576. case 1:
  577. cur_lp[width_tbl[1]] = le2me_32(((le2me_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1]) << 1);
  578. cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(lv2) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1);
  579. if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
  580. cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  581. cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  582. } else {
  583. cur_lp[0] = cur_lp[width_tbl[1]];
  584. cur_lp[1] = cur_lp[width_tbl[1]+1];
  585. }
  586. buf1++;
  587. lp2++;
  588. break;
  589. case 2:
  590. if(lp2 == 0) {
  591. if(flag1 != 0) {
  592. for(i = 0, j = width_tbl[1]; i < 3; i++, j += width_tbl[1]) {
  593. cur_lp[j] = lv1;
  594. cur_lp[j+1] = lv2;
  595. }
  596. cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  597. cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  598. } else {
  599. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {
  600. cur_lp[j] = lv1;
  601. cur_lp[j+1] = lv2;
  602. }
  603. }
  604. lp2 += 2;
  605. }
  606. break;
  607. case 3:
  608. if(lp2 < 2) {
  609. if(lp2 == 0 && flag1 != 0) {
  610. for(i = 0, j = width_tbl[1]; i < 5; i++, j += width_tbl[1]) {
  611. cur_lp[j] = lv1;
  612. cur_lp[j+1] = lv2;
  613. }
  614. cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  615. cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  616. } else {
  617. for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {
  618. cur_lp[j] = lv1;
  619. cur_lp[j+1] = lv2;
  620. }
  621. }
  622. lp2 = 3;
  623. }
  624. break;
  625. case 8:
  626. if(lp2 == 0) {
  627. RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  628. if(rle_v1 == 1) {
  629. if(flag1 != 0) {
  630. for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {
  631. cur_lp[j] = lv1;
  632. cur_lp[j+1] = lv2;
  633. }
  634. cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  635. cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  636. } else {
  637. for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) {
  638. cur_lp[j] = lv1;
  639. cur_lp[j+1] = lv2;
  640. }
  641. }
  642. }
  643. RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  644. break;
  645. } else {
  646. rle_v1 = 1;
  647. rle_v2 = (*buf1) - 1;
  648. }
  649. case 5:
  650. LP2_CHECK(buf1,rle_v3,lp2)
  651. case 4:
  652. if(lp2 == 0 && flag1 != 0) {
  653. for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {
  654. cur_lp[j] = lv1;
  655. cur_lp[j+1] = lv2;
  656. }
  657. cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
  658. cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
  659. } else {
  660. for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {
  661. cur_lp[j] = lv1;
  662. cur_lp[j+1] = lv2;
  663. }
  664. }
  665. lp2 = 4;
  666. break;
  667. case 6:
  668. lp2 = 4;
  669. break;
  670. case 7:
  671. if(lp2 == 0) {
  672. if(rle_v3 != 0)
  673. rle_v3 = 0;
  674. else {
  675. buf1--;
  676. rle_v3 = 1;
  677. }
  678. lp2 = 4;
  679. }
  680. break;
  681. case 9:
  682. av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
  683. lv1 = *buf1;
  684. lv = (lv1 & 0x7F) << 1;
  685. lv += (lv << 8);
  686. lv += (lv << 16);
  687. for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
  688. cur_lp[j] = lv;
  689. LV1_CHECK(buf1,rle_v3,lv1,lp2)
  690. break;
  691. default:
  692. return;
  693. }
  694. }
  695. cur_frm_pos += 8;
  696. }
  697. cur_frm_pos += (((width * 2) - blks_width) * 4);
  698. flag1 = 0;
  699. }
  700. } else {
  701. for( ; blks_height > 0; blks_height -= 8) {
  702. for(lp1 = 0; lp1 < blks_width; lp1 += 2) {
  703. for(lp2 = 0; lp2 < 4; ) {
  704. k = *buf1++;
  705. cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
  706. ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
  707. switch(correction_type_sp[lp2 & 0x01][k]) {
  708. case 0:
  709. lv1 = correctionloworder_lp[lp2 & 0x01][k];
  710. lv2 = correctionhighorder_lp[lp2 & 0x01][k];
  711. cur_lp[0] = le2me_32(((le2me_32(ref_lp[0]) >> 1) + lv1) << 1);
  712. cur_lp[1] = le2me_32(((le2me_32(ref_lp[1]) >> 1) + lv2) << 1);
  713. cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1);
  714. cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1);
  715. lp2++;
  716. break;
  717. case 1:
  718. lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++];
  719. lv2 = correctionloworder_lp[lp2 & 0x01][k];
  720. cur_lp[0] = le2me_32(((le2me_32(ref_lp[0]) >> 1) + lv1) << 1);
  721. cur_lp[1] = le2me_32(((le2me_32(ref_lp[1]) >> 1) + lv2) << 1);
  722. cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1);
  723. cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1);
  724. lp2++;
  725. break;
  726. case 2:
  727. if(lp2 == 0) {
  728. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {
  729. cur_lp[j] = ref_lp[j];
  730. cur_lp[j+1] = ref_lp[j+1];
  731. }
  732. lp2 += 2;
  733. }
  734. break;
  735. case 3:
  736. if(lp2 < 2) {
  737. for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {
  738. cur_lp[j] = ref_lp[j];
  739. cur_lp[j+1] = ref_lp[j+1];
  740. }
  741. lp2 = 3;
  742. }
  743. break;
  744. case 8:
  745. if(lp2 == 0) {
  746. RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  747. for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) {
  748. ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)ref_frm_pos)[j];
  749. ((uint32_t *)cur_frm_pos)[j+1] = ((uint32_t *)ref_frm_pos)[j+1];
  750. }
  751. RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  752. break;
  753. } else {
  754. rle_v1 = 1;
  755. rle_v2 = (*buf1) - 1;
  756. }
  757. case 5:
  758. case 7:
  759. LP2_CHECK(buf1,rle_v3,lp2)
  760. case 6:
  761. case 4:
  762. for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {
  763. cur_lp[j] = ref_lp[j];
  764. cur_lp[j+1] = ref_lp[j+1];
  765. }
  766. lp2 = 4;
  767. break;
  768. case 9:
  769. av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
  770. lv1 = *buf1;
  771. lv = (lv1 & 0x7F) << 1;
  772. lv += (lv << 8);
  773. lv += (lv << 16);
  774. for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
  775. ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)cur_frm_pos)[j+1] = lv;
  776. LV1_CHECK(buf1,rle_v3,lv1,lp2)
  777. break;
  778. default:
  779. return;
  780. }
  781. }
  782. cur_frm_pos += 8;
  783. ref_frm_pos += 8;
  784. }
  785. cur_frm_pos += (((width * 2) - blks_width) * 4);
  786. ref_frm_pos += (((width * 2) - blks_width) * 4);
  787. }
  788. }
  789. break;
  790. case 11: /********** CASE 11 **********/
  791. if(ref_vectors == NULL)
  792. return;
  793. for( ; blks_height > 0; blks_height -= 8) {
  794. for(lp1 = 0; lp1 < blks_width; lp1++) {
  795. for(lp2 = 0; lp2 < 4; ) {
  796. k = *buf1++;
  797. cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
  798. ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
  799. switch(correction_type_sp[lp2 & 0x01][k]) {
  800. case 0:
  801. cur_lp[0] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  802. cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
  803. lp2++;
  804. break;
  805. case 1:
  806. lv1 = (unsigned short)(correction_lp[lp2 & 0x01][*buf1++]);
  807. lv2 = (unsigned short)(correction_lp[lp2 & 0x01][k]);
  808. res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[0]) >> 1) + lv1) << 1);
  809. ((unsigned short *)cur_lp)[0] = le2me_16(res);
  810. res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[1]) >> 1) + lv2) << 1);
  811. ((unsigned short *)cur_lp)[1] = le2me_16(res);
  812. res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[width_tbl[2]]) >> 1) + lv1) << 1);
  813. ((unsigned short *)cur_lp)[width_tbl[2]] = le2me_16(res);
  814. res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[width_tbl[2]+1]) >> 1) + lv2) << 1);
  815. ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
  816. lp2++;
  817. break;
  818. case 2:
  819. if(lp2 == 0) {
  820. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  821. cur_lp[j] = ref_lp[j];
  822. lp2 += 2;
  823. }
  824. break;
  825. case 3:
  826. if(lp2 < 2) {
  827. for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])
  828. cur_lp[j] = ref_lp[j];
  829. lp2 = 3;
  830. }
  831. break;
  832. case 8:
  833. if(lp2 == 0) {
  834. RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
  835. for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
  836. cur_lp[j] = ref_lp[j];
  837. RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
  838. break;
  839. } else {
  840. rle_v1 = 1;
  841. rle_v2 = (*buf1) - 1;
  842. }
  843. case 5:
  844. case 7:
  845. LP2_CHECK(buf1,rle_v3,lp2)
  846. case 4:
  847. case 6:
  848. for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])
  849. cur_lp[j] = ref_lp[j];
  850. lp2 = 4;
  851. break;
  852. case 9:
  853. av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
  854. lv1 = *buf1++;
  855. lv = (lv1 & 0x7F) << 1;
  856. lv += (lv << 8);
  857. lv += (lv << 16);
  858. for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
  859. cur_lp[j] = lv;
  860. LV1_CHECK(buf1,rle_v3,lv1,lp2)
  861. break;
  862. default:
  863. return;
  864. }
  865. }
  866. cur_frm_pos += 4;
  867. ref_frm_pos += 4;
  868. }
  869. cur_frm_pos += (((width * 2) - blks_width) * 4);
  870. ref_frm_pos += (((width * 2) - blks_width) * 4);
  871. }
  872. break;
  873. default:
  874. return;
  875. }
  876. }
  877. if(strip < strip_tbl)
  878. return;
  879. for( ; strip >= strip_tbl; strip--) {
  880. if(strip->split_flag != 0) {
  881. strip->split_flag = 0;
  882. strip->usl7 = (strip-1)->usl7;
  883. if(strip->split_direction) {
  884. strip->xpos += strip->width;
  885. strip->width = (strip-1)->width - strip->width;
  886. if(region_160_width <= strip->xpos && width < strip->width + strip->xpos)
  887. strip->width = width - strip->xpos;
  888. } else {
  889. strip->ypos += strip->height;
  890. strip->height = (strip-1)->height - strip->height;
  891. }
  892. break;
  893. }
  894. }
  895. }
  896. }
  897. static av_cold int indeo3_decode_init(AVCodecContext *avctx)
  898. {
  899. Indeo3DecodeContext *s = avctx->priv_data;
  900. int ret = 0;
  901. s->avctx = avctx;
  902. s->width = avctx->width;
  903. s->height = avctx->height;
  904. avctx->pix_fmt = PIX_FMT_YUV410P;
  905. if (!(ret = build_modpred(s)))
  906. ret = iv_alloc_frames(s);
  907. if (ret)
  908. iv_free_func(s);
  909. return ret;
  910. }
  911. static int indeo3_decode_frame(AVCodecContext *avctx,
  912. void *data, int *data_size,
  913. const uint8_t *buf, int buf_size)
  914. {
  915. Indeo3DecodeContext *s=avctx->priv_data;
  916. uint8_t *src, *dest;
  917. int y;
  918. iv_decode_frame(s, buf, buf_size);
  919. if(s->frame.data[0])
  920. avctx->release_buffer(avctx, &s->frame);
  921. s->frame.reference = 0;
  922. if(avctx->get_buffer(avctx, &s->frame) < 0) {
  923. av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
  924. return -1;
  925. }
  926. src = s->cur_frame->Ybuf;
  927. dest = s->frame.data[0];
  928. for (y = 0; y < s->height; y++) {
  929. memcpy(dest, src, s->cur_frame->y_w);
  930. src += s->cur_frame->y_w;
  931. dest += s->frame.linesize[0];
  932. }
  933. if (!(s->avctx->flags & CODEC_FLAG_GRAY))
  934. {
  935. src = s->cur_frame->Ubuf;
  936. dest = s->frame.data[1];
  937. for (y = 0; y < s->height / 4; y++) {
  938. memcpy(dest, src, s->cur_frame->uv_w);
  939. src += s->cur_frame->uv_w;
  940. dest += s->frame.linesize[1];
  941. }
  942. src = s->cur_frame->Vbuf;
  943. dest = s->frame.data[2];
  944. for (y = 0; y < s->height / 4; y++) {
  945. memcpy(dest, src, s->cur_frame->uv_w);
  946. src += s->cur_frame->uv_w;
  947. dest += s->frame.linesize[2];
  948. }
  949. }
  950. *data_size=sizeof(AVFrame);
  951. *(AVFrame*)data= s->frame;
  952. return buf_size;
  953. }
  954. static av_cold int indeo3_decode_end(AVCodecContext *avctx)
  955. {
  956. Indeo3DecodeContext *s = avctx->priv_data;
  957. iv_free_func(s);
  958. return 0;
  959. }
  960. AVCodec indeo3_decoder = {
  961. "indeo3",
  962. CODEC_TYPE_VIDEO,
  963. CODEC_ID_INDEO3,
  964. sizeof(Indeo3DecodeContext),
  965. indeo3_decode_init,
  966. NULL,
  967. indeo3_decode_end,
  968. indeo3_decode_frame,
  969. 0,
  970. NULL,
  971. .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo 3"),
  972. };