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.

484 lines
14KB

  1. /*
  2. * JPEG-LS encoder
  3. * Copyright (c) 2003 Michael Niedermayer
  4. * Copyright (c) 2006 Konstantin Shishkov
  5. *
  6. * This file is part of Libav.
  7. *
  8. * Libav 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. * Libav 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 Libav; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. /**
  23. * @file
  24. * JPEG-LS encoder.
  25. */
  26. #include "avcodec.h"
  27. #include "get_bits.h"
  28. #include "golomb_legacy.h"
  29. #include "internal.h"
  30. #include "mathops.h"
  31. #include "mjpeg.h"
  32. #include "mjpegenc.h"
  33. #include "jpegls.h"
  34. typedef struct JPEGLSContext {
  35. AVClass *class;
  36. int pred;
  37. } JPEGLSContext;
  38. /**
  39. * Encode error from regular symbol
  40. */
  41. static inline void ls_encode_regular(JLSState *state, PutBitContext *pb, int Q,
  42. int err)
  43. {
  44. int k;
  45. int val;
  46. int map;
  47. for (k = 0; (state->N[Q] << k) < state->A[Q]; k++)
  48. ;
  49. map = !state->near && !k && (2 * state->B[Q] <= -state->N[Q]);
  50. if (err < 0)
  51. err += state->range;
  52. if (err >= (state->range + 1 >> 1)) {
  53. err -= state->range;
  54. val = 2 * FFABS(err) - 1 - map;
  55. } else
  56. val = 2 * err + map;
  57. set_ur_golomb_jpegls(pb, val, k, state->limit, state->qbpp);
  58. ff_jpegls_update_state_regular(state, Q, err);
  59. }
  60. /**
  61. * Encode error from run termination
  62. */
  63. static inline void ls_encode_runterm(JLSState *state, PutBitContext *pb,
  64. int RItype, int err, int limit_add)
  65. {
  66. int k;
  67. int val, map;
  68. int Q = 365 + RItype;
  69. int temp;
  70. temp = state->A[Q];
  71. if (RItype)
  72. temp += state->N[Q] >> 1;
  73. for (k = 0; (state->N[Q] << k) < temp; k++)
  74. ;
  75. map = 0;
  76. if (!k && err && (2 * state->B[Q] < state->N[Q]))
  77. map = 1;
  78. if (err < 0)
  79. val = -(2 * err) - 1 - RItype + map;
  80. else
  81. val = 2 * err - RItype - map;
  82. set_ur_golomb_jpegls(pb, val, k, state->limit - limit_add - 1, state->qbpp);
  83. if (err < 0)
  84. state->B[Q]++;
  85. state->A[Q] += (val + 1 - RItype) >> 1;
  86. ff_jpegls_downscale_state(state, Q);
  87. }
  88. /**
  89. * Encode run value as specified by JPEG-LS standard
  90. */
  91. static inline void ls_encode_run(JLSState *state, PutBitContext *pb, int run,
  92. int comp, int trail)
  93. {
  94. while (run >= (1 << ff_log2_run[state->run_index[comp]])) {
  95. put_bits(pb, 1, 1);
  96. run -= 1 << ff_log2_run[state->run_index[comp]];
  97. if (state->run_index[comp] < 31)
  98. state->run_index[comp]++;
  99. }
  100. /* if hit EOL, encode another full run, else encode aborted run */
  101. if (!trail && run) {
  102. put_bits(pb, 1, 1);
  103. } else if (trail) {
  104. put_bits(pb, 1, 0);
  105. if (ff_log2_run[state->run_index[comp]])
  106. put_bits(pb, ff_log2_run[state->run_index[comp]], run);
  107. }
  108. }
  109. /**
  110. * Encode one line of image
  111. */
  112. static inline void ls_encode_line(JLSState *state, PutBitContext *pb,
  113. void *last, void *cur, int last2, int w,
  114. int stride, int comp, int bits)
  115. {
  116. int x = 0;
  117. int Ra, Rb, Rc, Rd;
  118. int D0, D1, D2;
  119. while (x < w) {
  120. int err, pred, sign;
  121. /* compute gradients */
  122. Ra = x ? R(cur, x - stride) : R(last, x);
  123. Rb = R(last, x);
  124. Rc = x ? R(last, x - stride) : last2;
  125. Rd = (x >= w - stride) ? R(last, x) : R(last, x + stride);
  126. D0 = Rd - Rb;
  127. D1 = Rb - Rc;
  128. D2 = Rc - Ra;
  129. /* run mode */
  130. if ((FFABS(D0) <= state->near) &&
  131. (FFABS(D1) <= state->near) &&
  132. (FFABS(D2) <= state->near)) {
  133. int RUNval, RItype, run;
  134. run = 0;
  135. RUNval = Ra;
  136. while (x < w && (FFABS(R(cur, x) - RUNval) <= state->near)) {
  137. run++;
  138. W(cur, x, Ra);
  139. x += stride;
  140. }
  141. ls_encode_run(state, pb, run, comp, x < w);
  142. if (x >= w)
  143. return;
  144. Rb = R(last, x);
  145. RItype = FFABS(Ra - Rb) <= state->near;
  146. pred = RItype ? Ra : Rb;
  147. err = R(cur, x) - pred;
  148. if (!RItype && Ra > Rb)
  149. err = -err;
  150. if (state->near) {
  151. if (err > 0)
  152. err = (state->near + err) / state->twonear;
  153. else
  154. err = -(state->near - err) / state->twonear;
  155. if (RItype || (Rb >= Ra))
  156. Ra = av_clip(pred + err * state->twonear, 0, state->maxval);
  157. else
  158. Ra = av_clip(pred - err * state->twonear, 0, state->maxval);
  159. W(cur, x, Ra);
  160. }
  161. if (err < 0)
  162. err += state->range;
  163. if (err >= state->range + 1 >> 1)
  164. err -= state->range;
  165. ls_encode_runterm(state, pb, RItype, err,
  166. ff_log2_run[state->run_index[comp]]);
  167. if (state->run_index[comp] > 0)
  168. state->run_index[comp]--;
  169. } else { /* regular mode */
  170. int context;
  171. context = ff_jpegls_quantize(state, D0) * 81 +
  172. ff_jpegls_quantize(state, D1) * 9 +
  173. ff_jpegls_quantize(state, D2);
  174. pred = mid_pred(Ra, Ra + Rb - Rc, Rb);
  175. if (context < 0) {
  176. context = -context;
  177. sign = 1;
  178. pred = av_clip(pred - state->C[context], 0, state->maxval);
  179. err = pred - R(cur, x);
  180. } else {
  181. sign = 0;
  182. pred = av_clip(pred + state->C[context], 0, state->maxval);
  183. err = R(cur, x) - pred;
  184. }
  185. if (state->near) {
  186. if (err > 0)
  187. err = (state->near + err) / state->twonear;
  188. else
  189. err = -(state->near - err) / state->twonear;
  190. if (!sign)
  191. Ra = av_clip(pred + err * state->twonear, 0, state->maxval);
  192. else
  193. Ra = av_clip(pred - err * state->twonear, 0, state->maxval);
  194. W(cur, x, Ra);
  195. }
  196. ls_encode_regular(state, pb, context, err);
  197. }
  198. x += stride;
  199. }
  200. }
  201. static void ls_store_lse(JLSState *state, PutBitContext *pb)
  202. {
  203. /* Test if we have default params and don't need to store LSE */
  204. JLSState state2 = { 0 };
  205. state2.bpp = state->bpp;
  206. state2.near = state->near;
  207. ff_jpegls_reset_coding_parameters(&state2, 1);
  208. if (state->T1 == state2.T1 &&
  209. state->T2 == state2.T2 &&
  210. state->T3 == state2.T3 &&
  211. state->reset == state2.reset)
  212. return;
  213. /* store LSE type 1 */
  214. put_marker(pb, LSE);
  215. put_bits(pb, 16, 13);
  216. put_bits(pb, 8, 1);
  217. put_bits(pb, 16, state->maxval);
  218. put_bits(pb, 16, state->T1);
  219. put_bits(pb, 16, state->T2);
  220. put_bits(pb, 16, state->T3);
  221. put_bits(pb, 16, state->reset);
  222. }
  223. static int encode_picture_ls(AVCodecContext *avctx, AVPacket *pkt,
  224. const AVFrame *pict, int *got_packet)
  225. {
  226. JPEGLSContext *ctx = avctx->priv_data;
  227. const AVFrame *const p = pict;
  228. PutBitContext pb, pb2;
  229. GetBitContext gb;
  230. uint8_t *buf2 = NULL;
  231. uint8_t *zero = NULL;
  232. uint8_t *cur = NULL;
  233. uint8_t *last = NULL;
  234. JLSState *state;
  235. int i, size, ret;
  236. int comps;
  237. #if FF_API_PRIVATE_OPT
  238. FF_DISABLE_DEPRECATION_WARNINGS
  239. if (avctx->prediction_method)
  240. ctx->pred = avctx->prediction_method;
  241. FF_ENABLE_DEPRECATION_WARNINGS
  242. #endif
  243. if (avctx->pix_fmt == AV_PIX_FMT_GRAY8 ||
  244. avctx->pix_fmt == AV_PIX_FMT_GRAY16)
  245. comps = 1;
  246. else
  247. comps = 3;
  248. if ((ret = ff_alloc_packet(pkt, avctx->width * avctx->height * comps * 4 +
  249. AV_INPUT_BUFFER_MIN_SIZE)) < 0) {
  250. av_log(avctx, AV_LOG_ERROR, "Error getting output packet.\n");
  251. return ret;
  252. }
  253. buf2 = av_malloc(pkt->size);
  254. if (!buf2)
  255. goto memfail;
  256. init_put_bits(&pb, pkt->data, pkt->size);
  257. init_put_bits(&pb2, buf2, pkt->size);
  258. /* write our own JPEG header, can't use mjpeg_picture_header */
  259. put_marker(&pb, SOI);
  260. put_marker(&pb, SOF48);
  261. put_bits(&pb, 16, 8 + comps * 3); // header size depends on components
  262. put_bits(&pb, 8, (avctx->pix_fmt == AV_PIX_FMT_GRAY16) ? 16 : 8); // bpp
  263. put_bits(&pb, 16, avctx->height);
  264. put_bits(&pb, 16, avctx->width);
  265. put_bits(&pb, 8, comps); // components
  266. for (i = 1; i <= comps; i++) {
  267. put_bits(&pb, 8, i); // component ID
  268. put_bits(&pb, 8, 0x11); // subsampling: none
  269. put_bits(&pb, 8, 0); // Tiq, used by JPEG-LS ext
  270. }
  271. put_marker(&pb, SOS);
  272. put_bits(&pb, 16, 6 + comps * 2);
  273. put_bits(&pb, 8, comps);
  274. for (i = 1; i <= comps; i++) {
  275. put_bits(&pb, 8, i); // component ID
  276. put_bits(&pb, 8, 0); // mapping index: none
  277. }
  278. put_bits(&pb, 8, ctx->pred);
  279. put_bits(&pb, 8, (comps > 1) ? 1 : 0); // interleaving: 0 - plane, 1 - line
  280. put_bits(&pb, 8, 0); // point transform: none
  281. state = av_mallocz(sizeof(JLSState));
  282. if (!state)
  283. goto memfail;
  284. /* initialize JPEG-LS state from JPEG parameters */
  285. state->near = ctx->pred;
  286. state->bpp = (avctx->pix_fmt == AV_PIX_FMT_GRAY16) ? 16 : 8;
  287. ff_jpegls_reset_coding_parameters(state, 0);
  288. ff_jpegls_init_state(state);
  289. ls_store_lse(state, &pb);
  290. zero = last = av_mallocz(p->linesize[0]);
  291. if (!zero)
  292. goto memfail;
  293. cur = p->data[0];
  294. if (avctx->pix_fmt == AV_PIX_FMT_GRAY8) {
  295. int t = 0;
  296. for (i = 0; i < avctx->height; i++) {
  297. ls_encode_line(state, &pb2, last, cur, t, avctx->width, 1, 0, 8);
  298. t = last[0];
  299. last = cur;
  300. cur += p->linesize[0];
  301. }
  302. } else if (avctx->pix_fmt == AV_PIX_FMT_GRAY16) {
  303. int t = 0;
  304. for (i = 0; i < avctx->height; i++) {
  305. ls_encode_line(state, &pb2, last, cur, t, avctx->width, 1, 0, 16);
  306. t = *((uint16_t *)last);
  307. last = cur;
  308. cur += p->linesize[0];
  309. }
  310. } else if (avctx->pix_fmt == AV_PIX_FMT_RGB24) {
  311. int j, width;
  312. int Rc[3] = { 0, 0, 0 };
  313. width = avctx->width * 3;
  314. for (i = 0; i < avctx->height; i++) {
  315. for (j = 0; j < 3; j++) {
  316. ls_encode_line(state, &pb2, last + j, cur + j, Rc[j],
  317. width, 3, j, 8);
  318. Rc[j] = last[j];
  319. }
  320. last = cur;
  321. cur += p->linesize[0];
  322. }
  323. } else if (avctx->pix_fmt == AV_PIX_FMT_BGR24) {
  324. int j, width;
  325. int Rc[3] = { 0, 0, 0 };
  326. width = avctx->width * 3;
  327. for (i = 0; i < avctx->height; i++) {
  328. for (j = 2; j >= 0; j--) {
  329. ls_encode_line(state, &pb2, last + j, cur + j, Rc[j],
  330. width, 3, j, 8);
  331. Rc[j] = last[j];
  332. }
  333. last = cur;
  334. cur += p->linesize[0];
  335. }
  336. }
  337. av_freep(&zero);
  338. av_freep(&state);
  339. /* the specification says that after doing 0xff escaping unused bits in
  340. * the last byte must be set to 0, so just append 7 "optional" zero bits
  341. * to avoid special-casing. */
  342. put_bits(&pb2, 7, 0);
  343. size = put_bits_count(&pb2);
  344. flush_put_bits(&pb2);
  345. /* do escape coding */
  346. init_get_bits(&gb, buf2, size);
  347. size -= 7;
  348. while (get_bits_count(&gb) < size) {
  349. int v;
  350. v = get_bits(&gb, 8);
  351. put_bits(&pb, 8, v);
  352. if (v == 0xFF) {
  353. v = get_bits(&gb, 7);
  354. put_bits(&pb, 8, v);
  355. }
  356. }
  357. avpriv_align_put_bits(&pb);
  358. av_freep(&buf2);
  359. /* End of image */
  360. put_marker(&pb, EOI);
  361. flush_put_bits(&pb);
  362. emms_c();
  363. pkt->size = put_bits_count(&pb) >> 3;
  364. pkt->flags |= AV_PKT_FLAG_KEY;
  365. *got_packet = 1;
  366. return 0;
  367. memfail:
  368. av_packet_unref(pkt);
  369. av_freep(&buf2);
  370. av_freep(&state);
  371. av_freep(&zero);
  372. return AVERROR(ENOMEM);
  373. }
  374. static av_cold int encode_init_ls(AVCodecContext *ctx)
  375. {
  376. #if FF_API_CODED_FRAME
  377. FF_DISABLE_DEPRECATION_WARNINGS
  378. ctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
  379. ctx->coded_frame->key_frame = 1;
  380. FF_ENABLE_DEPRECATION_WARNINGS
  381. #endif
  382. if (ctx->pix_fmt != AV_PIX_FMT_GRAY8 &&
  383. ctx->pix_fmt != AV_PIX_FMT_GRAY16 &&
  384. ctx->pix_fmt != AV_PIX_FMT_RGB24 &&
  385. ctx->pix_fmt != AV_PIX_FMT_BGR24) {
  386. av_log(ctx, AV_LOG_ERROR,
  387. "Only grayscale and RGB24/BGR24 images are supported\n");
  388. return -1;
  389. }
  390. return 0;
  391. }
  392. #define OFFSET(x) offsetof(JPEGLSContext, x)
  393. #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
  394. static const AVOption options[] = {
  395. { "pred", "Prediction method", OFFSET(pred), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, VE, "pred" },
  396. { "left", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, "pred" },
  397. { "plane", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN, INT_MAX, VE, "pred" },
  398. { "median", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, INT_MIN, INT_MAX, VE, "pred" },
  399. { NULL},
  400. };
  401. static const AVClass jpegls_class = {
  402. .class_name = "jpegls",
  403. .item_name = av_default_item_name,
  404. .option = options,
  405. .version = LIBAVUTIL_VERSION_INT,
  406. };
  407. AVCodec ff_jpegls_encoder = {
  408. .name = "jpegls",
  409. .long_name = NULL_IF_CONFIG_SMALL("JPEG-LS"),
  410. .type = AVMEDIA_TYPE_VIDEO,
  411. .id = AV_CODEC_ID_JPEGLS,
  412. .priv_data_size = sizeof(JPEGLSContext),
  413. .priv_class = &jpegls_class,
  414. .init = encode_init_ls,
  415. .encode2 = encode_picture_ls,
  416. .pix_fmts = (const enum AVPixelFormat[]) {
  417. AV_PIX_FMT_BGR24, AV_PIX_FMT_RGB24,
  418. AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16,
  419. AV_PIX_FMT_NONE
  420. },
  421. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
  422. FF_CODEC_CAP_INIT_CLEANUP,
  423. };