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.

1139 lines
38KB

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