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.

570 lines
16KB

  1. /*
  2. * Gremlin Digital Video (GDV) decoder
  3. * Copyright (c) 2017 Konstantin Shishkov
  4. * Copyright (c) 2017 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 "libavutil/common.h"
  23. #include "avcodec.h"
  24. #include "bytestream.h"
  25. #include "internal.h"
  26. typedef struct GDVContext {
  27. AVCodecContext *avctx;
  28. GetByteContext gb;
  29. GetByteContext g2;
  30. PutByteContext pb;
  31. uint32_t pal[256];
  32. uint8_t *frame;
  33. unsigned frame_size;
  34. unsigned scale_h, scale_v;
  35. } GDVContext;
  36. typedef struct Bits8 {
  37. uint8_t queue;
  38. uint8_t fill;
  39. } Bits8;
  40. typedef struct Bits32 {
  41. uint32_t queue;
  42. uint8_t fill;
  43. } Bits32;
  44. #define PREAMBLE_SIZE 4096
  45. static av_cold int gdv_decode_init(AVCodecContext *avctx)
  46. {
  47. GDVContext *gdv = avctx->priv_data;
  48. int i, j, k;
  49. avctx->pix_fmt = AV_PIX_FMT_PAL8;
  50. gdv->frame_size = avctx->width * avctx->height + PREAMBLE_SIZE;
  51. gdv->frame = av_calloc(gdv->frame_size, 1);
  52. if (!gdv->frame)
  53. return AVERROR(ENOMEM);
  54. for (i = 0; i < 2; i++) {
  55. for (j = 0; j < 256; j++) {
  56. for (k = 0; k < 8; k++) {
  57. gdv->frame[i * 2048 + j * 8 + k] = j;
  58. }
  59. }
  60. }
  61. return 0;
  62. }
  63. static void scaleup(uint8_t *dst, const uint8_t *src, int w)
  64. {
  65. int x;
  66. for (x = 0; x < w - 7; x+=8) {
  67. dst[x + 0] =
  68. dst[x + 1] = src[(x>>1) + 0];
  69. dst[x + 2] =
  70. dst[x + 3] = src[(x>>1) + 1];
  71. dst[x + 4] =
  72. dst[x + 5] = src[(x>>1) + 2];
  73. dst[x + 6] =
  74. dst[x + 7] = src[(x>>1) + 3];
  75. }
  76. for (; x < w; x++) {
  77. dst[x] = src[(x>>1)];
  78. }
  79. }
  80. static void scaleup_rev(uint8_t *dst, const uint8_t *src, int w)
  81. {
  82. int x;
  83. for (x = w - 1; (x+1) & 7; x--) {
  84. dst[x] = src[(x>>1)];
  85. }
  86. for (x -= 7; x >= 0; x -= 8) {
  87. dst[x + 6] =
  88. dst[x + 7] = src[(x>>1) + 3];
  89. dst[x + 4] =
  90. dst[x + 5] = src[(x>>1) + 2];
  91. dst[x + 2] =
  92. dst[x + 3] = src[(x>>1) + 1];
  93. dst[x + 0] =
  94. dst[x + 1] = src[(x>>1) + 0];
  95. }
  96. }
  97. static void scaledown(uint8_t *dst, const uint8_t *src, int w)
  98. {
  99. int x;
  100. for (x = 0; x < w - 7; x+=8) {
  101. dst[x + 0] = src[2*x + 0];
  102. dst[x + 1] = src[2*x + 2];
  103. dst[x + 2] = src[2*x + 4];
  104. dst[x + 3] = src[2*x + 6];
  105. dst[x + 4] = src[2*x + 8];
  106. dst[x + 5] = src[2*x +10];
  107. dst[x + 6] = src[2*x +12];
  108. dst[x + 7] = src[2*x +14];
  109. }
  110. for (; x < w; x++) {
  111. dst[x] = src[2*x];
  112. }
  113. }
  114. static void rescale(GDVContext *gdv, uint8_t *dst, int w, int h, int scale_v, int scale_h)
  115. {
  116. int j, y;
  117. if ((gdv->scale_v == scale_v) && (gdv->scale_h == scale_h)) {
  118. return;
  119. }
  120. if (gdv->scale_v) {
  121. for (j = 0; j < h; j++) {
  122. int y = h - j - 1;
  123. uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
  124. uint8_t *src1 = dst + PREAMBLE_SIZE + (y>>!!gdv->scale_h) * (w>>1);
  125. scaleup_rev(dst1, src1, w);
  126. }
  127. } else if (gdv->scale_h) {
  128. for (j = 0; j < h; j++) {
  129. int y = h - j - 1;
  130. uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
  131. uint8_t *src1 = dst + PREAMBLE_SIZE + (y>>1) * w;
  132. memcpy(dst1, src1, w);
  133. }
  134. }
  135. if (scale_h && scale_v) {
  136. for (y = 0; y < (h>>1); y++) {
  137. uint8_t *dst1 = dst + PREAMBLE_SIZE + y * (w>>1);
  138. uint8_t *src1 = dst + PREAMBLE_SIZE + y*2 * w;
  139. scaledown(dst1, src1, w>>1);
  140. }
  141. } else if (scale_h) {
  142. for (y = 0; y < (h>>1); y++) {
  143. uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
  144. uint8_t *src1 = dst + PREAMBLE_SIZE + y*2 * w;
  145. memcpy(dst1, src1, w);
  146. }
  147. } else if (scale_v) {
  148. for (y = 0; y < h; y++) {
  149. uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
  150. scaledown(dst1, dst1, w>>1);
  151. }
  152. }
  153. gdv->scale_v = scale_v;
  154. gdv->scale_h = scale_h;
  155. }
  156. static int read_bits2(Bits8 *bits, GetByteContext *gb)
  157. {
  158. int res;
  159. if (bits->fill == 0) {
  160. bits->queue |= bytestream2_get_byte(gb);
  161. bits->fill = 8;
  162. }
  163. res = bits->queue >> 6;
  164. bits->queue <<= 2;
  165. bits->fill -= 2;
  166. return res;
  167. }
  168. static void fill_bits32(Bits32 *bits, GetByteContext *gb)
  169. {
  170. bits->queue = bytestream2_get_le32(gb);
  171. bits->fill = 32;
  172. }
  173. static int read_bits32(Bits32 *bits, GetByteContext *gb, int nbits)
  174. {
  175. int res = bits->queue & ((1 << nbits) - 1);
  176. bits->queue >>= nbits;
  177. bits->fill -= nbits;
  178. if (bits->fill <= 16) {
  179. bits->queue |= bytestream2_get_le16(gb) << bits->fill;
  180. bits->fill += 16;
  181. }
  182. return res;
  183. }
  184. static void lz_copy(PutByteContext *pb, GetByteContext *g2, int offset, unsigned len)
  185. {
  186. int i;
  187. if (offset == -1) {
  188. int c;
  189. bytestream2_seek(g2, bytestream2_tell_p(pb) - 1, SEEK_SET);
  190. c = bytestream2_get_byte(g2);
  191. for (i = 0; i < len; i++) {
  192. bytestream2_put_byte(pb, c);
  193. }
  194. } else if (offset < 0) {
  195. int start = bytestream2_tell_p(pb) - (-offset);
  196. bytestream2_seek(g2, start, SEEK_SET);
  197. for (i = 0; i < len; i++) {
  198. bytestream2_put_byte(pb, bytestream2_get_byte(g2));
  199. }
  200. } else {
  201. int start = bytestream2_tell_p(pb) + offset;
  202. bytestream2_seek(g2, start, SEEK_SET);
  203. for (i = 0; i < len; i++) {
  204. bytestream2_put_byte(pb, bytestream2_get_byte(g2));
  205. }
  206. }
  207. }
  208. static int decompress_2(AVCodecContext *avctx)
  209. {
  210. GDVContext *gdv = avctx->priv_data;
  211. GetByteContext *gb = &gdv->gb;
  212. GetByteContext *g2 = &gdv->g2;
  213. PutByteContext *pb = &gdv->pb;
  214. Bits8 bits = { 0 };
  215. int c, i;
  216. bytestream2_init(g2, gdv->frame, gdv->frame_size);
  217. bytestream2_skip_p(pb, PREAMBLE_SIZE);
  218. for (c = 0; c < 256; c++) {
  219. for (i = 0; i < 16; i++) {
  220. gdv->frame[c * 16 + i] = c;
  221. }
  222. }
  223. while (bytestream2_get_bytes_left_p(pb) > 0 && bytestream2_get_bytes_left(gb) > 0) {
  224. int tag = read_bits2(&bits, gb);
  225. if (tag == 0) {
  226. bytestream2_put_byte(pb, bytestream2_get_byte(gb));
  227. } else if (tag == 1) {
  228. int b = bytestream2_get_byte(gb);
  229. int len = (b & 0xF) + 3;
  230. int top = (b >> 4) & 0xF;
  231. int off = (bytestream2_get_byte(gb) << 4) + top - 4096;
  232. lz_copy(pb, g2, off, len);
  233. } else if (tag == 2) {
  234. int len = (bytestream2_get_byte(gb)) + 2;
  235. bytestream2_skip_p(pb, len);
  236. } else {
  237. break;
  238. }
  239. }
  240. if (bytestream2_get_bytes_left_p(pb) > 0)
  241. return AVERROR_INVALIDDATA;
  242. return 0;
  243. }
  244. static int decompress_5(AVCodecContext *avctx, unsigned skip)
  245. {
  246. GDVContext *gdv = avctx->priv_data;
  247. GetByteContext *gb = &gdv->gb;
  248. GetByteContext *g2 = &gdv->g2;
  249. PutByteContext *pb = &gdv->pb;
  250. Bits8 bits = { 0 };
  251. bytestream2_init(g2, gdv->frame, gdv->frame_size);
  252. bytestream2_skip_p(pb, skip + PREAMBLE_SIZE);
  253. while (bytestream2_get_bytes_left_p(pb) > 0 && bytestream2_get_bytes_left(gb) > 0) {
  254. int tag = read_bits2(&bits, gb);
  255. if (tag == 0) {
  256. bytestream2_put_byte(pb, bytestream2_get_byte(gb));
  257. } else if (tag == 1) {
  258. int b = bytestream2_get_byte(gb);
  259. int len = (b & 0xF) + 3;
  260. int top = b >> 4;
  261. int off = (bytestream2_get_byte(gb) << 4) + top - 4096;
  262. lz_copy(pb, g2, off, len);
  263. } else if (tag == 2) {
  264. int len;
  265. int b = bytestream2_get_byte(gb);
  266. if (b == 0) {
  267. break;
  268. }
  269. if (b != 0xFF) {
  270. len = b;
  271. } else {
  272. len = bytestream2_get_le16(gb);
  273. }
  274. bytestream2_skip_p(pb, len + 1);
  275. } else {
  276. int b = bytestream2_get_byte(gb);
  277. int len = (b & 0x3) + 2;
  278. int off = -(b >> 2) - 1;
  279. lz_copy(pb, g2, off, len);
  280. }
  281. }
  282. return 0;
  283. }
  284. static int decompress_68(AVCodecContext *avctx, unsigned skip, unsigned use8)
  285. {
  286. GDVContext *gdv = avctx->priv_data;
  287. GetByteContext *gb = &gdv->gb;
  288. GetByteContext *g2 = &gdv->g2;
  289. PutByteContext *pb = &gdv->pb;
  290. Bits32 bits;
  291. bytestream2_init(g2, gdv->frame, gdv->frame_size);
  292. bytestream2_skip_p(pb, skip + PREAMBLE_SIZE);
  293. fill_bits32(&bits, gb);
  294. while (bytestream2_get_bytes_left_p(pb) > 0 && bytestream2_get_bytes_left(gb) > 0) {
  295. int tag = read_bits32(&bits, gb, 2);
  296. if (tag == 0) {
  297. int b = read_bits32(&bits, gb, 1);
  298. if (b == 0) {
  299. bytestream2_put_byte(pb, bytestream2_get_byte(gb));
  300. } else {
  301. int i, len = 2;
  302. int lbits = 0;
  303. while (1) {
  304. int val;
  305. lbits += 1;
  306. val = read_bits32(&bits, gb, lbits);
  307. len += val;
  308. if (val != ((1 << lbits) - 1)) {
  309. break;
  310. }
  311. assert(lbits < 16);
  312. }
  313. for (i = 0; i < len; i++) {
  314. bytestream2_put_byte(pb, bytestream2_get_byte(gb));
  315. }
  316. }
  317. } else if (tag == 1) {
  318. int b = read_bits32(&bits, gb, 1);
  319. int len;
  320. if (b == 0) {
  321. len = (read_bits32(&bits, gb, 4)) + 2;
  322. } else {
  323. int bb = bytestream2_get_byte(gb);
  324. if ((bb & 0x80) == 0) {
  325. len = bb + 18;
  326. } else {
  327. int top = (bb & 0x7F) << 8;
  328. len = top + bytestream2_get_byte(gb) + 146;
  329. }
  330. }
  331. bytestream2_skip_p(pb, len);
  332. } else if (tag == 2) {
  333. int i, subtag = read_bits32(&bits, gb, 2);
  334. if (subtag != 3) {
  335. int top = (read_bits32(&bits, gb, 4)) << 8;
  336. int offs = top + bytestream2_get_byte(gb);
  337. if ((subtag != 0) || (offs <= 0xF80)) {
  338. int len = (subtag) + 3;
  339. lz_copy(pb, g2, (offs) - 4096, len);
  340. } else {
  341. int real_off, len, c1, c2;
  342. if (offs == 0xFFF) {
  343. return 0;
  344. }
  345. real_off = ((offs >> 4) & 0x7) + 1;
  346. len = ((offs & 0xF) + 2) * 2;
  347. c1 = gdv->frame[bytestream2_tell_p(pb) - real_off];
  348. c2 = gdv->frame[bytestream2_tell_p(pb) - real_off + 1];
  349. for (i = 0; i < len/2; i++) {
  350. bytestream2_put_byte(pb, c1);
  351. bytestream2_put_byte(pb, c2);
  352. }
  353. }
  354. } else {
  355. int b = bytestream2_get_byte(gb);
  356. int off = ((b & 0x7F)) + 1;
  357. int len = ((b & 0x80) == 0) ? 2 : 3;
  358. lz_copy(pb, g2, -off, len);
  359. }
  360. } else {
  361. int len;
  362. int off;
  363. if (use8) {
  364. int q, b = bytestream2_get_byte(gb);
  365. if ((b & 0xC0) == 0xC0) {
  366. len = ((b & 0x3F)) + 8;
  367. q = read_bits32(&bits, gb, 4);
  368. off = (q << 8) + (bytestream2_get_byte(gb)) + 1;
  369. } else {
  370. int ofs1;
  371. if ((b & 0x80) == 0) {
  372. len = ((b >> 4)) + 6;
  373. ofs1 = (b & 0xF);
  374. } else {
  375. len = ((b & 0x3F)) + 14;
  376. ofs1 = read_bits32(&bits, gb, 4);
  377. }
  378. off = (ofs1 << 8) + (bytestream2_get_byte(gb)) - 4096;
  379. }
  380. } else {
  381. int ofs1, b = bytestream2_get_byte(gb);
  382. if ((b >> 4) == 0xF) {
  383. len = bytestream2_get_byte(gb) + 21;
  384. } else {
  385. len = (b >> 4) + 6;
  386. }
  387. ofs1 = (b & 0xF);
  388. off = (ofs1 << 8) + bytestream2_get_byte(gb) - 4096;
  389. }
  390. lz_copy(pb, g2, off, len);
  391. }
  392. }
  393. return 0;
  394. }
  395. static int gdv_decode_frame(AVCodecContext *avctx, void *data,
  396. int *got_frame, AVPacket *avpkt)
  397. {
  398. GDVContext *gdv = avctx->priv_data;
  399. GetByteContext *gb = &gdv->gb;
  400. PutByteContext *pb = &gdv->pb;
  401. AVFrame *frame = data;
  402. int ret, i, pal_size;
  403. const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, &pal_size);
  404. int compression;
  405. unsigned flags;
  406. uint8_t *dst;
  407. bytestream2_init(gb, avpkt->data, avpkt->size);
  408. bytestream2_init_writer(pb, gdv->frame, gdv->frame_size);
  409. flags = bytestream2_get_le32(gb);
  410. compression = flags & 0xF;
  411. if (compression == 4 || compression == 7 || compression > 8)
  412. return AVERROR_INVALIDDATA;
  413. if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
  414. return ret;
  415. if (pal && pal_size == AVPALETTE_SIZE)
  416. memcpy(gdv->pal, pal, AVPALETTE_SIZE);
  417. rescale(gdv, gdv->frame, avctx->width, avctx->height,
  418. !!(flags & 0x10), !!(flags & 0x20));
  419. switch (compression) {
  420. case 1:
  421. memset(gdv->frame + PREAMBLE_SIZE, 0, gdv->frame_size - PREAMBLE_SIZE);
  422. case 0:
  423. if (bytestream2_get_bytes_left(gb) < 256*3)
  424. return AVERROR_INVALIDDATA;
  425. for (i = 0; i < 256; i++) {
  426. unsigned r = bytestream2_get_byte(gb);
  427. unsigned g = bytestream2_get_byte(gb);
  428. unsigned b = bytestream2_get_byte(gb);
  429. gdv->pal[i] = 0xFFU << 24 | r << 18 | g << 10 | b << 2;
  430. }
  431. break;
  432. case 2:
  433. ret = decompress_2(avctx);
  434. break;
  435. case 3:
  436. break;
  437. case 5:
  438. ret = decompress_5(avctx, flags >> 8);
  439. break;
  440. case 6:
  441. ret = decompress_68(avctx, flags >> 8, 0);
  442. break;
  443. case 8:
  444. ret = decompress_68(avctx, flags >> 8, 1);
  445. break;
  446. default:
  447. av_assert0(0);
  448. }
  449. if (ret < 0)
  450. return ret;
  451. memcpy(frame->data[1], gdv->pal, AVPALETTE_SIZE);
  452. dst = frame->data[0];
  453. if (!gdv->scale_v && !gdv->scale_h) {
  454. int sidx = PREAMBLE_SIZE, didx = 0;
  455. int y, x;
  456. for (y = 0; y < avctx->height; y++) {
  457. for (x = 0; x < avctx->width; x++) {
  458. dst[x+didx] = gdv->frame[x+sidx];
  459. }
  460. sidx += avctx->width;
  461. didx += frame->linesize[0];
  462. }
  463. } else {
  464. int sidx = PREAMBLE_SIZE, didx = 0;
  465. int y;
  466. for (y = 0; y < avctx->height; y++) {
  467. if (!gdv->scale_v) {
  468. memcpy(dst + didx, gdv->frame + sidx, avctx->width);
  469. } else {
  470. uint8_t *dst2 = dst + didx;
  471. uint8_t *src2 = gdv->frame + sidx;
  472. scaleup(dst2, src2, avctx->width);
  473. }
  474. if (!gdv->scale_h || ((y & 1) == 1)) {
  475. sidx += !gdv->scale_v ? avctx->width : avctx->width/2;
  476. }
  477. didx += frame->linesize[0];
  478. }
  479. }
  480. *got_frame = 1;
  481. return ret < 0 ? ret : avpkt->size;
  482. }
  483. static av_cold int gdv_decode_close(AVCodecContext *avctx)
  484. {
  485. GDVContext *gdv = avctx->priv_data;
  486. av_freep(&gdv->frame);
  487. return 0;
  488. }
  489. AVCodec ff_gdv_decoder = {
  490. .name = "gdv",
  491. .long_name = NULL_IF_CONFIG_SMALL("Gremlin Digital Video"),
  492. .type = AVMEDIA_TYPE_VIDEO,
  493. .id = AV_CODEC_ID_GDV,
  494. .priv_data_size = sizeof(GDVContext),
  495. .init = gdv_decode_init,
  496. .close = gdv_decode_close,
  497. .decode = gdv_decode_frame,
  498. .capabilities = AV_CODEC_CAP_DR1,
  499. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
  500. };