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.

654 lines
19KB

  1. /*
  2. * Amuse Graphics Movie decoder
  3. *
  4. * Copyright (c) 2018 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. #define BITSTREAM_READER_LE
  26. #include "avcodec.h"
  27. #include "bytestream.h"
  28. #include "copy_block.h"
  29. #include "get_bits.h"
  30. #include "idctdsp.h"
  31. #include "internal.h"
  32. static const uint8_t unscaled_luma[64] = {
  33. 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19,
  34. 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56,
  35. 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56,
  36. 68,109,103, 77, 24, 35, 55, 64, 81,104,113, 92,
  37. 49, 64, 78, 87,103,121,120,101, 72, 92, 95, 98,
  38. 112,100,103,99
  39. };
  40. static const uint8_t unscaled_chroma[64] = {
  41. 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66,
  42. 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99,
  43. 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  44. 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  45. 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  46. 99, 99, 99, 99
  47. };
  48. typedef struct MotionVector {
  49. int16_t x, y;
  50. } MotionVector;
  51. typedef struct AGMContext {
  52. const AVClass *class;
  53. AVCodecContext *avctx;
  54. GetBitContext gb;
  55. GetByteContext gbyte;
  56. int key_frame;
  57. int bitstream_size;
  58. int compression;
  59. int blocks_w;
  60. int blocks_h;
  61. int size[3];
  62. int plus;
  63. unsigned flags;
  64. unsigned fflags;
  65. MotionVector *mvectors;
  66. int mvectors_size;
  67. AVFrame *prev_frame;
  68. int luma_quant_matrix[64];
  69. int chroma_quant_matrix[64];
  70. ScanTable scantable;
  71. DECLARE_ALIGNED(32, int16_t, block)[64];
  72. IDCTDSPContext idsp;
  73. } AGMContext;
  74. static int read_code(GetBitContext *gb, int *oskip, int *level, int *map, int mode)
  75. {
  76. int len = 0, skip = 0, max;
  77. if (show_bits(gb, 2)) {
  78. switch (show_bits(gb, 4)) {
  79. case 1:
  80. case 9:
  81. len = 1;
  82. skip = 3;
  83. break;
  84. case 2:
  85. len = 3;
  86. skip = 4;
  87. break;
  88. case 3:
  89. len = 7;
  90. skip = 4;
  91. break;
  92. case 5:
  93. case 13:
  94. len = 2;
  95. skip = 3;
  96. break;
  97. case 6:
  98. len = 4;
  99. skip = 4;
  100. break;
  101. case 7:
  102. len = 8;
  103. skip = 4;
  104. break;
  105. case 10:
  106. len = 5;
  107. skip = 4;
  108. break;
  109. case 11:
  110. len = 9;
  111. skip = 4;
  112. break;
  113. case 14:
  114. len = 6;
  115. skip = 4;
  116. break;
  117. case 15:
  118. len = ((show_bits(gb, 5) & 0x10) | 0xA0) >> 4;
  119. skip = 5;
  120. break;
  121. default:
  122. return AVERROR_INVALIDDATA;
  123. }
  124. skip_bits(gb, skip);
  125. *level = get_bits(gb, len);
  126. *map = 1;
  127. *oskip = 0;
  128. max = 1 << (len - 1);
  129. if (*level < max)
  130. *level = -(max + *level);
  131. } else if (show_bits(gb, 3) & 4) {
  132. skip_bits(gb, 3);
  133. if (mode == 1) {
  134. if (show_bits(gb, 4)) {
  135. if (show_bits(gb, 4) == 1) {
  136. skip_bits(gb, 4);
  137. *oskip = get_bits(gb, 16);
  138. } else {
  139. *oskip = get_bits(gb, 4);
  140. }
  141. } else {
  142. skip_bits(gb, 4);
  143. *oskip = get_bits(gb, 10);
  144. }
  145. } else if (mode == 0) {
  146. *oskip = get_bits(gb, 10);
  147. }
  148. *level = 0;
  149. } else {
  150. skip_bits(gb, 3);
  151. if (mode == 0)
  152. *oskip = get_bits(gb, 4);
  153. else if (mode == 1)
  154. *oskip = 0;
  155. *level = 0;
  156. }
  157. return 0;
  158. }
  159. static int decode_intra_block(AGMContext *s, GetBitContext *gb, int size,
  160. const int *quant_matrix, int *skip, int *dc_level)
  161. {
  162. const uint8_t *scantable = s->scantable.permutated;
  163. const int offset = s->plus ? 0 : 1024;
  164. int16_t *block = s->block;
  165. int level, ret, map = 0;
  166. memset(block, 0, sizeof(s->block));
  167. if (*skip > 0) {
  168. (*skip)--;
  169. } else {
  170. ret = read_code(gb, skip, &level, &map, s->flags & 1);
  171. if (ret < 0)
  172. return ret;
  173. *dc_level += level;
  174. }
  175. block[scantable[0]] = offset + *dc_level * quant_matrix[0];
  176. for (int i = 1; i < 64;) {
  177. if (*skip > 0) {
  178. int rskip;
  179. rskip = FFMIN(*skip, 64 - i);
  180. i += rskip;
  181. *skip -= rskip;
  182. } else {
  183. ret = read_code(gb, skip, &level, &map, s->flags & 1);
  184. if (ret < 0)
  185. return ret;
  186. block[scantable[i]] = level * quant_matrix[i];
  187. i++;
  188. }
  189. }
  190. return 0;
  191. }
  192. static int decode_intra_plane(AGMContext *s, GetBitContext *gb, int size,
  193. const int *quant_matrix, AVFrame *frame,
  194. int plane)
  195. {
  196. int ret, skip = 0, dc_level = 0;
  197. if ((ret = init_get_bits8(gb, s->gbyte.buffer, size)) < 0)
  198. return ret;
  199. for (int y = 0; y < s->blocks_h; y++) {
  200. for (int x = 0; x < s->blocks_w; x++) {
  201. ret = decode_intra_block(s, gb, size, quant_matrix, &skip, &dc_level);
  202. if (ret < 0)
  203. return ret;
  204. s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
  205. frame->linesize[plane], s->block);
  206. }
  207. }
  208. align_get_bits(gb);
  209. if (get_bits_left(gb) < 0)
  210. av_log(s->avctx, AV_LOG_WARNING, "overread\n");
  211. if (get_bits_left(gb) > 0)
  212. av_log(s->avctx, AV_LOG_WARNING, "underread: %d\n", get_bits_left(gb));
  213. return 0;
  214. }
  215. static int decode_inter_block(AGMContext *s, GetBitContext *gb, int size,
  216. const int *quant_matrix, int *skip,
  217. int *map)
  218. {
  219. const uint8_t *scantable = s->scantable.permutated;
  220. int16_t *block = s->block;
  221. int level, ret;
  222. memset(block, 0, sizeof(s->block));
  223. for (int i = 0; i < 64;) {
  224. if (*skip > 0) {
  225. int rskip;
  226. rskip = FFMIN(*skip, 64 - i);
  227. i += rskip;
  228. *skip -= rskip;
  229. } else {
  230. ret = read_code(gb, skip, &level, map, s->flags & 1);
  231. if (ret < 0)
  232. return ret;
  233. block[scantable[i]] = level * quant_matrix[i];
  234. i++;
  235. }
  236. }
  237. return 0;
  238. }
  239. static int decode_inter_plane(AGMContext *s, GetBitContext *gb, int size,
  240. const int *quant_matrix, AVFrame *frame,
  241. AVFrame *prev, int plane)
  242. {
  243. int ret, skip = 0;
  244. if ((ret = init_get_bits8(gb, s->gbyte.buffer, size)) < 0)
  245. return ret;
  246. if (s->flags & 2) {
  247. for (int y = 0; y < s->blocks_h; y++) {
  248. for (int x = 0; x < s->blocks_w; x++) {
  249. int shift = plane == 0;
  250. int mvpos = (y >> shift) * (s->blocks_w >> shift) + (x >> shift);
  251. int orig_mv_x = s->mvectors[mvpos].x;
  252. int mv_x = s->mvectors[mvpos].x / (1 + !shift);
  253. int mv_y = s->mvectors[mvpos].y / (1 + !shift);
  254. int h = s->avctx->coded_height >> !shift;
  255. int w = s->avctx->coded_width >> !shift;
  256. int map = 0;
  257. ret = decode_inter_block(s, gb, size, quant_matrix, &skip, &map);
  258. if (ret < 0)
  259. return ret;
  260. if (orig_mv_x >= -32) {
  261. if (y * 8 + mv_y < 0 || y * 8 + mv_y >= h ||
  262. x * 8 + mv_x < 0 || x * 8 + mv_x >= w)
  263. return AVERROR_INVALIDDATA;
  264. copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
  265. prev->data[plane] + ((s->blocks_h - 1 - y) * 8 - mv_y) * prev->linesize[plane] + (x * 8 + mv_x),
  266. frame->linesize[plane], prev->linesize[plane], 8);
  267. if (map) {
  268. s->idsp.idct(s->block);
  269. for (int i = 0; i < 64; i++)
  270. s->block[i] = (s->block[i] + 1) & 0xFFFC;
  271. s->idsp.add_pixels_clamped(s->block, frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
  272. frame->linesize[plane]);
  273. }
  274. } else if (map) {
  275. s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
  276. frame->linesize[plane], s->block);
  277. }
  278. }
  279. }
  280. } else {
  281. for (int y = 0; y < s->blocks_h; y++) {
  282. for (int x = 0; x < s->blocks_w; x++) {
  283. int map = 0;
  284. ret = decode_inter_block(s, gb, size, quant_matrix, &skip, &map);
  285. if (ret < 0)
  286. return ret;
  287. if (!map)
  288. continue;
  289. s->idsp.idct_add(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
  290. frame->linesize[plane], s->block);
  291. }
  292. }
  293. }
  294. align_get_bits(gb);
  295. if (get_bits_left(gb) < 0)
  296. av_log(s->avctx, AV_LOG_WARNING, "overread\n");
  297. if (get_bits_left(gb) > 0)
  298. av_log(s->avctx, AV_LOG_WARNING, "underread: %d\n", get_bits_left(gb));
  299. return 0;
  300. }
  301. static void compute_quant_matrix(AGMContext *s, double qscale)
  302. {
  303. int luma[64], chroma[64];
  304. double f = 1.0 - fabs(qscale);
  305. if (!s->key_frame && (s->flags & 2)) {
  306. if (qscale >= 0.0) {
  307. for (int i = 0; i < 64; i++) {
  308. luma[i] = FFMAX(1, 16 * f);
  309. chroma[i] = FFMAX(1, 16 * f);
  310. }
  311. } else {
  312. for (int i = 0; i < 64; i++) {
  313. luma[i] = FFMAX(1, 16 - qscale * 32);
  314. chroma[i] = FFMAX(1, 16 - qscale * 32);
  315. }
  316. }
  317. } else {
  318. if (qscale >= 0.0) {
  319. for (int i = 0; i < 64; i++) {
  320. luma[i] = FFMAX(1, unscaled_luma [(i & 7) * 8 + (i >> 3)] * f);
  321. chroma[i] = FFMAX(1, unscaled_chroma[(i & 7) * 8 + (i >> 3)] * f);
  322. }
  323. } else {
  324. for (int i = 0; i < 64; i++) {
  325. luma[i] = FFMAX(1, 255.0 - (255 - unscaled_luma [(i & 7) * 8 + (i >> 3)]) * f);
  326. chroma[i] = FFMAX(1, 255.0 - (255 - unscaled_chroma[(i & 7) * 8 + (i >> 3)]) * f);
  327. }
  328. }
  329. }
  330. for (int i = 0; i < 64; i++) {
  331. int pos = ff_zigzag_direct[i];
  332. s->luma_quant_matrix[i] = luma[pos] * ((pos / 8) & 1 ? -1 : 1);
  333. s->chroma_quant_matrix[i] = chroma[pos] * ((pos / 8) & 1 ? -1 : 1);
  334. }
  335. }
  336. static int decode_intra(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame)
  337. {
  338. AGMContext *s = avctx->priv_data;
  339. int ret;
  340. compute_quant_matrix(s, (2 * s->compression - 100) / 100.0);
  341. s->blocks_w = avctx->coded_width >> 3;
  342. s->blocks_h = avctx->coded_height >> 3;
  343. ret = decode_intra_plane(s, gb, s->size[0], s->luma_quant_matrix, frame, 0);
  344. if (ret < 0)
  345. return ret;
  346. bytestream2_skip(&s->gbyte, s->size[0]);
  347. s->blocks_w = avctx->coded_width >> 4;
  348. s->blocks_h = avctx->coded_height >> 4;
  349. ret = decode_intra_plane(s, gb, s->size[1], s->chroma_quant_matrix, frame, 2);
  350. if (ret < 0)
  351. return ret;
  352. bytestream2_skip(&s->gbyte, s->size[1]);
  353. s->blocks_w = avctx->coded_width >> 4;
  354. s->blocks_h = avctx->coded_height >> 4;
  355. ret = decode_intra_plane(s, gb, s->size[2], s->chroma_quant_matrix, frame, 1);
  356. if (ret < 0)
  357. return ret;
  358. return 0;
  359. }
  360. static int decode_motion_vectors(AVCodecContext *avctx, GetBitContext *gb)
  361. {
  362. AGMContext *s = avctx->priv_data;
  363. int nb_mvs = ((avctx->height + 15) >> 4) * ((avctx->width + 15) >> 4);
  364. int ret, skip = 0, value, map;
  365. av_fast_padded_malloc(&s->mvectors, &s->mvectors_size,
  366. nb_mvs * sizeof(*s->mvectors));
  367. if (!s->mvectors)
  368. return AVERROR(ENOMEM);
  369. if ((ret = init_get_bits8(gb, s->gbyte.buffer, bytestream2_get_bytes_left(&s->gbyte) -
  370. (s->size[0] + s->size[1] + s->size[2]))) < 0)
  371. return ret;
  372. memset(s->mvectors, 0, sizeof(*s->mvectors) * nb_mvs);
  373. for (int i = 0; i < nb_mvs; i++) {
  374. ret = read_code(gb, &skip, &value, &map, 1);
  375. if (ret < 0)
  376. return ret;
  377. s->mvectors[i].x = value;
  378. i += skip;
  379. }
  380. for (int i = 0; i < nb_mvs; i++) {
  381. ret = read_code(gb, &skip, &value, &map, 1);
  382. if (ret < 0)
  383. return ret;
  384. s->mvectors[i].y = value;
  385. i += skip;
  386. }
  387. if (get_bits_left(gb) <= 0)
  388. return AVERROR_INVALIDDATA;
  389. skip = (get_bits_count(gb) >> 3) + 1;
  390. bytestream2_skip(&s->gbyte, skip);
  391. return 0;
  392. }
  393. static int decode_inter(AVCodecContext *avctx, GetBitContext *gb,
  394. AVFrame *frame, AVFrame *prev)
  395. {
  396. AGMContext *s = avctx->priv_data;
  397. int ret;
  398. compute_quant_matrix(s, (2 * s->compression - 100) / 100.0);
  399. if (s->flags & 2) {
  400. ret = decode_motion_vectors(avctx, gb);
  401. if (ret < 0)
  402. return ret;
  403. }
  404. s->blocks_w = avctx->coded_width >> 3;
  405. s->blocks_h = avctx->coded_height >> 3;
  406. ret = decode_inter_plane(s, gb, s->size[0], s->luma_quant_matrix, frame, prev, 0);
  407. if (ret < 0)
  408. return ret;
  409. bytestream2_skip(&s->gbyte, s->size[0]);
  410. s->blocks_w = avctx->coded_width >> 4;
  411. s->blocks_h = avctx->coded_height >> 4;
  412. ret = decode_inter_plane(s, gb, s->size[1], s->chroma_quant_matrix, frame, prev, 2);
  413. if (ret < 0)
  414. return ret;
  415. bytestream2_skip(&s->gbyte, s->size[1]);
  416. s->blocks_w = avctx->coded_width >> 4;
  417. s->blocks_h = avctx->coded_height >> 4;
  418. ret = decode_inter_plane(s, gb, s->size[2], s->chroma_quant_matrix, frame, prev, 1);
  419. if (ret < 0)
  420. return ret;
  421. return 0;
  422. }
  423. static int decode_frame(AVCodecContext *avctx, void *data,
  424. int *got_frame, AVPacket *avpkt)
  425. {
  426. AGMContext *s = avctx->priv_data;
  427. GetBitContext *gb = &s->gb;
  428. GetByteContext *gbyte = &s->gbyte;
  429. AVFrame *frame = data;
  430. int w, h, width, height, header;
  431. int ret;
  432. if (!avpkt->size)
  433. return 0;
  434. bytestream2_init(gbyte, avpkt->data, avpkt->size);
  435. header = bytestream2_get_le32(gbyte);
  436. s->fflags = bytestream2_get_le32(gbyte);
  437. s->bitstream_size = s->fflags & 0x1FFFFFFF;
  438. s->fflags >>= 29;
  439. av_log(avctx, AV_LOG_DEBUG, "fflags: %X\n", s->fflags);
  440. if (avpkt->size < s->bitstream_size + 8)
  441. return AVERROR_INVALIDDATA;
  442. s->key_frame = s->fflags & 0x1;
  443. frame->key_frame = s->key_frame;
  444. frame->pict_type = s->key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
  445. if (header) {
  446. av_log(avctx, AV_LOG_ERROR, "header: %X\n", header);
  447. return AVERROR_PATCHWELCOME;
  448. }
  449. s->flags = 0;
  450. w = bytestream2_get_le32(gbyte);
  451. if (w < 0) {
  452. w = -w;
  453. s->flags |= 2;
  454. }
  455. h = bytestream2_get_le32(gbyte);
  456. if (h < 0) {
  457. h = -h;
  458. s->flags |= 1;
  459. }
  460. width = avctx->width;
  461. height = avctx->height;
  462. if (w < width || h < height || w & 7 || h & 7)
  463. return AVERROR_INVALIDDATA;
  464. ret = ff_set_dimensions(avctx, w, h);
  465. if (ret < 0)
  466. return ret;
  467. avctx->width = width;
  468. avctx->height = height;
  469. s->compression = bytestream2_get_le32(gbyte);
  470. if (s->compression < 0 || s->compression > 100)
  471. return AVERROR_INVALIDDATA;
  472. for (int i = 0; i < 3; i++)
  473. s->size[i] = bytestream2_get_le32(gbyte);
  474. if (32LL + s->size[0] + s->size[1] + s->size[2] > avpkt->size)
  475. return AVERROR_INVALIDDATA;
  476. if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
  477. return ret;
  478. if (frame->key_frame) {
  479. ret = decode_intra(avctx, gb, frame);
  480. } else {
  481. if (!s->prev_frame->data[0]) {
  482. av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
  483. return AVERROR_INVALIDDATA;
  484. }
  485. if (!(s->flags & 2)) {
  486. ret = av_frame_copy(frame, s->prev_frame);
  487. if (ret < 0)
  488. return ret;
  489. }
  490. ret = decode_inter(avctx, gb, frame, s->prev_frame);
  491. }
  492. if (ret < 0)
  493. return ret;
  494. av_frame_unref(s->prev_frame);
  495. if ((ret = av_frame_ref(s->prev_frame, frame)) < 0)
  496. return ret;
  497. frame->crop_top = avctx->coded_height - avctx->height;
  498. frame->crop_left = avctx->coded_width - avctx->width;
  499. *got_frame = 1;
  500. return avpkt->size;
  501. }
  502. static av_cold int decode_init(AVCodecContext *avctx)
  503. {
  504. AGMContext *s = avctx->priv_data;
  505. avctx->pix_fmt = AV_PIX_FMT_YUV420P;
  506. s->avctx = avctx;
  507. s->plus = avctx->codec_tag == MKTAG('A', 'G', 'M', '3');
  508. avctx->idct_algo = FF_IDCT_SIMPLE;
  509. ff_idctdsp_init(&s->idsp, avctx);
  510. ff_init_scantable(s->idsp.idct_permutation, &s->scantable, ff_zigzag_direct);
  511. s->prev_frame = av_frame_alloc();
  512. if (!s->prev_frame)
  513. return AVERROR(ENOMEM);
  514. return 0;
  515. }
  516. static void decode_flush(AVCodecContext *avctx)
  517. {
  518. AGMContext *s = avctx->priv_data;
  519. av_frame_unref(s->prev_frame);
  520. }
  521. static av_cold int decode_close(AVCodecContext *avctx)
  522. {
  523. AGMContext *s = avctx->priv_data;
  524. av_frame_free(&s->prev_frame);
  525. av_freep(&s->mvectors);
  526. s->mvectors_size = 0;
  527. return 0;
  528. }
  529. AVCodec ff_agm_decoder = {
  530. .name = "agm",
  531. .long_name = NULL_IF_CONFIG_SMALL("Amuse Graphics Movie"),
  532. .type = AVMEDIA_TYPE_VIDEO,
  533. .id = AV_CODEC_ID_AGM,
  534. .priv_data_size = sizeof(AGMContext),
  535. .init = decode_init,
  536. .close = decode_close,
  537. .decode = decode_frame,
  538. .flush = decode_flush,
  539. .capabilities = AV_CODEC_CAP_DR1,
  540. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
  541. FF_CODEC_CAP_INIT_CLEANUP |
  542. FF_CODEC_CAP_EXPORTS_CROPPING,
  543. };