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.

575 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 (bytestream2_get_bytes_left(gb) < 1)
  256. return AVERROR_INVALIDDATA;
  257. if (tag == 0) {
  258. bytestream2_put_byte(pb, bytestream2_get_byte(gb));
  259. } else if (tag == 1) {
  260. int b = bytestream2_get_byte(gb);
  261. int len = (b & 0xF) + 3;
  262. int top = b >> 4;
  263. int off = (bytestream2_get_byte(gb) << 4) + top - 4096;
  264. lz_copy(pb, g2, off, len);
  265. } else if (tag == 2) {
  266. int len;
  267. int b = bytestream2_get_byte(gb);
  268. if (b == 0) {
  269. return 0;
  270. }
  271. if (b != 0xFF) {
  272. len = b;
  273. } else {
  274. len = bytestream2_get_le16(gb);
  275. }
  276. bytestream2_skip_p(pb, len + 1);
  277. } else {
  278. int b = bytestream2_get_byte(gb);
  279. int len = (b & 0x3) + 2;
  280. int off = -(b >> 2) - 1;
  281. lz_copy(pb, g2, off, len);
  282. }
  283. }
  284. if (bytestream2_get_bytes_left_p(pb) > 0)
  285. return AVERROR_INVALIDDATA;
  286. return 0;
  287. }
  288. static int decompress_68(AVCodecContext *avctx, unsigned skip, unsigned use8)
  289. {
  290. GDVContext *gdv = avctx->priv_data;
  291. GetByteContext *gb = &gdv->gb;
  292. GetByteContext *g2 = &gdv->g2;
  293. PutByteContext *pb = &gdv->pb;
  294. Bits32 bits;
  295. bytestream2_init(g2, gdv->frame, gdv->frame_size);
  296. bytestream2_skip_p(pb, skip + PREAMBLE_SIZE);
  297. fill_bits32(&bits, gb);
  298. while (bytestream2_get_bytes_left_p(pb) > 0 && bytestream2_get_bytes_left(gb) > 0) {
  299. int tag = read_bits32(&bits, gb, 2);
  300. if (tag == 0) {
  301. int b = read_bits32(&bits, gb, 1);
  302. if (b == 0) {
  303. bytestream2_put_byte(pb, bytestream2_get_byte(gb));
  304. } else {
  305. int i, len = 2;
  306. int lbits = 0;
  307. while (1) {
  308. int val;
  309. lbits += 1;
  310. val = read_bits32(&bits, gb, lbits);
  311. len += val;
  312. if (val != ((1 << lbits) - 1)) {
  313. break;
  314. }
  315. assert(lbits < 16);
  316. }
  317. for (i = 0; i < len; i++) {
  318. bytestream2_put_byte(pb, bytestream2_get_byte(gb));
  319. }
  320. }
  321. } else if (tag == 1) {
  322. int b = read_bits32(&bits, gb, 1);
  323. int len;
  324. if (b == 0) {
  325. len = (read_bits32(&bits, gb, 4)) + 2;
  326. } else {
  327. int bb = bytestream2_get_byte(gb);
  328. if ((bb & 0x80) == 0) {
  329. len = bb + 18;
  330. } else {
  331. int top = (bb & 0x7F) << 8;
  332. len = top + bytestream2_get_byte(gb) + 146;
  333. }
  334. }
  335. bytestream2_skip_p(pb, len);
  336. } else if (tag == 2) {
  337. int i, subtag = read_bits32(&bits, gb, 2);
  338. if (subtag != 3) {
  339. int top = (read_bits32(&bits, gb, 4)) << 8;
  340. int offs = top + bytestream2_get_byte(gb);
  341. if ((subtag != 0) || (offs <= 0xF80)) {
  342. int len = (subtag) + 3;
  343. lz_copy(pb, g2, (offs) - 4096, len);
  344. } else {
  345. int real_off, len, c1, c2;
  346. if (offs == 0xFFF) {
  347. return 0;
  348. }
  349. real_off = ((offs >> 4) & 0x7) + 1;
  350. len = ((offs & 0xF) + 2) * 2;
  351. c1 = gdv->frame[bytestream2_tell_p(pb) - real_off];
  352. c2 = gdv->frame[bytestream2_tell_p(pb) - real_off + 1];
  353. for (i = 0; i < len/2; i++) {
  354. bytestream2_put_byte(pb, c1);
  355. bytestream2_put_byte(pb, c2);
  356. }
  357. }
  358. } else {
  359. int b = bytestream2_get_byte(gb);
  360. int off = ((b & 0x7F)) + 1;
  361. int len = ((b & 0x80) == 0) ? 2 : 3;
  362. lz_copy(pb, g2, -off, len);
  363. }
  364. } else {
  365. int len;
  366. int off;
  367. if (use8) {
  368. int q, b = bytestream2_get_byte(gb);
  369. if ((b & 0xC0) == 0xC0) {
  370. len = ((b & 0x3F)) + 8;
  371. q = read_bits32(&bits, gb, 4);
  372. off = (q << 8) + (bytestream2_get_byte(gb)) + 1;
  373. } else {
  374. int ofs1;
  375. if ((b & 0x80) == 0) {
  376. len = ((b >> 4)) + 6;
  377. ofs1 = (b & 0xF);
  378. } else {
  379. len = ((b & 0x3F)) + 14;
  380. ofs1 = read_bits32(&bits, gb, 4);
  381. }
  382. off = (ofs1 << 8) + (bytestream2_get_byte(gb)) - 4096;
  383. }
  384. } else {
  385. int ofs1, b = bytestream2_get_byte(gb);
  386. if ((b >> 4) == 0xF) {
  387. len = bytestream2_get_byte(gb) + 21;
  388. } else {
  389. len = (b >> 4) + 6;
  390. }
  391. ofs1 = (b & 0xF);
  392. off = (ofs1 << 8) + bytestream2_get_byte(gb) - 4096;
  393. }
  394. lz_copy(pb, g2, off, len);
  395. }
  396. }
  397. if (bytestream2_get_bytes_left_p(pb) > 0)
  398. return AVERROR_INVALIDDATA;
  399. return 0;
  400. }
  401. static int gdv_decode_frame(AVCodecContext *avctx, void *data,
  402. int *got_frame, AVPacket *avpkt)
  403. {
  404. GDVContext *gdv = avctx->priv_data;
  405. GetByteContext *gb = &gdv->gb;
  406. PutByteContext *pb = &gdv->pb;
  407. AVFrame *frame = data;
  408. int ret, i, pal_size;
  409. const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, &pal_size);
  410. int compression;
  411. unsigned flags;
  412. uint8_t *dst;
  413. bytestream2_init(gb, avpkt->data, avpkt->size);
  414. bytestream2_init_writer(pb, gdv->frame, gdv->frame_size);
  415. flags = bytestream2_get_le32(gb);
  416. compression = flags & 0xF;
  417. if (compression == 4 || compression == 7 || compression > 8)
  418. return AVERROR_INVALIDDATA;
  419. if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
  420. return ret;
  421. if (pal && pal_size == AVPALETTE_SIZE)
  422. memcpy(gdv->pal, pal, AVPALETTE_SIZE);
  423. if (compression < 2 && bytestream2_get_bytes_left(gb) < 256*3)
  424. return AVERROR_INVALIDDATA;
  425. rescale(gdv, gdv->frame, avctx->width, avctx->height,
  426. !!(flags & 0x10), !!(flags & 0x20));
  427. switch (compression) {
  428. case 1:
  429. memset(gdv->frame + PREAMBLE_SIZE, 0, gdv->frame_size - PREAMBLE_SIZE);
  430. case 0:
  431. for (i = 0; i < 256; i++) {
  432. unsigned r = bytestream2_get_byte(gb);
  433. unsigned g = bytestream2_get_byte(gb);
  434. unsigned b = bytestream2_get_byte(gb);
  435. gdv->pal[i] = 0xFFU << 24 | r << 18 | g << 10 | b << 2;
  436. }
  437. break;
  438. case 2:
  439. ret = decompress_2(avctx);
  440. break;
  441. case 3:
  442. break;
  443. case 5:
  444. ret = decompress_5(avctx, flags >> 8);
  445. break;
  446. case 6:
  447. ret = decompress_68(avctx, flags >> 8, 0);
  448. break;
  449. case 8:
  450. ret = decompress_68(avctx, flags >> 8, 1);
  451. break;
  452. default:
  453. av_assert0(0);
  454. }
  455. if (ret < 0)
  456. return ret;
  457. memcpy(frame->data[1], gdv->pal, AVPALETTE_SIZE);
  458. dst = frame->data[0];
  459. if (!gdv->scale_v && !gdv->scale_h) {
  460. int sidx = PREAMBLE_SIZE, didx = 0;
  461. int y;
  462. for (y = 0; y < avctx->height; y++) {
  463. memcpy(dst + didx, gdv->frame + sidx, avctx->width);
  464. sidx += avctx->width;
  465. didx += frame->linesize[0];
  466. }
  467. } else {
  468. int sidx = PREAMBLE_SIZE, didx = 0;
  469. int y;
  470. for (y = 0; y < avctx->height; y++) {
  471. if (!gdv->scale_v) {
  472. memcpy(dst + didx, gdv->frame + sidx, avctx->width);
  473. } else {
  474. uint8_t *dst2 = dst + didx;
  475. uint8_t *src2 = gdv->frame + sidx;
  476. scaleup(dst2, src2, avctx->width);
  477. }
  478. if (!gdv->scale_h || ((y & 1) == 1)) {
  479. sidx += !gdv->scale_v ? avctx->width : avctx->width/2;
  480. }
  481. didx += frame->linesize[0];
  482. }
  483. }
  484. *got_frame = 1;
  485. return ret < 0 ? ret : avpkt->size;
  486. }
  487. static av_cold int gdv_decode_close(AVCodecContext *avctx)
  488. {
  489. GDVContext *gdv = avctx->priv_data;
  490. av_freep(&gdv->frame);
  491. return 0;
  492. }
  493. AVCodec ff_gdv_decoder = {
  494. .name = "gdv",
  495. .long_name = NULL_IF_CONFIG_SMALL("Gremlin Digital Video"),
  496. .type = AVMEDIA_TYPE_VIDEO,
  497. .id = AV_CODEC_ID_GDV,
  498. .priv_data_size = sizeof(GDVContext),
  499. .init = gdv_decode_init,
  500. .close = gdv_decode_close,
  501. .decode = gdv_decode_frame,
  502. .capabilities = AV_CODEC_CAP_DR1,
  503. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
  504. };