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.

913 lines
29KB

  1. /*
  2. * ClearVideo decoder
  3. * Copyright (c) 2012-2018 Konstantin Shishkov
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file
  23. * ClearVideo decoder
  24. */
  25. #include "avcodec.h"
  26. #include "bytestream.h"
  27. #include "get_bits.h"
  28. #include "idctdsp.h"
  29. #include "internal.h"
  30. #include "mathops.h"
  31. #include "clearvideodata.h"
  32. typedef struct LevelCodes {
  33. uint16_t mv_esc;
  34. uint16_t bias_esc;
  35. VLC flags_cb;
  36. VLC mv_cb;
  37. VLC bias_cb;
  38. } LevelCodes;
  39. typedef struct MV {
  40. int16_t x, y;
  41. } MV;
  42. static const MV zero_mv = { 0 };
  43. typedef struct MVInfo {
  44. int mb_w;
  45. int mb_h;
  46. int mb_size;
  47. int mb_stride;
  48. int top;
  49. MV *mv;
  50. } MVInfo;
  51. typedef struct TileInfo {
  52. uint16_t flags;
  53. int16_t bias;
  54. MV mv;
  55. struct TileInfo *child[4];
  56. } TileInfo;
  57. typedef struct CLVContext {
  58. AVCodecContext *avctx;
  59. IDCTDSPContext idsp;
  60. AVFrame *pic;
  61. AVFrame *prev;
  62. GetBitContext gb;
  63. int mb_width, mb_height;
  64. int pmb_width, pmb_height;
  65. MVInfo mvi;
  66. int tile_size;
  67. int tile_shift;
  68. VLC dc_vlc, ac_vlc;
  69. LevelCodes ylev[4], ulev[3], vlev[3];
  70. int luma_dc_quant, chroma_dc_quant, ac_quant;
  71. DECLARE_ALIGNED(16, int16_t, block)[64];
  72. int top_dc[3], left_dc[4];
  73. } CLVContext;
  74. static inline int decode_block(CLVContext *ctx, int16_t *blk, int has_ac,
  75. int ac_quant)
  76. {
  77. GetBitContext *gb = &ctx->gb;
  78. int idx = 1, last = 0, val, skip;
  79. memset(blk, 0, sizeof(*blk) * 64);
  80. blk[0] = get_vlc2(gb, ctx->dc_vlc.table, 9, 3);
  81. if (blk[0] < 0)
  82. return AVERROR_INVALIDDATA;
  83. blk[0] -= 63;
  84. if (!has_ac)
  85. return 0;
  86. while (idx < 64 && !last) {
  87. val = get_vlc2(gb, ctx->ac_vlc.table, 9, 2);
  88. if (val < 0)
  89. return AVERROR_INVALIDDATA;
  90. if (val != 0x1BFF) {
  91. last = val >> 12;
  92. skip = (val >> 4) & 0xFF;
  93. val &= 0xF;
  94. if (get_bits1(gb))
  95. val = -val;
  96. } else {
  97. last = get_bits1(gb);
  98. skip = get_bits(gb, 6);
  99. val = get_sbits(gb, 8);
  100. }
  101. if (val) {
  102. int aval = FFABS(val), sign = val < 0;
  103. val = ac_quant * (2 * aval + 1);
  104. if (!(ac_quant & 1))
  105. val--;
  106. if (sign)
  107. val = -val;
  108. }
  109. idx += skip;
  110. if (idx >= 64)
  111. return AVERROR_INVALIDDATA;
  112. blk[ff_zigzag_direct[idx++]] = val;
  113. }
  114. return (idx <= 64 && last) ? 0 : -1;
  115. }
  116. #define DCT_TEMPLATE(blk, step, bias, shift, dshift, OP) \
  117. const int t0 = OP(2841 * blk[1 * step] + 565 * blk[7 * step]); \
  118. const int t1 = OP( 565 * blk[1 * step] - 2841 * blk[7 * step]); \
  119. const int t2 = OP(1609 * blk[5 * step] + 2408 * blk[3 * step]); \
  120. const int t3 = OP(2408 * blk[5 * step] - 1609 * blk[3 * step]); \
  121. const int t4 = OP(1108 * blk[2 * step] - 2676 * blk[6 * step]); \
  122. const int t5 = OP(2676 * blk[2 * step] + 1108 * blk[6 * step]); \
  123. const int t6 = ((blk[0 * step] + blk[4 * step]) * (1 << dshift)) + bias; \
  124. const int t7 = ((blk[0 * step] - blk[4 * step]) * (1 << dshift)) + bias; \
  125. const int t8 = t0 + t2; \
  126. const int t9 = t0 - t2; \
  127. const int tA = (int)(181U * (t9 + (t1 - t3)) + 0x80) >> 8; \
  128. const int tB = (int)(181U * (t9 - (t1 - t3)) + 0x80) >> 8; \
  129. const int tC = t1 + t3; \
  130. \
  131. blk[0 * step] = (t6 + t5 + t8) >> shift; \
  132. blk[1 * step] = (t7 + t4 + tA) >> shift; \
  133. blk[2 * step] = (t7 - t4 + tB) >> shift; \
  134. blk[3 * step] = (t6 - t5 + tC) >> shift; \
  135. blk[4 * step] = (t6 - t5 - tC) >> shift; \
  136. blk[5 * step] = (t7 - t4 - tB) >> shift; \
  137. blk[6 * step] = (t7 + t4 - tA) >> shift; \
  138. blk[7 * step] = (t6 + t5 - t8) >> shift; \
  139. #define ROP(x) x
  140. #define COP(x) (((x) + 4) >> 3)
  141. static void clv_dct(int16_t *block)
  142. {
  143. int i;
  144. int16_t *ptr;
  145. ptr = block;
  146. for (i = 0; i < 8; i++) {
  147. DCT_TEMPLATE(ptr, 1, 0x80, 8, 11, ROP);
  148. ptr += 8;
  149. }
  150. ptr = block;
  151. for (i = 0; i < 8; i++) {
  152. DCT_TEMPLATE(ptr, 8, 0x2000, 14, 8, COP);
  153. ptr++;
  154. }
  155. }
  156. static int decode_mb(CLVContext *c, int x, int y)
  157. {
  158. int i, has_ac[6], off;
  159. for (i = 0; i < 6; i++)
  160. has_ac[i] = get_bits1(&c->gb);
  161. off = x * 16 + y * 16 * c->pic->linesize[0];
  162. for (i = 0; i < 4; i++) {
  163. if (decode_block(c, c->block, has_ac[i], c->ac_quant) < 0)
  164. return AVERROR_INVALIDDATA;
  165. if (!x && !(i & 1)) {
  166. c->block[0] += c->top_dc[0];
  167. c->top_dc[0] = c->block[0];
  168. } else {
  169. c->block[0] += c->left_dc[(i & 2) >> 1];
  170. }
  171. c->left_dc[(i & 2) >> 1] = c->block[0];
  172. c->block[0] *= c->luma_dc_quant;
  173. clv_dct(c->block);
  174. if (i == 2)
  175. off += c->pic->linesize[0] * 8;
  176. c->idsp.put_pixels_clamped(c->block,
  177. c->pic->data[0] + off + (i & 1) * 8,
  178. c->pic->linesize[0]);
  179. }
  180. off = x * 8 + y * 8 * c->pic->linesize[1];
  181. for (i = 1; i < 3; i++) {
  182. if (decode_block(c, c->block, has_ac[i + 3], c->ac_quant) < 0)
  183. return AVERROR_INVALIDDATA;
  184. if (!x) {
  185. c->block[0] += c->top_dc[i];
  186. c->top_dc[i] = c->block[0];
  187. } else {
  188. c->block[0] += c->left_dc[i + 1];
  189. }
  190. c->left_dc[i + 1] = c->block[0];
  191. c->block[0] *= c->chroma_dc_quant;
  192. clv_dct(c->block);
  193. c->idsp.put_pixels_clamped(c->block, c->pic->data[i] + off,
  194. c->pic->linesize[i]);
  195. }
  196. return 0;
  197. }
  198. static int copy_block(AVCodecContext *avctx, AVFrame *dst, AVFrame *src,
  199. int plane, int x, int y, int dx, int dy, int size)
  200. {
  201. int shift = plane > 0;
  202. int sx = x + dx;
  203. int sy = y + dy;
  204. int sstride, dstride, soff, doff;
  205. uint8_t *sbuf, *dbuf;
  206. int i;
  207. if (x < 0 || sx < 0 || y < 0 || sy < 0 ||
  208. x + size > avctx->coded_width >> shift ||
  209. y + size > avctx->coded_height >> shift ||
  210. sx + size > avctx->coded_width >> shift ||
  211. sy + size > avctx->coded_height >> shift)
  212. return AVERROR_INVALIDDATA;
  213. sstride = src->linesize[plane];
  214. dstride = dst->linesize[plane];
  215. soff = sx + sy * sstride;
  216. sbuf = src->data[plane];
  217. doff = x + y * dstride;
  218. dbuf = dst->data[plane];
  219. for (i = 0; i < size; i++) {
  220. uint8_t *dptr = &dbuf[doff];
  221. uint8_t *sptr = &sbuf[soff];
  222. memcpy(dptr, sptr, size);
  223. doff += dstride;
  224. soff += sstride;
  225. }
  226. return 0;
  227. }
  228. static int copyadd_block(AVCodecContext *avctx, AVFrame *dst, AVFrame *src,
  229. int plane, int x, int y, int dx, int dy, int size, int bias)
  230. {
  231. int shift = plane > 0;
  232. int sx = x + dx;
  233. int sy = y + dy;
  234. int sstride = src->linesize[plane];
  235. int dstride = dst->linesize[plane];
  236. int soff = sx + sy * sstride;
  237. uint8_t *sbuf = src->data[plane];
  238. int doff = x + y * dstride;
  239. uint8_t *dbuf = dst->data[plane];
  240. int i, j;
  241. if (x < 0 || sx < 0 || y < 0 || sy < 0 ||
  242. x + size > avctx->coded_width >> shift ||
  243. y + size > avctx->coded_height >> shift ||
  244. sx + size > avctx->coded_width >> shift ||
  245. sy + size > avctx->coded_height >> shift)
  246. return AVERROR_INVALIDDATA;
  247. for (j = 0; j < size; j++) {
  248. uint8_t *dptr = &dbuf[doff];
  249. uint8_t *sptr = &sbuf[soff];
  250. for (i = 0; i < size; i++) {
  251. int val = sptr[i] + bias;
  252. dptr[i] = av_clip_uint8(val);
  253. }
  254. doff += dstride;
  255. soff += sstride;
  256. }
  257. return 0;
  258. }
  259. static MV mvi_predict(MVInfo *mvi, int mb_x, int mb_y, MV diff)
  260. {
  261. MV res, pred_mv;
  262. int left_mv, right_mv, top_mv, bot_mv;
  263. if (mvi->top) {
  264. if (mb_x > 0) {
  265. pred_mv = mvi->mv[mvi->mb_stride + mb_x - 1];
  266. } else {
  267. pred_mv = zero_mv;
  268. }
  269. } else if ((mb_x == 0) || (mb_x == mvi->mb_w - 1)) {
  270. pred_mv = mvi->mv[mb_x];
  271. } else {
  272. MV A = mvi->mv[mvi->mb_stride + mb_x - 1];
  273. MV B = mvi->mv[ mb_x ];
  274. MV C = mvi->mv[ mb_x + 1];
  275. pred_mv.x = mid_pred(A.x, B.x, C.x);
  276. pred_mv.y = mid_pred(A.y, B.y, C.y);
  277. }
  278. res = pred_mv;
  279. left_mv = -((mb_x * mvi->mb_size));
  280. right_mv = ((mvi->mb_w - mb_x - 1) * mvi->mb_size);
  281. if (res.x < left_mv) {
  282. res.x = left_mv;
  283. }
  284. if (res.x > right_mv) {
  285. res.x = right_mv;
  286. }
  287. top_mv = -((mb_y * mvi->mb_size));
  288. bot_mv = ((mvi->mb_h - mb_y - 1) * mvi->mb_size);
  289. if (res.y < top_mv) {
  290. res.y = top_mv;
  291. }
  292. if (res.y > bot_mv) {
  293. res.y = bot_mv;
  294. }
  295. mvi->mv[mvi->mb_stride + mb_x].x = res.x + diff.x;
  296. mvi->mv[mvi->mb_stride + mb_x].y = res.y + diff.y;
  297. return res;
  298. }
  299. static void mvi_reset(MVInfo *mvi, int mb_w, int mb_h, int mb_size)
  300. {
  301. mvi->top = 1;
  302. mvi->mb_w = mb_w;
  303. mvi->mb_h = mb_h;
  304. mvi->mb_size = mb_size;
  305. mvi->mb_stride = mb_w;
  306. memset(mvi->mv, 0, sizeof(MV) * mvi->mb_stride * 2);
  307. }
  308. static void mvi_update_row(MVInfo *mvi)
  309. {
  310. int i;
  311. mvi->top = 0;
  312. for (i = 0 ; i < mvi->mb_stride; i++) {
  313. mvi->mv[i] = mvi->mv[mvi->mb_stride + i];
  314. }
  315. }
  316. static TileInfo* decode_tile_info(GetBitContext *gb, LevelCodes *lc, int level)
  317. {
  318. TileInfo *ti;
  319. int i, flags = 0;
  320. int16_t bias = 0;
  321. MV mv = { 0 };
  322. if (lc[level].flags_cb.table) {
  323. flags = get_vlc2(gb, lc[level].flags_cb.table, lc[level].flags_cb.bits, 2);
  324. }
  325. if (lc[level].mv_cb.table) {
  326. uint16_t mv_code = get_vlc2(gb, lc[level].mv_cb.table, lc[level].mv_cb.bits, 3);
  327. if (mv_code != lc[level].mv_esc) {
  328. mv.x = (int8_t)(mv_code & 0xff);
  329. mv.y = (int8_t)(mv_code >> 8);
  330. } else {
  331. mv.x = get_sbits(gb, 8);
  332. mv.y = get_sbits(gb, 8);
  333. }
  334. }
  335. if (lc[level].bias_cb.table) {
  336. uint16_t bias_val = get_vlc2(gb, lc[level].bias_cb.table, lc[level].bias_cb.bits, 2);
  337. if (bias_val != lc[level].bias_esc) {
  338. bias = (int16_t)(bias_val);
  339. } else {
  340. bias = get_sbits(gb, 16);
  341. }
  342. }
  343. ti = av_calloc(1, sizeof(*ti));
  344. if (!ti)
  345. return NULL;
  346. ti->flags = flags;
  347. ti->mv = mv;
  348. ti->bias = bias;
  349. if (ti->flags) {
  350. for (i = 0; i < 4; i++) {
  351. if (ti->flags & (1 << i)) {
  352. TileInfo *subti = decode_tile_info(gb, lc, level + 1);
  353. ti->child[i] = subti;
  354. }
  355. }
  356. }
  357. return ti;
  358. }
  359. static int tile_do_block(AVCodecContext *avctx, AVFrame *dst, AVFrame *src,
  360. int plane, int x, int y, int dx, int dy, int size, int bias)
  361. {
  362. int ret;
  363. if (!bias) {
  364. ret = copy_block(avctx, dst, src, plane, x, y, dx, dy, size);
  365. } else {
  366. ret = copyadd_block(avctx, dst, src, plane, x, y, dx, dy, size, bias);
  367. }
  368. return ret;
  369. }
  370. static int restore_tree(AVCodecContext *avctx, AVFrame *dst, AVFrame *src,
  371. int plane, int x, int y, int size,
  372. TileInfo *tile, MV root_mv)
  373. {
  374. int ret;
  375. MV mv;
  376. mv.x = root_mv.x + tile->mv.x;
  377. mv.y = root_mv.y + tile->mv.y;
  378. if (!tile->flags) {
  379. ret = tile_do_block(avctx, dst, src, plane, x, y, mv.x, mv.y, size, tile->bias);
  380. } else {
  381. int i, hsize = size >> 1;
  382. for (i = 0; i < 4; i++) {
  383. int xoff = (i & 2) == 0 ? 0 : hsize;
  384. int yoff = (i & 1) == 0 ? 0 : hsize;
  385. if (tile->child[i]) {
  386. ret = restore_tree(avctx, dst, src, plane, x + xoff, y + yoff, hsize, tile->child[i], root_mv);
  387. av_freep(&tile->child[i]);
  388. } else {
  389. ret = tile_do_block(avctx, dst, src, plane, x + xoff, y + yoff, mv.x, mv.y, hsize, tile->bias);
  390. }
  391. }
  392. }
  393. return ret;
  394. }
  395. static void extend_edges(AVFrame *buf, int tile_size)
  396. {
  397. int comp, i, j;
  398. for (comp = 0; comp < 3; comp++) {
  399. int shift = comp > 0;
  400. int w = buf->width >> shift;
  401. int h = buf->height >> shift;
  402. int size = comp == 0 ? tile_size : tile_size >> 1;
  403. int stride = buf->linesize[comp];
  404. uint8_t *framebuf = buf->data[comp];
  405. int right = size - (w & (size - 1));
  406. int bottom = size - (h & (size - 1));
  407. if ((right == size) && (bottom == size)) {
  408. return;
  409. }
  410. if (right != size) {
  411. int off = w;
  412. for (j = 0; j < h; j++) {
  413. for (i = 0; i < right; i++) {
  414. framebuf[off + i] = 0x80;
  415. }
  416. off += stride;
  417. }
  418. }
  419. if (bottom != size) {
  420. int off = h * stride;
  421. for (j = 0; j < bottom; j++) {
  422. for (i = 0; i < stride; i++) {
  423. framebuf[off + i] = 0x80;
  424. }
  425. off += stride;
  426. }
  427. }
  428. }
  429. }
  430. static int clv_decode_frame(AVCodecContext *avctx, void *data,
  431. int *got_frame, AVPacket *avpkt)
  432. {
  433. const uint8_t *buf = avpkt->data;
  434. int buf_size = avpkt->size;
  435. CLVContext *c = avctx->priv_data;
  436. GetByteContext gb;
  437. uint32_t frame_type;
  438. int i, j, ret;
  439. int mb_ret = 0;
  440. bytestream2_init(&gb, buf, buf_size);
  441. if (avctx->codec_tag == MKTAG('C', 'L', 'V', '1')) {
  442. int skip = bytestream2_get_byte(&gb);
  443. bytestream2_skip(&gb, (skip + 1) * 8);
  444. }
  445. frame_type = bytestream2_get_byte(&gb);
  446. if ((frame_type & 0x7f) == 0x30) {
  447. *got_frame = 0;
  448. return buf_size;
  449. } else if (frame_type & 0x2) {
  450. if (buf_size < c->mb_width * c->mb_height) {
  451. av_log(avctx, AV_LOG_ERROR, "Packet too small\n");
  452. return AVERROR_INVALIDDATA;
  453. }
  454. if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
  455. return ret;
  456. c->pic->key_frame = 1;
  457. c->pic->pict_type = AV_PICTURE_TYPE_I;
  458. bytestream2_get_be32(&gb); // frame size;
  459. c->ac_quant = bytestream2_get_byte(&gb);
  460. c->luma_dc_quant = 32;
  461. c->chroma_dc_quant = 32;
  462. if ((ret = init_get_bits8(&c->gb, buf + bytestream2_tell(&gb),
  463. buf_size - bytestream2_tell(&gb))) < 0)
  464. return ret;
  465. for (i = 0; i < 3; i++)
  466. c->top_dc[i] = 32;
  467. for (i = 0; i < 4; i++)
  468. c->left_dc[i] = 32;
  469. for (j = 0; j < c->mb_height; j++) {
  470. for (i = 0; i < c->mb_width; i++) {
  471. ret = decode_mb(c, i, j);
  472. if (ret < 0)
  473. mb_ret = ret;
  474. }
  475. }
  476. extend_edges(c->pic, c->tile_size);
  477. } else {
  478. int plane;
  479. if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
  480. return ret;
  481. ret = av_frame_copy(c->pic, c->prev);
  482. if (ret < 0)
  483. return ret;
  484. if ((ret = init_get_bits8(&c->gb, buf + bytestream2_tell(&gb),
  485. buf_size - bytestream2_tell(&gb))) < 0)
  486. return ret;
  487. mvi_reset(&c->mvi, c->pmb_width, c->pmb_height, 1 << c->tile_shift);
  488. for (j = 0; j < c->pmb_height; j++) {
  489. for (i = 0; i < c->pmb_width; i++) {
  490. if (get_bits1(&c->gb)) {
  491. MV mv = mvi_predict(&c->mvi, i, j, zero_mv);
  492. for (plane = 0; plane < 3; plane++) {
  493. int16_t x = plane == 0 ? i << c->tile_shift : i << (c->tile_shift - 1);
  494. int16_t y = plane == 0 ? j << c->tile_shift : j << (c->tile_shift - 1);
  495. int16_t size = plane == 0 ? 1 << c->tile_shift : 1 << (c->tile_shift - 1);
  496. int16_t mx = plane == 0 ? mv.x : mv.x / 2;
  497. int16_t my = plane == 0 ? mv.y : mv.y / 2;
  498. ret = copy_block(avctx, c->pic, c->prev, plane, x, y, mx, my, size);
  499. if (ret < 0)
  500. mb_ret = ret;
  501. }
  502. } else {
  503. int x = i << c->tile_shift;
  504. int y = j << c->tile_shift;
  505. int size = 1 << c->tile_shift;
  506. TileInfo *tile;
  507. MV mv, cmv;
  508. tile = decode_tile_info(&c->gb, c->ylev, 0);
  509. if (!tile)
  510. return AVERROR(ENOMEM);
  511. mv = mvi_predict(&c->mvi, i, j, tile->mv);
  512. ret = restore_tree(avctx, c->pic, c->prev, 0, x, y, size, tile, mv);
  513. if (ret < 0)
  514. mb_ret = ret;
  515. x = i << (c->tile_shift - 1);
  516. y = j << (c->tile_shift - 1);
  517. size = 1 << (c->tile_shift - 1);
  518. cmv.x = mv.x + tile->mv.x;
  519. cmv.y = mv.y + tile->mv.y;
  520. cmv.x /= 2;
  521. cmv.y /= 2;
  522. av_freep(&tile);
  523. tile = decode_tile_info(&c->gb, c->ulev, 0);
  524. if (!tile)
  525. return AVERROR(ENOMEM);
  526. ret = restore_tree(avctx, c->pic, c->prev, 1, x, y, size, tile, cmv);
  527. if (ret < 0)
  528. mb_ret = ret;
  529. av_freep(&tile);
  530. tile = decode_tile_info(&c->gb, c->vlev, 0);
  531. if (!tile)
  532. return AVERROR(ENOMEM);
  533. ret = restore_tree(avctx, c->pic, c->prev, 2, x, y, size, tile, cmv);
  534. if (ret < 0)
  535. mb_ret = ret;
  536. av_freep(&tile);
  537. }
  538. }
  539. mvi_update_row(&c->mvi);
  540. }
  541. extend_edges(c->pic, c->tile_size);
  542. c->pic->key_frame = 0;
  543. c->pic->pict_type = AV_PICTURE_TYPE_P;
  544. }
  545. if ((ret = av_frame_ref(data, c->pic)) < 0)
  546. return ret;
  547. FFSWAP(AVFrame *, c->pic, c->prev);
  548. *got_frame = 1;
  549. if (get_bits_left(&c->gb) < 0)
  550. av_log(c->avctx, AV_LOG_WARNING, "overread %d\n", -get_bits_left(&c->gb));
  551. return mb_ret < 0 ? mb_ret : buf_size;
  552. }
  553. static av_cold int clv_decode_init(AVCodecContext *avctx)
  554. {
  555. CLVContext *const c = avctx->priv_data;
  556. int ret, w, h;
  557. if (avctx->extradata_size == 110) {
  558. c->tile_size = AV_RL32(&avctx->extradata[94]);
  559. } else if (avctx->extradata_size == 150) {
  560. c->tile_size = AV_RB32(&avctx->extradata[134]);
  561. } else if (!avctx->extradata_size) {
  562. c->tile_size = 16;
  563. } else {
  564. av_log(avctx, AV_LOG_ERROR, "Unsupported extradata size: %d\n", avctx->extradata_size);
  565. return AVERROR_INVALIDDATA;
  566. }
  567. c->tile_shift = av_log2(c->tile_size);
  568. if (1 << c->tile_shift != c->tile_size) {
  569. av_log(avctx, AV_LOG_ERROR, "Tile size: %d, is not power of 2.\n", c->tile_size);
  570. return AVERROR_INVALIDDATA;
  571. }
  572. avctx->pix_fmt = AV_PIX_FMT_YUV420P;
  573. w = avctx->width;
  574. h = avctx->height;
  575. ret = ff_set_dimensions(avctx, FFALIGN(w, 1 << c->tile_shift), FFALIGN(h, 1 << c->tile_shift));
  576. if (ret < 0)
  577. return ret;
  578. avctx->width = w;
  579. avctx->height = h;
  580. c->avctx = avctx;
  581. c->mb_width = FFALIGN(avctx->width, 16) >> 4;
  582. c->mb_height = FFALIGN(avctx->height, 16) >> 4;
  583. c->pmb_width = (w + c->tile_size - 1) >> c->tile_shift;
  584. c->pmb_height = (h + c->tile_size - 1) >> c->tile_shift;
  585. c->pic = av_frame_alloc();
  586. c->prev = av_frame_alloc();
  587. c->mvi.mv = av_calloc(c->pmb_width * 2, sizeof(*c->mvi.mv));
  588. if (!c->pic || !c->prev || !c->mvi.mv)
  589. return AVERROR(ENOMEM);
  590. ff_idctdsp_init(&c->idsp, avctx);
  591. ret = init_vlc(&c->dc_vlc, 9, NUM_DC_CODES,
  592. clv_dc_bits, 1, 1,
  593. clv_dc_codes, 1, 1, 0);
  594. if (ret) {
  595. av_log(avctx, AV_LOG_ERROR, "Error initialising DC VLC\n");
  596. return ret;
  597. }
  598. ret = ff_init_vlc_sparse(&c->ac_vlc, 9, NUM_AC_CODES,
  599. clv_ac_bits, 1, 1,
  600. clv_ac_codes, 1, 1,
  601. clv_ac_syms, 2, 2, 0);
  602. if (ret) {
  603. av_log(avctx, AV_LOG_ERROR, "Error initialising AC VLC\n");
  604. return ret;
  605. }
  606. ret = init_vlc(&c->ylev[0].flags_cb, 9, FF_ARRAY_ELEMS(clv_flagsy_0_bits),
  607. clv_flagsy_0_bits, 1, 1,
  608. clv_flagsy_0_codes, 2, 2, 0);
  609. if (ret)
  610. return ret;
  611. ret = init_vlc(&c->ylev[1].flags_cb, 9, FF_ARRAY_ELEMS(clv_flagsy_1_bits),
  612. clv_flagsy_1_bits, 1, 1,
  613. clv_flagsy_1_codes, 2, 2, 0);
  614. if (ret)
  615. return ret;
  616. ret = init_vlc(&c->ylev[2].flags_cb, 9, FF_ARRAY_ELEMS(clv_flagsy_2_bits),
  617. clv_flagsy_2_bits, 1, 1,
  618. clv_flagsy_2_codes, 2, 2, 0);
  619. if (ret)
  620. return ret;
  621. ret = init_vlc(&c->ulev[0].flags_cb, 9, FF_ARRAY_ELEMS(clv_flagsu_0_bits),
  622. clv_flagsu_0_bits, 1, 1,
  623. clv_flagsu_0_codes, 2, 2, 0);
  624. if (ret)
  625. return ret;
  626. ret = init_vlc(&c->ulev[1].flags_cb, 9, FF_ARRAY_ELEMS(clv_flagsu_1_bits),
  627. clv_flagsu_1_bits, 1, 1,
  628. clv_flagsu_1_codes, 2, 2, 0);
  629. if (ret)
  630. return ret;
  631. ret = init_vlc(&c->vlev[0].flags_cb, 9, FF_ARRAY_ELEMS(clv_flagsv_0_bits),
  632. clv_flagsv_0_bits, 1, 1,
  633. clv_flagsv_0_codes, 2, 2, 0);
  634. if (ret)
  635. return ret;
  636. ret = init_vlc(&c->vlev[1].flags_cb, 9, FF_ARRAY_ELEMS(clv_flagsv_1_bits),
  637. clv_flagsv_1_bits, 1, 1,
  638. clv_flagsv_1_codes, 2, 2, 0);
  639. if (ret)
  640. return ret;
  641. ret = ff_init_vlc_sparse(&c->ylev[0].mv_cb, 9, FF_ARRAY_ELEMS(clv_mvy_0_bits),
  642. clv_mvy_0_bits, 1, 1,
  643. clv_mvy_0_codes, 2, 2,
  644. clv_mvy_0_syms, 2, 2, 0);
  645. if (ret)
  646. return ret;
  647. ret = ff_init_vlc_sparse(&c->ylev[1].mv_cb, 9, FF_ARRAY_ELEMS(clv_mvy_1_bits),
  648. clv_mvy_1_bits, 1, 1,
  649. clv_mvy_1_codes, 2, 2,
  650. clv_mvy_1_syms, 2, 2, 0);
  651. if (ret)
  652. return ret;
  653. ret = ff_init_vlc_sparse(&c->ylev[2].mv_cb, 9, FF_ARRAY_ELEMS(clv_mvy_2_bits),
  654. clv_mvy_2_bits, 1, 1,
  655. clv_mvy_2_codes, 2, 2,
  656. clv_mvy_2_syms, 2, 2, 0);
  657. if (ret)
  658. return ret;
  659. ret = ff_init_vlc_sparse(&c->ylev[3].mv_cb, 9, FF_ARRAY_ELEMS(clv_mvy_3_bits),
  660. clv_mvy_3_bits, 1, 1,
  661. clv_mvy_3_codes, 2, 2,
  662. clv_mvy_3_syms, 2, 2, 0);
  663. if (ret)
  664. return ret;
  665. ret = ff_init_vlc_sparse(&c->ulev[1].mv_cb, 9, FF_ARRAY_ELEMS(clv_mvu_1_bits),
  666. clv_mvu_1_bits, 1, 1,
  667. clv_mvu_1_codes, 2, 2,
  668. clv_mvu_1_syms, 2, 2, 0);
  669. if (ret)
  670. return ret;
  671. ret = ff_init_vlc_sparse(&c->ulev[2].mv_cb, 9, FF_ARRAY_ELEMS(clv_mvu_2_bits),
  672. clv_mvu_2_bits, 1, 1,
  673. clv_mvu_2_codes, 2, 2,
  674. clv_mvu_2_syms, 2, 2, 0);
  675. if (ret)
  676. return ret;
  677. ret = ff_init_vlc_sparse(&c->vlev[1].mv_cb, 9, FF_ARRAY_ELEMS(clv_mvv_1_bits),
  678. clv_mvv_1_bits, 1, 1,
  679. clv_mvv_1_codes, 2, 2,
  680. clv_mvv_1_syms, 2, 2, 0);
  681. if (ret)
  682. return ret;
  683. ret = ff_init_vlc_sparse(&c->vlev[2].mv_cb, 9, FF_ARRAY_ELEMS(clv_mvv_2_bits),
  684. clv_mvv_2_bits, 1, 1,
  685. clv_mvv_2_codes, 2, 2,
  686. clv_mvv_2_syms, 2, 2, 0);
  687. if (ret)
  688. return ret;
  689. ret = ff_init_vlc_sparse(&c->ylev[1].bias_cb, 9, FF_ARRAY_ELEMS(clv_biasy_1_bits),
  690. clv_biasy_1_bits, 1, 1,
  691. clv_biasy_1_codes, 2, 2,
  692. clv_biasy_1_syms, 2, 2, 0);
  693. if (ret)
  694. return ret;
  695. ret = ff_init_vlc_sparse(&c->ylev[2].bias_cb, 9, FF_ARRAY_ELEMS(clv_biasy_2_bits),
  696. clv_biasy_2_bits, 1, 1,
  697. clv_biasy_2_codes, 2, 2,
  698. clv_biasy_2_syms, 2, 2, 0);
  699. if (ret)
  700. return ret;
  701. ret = ff_init_vlc_sparse(&c->ylev[3].bias_cb, 9, FF_ARRAY_ELEMS(clv_biasy_3_bits),
  702. clv_biasy_3_bits, 1, 1,
  703. clv_biasy_3_codes, 2, 2,
  704. clv_biasy_3_syms, 2, 2, 0);
  705. if (ret)
  706. return ret;
  707. ret = ff_init_vlc_sparse(&c->ulev[1].bias_cb, 9, FF_ARRAY_ELEMS(clv_biasu_1_bits),
  708. clv_biasu_1_bits, 1, 1,
  709. clv_biasu_1_codes, 2, 2,
  710. clv_biasu_1_syms, 2, 2, 0);
  711. if (ret)
  712. return ret;
  713. ret = ff_init_vlc_sparse(&c->ulev[2].bias_cb, 9, FF_ARRAY_ELEMS(clv_biasu_2_bits),
  714. clv_biasu_2_bits, 1, 1,
  715. clv_biasu_2_codes, 2, 2,
  716. clv_biasu_2_syms, 2, 2, 0);
  717. if (ret)
  718. return ret;
  719. ret = ff_init_vlc_sparse(&c->vlev[1].bias_cb, 9, FF_ARRAY_ELEMS(clv_biasv_1_bits),
  720. clv_biasv_1_bits, 1, 1,
  721. clv_biasv_1_codes, 2, 2,
  722. clv_biasv_1_syms, 2, 2, 0);
  723. if (ret)
  724. return ret;
  725. ret = ff_init_vlc_sparse(&c->vlev[2].bias_cb, 9, FF_ARRAY_ELEMS(clv_biasv_2_bits),
  726. clv_biasv_2_bits, 1, 1,
  727. clv_biasv_2_codes, 2, 2,
  728. clv_biasv_2_syms, 2, 2, 0);
  729. if (ret)
  730. return ret;
  731. c->ylev[0].mv_esc = 0x0909;
  732. c->ylev[1].mv_esc = 0x0A0A;
  733. c->ylev[2].mv_esc = 0x1010;
  734. c->ylev[3].mv_esc = 0x1313;
  735. c->ulev[1].mv_esc = 0x0808;
  736. c->ulev[2].mv_esc = 0x0B0B;
  737. c->vlev[1].mv_esc = 0x0808;
  738. c->vlev[2].mv_esc = 0x0B0B;
  739. c->ylev[1].bias_esc = 0x100;
  740. c->ylev[2].bias_esc = 0x100;
  741. c->ylev[3].bias_esc = 0x100;
  742. c->ulev[1].bias_esc = 0x100;
  743. c->ulev[2].bias_esc = 0x100;
  744. c->vlev[1].bias_esc = 0x100;
  745. c->vlev[2].bias_esc = 0x100;
  746. return 0;
  747. }
  748. static av_cold int clv_decode_end(AVCodecContext *avctx)
  749. {
  750. CLVContext *const c = avctx->priv_data;
  751. int i;
  752. av_frame_free(&c->prev);
  753. av_frame_free(&c->pic);
  754. av_freep(&c->mvi.mv);
  755. ff_free_vlc(&c->dc_vlc);
  756. ff_free_vlc(&c->ac_vlc);
  757. for (i = 0; i < 4; i++) {
  758. ff_free_vlc(&c->ylev[i].mv_cb);
  759. ff_free_vlc(&c->ylev[i].flags_cb);
  760. ff_free_vlc(&c->ylev[i].bias_cb);
  761. }
  762. for (i = 0; i < 3; i++) {
  763. ff_free_vlc(&c->ulev[i].mv_cb);
  764. ff_free_vlc(&c->ulev[i].flags_cb);
  765. ff_free_vlc(&c->ulev[i].bias_cb);
  766. ff_free_vlc(&c->vlev[i].mv_cb);
  767. ff_free_vlc(&c->vlev[i].flags_cb);
  768. ff_free_vlc(&c->vlev[i].bias_cb);
  769. }
  770. return 0;
  771. }
  772. AVCodec ff_clearvideo_decoder = {
  773. .name = "clearvideo",
  774. .long_name = NULL_IF_CONFIG_SMALL("Iterated Systems ClearVideo"),
  775. .type = AVMEDIA_TYPE_VIDEO,
  776. .id = AV_CODEC_ID_CLEARVIDEO,
  777. .priv_data_size = sizeof(CLVContext),
  778. .init = clv_decode_init,
  779. .close = clv_decode_end,
  780. .decode = clv_decode_frame,
  781. .capabilities = AV_CODEC_CAP_DR1,
  782. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
  783. };