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.

582 lines
16KB

  1. /*
  2. * Copyright (c) 2012 Konstantin Shishkov
  3. *
  4. * This file is part of Libav.
  5. *
  6. * Libav is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * Libav is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with Libav; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. /**
  21. * @file
  22. * Common functions for Microsoft Screen 1 and 2
  23. */
  24. #include "libavutil/intfloat.h"
  25. #include "libavutil/intreadwrite.h"
  26. #include "avcodec.h"
  27. #include "mss12.h"
  28. enum SplitMode {
  29. SPLIT_VERT = 0,
  30. SPLIT_HOR,
  31. SPLIT_NONE
  32. };
  33. static const int sec_order_sizes[4] = { 1, 7, 6, 1 };
  34. enum ContextDirection {
  35. TOP_LEFT = 0,
  36. TOP,
  37. TOP_RIGHT,
  38. LEFT
  39. };
  40. static int model_calc_threshold(Model *m)
  41. {
  42. int thr;
  43. if (m->thr_weight == -1) {
  44. thr = 2 * m->weights[m->num_syms] - 1;
  45. thr = ((thr >> 1) + 4 * m->cum_prob[0]) / thr;
  46. } else {
  47. thr = m->num_syms * m->thr_weight;
  48. }
  49. return FFMIN(thr, 0x3FFF);
  50. }
  51. static void model_reset(Model *m)
  52. {
  53. int i;
  54. for (i = 0; i <= m->num_syms; i++) {
  55. m->weights[i] = 1;
  56. m->cum_prob[i] = m->num_syms - i;
  57. }
  58. m->weights[0] = -1;
  59. m->idx2sym[0] = -1;
  60. m->sym2idx[m->num_syms] = -1;
  61. for (i = 0; i < m->num_syms; i++) {
  62. m->sym2idx[i] = i + 1;
  63. m->idx2sym[i + 1] = i;
  64. }
  65. }
  66. static av_cold void model_init(Model *m, int num_syms, int thr_weight)
  67. {
  68. m->num_syms = num_syms;
  69. m->thr_weight = thr_weight;
  70. m->threshold = model_calc_threshold(m);
  71. model_reset(m);
  72. }
  73. static void model_rescale_weights(Model *m)
  74. {
  75. int i;
  76. int cum_prob;
  77. if (m->thr_weight == -1)
  78. m->threshold = model_calc_threshold(m);
  79. while (m->cum_prob[0] > m->threshold) {
  80. cum_prob = 0;
  81. for (i = m->num_syms; i >= 0; i--) {
  82. m->cum_prob[i] = cum_prob;
  83. m->weights[i] = (m->weights[i] + 1) >> 1;
  84. cum_prob += m->weights[i];
  85. }
  86. }
  87. }
  88. void ff_mss12_model_update(Model *m, int val)
  89. {
  90. int i;
  91. if (m->weights[val] == m->weights[val - 1]) {
  92. for (i = val; m->weights[i - 1] == m->weights[val]; i--);
  93. if (i != val) {
  94. int sym1, sym2;
  95. sym1 = m->idx2sym[val];
  96. sym2 = m->idx2sym[i];
  97. m->idx2sym[val] = sym2;
  98. m->idx2sym[i] = sym1;
  99. m->sym2idx[sym1] = i;
  100. m->sym2idx[sym2] = val;
  101. val = i;
  102. }
  103. }
  104. m->weights[val]++;
  105. for (i = val - 1; i >= 0; i--)
  106. m->cum_prob[i]++;
  107. model_rescale_weights(m);
  108. }
  109. static void pixctx_reset(PixContext *ctx)
  110. {
  111. int i, j, k;
  112. for (i = 0; i < ctx->cache_size; i++)
  113. ctx->cache[i] = i;
  114. model_reset(&ctx->cache_model);
  115. model_reset(&ctx->full_model);
  116. for (i = 0; i < 4; i++)
  117. for (j = 0; j < sec_order_sizes[i]; j++)
  118. for (k = 0; k < 4; k++)
  119. model_reset(&ctx->sec_models[i][j][k]);
  120. }
  121. static av_cold void pixctx_init(PixContext *ctx, int cache_size)
  122. {
  123. int i, j, k;
  124. ctx->cache_size = cache_size + 4;
  125. ctx->num_syms = cache_size;
  126. for (i = 0; i < ctx->cache_size; i++)
  127. ctx->cache[i] = i;
  128. model_init(&ctx->cache_model, ctx->num_syms + 1, THRESH_LOW);
  129. model_init(&ctx->full_model, 256, THRESH_HIGH);
  130. for (i = 0; i < 4; i++) {
  131. for (j = 0; j < sec_order_sizes[i]; j++) {
  132. for (k = 0; k < 4; k++) {
  133. model_init(&ctx->sec_models[i][j][k], 2 + i,
  134. i ? THRESH_LOW : THRESH_ADAPTIVE);
  135. }
  136. }
  137. }
  138. }
  139. static int decode_top_left_pixel(ArithCoder *acoder, PixContext *pctx)
  140. {
  141. int i, val, pix;
  142. val = acoder->get_model_sym(acoder, &pctx->cache_model);
  143. if (val < pctx->num_syms) {
  144. pix = pctx->cache[val];
  145. } else {
  146. pix = acoder->get_model_sym(acoder, &pctx->full_model);
  147. for (i = 0; i < pctx->cache_size - 1; i++)
  148. if (pctx->cache[i] == pix)
  149. break;
  150. val = i;
  151. }
  152. if (val) {
  153. for (i = val; i > 0; i--)
  154. pctx->cache[i] = pctx->cache[i - 1];
  155. pctx->cache[0] = pix;
  156. }
  157. return pix;
  158. }
  159. static int decode_pixel(ArithCoder *acoder, PixContext *pctx,
  160. uint8_t *ngb, int num_ngb)
  161. {
  162. int i, val, pix;
  163. val = acoder->get_model_sym(acoder, &pctx->cache_model);
  164. if (val < pctx->num_syms) {
  165. int idx, j;
  166. idx = 0;
  167. for (i = 0; i < pctx->cache_size; i++) {
  168. for (j = 0; j < num_ngb; j++)
  169. if (pctx->cache[i] == ngb[j])
  170. break;
  171. if (j == num_ngb) {
  172. if (idx == val)
  173. break;
  174. idx++;
  175. }
  176. }
  177. val = FFMIN(i, pctx->cache_size - 1);
  178. pix = pctx->cache[val];
  179. } else {
  180. pix = acoder->get_model_sym(acoder, &pctx->full_model);
  181. for (i = 0; i < pctx->cache_size - 1; i++)
  182. if (pctx->cache[i] == pix)
  183. break;
  184. val = i;
  185. }
  186. if (val) {
  187. for (i = val; i > 0; i--)
  188. pctx->cache[i] = pctx->cache[i - 1];
  189. pctx->cache[0] = pix;
  190. }
  191. return pix;
  192. }
  193. static int decode_pixel_in_context(ArithCoder *acoder, PixContext *pctx,
  194. uint8_t *src, int stride, int x, int y,
  195. int has_right)
  196. {
  197. uint8_t neighbours[4];
  198. uint8_t ref_pix[4];
  199. int nlen;
  200. int layer = 0, sub;
  201. int pix;
  202. int i, j;
  203. if (!y) {
  204. memset(neighbours, src[-1], 4);
  205. } else {
  206. neighbours[TOP] = src[-stride];
  207. if (!x) {
  208. neighbours[TOP_LEFT] = neighbours[LEFT] = neighbours[TOP];
  209. } else {
  210. neighbours[TOP_LEFT] = src[-stride - 1];
  211. neighbours[ LEFT] = src[-1];
  212. }
  213. if (has_right)
  214. neighbours[TOP_RIGHT] = src[-stride + 1];
  215. else
  216. neighbours[TOP_RIGHT] = neighbours[TOP];
  217. }
  218. sub = 0;
  219. if (x >= 2 && src[-2] == neighbours[LEFT])
  220. sub = 1;
  221. if (y >= 2 && src[-2 * stride] == neighbours[TOP])
  222. sub |= 2;
  223. nlen = 1;
  224. ref_pix[0] = neighbours[0];
  225. for (i = 1; i < 4; i++) {
  226. for (j = 0; j < nlen; j++)
  227. if (ref_pix[j] == neighbours[i])
  228. break;
  229. if (j == nlen)
  230. ref_pix[nlen++] = neighbours[i];
  231. }
  232. switch (nlen) {
  233. case 1:
  234. case 4:
  235. layer = 0;
  236. break;
  237. case 2:
  238. if (neighbours[TOP] == neighbours[TOP_LEFT]) {
  239. if (neighbours[TOP_RIGHT] == neighbours[TOP_LEFT])
  240. layer = 3;
  241. else if (neighbours[LEFT] == neighbours[TOP_LEFT])
  242. layer = 2;
  243. else
  244. layer = 4;
  245. } else if (neighbours[TOP_RIGHT] == neighbours[TOP_LEFT]) {
  246. if (neighbours[LEFT] == neighbours[TOP_LEFT])
  247. layer = 1;
  248. else
  249. layer = 5;
  250. } else if (neighbours[LEFT] == neighbours[TOP_LEFT]) {
  251. layer = 6;
  252. } else {
  253. layer = 0;
  254. }
  255. break;
  256. case 3:
  257. if (neighbours[TOP] == neighbours[TOP_LEFT])
  258. layer = 0;
  259. else if (neighbours[TOP_RIGHT] == neighbours[TOP_LEFT])
  260. layer = 1;
  261. else if (neighbours[LEFT] == neighbours[TOP_LEFT])
  262. layer = 2;
  263. else if (neighbours[TOP_RIGHT] == neighbours[TOP])
  264. layer = 3;
  265. else if (neighbours[TOP] == neighbours[LEFT])
  266. layer = 4;
  267. else
  268. layer = 5;
  269. break;
  270. }
  271. pix = acoder->get_model_sym(acoder, &pctx->sec_models[nlen - 1][layer][sub]);
  272. if (pix < nlen)
  273. return ref_pix[pix];
  274. else
  275. return decode_pixel(acoder, pctx, ref_pix, nlen);
  276. }
  277. static int decode_region(MSS12Context *ctx, ArithCoder *acoder, uint8_t *dst,
  278. int x, int y, int width, int height, int stride,
  279. PixContext *pctx)
  280. {
  281. int i, j;
  282. dst += x + y * stride;
  283. dst[0] = decode_top_left_pixel(acoder, pctx);
  284. for (j = 0; j < height; j++) {
  285. for (i = 0; i < width; i++) {
  286. if (!i && !j)
  287. continue;
  288. dst[i] = decode_pixel_in_context(acoder, pctx, dst + i, stride,
  289. i, j, width - i - 1);
  290. }
  291. dst += stride;
  292. }
  293. return 0;
  294. }
  295. static int decode_region_masked(MSS12Context *ctx, ArithCoder *acoder,
  296. uint8_t *dst, int stride, uint8_t *mask,
  297. int mask_stride, int x, int y,
  298. int width, int height,
  299. PixContext *pctx)
  300. {
  301. int i, j;
  302. dst += x + y * stride;
  303. mask += x + y * mask_stride;
  304. if (mask[0] == 0xFF)
  305. dst[0] = decode_top_left_pixel(acoder, pctx);
  306. for (j = 0; j < height; j++) {
  307. for (i = 0; i < width; i++) {
  308. if (!i && !j || mask[i] != 0xFF)
  309. continue;
  310. dst[i] = decode_pixel_in_context(acoder, pctx, dst + i, stride,
  311. i, j, width - i - 1);
  312. }
  313. dst += stride;
  314. mask += mask_stride;
  315. }
  316. return 0;
  317. }
  318. static av_cold void codec_init(MSS12Context *ctx)
  319. {
  320. model_init(&ctx->intra_region, 2, THRESH_ADAPTIVE);
  321. model_init(&ctx->inter_region, 2, THRESH_ADAPTIVE);
  322. model_init(&ctx->split_mode, 3, THRESH_HIGH);
  323. model_init(&ctx->edge_mode, 2, THRESH_HIGH);
  324. model_init(&ctx->pivot, 3, THRESH_LOW);
  325. pixctx_init(&ctx->intra_pix_ctx, 8);
  326. pixctx_init(&ctx->inter_pix_ctx, 2);
  327. ctx->corrupted = 1;
  328. }
  329. void ff_mss12_codec_reset(MSS12Context *ctx)
  330. {
  331. model_reset(&ctx->intra_region);
  332. model_reset(&ctx->inter_region);
  333. model_reset(&ctx->split_mode);
  334. model_reset(&ctx->edge_mode);
  335. model_reset(&ctx->pivot);
  336. pixctx_reset(&ctx->intra_pix_ctx);
  337. pixctx_reset(&ctx->inter_pix_ctx);
  338. ctx->corrupted = 0;
  339. }
  340. static int decode_pivot(MSS12Context *ctx, ArithCoder *acoder, int base)
  341. {
  342. int val, inv;
  343. inv = acoder->get_model_sym(acoder, &ctx->edge_mode);
  344. val = acoder->get_model_sym(acoder, &ctx->pivot) + 1;
  345. if (val > 2) {
  346. if ((base + 1) / 2 - 2 <= 0) {
  347. ctx->corrupted = 1;
  348. return 0;
  349. }
  350. val = acoder->get_number(acoder, (base + 1) / 2 - 2) + 3;
  351. }
  352. if (val == base) {
  353. ctx->corrupted = 1;
  354. return 0;
  355. }
  356. return inv ? base - val : val;
  357. }
  358. static int decode_region_intra(MSS12Context *ctx, ArithCoder *acoder,
  359. int x, int y, int width, int height)
  360. {
  361. int mode;
  362. mode = acoder->get_model_sym(acoder, &ctx->intra_region);
  363. if (!mode) {
  364. int i, pix;
  365. int stride = ctx->pic_stride;
  366. uint8_t *dst = ctx->pic_start + x + y * stride;
  367. pix = decode_top_left_pixel(acoder, &ctx->intra_pix_ctx);
  368. for (i = 0; i < height; i++, dst += stride)
  369. memset(dst, pix, width);
  370. } else {
  371. return decode_region(ctx, acoder, ctx->pic_start,
  372. x, y, width, height, ctx->pic_stride,
  373. &ctx->intra_pix_ctx);
  374. }
  375. return 0;
  376. }
  377. static int decode_region_inter(MSS12Context *ctx, ArithCoder *acoder,
  378. int x, int y, int width, int height)
  379. {
  380. int mode;
  381. mode = acoder->get_model_sym(acoder, &ctx->inter_region);
  382. if (!mode) {
  383. mode = decode_top_left_pixel(acoder, &ctx->inter_pix_ctx);
  384. if (mode != 0xFF) {
  385. return 0;
  386. } else {
  387. return decode_region_intra(ctx, acoder, x, y, width, height);
  388. }
  389. } else {
  390. if (decode_region(ctx, acoder, ctx->mask,
  391. x, y, width, height, ctx->mask_linesize,
  392. &ctx->inter_pix_ctx) < 0)
  393. return -1;
  394. return decode_region_masked(ctx, acoder, ctx->pic_start,
  395. ctx->pic_stride, ctx->mask,
  396. ctx->mask_linesize,
  397. x, y, width, height,
  398. &ctx->intra_pix_ctx);
  399. }
  400. return 0;
  401. }
  402. int ff_mss12_decode_rect(MSS12Context *ctx, ArithCoder *acoder,
  403. int x, int y, int width, int height)
  404. {
  405. int mode, pivot;
  406. if (ctx->corrupted)
  407. return -1;
  408. mode = acoder->get_model_sym(acoder, &ctx->split_mode);
  409. switch (mode) {
  410. case SPLIT_VERT:
  411. pivot = decode_pivot(ctx, acoder, height);
  412. if (ff_mss12_decode_rect(ctx, acoder, x, y, width, pivot))
  413. return -1;
  414. if (ff_mss12_decode_rect(ctx, acoder, x, y + pivot, width, height - pivot))
  415. return -1;
  416. break;
  417. case SPLIT_HOR:
  418. pivot = decode_pivot(ctx, acoder, width);
  419. if (ff_mss12_decode_rect(ctx, acoder, x, y, pivot, height))
  420. return -1;
  421. if (ff_mss12_decode_rect(ctx, acoder, x + pivot, y, width - pivot, height))
  422. return -1;
  423. break;
  424. case SPLIT_NONE:
  425. if (ctx->keyframe)
  426. return decode_region_intra(ctx, acoder, x, y, width, height);
  427. else
  428. return decode_region_inter(ctx, acoder, x, y, width, height);
  429. default:
  430. return -1;
  431. }
  432. return 0;
  433. }
  434. av_cold int ff_mss12_decode_init(AVCodecContext *avctx, int version)
  435. {
  436. MSS12Context * const c = avctx->priv_data;
  437. int i;
  438. c->avctx = avctx;
  439. if (avctx->extradata_size < 52 + 256 * 3) {
  440. av_log(avctx, AV_LOG_ERROR, "Insufficient extradata size %d\n",
  441. avctx->extradata_size);
  442. return AVERROR_INVALIDDATA;
  443. }
  444. if (AV_RB32(avctx->extradata) < avctx->extradata_size) {
  445. av_log(avctx, AV_LOG_ERROR,
  446. "Insufficient extradata size: expected %d got %d\n",
  447. AV_RB32(avctx->extradata),
  448. avctx->extradata_size);
  449. return AVERROR_INVALIDDATA;
  450. }
  451. av_log(avctx, AV_LOG_DEBUG, "Encoder version %d.%d\n",
  452. AV_RB32(avctx->extradata + 4), AV_RB32(avctx->extradata + 8));
  453. c->free_colours = AV_RB32(avctx->extradata + 48);
  454. if ((unsigned)c->free_colours > 256) {
  455. av_log(avctx, AV_LOG_ERROR,
  456. "Incorrect number of changeable palette entries: %d\n",
  457. c->free_colours);
  458. return AVERROR_INVALIDDATA;
  459. }
  460. av_log(avctx, AV_LOG_DEBUG, "%d free colour(s)\n", c->free_colours);
  461. avctx->coded_width = AV_RB32(avctx->extradata + 20);
  462. avctx->coded_height = AV_RB32(avctx->extradata + 24);
  463. av_log(avctx, AV_LOG_DEBUG, "Display dimensions %dx%d\n",
  464. AV_RB32(avctx->extradata + 12), AV_RB32(avctx->extradata + 16));
  465. av_log(avctx, AV_LOG_DEBUG, "Coded dimensions %dx%d\n",
  466. avctx->coded_width, avctx->coded_height);
  467. av_log(avctx, AV_LOG_DEBUG, "%g frames per second\n",
  468. av_int2float(AV_RB32(avctx->extradata + 28)));
  469. av_log(avctx, AV_LOG_DEBUG, "Bitrate %d bps\n",
  470. AV_RB32(avctx->extradata + 32));
  471. av_log(avctx, AV_LOG_DEBUG, "Max. lead time %g ms\n",
  472. av_int2float(AV_RB32(avctx->extradata + 36)));
  473. av_log(avctx, AV_LOG_DEBUG, "Max. lag time %g ms\n",
  474. av_int2float(AV_RB32(avctx->extradata + 40)));
  475. av_log(avctx, AV_LOG_DEBUG, "Max. seek time %g ms\n",
  476. av_int2float(AV_RB32(avctx->extradata + 44)));
  477. for (i = 0; i < 256; i++)
  478. c->pal[i] = AV_RB24(avctx->extradata + 52 + i * 3);
  479. avctx->pix_fmt = PIX_FMT_PAL8;
  480. c->mask_linesize = FFALIGN(avctx->width, 16);
  481. c->mask = av_malloc(c->mask_linesize * avctx->height);
  482. if (!c->mask) {
  483. av_log(avctx, AV_LOG_ERROR, "Cannot allocate mask plane\n");
  484. return AVERROR(ENOMEM);
  485. }
  486. codec_init(c);
  487. return 0;
  488. }
  489. av_cold int ff_mss12_decode_end(AVCodecContext *avctx)
  490. {
  491. MSS12Context * const c = avctx->priv_data;
  492. av_freep(&c->mask);
  493. return 0;
  494. }