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.

719 lines
22KB

  1. /*
  2. * MidiVid MV30 decoder
  3. *
  4. * Copyright (c) 2020 Paul B Mahol
  5. *
  6. * This file is part of FFmpeg.
  7. *
  8. * FFmpeg is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * FFmpeg is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with FFmpeg; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include "libavutil/thread.h"
  26. #include "avcodec.h"
  27. #include "bytestream.h"
  28. #include "copy_block.h"
  29. #include "mathops.h"
  30. #include "blockdsp.h"
  31. #include "get_bits.h"
  32. #include "internal.h"
  33. #include "aandcttab.h"
  34. #define CBP_VLC_BITS 9
  35. typedef struct MV30Context {
  36. GetBitContext gb;
  37. int intra_quant;
  38. int inter_quant;
  39. int is_inter;
  40. int mode_size;
  41. int nb_mvectors;
  42. int block[6][64];
  43. int16_t *mvectors;
  44. unsigned int mvectors_size;
  45. int16_t *coeffs;
  46. unsigned int coeffs_size;
  47. int16_t intraq_tab[2][64];
  48. int16_t interq_tab[2][64];
  49. BlockDSPContext bdsp;
  50. AVFrame *prev_frame;
  51. } MV30Context;
  52. static VLC cbp_tab;
  53. static const uint8_t luma_tab[] = {
  54. 12, 12, 15, 19, 25, 34, 40, 48,
  55. 12, 12, 18, 22, 27, 44, 47, 46,
  56. 17, 18, 21, 26, 35, 46, 52, 47,
  57. 18, 20, 24, 28, 40, 61, 59, 51,
  58. 20, 24, 32, 43, 50, 72, 72, 63,
  59. 25, 31, 42, 48, 58, 72, 81, 75,
  60. 38, 46, 54, 61, 71, 84, 88, 85,
  61. 50, 61, 65, 68, 79, 78, 86, 91,
  62. };
  63. static const uint8_t chroma_tab[] = {
  64. 12, 16, 24, 47, 99, 99, 99, 99,
  65. 16, 21, 26, 66, 99, 99, 99, 99,
  66. 24, 26, 56, 99, 99, 99, 99, 99,
  67. 47, 66, 99, 99, 99, 99, 99, 99,
  68. 99, 99, 99, 99, 99, 99, 99, 99,
  69. 99, 99, 99, 99, 99, 99, 99, 99,
  70. 99, 99, 99, 99, 99, 99, 99, 99,
  71. 99, 99, 99, 99, 99, 99, 99, 99,
  72. };
  73. static const uint8_t zigzag[] = {
  74. 0, 1, 8, 9, 16, 2, 3, 10,
  75. 17, 24, 32, 25, 18, 11, 4, 5,
  76. 12, 19, 26, 33, 40, 48, 41, 34,
  77. 27, 20, 13, 6, 7, 14, 21, 28,
  78. 35, 42, 49, 56, 57, 50, 43, 36,
  79. 29, 22, 15, 23, 30, 37, 44, 51,
  80. 58, 59, 52, 45, 38, 31, 39, 46,
  81. 53, 60, 61, 54, 47, 55, 62, 63,
  82. };
  83. static void get_qtable(int16_t *table, int quant, const uint8_t *quant_tab)
  84. {
  85. int factor = quant < 50 ? 5000 / FFMAX(quant, 1) : 200 - FFMIN(quant, 100) * 2;
  86. for (int i = 0; i < 64; i++) {
  87. table[i] = av_clip((quant_tab[i] * factor + 0x32) / 100, 1, 0x7fff);
  88. table[i] = ((int)ff_aanscales[i] * (int)table[i] + 0x800) >> 12;
  89. }
  90. }
  91. static inline void idct_1d(unsigned *blk, int step)
  92. {
  93. const unsigned t0 = blk[0 * step] + blk[4 * step];
  94. const unsigned t1 = blk[0 * step] - blk[4 * step];
  95. const unsigned t2 = blk[2 * step] + blk[6 * step];
  96. const unsigned t3 = ((int)((blk[2 * step] - blk[6 * step]) * 362U) >> 8) - t2;
  97. const unsigned t4 = t0 + t2;
  98. const unsigned t5 = t0 - t2;
  99. const unsigned t6 = t1 + t3;
  100. const unsigned t7 = t1 - t3;
  101. const unsigned t8 = blk[5 * step] + blk[3 * step];
  102. const unsigned t9 = blk[5 * step] - blk[3 * step];
  103. const unsigned tA = blk[1 * step] + blk[7 * step];
  104. const unsigned tB = blk[1 * step] - blk[7 * step];
  105. const unsigned tC = t8 + tA;
  106. const unsigned tD = (int)((tB + t9) * 473U) >> 8;
  107. const unsigned tE = (((int)(t9 * -669U) >> 8) - tC) + tD;
  108. const unsigned tF = ((int)((tA - t8) * 362U) >> 8) - tE;
  109. const unsigned t10 = (((int)(tB * 277U) >> 8) - tD) + tF;
  110. blk[0 * step] = t4 + tC;
  111. blk[1 * step] = t6 + tE;
  112. blk[2 * step] = t7 + tF;
  113. blk[3 * step] = t5 - t10;
  114. blk[4 * step] = t5 + t10;
  115. blk[5 * step] = t7 - tF;
  116. blk[6 * step] = t6 - tE;
  117. blk[7 * step] = t4 - tC;
  118. }
  119. static void idct_put(uint8_t *dst, int stride, int *block)
  120. {
  121. for (int i = 0; i < 8; i++) {
  122. if ((block[0x08 + i] |
  123. block[0x10 + i] |
  124. block[0x18 + i] |
  125. block[0x20 + i] |
  126. block[0x28 + i] |
  127. block[0x30 + i] |
  128. block[0x38 + i]) == 0) {
  129. block[0x08 + i] = block[i];
  130. block[0x10 + i] = block[i];
  131. block[0x18 + i] = block[i];
  132. block[0x20 + i] = block[i];
  133. block[0x28 + i] = block[i];
  134. block[0x30 + i] = block[i];
  135. block[0x38 + i] = block[i];
  136. } else {
  137. idct_1d(block + i, 8);
  138. }
  139. }
  140. for (int i = 0; i < 8; i++) {
  141. idct_1d(block, 1);
  142. for (int j = 0; j < 8; j++)
  143. dst[j] = av_clip_uint8((block[j] >> 5) + 128);
  144. block += 8;
  145. dst += stride;
  146. }
  147. }
  148. static void idct_add(uint8_t *dst, int stride,
  149. const uint8_t *src, int in_linesize, int *block)
  150. {
  151. for (int i = 0; i < 8; i++) {
  152. if ((block[0x08 + i] |
  153. block[0x10 + i] |
  154. block[0x18 + i] |
  155. block[0x20 + i] |
  156. block[0x28 + i] |
  157. block[0x30 + i] |
  158. block[0x38 + i]) == 0) {
  159. block[0x08 + i] = block[i];
  160. block[0x10 + i] = block[i];
  161. block[0x18 + i] = block[i];
  162. block[0x20 + i] = block[i];
  163. block[0x28 + i] = block[i];
  164. block[0x30 + i] = block[i];
  165. block[0x38 + i] = block[i];
  166. } else {
  167. idct_1d(block + i, 8);
  168. }
  169. }
  170. for (int i = 0; i < 8; i++) {
  171. idct_1d(block, 1);
  172. for (int j = 0; j < 8; j++)
  173. dst[j] = av_clip_uint8((block[j] >> 5) + src[j]);
  174. block += 8;
  175. dst += stride;
  176. src += in_linesize;
  177. }
  178. }
  179. static inline void idct2_1d(int *blk, int step)
  180. {
  181. const unsigned int t0 = blk[0 * step];
  182. const unsigned int t1 = blk[1 * step];
  183. const unsigned int t2 = (int)(t1 * 473U) >> 8;
  184. const unsigned int t3 = t2 - t1;
  185. const unsigned int t4 = ((int)(t1 * 362U) >> 8) - t3;
  186. const unsigned int t5 = (((int)(t1 * 277U) >> 8) - t2) + t4;
  187. blk[0 * step] = t1 + t0;
  188. blk[1 * step] = t0 + t3;
  189. blk[2 * step] = t4 + t0;
  190. blk[3 * step] = t0 - t5;
  191. blk[4 * step] = t5 + t0;
  192. blk[5 * step] = t0 - t4;
  193. blk[6 * step] = t0 - t3;
  194. blk[7 * step] = t0 - t1;
  195. }
  196. static void idct2_put(uint8_t *dst, int stride, int *block)
  197. {
  198. for (int i = 0; i < 2; i++) {
  199. if ((block[0x08 + i]) == 0) {
  200. block[0x08 + i] = block[i];
  201. block[0x10 + i] = block[i];
  202. block[0x18 + i] = block[i];
  203. block[0x20 + i] = block[i];
  204. block[0x28 + i] = block[i];
  205. block[0x30 + i] = block[i];
  206. block[0x38 + i] = block[i];
  207. } else {
  208. idct2_1d(block + i, 8);
  209. }
  210. }
  211. for (int i = 0; i < 8; i++) {
  212. if (block[1] == 0) {
  213. for (int j = 0; j < 8; j++)
  214. dst[j] = av_clip_uint8((block[0] >> 5) + 128);
  215. } else {
  216. idct2_1d(block, 1);
  217. for (int j = 0; j < 8; j++)
  218. dst[j] = av_clip_uint8((block[j] >> 5) + 128);
  219. }
  220. block += 8;
  221. dst += stride;
  222. }
  223. }
  224. static void idct2_add(uint8_t *dst, int stride,
  225. const uint8_t *src, int in_linesize,
  226. int *block)
  227. {
  228. for (int i = 0; i < 2; i++) {
  229. if ((block[0x08 + i]) == 0) {
  230. block[0x08 + i] = block[i];
  231. block[0x10 + i] = block[i];
  232. block[0x18 + i] = block[i];
  233. block[0x20 + i] = block[i];
  234. block[0x28 + i] = block[i];
  235. block[0x30 + i] = block[i];
  236. block[0x38 + i] = block[i];
  237. } else {
  238. idct2_1d(block + i, 8);
  239. }
  240. }
  241. for (int i = 0; i < 8; i++) {
  242. if (block[1] == 0) {
  243. for (int j = 0; j < 8; j++)
  244. dst[j] = av_clip_uint8((block[0] >> 5) + src[j]);
  245. } else {
  246. idct2_1d(block, 1);
  247. for (int j = 0; j < 8; j++)
  248. dst[j] = av_clip_uint8((block[j] >> 5) + src[j]);
  249. }
  250. block += 8;
  251. dst += stride;
  252. src += in_linesize;
  253. }
  254. }
  255. static void update_inter_block(uint8_t *dst, int stride,
  256. const uint8_t *src, int in_linesize,
  257. int block)
  258. {
  259. for (int i = 0; i < 8; i++) {
  260. for (int j = 0; j < 8; j++)
  261. dst[j] = av_clip_uint8(block + src[j]);
  262. dst += stride;
  263. src += in_linesize;
  264. }
  265. }
  266. static int decode_intra_block(AVCodecContext *avctx, int mode,
  267. GetByteContext *gbyte, int16_t *qtab,
  268. int *block, int *pfill,
  269. uint8_t *dst, int linesize)
  270. {
  271. MV30Context *s = avctx->priv_data;
  272. int fill;
  273. switch (mode) {
  274. case 0:
  275. s->bdsp.fill_block_tab[1](dst, 128, linesize, 8);
  276. break;
  277. case 1:
  278. fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
  279. pfill[0] += fill;
  280. block[0] = ((int)((unsigned)pfill[0] * qtab[0]) >> 5) + 128;
  281. s->bdsp.fill_block_tab[1](dst, block[0], linesize, 8);
  282. break;
  283. case 2:
  284. memset(block, 0, sizeof(*block) * 64);
  285. fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
  286. pfill[0] += fill;
  287. block[0] = (unsigned)pfill[0] * qtab[0];
  288. block[1] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[1];
  289. block[8] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[8];
  290. block[9] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[9];
  291. idct2_put(dst, linesize, block);
  292. break;
  293. case 3:
  294. fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
  295. pfill[0] += fill;
  296. block[0] = (unsigned)pfill[0] * qtab[0];
  297. for (int i = 1; i < 64; i++)
  298. block[zigzag[i]] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[zigzag[i]];
  299. idct_put(dst, linesize, block);
  300. break;
  301. }
  302. return 0;
  303. }
  304. static int decode_inter_block(AVCodecContext *avctx, int mode,
  305. GetByteContext *gbyte, int16_t *qtab,
  306. int *block, int *pfill,
  307. uint8_t *dst, int linesize,
  308. const uint8_t *src, int in_linesize)
  309. {
  310. int fill;
  311. switch (mode) {
  312. case 0:
  313. copy_block8(dst, src, linesize, in_linesize, 8);
  314. break;
  315. case 1:
  316. fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
  317. pfill[0] += fill;
  318. block[0] = (int)((unsigned)pfill[0] * qtab[0]) >> 5;
  319. update_inter_block(dst, linesize, src, in_linesize, block[0]);
  320. break;
  321. case 2:
  322. memset(block, 0, sizeof(*block) * 64);
  323. fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
  324. pfill[0] += fill;
  325. block[0] = (unsigned)pfill[0] * qtab[0];
  326. block[1] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[1];
  327. block[8] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[8];
  328. block[9] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[9];
  329. idct2_add(dst, linesize, src, in_linesize, block);
  330. break;
  331. case 3:
  332. fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
  333. pfill[0] += fill;
  334. block[0] = (unsigned)pfill[0] * qtab[0];
  335. for (int i = 1; i < 64; i++)
  336. block[zigzag[i]] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[zigzag[i]];
  337. idct_add(dst, linesize, src, in_linesize, block);
  338. break;
  339. }
  340. return 0;
  341. }
  342. static int decode_coeffs(GetBitContext *gb, int16_t *coeffs, int nb_codes)
  343. {
  344. memset(coeffs, 0, nb_codes * sizeof(*coeffs));
  345. for (int i = 0; i < nb_codes;) {
  346. int value = get_vlc2(gb, cbp_tab.table, CBP_VLC_BITS, 1);
  347. if (value > 0) {
  348. int x = get_bits(gb, value);
  349. if (x < (1 << value) / 2) {
  350. x = (1 << (value - 1)) + (x & ((1 << value) - 1 >> 1));
  351. } else {
  352. x = -(1 << (value - 1)) - (x & ((1 << value) - 1 >> 1));
  353. }
  354. coeffs[i++] = x;
  355. } else {
  356. int flag = get_bits1(gb);
  357. i += get_bits(gb, 3 + flag * 3) + 1 + flag * 8;
  358. }
  359. }
  360. return 0;
  361. }
  362. static int decode_intra(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame)
  363. {
  364. MV30Context *s = avctx->priv_data;
  365. GetBitContext mgb;
  366. uint8_t *dst[6];
  367. int linesize[6];
  368. int ret;
  369. mgb = *gb;
  370. if (get_bits_left(gb) < s->mode_size * 8)
  371. return AVERROR_INVALIDDATA;
  372. skip_bits_long(gb, s->mode_size * 8);
  373. linesize[0] = frame->linesize[0];
  374. linesize[1] = frame->linesize[0];
  375. linesize[2] = frame->linesize[0];
  376. linesize[3] = frame->linesize[0];
  377. linesize[4] = frame->linesize[1];
  378. linesize[5] = frame->linesize[2];
  379. for (int y = 0; y < avctx->height; y += 16) {
  380. GetByteContext gbyte;
  381. int pfill[3][1] = { {0} };
  382. int nb_codes = get_bits(gb, 16);
  383. av_fast_padded_malloc(&s->coeffs, &s->coeffs_size, nb_codes * sizeof(*s->coeffs));
  384. if (!s->coeffs)
  385. return AVERROR(ENOMEM);
  386. ret = decode_coeffs(gb, s->coeffs, nb_codes);
  387. if (ret < 0)
  388. return ret;
  389. bytestream2_init(&gbyte, (uint8_t *)s->coeffs, nb_codes * sizeof(*s->coeffs));
  390. for (int x = 0; x < avctx->width; x += 16) {
  391. dst[0] = frame->data[0] + linesize[0] * y + x;
  392. dst[1] = frame->data[0] + linesize[0] * y + x + 8;
  393. dst[2] = frame->data[0] + linesize[0] * (y + 8) + x;
  394. dst[3] = frame->data[0] + linesize[0] * (y + 8) + x + 8;
  395. dst[4] = frame->data[1] + linesize[4] * (y >> 1) + (x >> 1);
  396. dst[5] = frame->data[2] + linesize[5] * (y >> 1) + (x >> 1);
  397. for (int b = 0; b < 6; b++) {
  398. int mode = get_bits_le(&mgb, 2);
  399. ret = decode_intra_block(avctx, mode, &gbyte, s->intraq_tab[b >= 4],
  400. s->block[b],
  401. pfill[(b >= 4) + (b >= 5)],
  402. dst[b], linesize[b]);
  403. if (ret < 0)
  404. return ret;
  405. }
  406. }
  407. }
  408. return 0;
  409. }
  410. static int decode_inter(AVCodecContext *avctx, GetBitContext *gb,
  411. AVFrame *frame, AVFrame *prev)
  412. {
  413. MV30Context *s = avctx->priv_data;
  414. GetBitContext mask;
  415. GetBitContext mgb;
  416. GetByteContext mv;
  417. const int mask_size = ((avctx->height >> 4) * (avctx->width >> 4) * 2 + 7) / 8;
  418. uint8_t *dst[6], *src[6];
  419. int in_linesize[6];
  420. int linesize[6];
  421. int ret, cnt = 0;
  422. int flags = 0;
  423. in_linesize[0] = prev->linesize[0];
  424. in_linesize[1] = prev->linesize[0];
  425. in_linesize[2] = prev->linesize[0];
  426. in_linesize[3] = prev->linesize[0];
  427. in_linesize[4] = prev->linesize[1];
  428. in_linesize[5] = prev->linesize[2];
  429. linesize[0] = frame->linesize[0];
  430. linesize[1] = frame->linesize[0];
  431. linesize[2] = frame->linesize[0];
  432. linesize[3] = frame->linesize[0];
  433. linesize[4] = frame->linesize[1];
  434. linesize[5] = frame->linesize[2];
  435. av_fast_padded_malloc(&s->mvectors, &s->mvectors_size, 2 * s->nb_mvectors * sizeof(*s->mvectors));
  436. if (!s->mvectors) {
  437. ret = AVERROR(ENOMEM);
  438. goto fail;
  439. }
  440. mask = *gb;
  441. skip_bits_long(gb, mask_size * 8);
  442. mgb = *gb;
  443. skip_bits_long(gb, s->mode_size * 8);
  444. ret = decode_coeffs(gb, s->mvectors, 2 * s->nb_mvectors);
  445. if (ret < 0)
  446. goto fail;
  447. bytestream2_init(&mv, (uint8_t *)s->mvectors, 2 * s->nb_mvectors * sizeof(*s->mvectors));
  448. for (int y = 0; y < avctx->height; y += 16) {
  449. GetByteContext gbyte;
  450. int pfill[3][1] = { {0} };
  451. int nb_codes = get_bits(gb, 16);
  452. skip_bits(gb, 8);
  453. if (get_bits_left(gb) < 0) {
  454. ret = AVERROR_INVALIDDATA;
  455. goto fail;
  456. }
  457. av_fast_padded_malloc(&s->coeffs, &s->coeffs_size, nb_codes * sizeof(*s->coeffs));
  458. if (!s->coeffs) {
  459. ret = AVERROR(ENOMEM);
  460. goto fail;
  461. }
  462. ret = decode_coeffs(gb, s->coeffs, nb_codes);
  463. if (ret < 0)
  464. goto fail;
  465. bytestream2_init(&gbyte, (uint8_t *)s->coeffs, nb_codes * sizeof(*s->coeffs));
  466. for (int x = 0; x < avctx->width; x += 16) {
  467. if (cnt >= 4)
  468. cnt = 0;
  469. if (cnt == 0) {
  470. if (get_bits_left(&mask) < 8) {
  471. ret = AVERROR_INVALIDDATA;
  472. goto fail;
  473. }
  474. flags = get_bits(&mask, 8);
  475. }
  476. dst[0] = frame->data[0] + linesize[0] * y + x;
  477. dst[1] = frame->data[0] + linesize[0] * y + x + 8;
  478. dst[2] = frame->data[0] + linesize[0] * (y + 8) + x;
  479. dst[3] = frame->data[0] + linesize[0] * (y + 8) + x + 8;
  480. dst[4] = frame->data[1] + linesize[4] * (y >> 1) + (x >> 1);
  481. dst[5] = frame->data[2] + linesize[5] * (y >> 1) + (x >> 1);
  482. if ((flags >> (cnt)) & 1) {
  483. int mv_x = sign_extend(bytestream2_get_ne16(&mv), 16);
  484. int mv_y = sign_extend(bytestream2_get_ne16(&mv), 16);
  485. int px = x + mv_x;
  486. int py = y + mv_y;
  487. if (px < 0 || px > FFALIGN(avctx->width , 16) - 16 ||
  488. py < 0 || py > FFALIGN(avctx->height, 16) - 16)
  489. return AVERROR_INVALIDDATA;
  490. src[0] = prev->data[0] + in_linesize[0] * py + px;
  491. src[1] = prev->data[0] + in_linesize[0] * py + px + 8;
  492. src[2] = prev->data[0] + in_linesize[0] * (py + 8) + px;
  493. src[3] = prev->data[0] + in_linesize[0] * (py + 8) + px + 8;
  494. src[4] = prev->data[1] + in_linesize[4] * (py >> 1) + (px >> 1);
  495. src[5] = prev->data[2] + in_linesize[5] * (py >> 1) + (px >> 1);
  496. if ((flags >> (cnt + 4)) & 1) {
  497. for (int b = 0; b < 6; b++)
  498. copy_block8(dst[b], src[b], linesize[b], in_linesize[b], 8);
  499. } else {
  500. for (int b = 0; b < 6; b++) {
  501. int mode = get_bits_le(&mgb, 2);
  502. ret = decode_inter_block(avctx, mode, &gbyte, s->interq_tab[b >= 4],
  503. s->block[b],
  504. pfill[(b >= 4) + (b >= 5)],
  505. dst[b], linesize[b],
  506. src[b], in_linesize[b]);
  507. if (ret < 0)
  508. goto fail;
  509. }
  510. }
  511. } else {
  512. for (int b = 0; b < 6; b++) {
  513. int mode = get_bits_le(&mgb, 2);
  514. ret = decode_intra_block(avctx, mode, &gbyte, s->intraq_tab[b >= 4],
  515. s->block[b],
  516. pfill[(b >= 4) + (b >= 5)],
  517. dst[b], linesize[b]);
  518. if (ret < 0)
  519. goto fail;
  520. }
  521. }
  522. cnt++;
  523. }
  524. }
  525. fail:
  526. return ret;
  527. }
  528. static int decode_frame(AVCodecContext *avctx, void *data,
  529. int *got_frame, AVPacket *avpkt)
  530. {
  531. MV30Context *s = avctx->priv_data;
  532. GetBitContext *gb = &s->gb;
  533. AVFrame *frame = data;
  534. int ret;
  535. if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0)
  536. return ret;
  537. if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
  538. return ret;
  539. s->intra_quant = get_bits(gb, 8);
  540. s->inter_quant = s->intra_quant + get_sbits(gb, 8);
  541. s->is_inter = get_bits_le(gb, 16);
  542. s->mode_size = get_bits_le(gb, 16);
  543. if (s->is_inter)
  544. s->nb_mvectors = get_bits_le(gb, 16);
  545. get_qtable(s->intraq_tab[0], s->intra_quant, luma_tab);
  546. get_qtable(s->intraq_tab[1], s->intra_quant, chroma_tab);
  547. frame->key_frame = s->is_inter == 0;
  548. if (frame->key_frame) {
  549. ret = decode_intra(avctx, gb, frame);
  550. if (ret < 0)
  551. return ret;
  552. } else {
  553. get_qtable(s->interq_tab[0], s->inter_quant, luma_tab);
  554. get_qtable(s->interq_tab[1], s->inter_quant, chroma_tab);
  555. if (!s->prev_frame->data[0]) {
  556. av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
  557. return AVERROR_INVALIDDATA;
  558. }
  559. ret = decode_inter(avctx, gb, frame, s->prev_frame);
  560. if (ret < 0)
  561. return ret;
  562. }
  563. av_frame_unref(s->prev_frame);
  564. if ((ret = av_frame_ref(s->prev_frame, frame)) < 0)
  565. return ret;
  566. *got_frame = 1;
  567. return avpkt->size;
  568. }
  569. static const uint8_t cbp_bits[] = {
  570. 2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 9, 9,
  571. };
  572. static av_cold void init_static_data(void)
  573. {
  574. INIT_VLC_STATIC_FROM_LENGTHS(&cbp_tab, CBP_VLC_BITS, FF_ARRAY_ELEMS(cbp_bits),
  575. cbp_bits, 1, NULL, 0, 0, 0, 0, 1 << CBP_VLC_BITS);
  576. }
  577. static av_cold int decode_init(AVCodecContext *avctx)
  578. {
  579. MV30Context *s = avctx->priv_data;
  580. static AVOnce init_static_once = AV_ONCE_INIT;
  581. avctx->pix_fmt = AV_PIX_FMT_YUV420P;
  582. avctx->color_range = AVCOL_RANGE_JPEG;
  583. ff_blockdsp_init(&s->bdsp, avctx);
  584. s->prev_frame = av_frame_alloc();
  585. if (!s->prev_frame)
  586. return AVERROR(ENOMEM);
  587. ff_thread_once(&init_static_once, init_static_data);
  588. return 0;
  589. }
  590. static void decode_flush(AVCodecContext *avctx)
  591. {
  592. MV30Context *s = avctx->priv_data;
  593. av_frame_unref(s->prev_frame);
  594. }
  595. static av_cold int decode_close(AVCodecContext *avctx)
  596. {
  597. MV30Context *s = avctx->priv_data;
  598. av_frame_free(&s->prev_frame);
  599. av_freep(&s->coeffs);
  600. s->coeffs_size = 0;
  601. av_freep(&s->mvectors);
  602. s->mvectors_size = 0;
  603. return 0;
  604. }
  605. AVCodec ff_mv30_decoder = {
  606. .name = "mv30",
  607. .long_name = NULL_IF_CONFIG_SMALL("MidiVid 3.0"),
  608. .type = AVMEDIA_TYPE_VIDEO,
  609. .id = AV_CODEC_ID_MV30,
  610. .priv_data_size = sizeof(MV30Context),
  611. .init = decode_init,
  612. .close = decode_close,
  613. .decode = decode_frame,
  614. .flush = decode_flush,
  615. .capabilities = AV_CODEC_CAP_DR1,
  616. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
  617. FF_CODEC_CAP_INIT_CLEANUP,
  618. };