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.

1120 lines
37KB

  1. /*
  2. * Copyright (c) 2002-2014 Michael Niedermayer <michaelni@gmx.at>
  3. *
  4. * see http://www.pcisys.net/~melanson/codecs/huffyuv.txt for a description of
  5. * the algorithm used
  6. *
  7. * This file is part of FFmpeg.
  8. *
  9. * FFmpeg is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation; either
  12. * version 2.1 of the License, or (at your option) any later version.
  13. *
  14. * FFmpeg is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with FFmpeg; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * yuva, gray, 4:4:4, 4:1:1, 4:1:0 and >8 bit per sample support sponsored by NOA
  24. */
  25. /**
  26. * @file
  27. * huffyuv encoder
  28. */
  29. #include "avcodec.h"
  30. #include "huffyuv.h"
  31. #include "huffman.h"
  32. #include "huffyuvencdsp.h"
  33. #include "internal.h"
  34. #include "put_bits.h"
  35. #include "libavutil/opt.h"
  36. #include "libavutil/pixdesc.h"
  37. static inline void diff_bytes(HYuvContext *s, uint8_t *dst,
  38. const uint8_t *src0, const uint8_t *src1, int w)
  39. {
  40. if (s->bps <= 8) {
  41. s->hencdsp.diff_bytes(dst, src0, src1, w);
  42. } else {
  43. s->llviddsp.diff_int16((uint16_t *)dst, (const uint16_t *)src0, (const uint16_t *)src1, s->n - 1, w);
  44. }
  45. }
  46. static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst,
  47. const uint8_t *src, int w, int left)
  48. {
  49. int i;
  50. if (s->bps <= 8) {
  51. if (w < 32) {
  52. for (i = 0; i < w; i++) {
  53. const int temp = src[i];
  54. dst[i] = temp - left;
  55. left = temp;
  56. }
  57. return left;
  58. } else {
  59. for (i = 0; i < 16; i++) {
  60. const int temp = src[i];
  61. dst[i] = temp - left;
  62. left = temp;
  63. }
  64. s->hencdsp.diff_bytes(dst + 16, src + 16, src + 15, w - 16);
  65. return src[w-1];
  66. }
  67. } else {
  68. const uint16_t *src16 = (const uint16_t *)src;
  69. uint16_t *dst16 = ( uint16_t *)dst;
  70. if (w < 32) {
  71. for (i = 0; i < w; i++) {
  72. const int temp = src16[i];
  73. dst16[i] = temp - left;
  74. left = temp;
  75. }
  76. return left;
  77. } else {
  78. for (i = 0; i < 16; i++) {
  79. const int temp = src16[i];
  80. dst16[i] = temp - left;
  81. left = temp;
  82. }
  83. s->llviddsp.diff_int16(dst16 + 16, src16 + 16, src16 + 15, s->n - 1, w - 16);
  84. return src16[w-1];
  85. }
  86. }
  87. }
  88. static inline void sub_left_prediction_bgr32(HYuvContext *s, uint8_t *dst,
  89. const uint8_t *src, int w,
  90. int *red, int *green, int *blue,
  91. int *alpha)
  92. {
  93. int i;
  94. int r, g, b, a;
  95. r = *red;
  96. g = *green;
  97. b = *blue;
  98. a = *alpha;
  99. for (i = 0; i < FFMIN(w, 4); i++) {
  100. const int rt = src[i * 4 + R];
  101. const int gt = src[i * 4 + G];
  102. const int bt = src[i * 4 + B];
  103. const int at = src[i * 4 + A];
  104. dst[i * 4 + R] = rt - r;
  105. dst[i * 4 + G] = gt - g;
  106. dst[i * 4 + B] = bt - b;
  107. dst[i * 4 + A] = at - a;
  108. r = rt;
  109. g = gt;
  110. b = bt;
  111. a = at;
  112. }
  113. s->hencdsp.diff_bytes(dst + 16, src + 16, src + 12, w * 4 - 16);
  114. *red = src[(w - 1) * 4 + R];
  115. *green = src[(w - 1) * 4 + G];
  116. *blue = src[(w - 1) * 4 + B];
  117. *alpha = src[(w - 1) * 4 + A];
  118. }
  119. static inline void sub_left_prediction_rgb24(HYuvContext *s, uint8_t *dst,
  120. uint8_t *src, int w,
  121. int *red, int *green, int *blue)
  122. {
  123. int i;
  124. int r, g, b;
  125. r = *red;
  126. g = *green;
  127. b = *blue;
  128. for (i = 0; i < FFMIN(w, 16); i++) {
  129. const int rt = src[i * 3 + 0];
  130. const int gt = src[i * 3 + 1];
  131. const int bt = src[i * 3 + 2];
  132. dst[i * 3 + 0] = rt - r;
  133. dst[i * 3 + 1] = gt - g;
  134. dst[i * 3 + 2] = bt - b;
  135. r = rt;
  136. g = gt;
  137. b = bt;
  138. }
  139. s->hencdsp.diff_bytes(dst + 48, src + 48, src + 48 - 3, w * 3 - 48);
  140. *red = src[(w - 1) * 3 + 0];
  141. *green = src[(w - 1) * 3 + 1];
  142. *blue = src[(w - 1) * 3 + 2];
  143. }
  144. static void sub_median_prediction(HYuvContext *s, uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w, int *left, int *left_top)
  145. {
  146. if (s->bps <= 8) {
  147. s->hencdsp.sub_hfyu_median_pred(dst, src1, src2, w , left, left_top);
  148. } else {
  149. s->llviddsp.sub_hfyu_median_pred_int16((uint16_t *)dst, (const uint16_t *)src1, (const uint16_t *)src2, s->n - 1, w , left, left_top);
  150. }
  151. }
  152. static int store_table(HYuvContext *s, const uint8_t *len, uint8_t *buf)
  153. {
  154. int i;
  155. int index = 0;
  156. int n = s->vlc_n;
  157. for (i = 0; i < n;) {
  158. int val = len[i];
  159. int repeat = 0;
  160. for (; i < n && len[i] == val && repeat < 255; i++)
  161. repeat++;
  162. av_assert0(val < 32 && val >0 && repeat < 256 && repeat>0);
  163. if (repeat > 7) {
  164. buf[index++] = val;
  165. buf[index++] = repeat;
  166. } else {
  167. buf[index++] = val | (repeat << 5);
  168. }
  169. }
  170. return index;
  171. }
  172. static int store_huffman_tables(HYuvContext *s, uint8_t *buf)
  173. {
  174. int i, ret;
  175. int size = 0;
  176. int count = 3;
  177. if (s->version > 2)
  178. count = 1 + s->alpha + 2*s->chroma;
  179. for (i = 0; i < count; i++) {
  180. if ((ret = ff_huff_gen_len_table(s->len[i], s->stats[i], s->vlc_n, 0)) < 0)
  181. return ret;
  182. if (ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n) < 0) {
  183. return -1;
  184. }
  185. size += store_table(s, s->len[i], buf + size);
  186. }
  187. return size;
  188. }
  189. static av_cold int encode_init(AVCodecContext *avctx)
  190. {
  191. HYuvContext *s = avctx->priv_data;
  192. int i, j;
  193. int ret;
  194. const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
  195. ff_huffyuv_common_init(avctx);
  196. ff_huffyuvencdsp_init(&s->hencdsp);
  197. avctx->extradata = av_mallocz(3*MAX_N + 4);
  198. if (s->flags&AV_CODEC_FLAG_PASS1) {
  199. #define STATS_OUT_SIZE 21*MAX_N*3 + 4
  200. avctx->stats_out = av_mallocz(STATS_OUT_SIZE); // 21*256*3(%llu ) + 3(\n) + 1(0) = 16132
  201. if (!avctx->stats_out)
  202. return AVERROR(ENOMEM);
  203. }
  204. s->version = 2;
  205. if (!avctx->extradata)
  206. return AVERROR(ENOMEM);
  207. #if FF_API_CODED_FRAME
  208. FF_DISABLE_DEPRECATION_WARNINGS
  209. avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
  210. avctx->coded_frame->key_frame = 1;
  211. FF_ENABLE_DEPRECATION_WARNINGS
  212. #endif
  213. s->bps = desc->comp[0].depth_minus1 + 1;
  214. s->yuv = !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components >= 2;
  215. s->chroma = desc->nb_components > 2;
  216. s->alpha = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
  217. av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt,
  218. &s->chroma_h_shift,
  219. &s->chroma_v_shift);
  220. switch (avctx->pix_fmt) {
  221. case AV_PIX_FMT_YUV420P:
  222. case AV_PIX_FMT_YUV422P:
  223. if (s->width & 1) {
  224. av_log(avctx, AV_LOG_ERROR, "Width must be even for this colorspace.\n");
  225. return AVERROR(EINVAL);
  226. }
  227. s->bitstream_bpp = avctx->pix_fmt == AV_PIX_FMT_YUV420P ? 12 : 16;
  228. break;
  229. case AV_PIX_FMT_YUV444P:
  230. case AV_PIX_FMT_YUV410P:
  231. case AV_PIX_FMT_YUV411P:
  232. case AV_PIX_FMT_YUV440P:
  233. case AV_PIX_FMT_GBRP:
  234. case AV_PIX_FMT_GBRP9:
  235. case AV_PIX_FMT_GBRP10:
  236. case AV_PIX_FMT_GBRP12:
  237. case AV_PIX_FMT_GBRP14:
  238. case AV_PIX_FMT_GBRP16:
  239. case AV_PIX_FMT_GRAY8:
  240. case AV_PIX_FMT_GRAY16:
  241. case AV_PIX_FMT_YUVA444P:
  242. case AV_PIX_FMT_YUVA420P:
  243. case AV_PIX_FMT_YUVA422P:
  244. case AV_PIX_FMT_GBRAP:
  245. case AV_PIX_FMT_GRAY8A:
  246. case AV_PIX_FMT_YUV420P9:
  247. case AV_PIX_FMT_YUV420P10:
  248. case AV_PIX_FMT_YUV420P12:
  249. case AV_PIX_FMT_YUV420P14:
  250. case AV_PIX_FMT_YUV420P16:
  251. case AV_PIX_FMT_YUV422P9:
  252. case AV_PIX_FMT_YUV422P10:
  253. case AV_PIX_FMT_YUV422P12:
  254. case AV_PIX_FMT_YUV422P14:
  255. case AV_PIX_FMT_YUV422P16:
  256. case AV_PIX_FMT_YUV444P9:
  257. case AV_PIX_FMT_YUV444P10:
  258. case AV_PIX_FMT_YUV444P12:
  259. case AV_PIX_FMT_YUV444P14:
  260. case AV_PIX_FMT_YUV444P16:
  261. case AV_PIX_FMT_YUVA420P9:
  262. case AV_PIX_FMT_YUVA420P10:
  263. case AV_PIX_FMT_YUVA420P16:
  264. case AV_PIX_FMT_YUVA422P9:
  265. case AV_PIX_FMT_YUVA422P10:
  266. case AV_PIX_FMT_YUVA422P16:
  267. case AV_PIX_FMT_YUVA444P9:
  268. case AV_PIX_FMT_YUVA444P10:
  269. case AV_PIX_FMT_YUVA444P16:
  270. s->version = 3;
  271. break;
  272. case AV_PIX_FMT_RGB32:
  273. s->bitstream_bpp = 32;
  274. break;
  275. case AV_PIX_FMT_RGB24:
  276. s->bitstream_bpp = 24;
  277. break;
  278. default:
  279. av_log(avctx, AV_LOG_ERROR, "format not supported\n");
  280. return AVERROR(EINVAL);
  281. }
  282. s->n = 1<<s->bps;
  283. s->vlc_n = FFMIN(s->n, MAX_VLC_N);
  284. avctx->bits_per_coded_sample = s->bitstream_bpp;
  285. s->decorrelate = s->bitstream_bpp >= 24 && !s->yuv && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR);
  286. s->predictor = avctx->prediction_method;
  287. s->interlaced = avctx->flags & AV_CODEC_FLAG_INTERLACED_ME ? 1 : 0;
  288. if (avctx->context_model == 1) {
  289. s->context = avctx->context_model;
  290. if (s->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) {
  291. av_log(avctx, AV_LOG_ERROR,
  292. "context=1 is not compatible with "
  293. "2 pass huffyuv encoding\n");
  294. return AVERROR(EINVAL);
  295. }
  296. }else s->context= 0;
  297. if (avctx->codec->id == AV_CODEC_ID_HUFFYUV) {
  298. if (avctx->pix_fmt == AV_PIX_FMT_YUV420P) {
  299. av_log(avctx, AV_LOG_ERROR,
  300. "Error: YV12 is not supported by huffyuv; use "
  301. "vcodec=ffvhuff or format=422p\n");
  302. return AVERROR(EINVAL);
  303. }
  304. if (avctx->context_model) {
  305. av_log(avctx, AV_LOG_ERROR,
  306. "Error: per-frame huffman tables are not supported "
  307. "by huffyuv; use vcodec=ffvhuff\n");
  308. return AVERROR(EINVAL);
  309. }
  310. if (s->version > 2) {
  311. av_log(avctx, AV_LOG_ERROR,
  312. "Error: ver>2 is not supported "
  313. "by huffyuv; use vcodec=ffvhuff\n");
  314. return AVERROR(EINVAL);
  315. }
  316. if (s->interlaced != ( s->height > 288 ))
  317. av_log(avctx, AV_LOG_INFO,
  318. "using huffyuv 2.2.0 or newer interlacing flag\n");
  319. }
  320. if (s->version > 3 && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
  321. av_log(avctx, AV_LOG_ERROR, "Ver > 3 is under development, files encoded with it may not be decodable with future versions!!!\n"
  322. "Use vstrict=-2 / -strict -2 to use it anyway.\n");
  323. return AVERROR(EINVAL);
  324. }
  325. if (s->bitstream_bpp >= 24 && s->predictor == MEDIAN && s->version <= 2) {
  326. av_log(avctx, AV_LOG_ERROR,
  327. "Error: RGB is incompatible with median predictor\n");
  328. return AVERROR(EINVAL);
  329. }
  330. ((uint8_t*)avctx->extradata)[0] = s->predictor | (s->decorrelate << 6);
  331. ((uint8_t*)avctx->extradata)[2] = s->interlaced ? 0x10 : 0x20;
  332. if (s->context)
  333. ((uint8_t*)avctx->extradata)[2] |= 0x40;
  334. if (s->version < 3) {
  335. ((uint8_t*)avctx->extradata)[1] = s->bitstream_bpp;
  336. ((uint8_t*)avctx->extradata)[3] = 0;
  337. } else {
  338. ((uint8_t*)avctx->extradata)[1] = ((s->bps-1)<<4) | s->chroma_h_shift | (s->chroma_v_shift<<2);
  339. if (s->chroma)
  340. ((uint8_t*)avctx->extradata)[2] |= s->yuv ? 1 : 2;
  341. if (s->alpha)
  342. ((uint8_t*)avctx->extradata)[2] |= 4;
  343. ((uint8_t*)avctx->extradata)[3] = 1;
  344. }
  345. s->avctx->extradata_size = 4;
  346. if (avctx->stats_in) {
  347. char *p = avctx->stats_in;
  348. for (i = 0; i < 4; i++)
  349. for (j = 0; j < s->vlc_n; j++)
  350. s->stats[i][j] = 1;
  351. for (;;) {
  352. for (i = 0; i < 4; i++) {
  353. char *next;
  354. for (j = 0; j < s->vlc_n; j++) {
  355. s->stats[i][j] += strtol(p, &next, 0);
  356. if (next == p) return -1;
  357. p = next;
  358. }
  359. }
  360. if (p[0] == 0 || p[1] == 0 || p[2] == 0) break;
  361. }
  362. } else {
  363. for (i = 0; i < 4; i++)
  364. for (j = 0; j < s->vlc_n; j++) {
  365. int d = FFMIN(j, s->vlc_n - j);
  366. s->stats[i][j] = 100000000 / (d*d + 1);
  367. }
  368. }
  369. ret = store_huffman_tables(s, s->avctx->extradata + s->avctx->extradata_size);
  370. if (ret < 0)
  371. return ret;
  372. s->avctx->extradata_size += ret;
  373. if (s->context) {
  374. for (i = 0; i < 4; i++) {
  375. int pels = s->width * s->height / (i ? 40 : 10);
  376. for (j = 0; j < s->vlc_n; j++) {
  377. int d = FFMIN(j, s->vlc_n - j);
  378. s->stats[i][j] = pels/(d*d + 1);
  379. }
  380. }
  381. } else {
  382. for (i = 0; i < 4; i++)
  383. for (j = 0; j < s->vlc_n; j++)
  384. s->stats[i][j]= 0;
  385. }
  386. if (ff_huffyuv_alloc_temp(s)) {
  387. ff_huffyuv_common_end(s);
  388. return AVERROR(ENOMEM);
  389. }
  390. s->picture_number=0;
  391. return 0;
  392. }
  393. static int encode_422_bitstream(HYuvContext *s, int offset, int count)
  394. {
  395. int i;
  396. const uint8_t *y = s->temp[0] + offset;
  397. const uint8_t *u = s->temp[1] + offset / 2;
  398. const uint8_t *v = s->temp[2] + offset / 2;
  399. if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < 2 * 4 * count) {
  400. av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
  401. return -1;
  402. }
  403. #define LOAD4\
  404. int y0 = y[2 * i];\
  405. int y1 = y[2 * i + 1];\
  406. int u0 = u[i];\
  407. int v0 = v[i];
  408. count /= 2;
  409. if (s->flags & AV_CODEC_FLAG_PASS1) {
  410. for(i = 0; i < count; i++) {
  411. LOAD4;
  412. s->stats[0][y0]++;
  413. s->stats[1][u0]++;
  414. s->stats[0][y1]++;
  415. s->stats[2][v0]++;
  416. }
  417. }
  418. if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
  419. return 0;
  420. if (s->context) {
  421. for (i = 0; i < count; i++) {
  422. LOAD4;
  423. s->stats[0][y0]++;
  424. put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);
  425. s->stats[1][u0]++;
  426. put_bits(&s->pb, s->len[1][u0], s->bits[1][u0]);
  427. s->stats[0][y1]++;
  428. put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
  429. s->stats[2][v0]++;
  430. put_bits(&s->pb, s->len[2][v0], s->bits[2][v0]);
  431. }
  432. } else {
  433. for(i = 0; i < count; i++) {
  434. LOAD4;
  435. put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);
  436. put_bits(&s->pb, s->len[1][u0], s->bits[1][u0]);
  437. put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
  438. put_bits(&s->pb, s->len[2][v0], s->bits[2][v0]);
  439. }
  440. }
  441. return 0;
  442. }
  443. static int encode_plane_bitstream(HYuvContext *s, int width, int plane)
  444. {
  445. int i, count = width/2;
  446. if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < count * s->bps / 2) {
  447. av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
  448. return -1;
  449. }
  450. #define LOADEND\
  451. int y0 = s->temp[0][width-1];
  452. #define LOADEND_14\
  453. int y0 = s->temp16[0][width-1] & mask;
  454. #define LOADEND_16\
  455. int y0 = s->temp16[0][width-1];
  456. #define STATEND\
  457. s->stats[plane][y0]++;
  458. #define STATEND_16\
  459. s->stats[plane][y0>>2]++;
  460. #define WRITEEND\
  461. put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);
  462. #define WRITEEND_16\
  463. put_bits(&s->pb, s->len[plane][y0>>2], s->bits[plane][y0>>2]);\
  464. put_bits(&s->pb, 2, y0&3);
  465. #define LOAD2\
  466. int y0 = s->temp[0][2 * i];\
  467. int y1 = s->temp[0][2 * i + 1];
  468. #define LOAD2_14\
  469. int y0 = s->temp16[0][2 * i] & mask;\
  470. int y1 = s->temp16[0][2 * i + 1] & mask;
  471. #define LOAD2_16\
  472. int y0 = s->temp16[0][2 * i];\
  473. int y1 = s->temp16[0][2 * i + 1];
  474. #define STAT2\
  475. s->stats[plane][y0]++;\
  476. s->stats[plane][y1]++;
  477. #define STAT2_16\
  478. s->stats[plane][y0>>2]++;\
  479. s->stats[plane][y1>>2]++;
  480. #define WRITE2\
  481. put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);\
  482. put_bits(&s->pb, s->len[plane][y1], s->bits[plane][y1]);
  483. #define WRITE2_16\
  484. put_bits(&s->pb, s->len[plane][y0>>2], s->bits[plane][y0>>2]);\
  485. put_bits(&s->pb, 2, y0&3);\
  486. put_bits(&s->pb, s->len[plane][y1>>2], s->bits[plane][y1>>2]);\
  487. put_bits(&s->pb, 2, y1&3);
  488. if (s->bps <= 8) {
  489. if (s->flags & AV_CODEC_FLAG_PASS1) {
  490. for (i = 0; i < count; i++) {
  491. LOAD2;
  492. STAT2;
  493. }
  494. if (width&1) {
  495. LOADEND;
  496. STATEND;
  497. }
  498. }
  499. if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
  500. return 0;
  501. if (s->context) {
  502. for (i = 0; i < count; i++) {
  503. LOAD2;
  504. STAT2;
  505. WRITE2;
  506. }
  507. if (width&1) {
  508. LOADEND;
  509. STATEND;
  510. WRITEEND;
  511. }
  512. } else {
  513. for (i = 0; i < count; i++) {
  514. LOAD2;
  515. WRITE2;
  516. }
  517. if (width&1) {
  518. LOADEND;
  519. WRITEEND;
  520. }
  521. }
  522. } else if (s->bps <= 14) {
  523. int mask = s->n - 1;
  524. if (s->flags & AV_CODEC_FLAG_PASS1) {
  525. for (i = 0; i < count; i++) {
  526. LOAD2_14;
  527. STAT2;
  528. }
  529. if (width&1) {
  530. LOADEND_14;
  531. STATEND;
  532. }
  533. }
  534. if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
  535. return 0;
  536. if (s->context) {
  537. for (i = 0; i < count; i++) {
  538. LOAD2_14;
  539. STAT2;
  540. WRITE2;
  541. }
  542. if (width&1) {
  543. LOADEND_14;
  544. STATEND;
  545. WRITEEND;
  546. }
  547. } else {
  548. for (i = 0; i < count; i++) {
  549. LOAD2_14;
  550. WRITE2;
  551. }
  552. if (width&1) {
  553. LOADEND_14;
  554. WRITEEND;
  555. }
  556. }
  557. } else {
  558. if (s->flags & AV_CODEC_FLAG_PASS1) {
  559. for (i = 0; i < count; i++) {
  560. LOAD2_16;
  561. STAT2_16;
  562. }
  563. if (width&1) {
  564. LOADEND_16;
  565. STATEND_16;
  566. }
  567. }
  568. if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
  569. return 0;
  570. if (s->context) {
  571. for (i = 0; i < count; i++) {
  572. LOAD2_16;
  573. STAT2_16;
  574. WRITE2_16;
  575. }
  576. if (width&1) {
  577. LOADEND_16;
  578. STATEND_16;
  579. WRITEEND_16;
  580. }
  581. } else {
  582. for (i = 0; i < count; i++) {
  583. LOAD2_16;
  584. WRITE2_16;
  585. }
  586. if (width&1) {
  587. LOADEND_16;
  588. WRITEEND_16;
  589. }
  590. }
  591. }
  592. #undef LOAD2
  593. #undef STAT2
  594. #undef WRITE2
  595. return 0;
  596. }
  597. static int encode_gray_bitstream(HYuvContext *s, int count)
  598. {
  599. int i;
  600. if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < 4 * count) {
  601. av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
  602. return -1;
  603. }
  604. #define LOAD2\
  605. int y0 = s->temp[0][2 * i];\
  606. int y1 = s->temp[0][2 * i + 1];
  607. #define STAT2\
  608. s->stats[0][y0]++;\
  609. s->stats[0][y1]++;
  610. #define WRITE2\
  611. put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);\
  612. put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
  613. count /= 2;
  614. if (s->flags & AV_CODEC_FLAG_PASS1) {
  615. for (i = 0; i < count; i++) {
  616. LOAD2;
  617. STAT2;
  618. }
  619. }
  620. if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
  621. return 0;
  622. if (s->context) {
  623. for (i = 0; i < count; i++) {
  624. LOAD2;
  625. STAT2;
  626. WRITE2;
  627. }
  628. } else {
  629. for (i = 0; i < count; i++) {
  630. LOAD2;
  631. WRITE2;
  632. }
  633. }
  634. return 0;
  635. }
  636. static inline int encode_bgra_bitstream(HYuvContext *s, int count, int planes)
  637. {
  638. int i;
  639. if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
  640. 4 * planes * count) {
  641. av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
  642. return -1;
  643. }
  644. #define LOAD_GBRA \
  645. int g = s->temp[0][planes == 3 ? 3 * i + 1 : 4 * i + G]; \
  646. int b =(s->temp[0][planes == 3 ? 3 * i + 2 : 4 * i + B] - g) & 0xFF;\
  647. int r =(s->temp[0][planes == 3 ? 3 * i + 0 : 4 * i + R] - g) & 0xFF;\
  648. int a = s->temp[0][planes * i + A];
  649. #define STAT_BGRA \
  650. s->stats[0][b]++; \
  651. s->stats[1][g]++; \
  652. s->stats[2][r]++; \
  653. if (planes == 4) \
  654. s->stats[2][a]++;
  655. #define WRITE_GBRA \
  656. put_bits(&s->pb, s->len[1][g], s->bits[1][g]); \
  657. put_bits(&s->pb, s->len[0][b], s->bits[0][b]); \
  658. put_bits(&s->pb, s->len[2][r], s->bits[2][r]); \
  659. if (planes == 4) \
  660. put_bits(&s->pb, s->len[2][a], s->bits[2][a]);
  661. if ((s->flags & AV_CODEC_FLAG_PASS1) &&
  662. (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)) {
  663. for (i = 0; i < count; i++) {
  664. LOAD_GBRA;
  665. STAT_BGRA;
  666. }
  667. } else if (s->context || (s->flags & AV_CODEC_FLAG_PASS1)) {
  668. for (i = 0; i < count; i++) {
  669. LOAD_GBRA;
  670. STAT_BGRA;
  671. WRITE_GBRA;
  672. }
  673. } else {
  674. for (i = 0; i < count; i++) {
  675. LOAD_GBRA;
  676. WRITE_GBRA;
  677. }
  678. }
  679. return 0;
  680. }
  681. static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
  682. const AVFrame *pict, int *got_packet)
  683. {
  684. HYuvContext *s = avctx->priv_data;
  685. const int width = s->width;
  686. const int width2 = s->width>>1;
  687. const int height = s->height;
  688. const int fake_ystride = s->interlaced ? pict->linesize[0]*2 : pict->linesize[0];
  689. const int fake_ustride = s->interlaced ? pict->linesize[1]*2 : pict->linesize[1];
  690. const int fake_vstride = s->interlaced ? pict->linesize[2]*2 : pict->linesize[2];
  691. const AVFrame * const p = pict;
  692. int i, j, size = 0, ret;
  693. if ((ret = ff_alloc_packet2(avctx, pkt, width * height * 3 * 4 + AV_INPUT_BUFFER_MIN_SIZE, 0)) < 0)
  694. return ret;
  695. if (s->context) {
  696. size = store_huffman_tables(s, pkt->data);
  697. if (size < 0)
  698. return size;
  699. for (i = 0; i < 4; i++)
  700. for (j = 0; j < s->vlc_n; j++)
  701. s->stats[i][j] >>= 1;
  702. }
  703. init_put_bits(&s->pb, pkt->data + size, pkt->size - size);
  704. if (avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
  705. avctx->pix_fmt == AV_PIX_FMT_YUV420P) {
  706. int lefty, leftu, leftv, y, cy;
  707. put_bits(&s->pb, 8, leftv = p->data[2][0]);
  708. put_bits(&s->pb, 8, lefty = p->data[0][1]);
  709. put_bits(&s->pb, 8, leftu = p->data[1][0]);
  710. put_bits(&s->pb, 8, p->data[0][0]);
  711. lefty = sub_left_prediction(s, s->temp[0], p->data[0], width , 0);
  712. leftu = sub_left_prediction(s, s->temp[1], p->data[1], width2, 0);
  713. leftv = sub_left_prediction(s, s->temp[2], p->data[2], width2, 0);
  714. encode_422_bitstream(s, 2, width-2);
  715. if (s->predictor==MEDIAN) {
  716. int lefttopy, lefttopu, lefttopv;
  717. cy = y = 1;
  718. if (s->interlaced) {
  719. lefty = sub_left_prediction(s, s->temp[0], p->data[0] + p->linesize[0], width , lefty);
  720. leftu = sub_left_prediction(s, s->temp[1], p->data[1] + p->linesize[1], width2, leftu);
  721. leftv = sub_left_prediction(s, s->temp[2], p->data[2] + p->linesize[2], width2, leftv);
  722. encode_422_bitstream(s, 0, width);
  723. y++; cy++;
  724. }
  725. lefty = sub_left_prediction(s, s->temp[0], p->data[0] + fake_ystride, 4, lefty);
  726. leftu = sub_left_prediction(s, s->temp[1], p->data[1] + fake_ustride, 2, leftu);
  727. leftv = sub_left_prediction(s, s->temp[2], p->data[2] + fake_vstride, 2, leftv);
  728. encode_422_bitstream(s, 0, 4);
  729. lefttopy = p->data[0][3];
  730. lefttopu = p->data[1][1];
  731. lefttopv = p->data[2][1];
  732. s->hencdsp.sub_hfyu_median_pred(s->temp[0], p->data[0] + 4, p->data[0] + fake_ystride + 4, width - 4, &lefty, &lefttopy);
  733. s->hencdsp.sub_hfyu_median_pred(s->temp[1], p->data[1] + 2, p->data[1] + fake_ustride + 2, width2 - 2, &leftu, &lefttopu);
  734. s->hencdsp.sub_hfyu_median_pred(s->temp[2], p->data[2] + 2, p->data[2] + fake_vstride + 2, width2 - 2, &leftv, &lefttopv);
  735. encode_422_bitstream(s, 0, width - 4);
  736. y++; cy++;
  737. for (; y < height; y++,cy++) {
  738. uint8_t *ydst, *udst, *vdst;
  739. if (s->bitstream_bpp == 12) {
  740. while (2 * cy > y) {
  741. ydst = p->data[0] + p->linesize[0] * y;
  742. s->hencdsp.sub_hfyu_median_pred(s->temp[0], ydst - fake_ystride, ydst, width, &lefty, &lefttopy);
  743. encode_gray_bitstream(s, width);
  744. y++;
  745. }
  746. if (y >= height) break;
  747. }
  748. ydst = p->data[0] + p->linesize[0] * y;
  749. udst = p->data[1] + p->linesize[1] * cy;
  750. vdst = p->data[2] + p->linesize[2] * cy;
  751. s->hencdsp.sub_hfyu_median_pred(s->temp[0], ydst - fake_ystride, ydst, width, &lefty, &lefttopy);
  752. s->hencdsp.sub_hfyu_median_pred(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
  753. s->hencdsp.sub_hfyu_median_pred(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
  754. encode_422_bitstream(s, 0, width);
  755. }
  756. } else {
  757. for (cy = y = 1; y < height; y++, cy++) {
  758. uint8_t *ydst, *udst, *vdst;
  759. /* encode a luma only line & y++ */
  760. if (s->bitstream_bpp == 12) {
  761. ydst = p->data[0] + p->linesize[0] * y;
  762. if (s->predictor == PLANE && s->interlaced < y) {
  763. s->hencdsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
  764. lefty = sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
  765. } else {
  766. lefty = sub_left_prediction(s, s->temp[0], ydst, width , lefty);
  767. }
  768. encode_gray_bitstream(s, width);
  769. y++;
  770. if (y >= height) break;
  771. }
  772. ydst = p->data[0] + p->linesize[0] * y;
  773. udst = p->data[1] + p->linesize[1] * cy;
  774. vdst = p->data[2] + p->linesize[2] * cy;
  775. if (s->predictor == PLANE && s->interlaced < cy) {
  776. s->hencdsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
  777. s->hencdsp.diff_bytes(s->temp[2], udst, udst - fake_ustride, width2);
  778. s->hencdsp.diff_bytes(s->temp[2] + width2, vdst, vdst - fake_vstride, width2);
  779. lefty = sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
  780. leftu = sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu);
  781. leftv = sub_left_prediction(s, s->temp[2], s->temp[2] + width2, width2, leftv);
  782. } else {
  783. lefty = sub_left_prediction(s, s->temp[0], ydst, width , lefty);
  784. leftu = sub_left_prediction(s, s->temp[1], udst, width2, leftu);
  785. leftv = sub_left_prediction(s, s->temp[2], vdst, width2, leftv);
  786. }
  787. encode_422_bitstream(s, 0, width);
  788. }
  789. }
  790. } else if(avctx->pix_fmt == AV_PIX_FMT_RGB32) {
  791. uint8_t *data = p->data[0] + (height - 1) * p->linesize[0];
  792. const int stride = -p->linesize[0];
  793. const int fake_stride = -fake_ystride;
  794. int y;
  795. int leftr, leftg, leftb, lefta;
  796. put_bits(&s->pb, 8, lefta = data[A]);
  797. put_bits(&s->pb, 8, leftr = data[R]);
  798. put_bits(&s->pb, 8, leftg = data[G]);
  799. put_bits(&s->pb, 8, leftb = data[B]);
  800. sub_left_prediction_bgr32(s, s->temp[0], data + 4, width - 1,
  801. &leftr, &leftg, &leftb, &lefta);
  802. encode_bgra_bitstream(s, width - 1, 4);
  803. for (y = 1; y < s->height; y++) {
  804. uint8_t *dst = data + y*stride;
  805. if (s->predictor == PLANE && s->interlaced < y) {
  806. s->hencdsp.diff_bytes(s->temp[1], dst, dst - fake_stride, width * 4);
  807. sub_left_prediction_bgr32(s, s->temp[0], s->temp[1], width,
  808. &leftr, &leftg, &leftb, &lefta);
  809. } else {
  810. sub_left_prediction_bgr32(s, s->temp[0], dst, width,
  811. &leftr, &leftg, &leftb, &lefta);
  812. }
  813. encode_bgra_bitstream(s, width, 4);
  814. }
  815. } else if (avctx->pix_fmt == AV_PIX_FMT_RGB24) {
  816. uint8_t *data = p->data[0] + (height - 1) * p->linesize[0];
  817. const int stride = -p->linesize[0];
  818. const int fake_stride = -fake_ystride;
  819. int y;
  820. int leftr, leftg, leftb;
  821. put_bits(&s->pb, 8, leftr = data[0]);
  822. put_bits(&s->pb, 8, leftg = data[1]);
  823. put_bits(&s->pb, 8, leftb = data[2]);
  824. put_bits(&s->pb, 8, 0);
  825. sub_left_prediction_rgb24(s, s->temp[0], data + 3, width - 1,
  826. &leftr, &leftg, &leftb);
  827. encode_bgra_bitstream(s, width-1, 3);
  828. for (y = 1; y < s->height; y++) {
  829. uint8_t *dst = data + y * stride;
  830. if (s->predictor == PLANE && s->interlaced < y) {
  831. s->hencdsp.diff_bytes(s->temp[1], dst, dst - fake_stride,
  832. width * 3);
  833. sub_left_prediction_rgb24(s, s->temp[0], s->temp[1], width,
  834. &leftr, &leftg, &leftb);
  835. } else {
  836. sub_left_prediction_rgb24(s, s->temp[0], dst, width,
  837. &leftr, &leftg, &leftb);
  838. }
  839. encode_bgra_bitstream(s, width, 3);
  840. }
  841. } else if (s->version > 2) {
  842. int plane;
  843. for (plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) {
  844. int left, y;
  845. int w = width;
  846. int h = height;
  847. int fake_stride = fake_ystride;
  848. if (s->chroma && (plane == 1 || plane == 2)) {
  849. w >>= s->chroma_h_shift;
  850. h >>= s->chroma_v_shift;
  851. fake_stride = plane == 1 ? fake_ustride : fake_vstride;
  852. }
  853. left = sub_left_prediction(s, s->temp[0], p->data[plane], w , 0);
  854. encode_plane_bitstream(s, w, plane);
  855. if (s->predictor==MEDIAN) {
  856. int lefttop;
  857. y = 1;
  858. if (s->interlaced) {
  859. left = sub_left_prediction(s, s->temp[0], p->data[plane] + p->linesize[plane], w , left);
  860. encode_plane_bitstream(s, w, plane);
  861. y++;
  862. }
  863. lefttop = p->data[plane][0];
  864. for (; y < h; y++) {
  865. uint8_t *dst = p->data[plane] + p->linesize[plane] * y;
  866. sub_median_prediction(s, s->temp[0], dst - fake_stride, dst, w , &left, &lefttop);
  867. encode_plane_bitstream(s, w, plane);
  868. }
  869. } else {
  870. for (y = 1; y < h; y++) {
  871. uint8_t *dst = p->data[plane] + p->linesize[plane] * y;
  872. if (s->predictor == PLANE && s->interlaced < y) {
  873. diff_bytes(s, s->temp[1], dst, dst - fake_stride, w);
  874. left = sub_left_prediction(s, s->temp[0], s->temp[1], w , left);
  875. } else {
  876. left = sub_left_prediction(s, s->temp[0], dst, w , left);
  877. }
  878. encode_plane_bitstream(s, w, plane);
  879. }
  880. }
  881. }
  882. } else {
  883. av_log(avctx, AV_LOG_ERROR, "Format not supported!\n");
  884. }
  885. emms_c();
  886. size += (put_bits_count(&s->pb) + 31) / 8;
  887. put_bits(&s->pb, 16, 0);
  888. put_bits(&s->pb, 15, 0);
  889. size /= 4;
  890. if ((s->flags & AV_CODEC_FLAG_PASS1) && (s->picture_number & 31) == 0) {
  891. int j;
  892. char *p = avctx->stats_out;
  893. char *end = p + STATS_OUT_SIZE;
  894. for (i = 0; i < 4; i++) {
  895. for (j = 0; j < s->vlc_n; j++) {
  896. snprintf(p, end-p, "%"PRIu64" ", s->stats[i][j]);
  897. p += strlen(p);
  898. s->stats[i][j]= 0;
  899. }
  900. snprintf(p, end-p, "\n");
  901. p++;
  902. if (end <= p)
  903. return AVERROR(ENOMEM);
  904. }
  905. } else if (avctx->stats_out)
  906. avctx->stats_out[0] = '\0';
  907. if (!(s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)) {
  908. flush_put_bits(&s->pb);
  909. s->bdsp.bswap_buf((uint32_t *) pkt->data, (uint32_t *) pkt->data, size);
  910. }
  911. s->picture_number++;
  912. pkt->size = size * 4;
  913. pkt->flags |= AV_PKT_FLAG_KEY;
  914. *got_packet = 1;
  915. return 0;
  916. }
  917. static av_cold int encode_end(AVCodecContext *avctx)
  918. {
  919. HYuvContext *s = avctx->priv_data;
  920. ff_huffyuv_common_end(s);
  921. av_freep(&avctx->extradata);
  922. av_freep(&avctx->stats_out);
  923. return 0;
  924. }
  925. static const AVOption options[] = {
  926. { "non_deterministic", "Allow multithreading for e.g. context=1 at the expense of determinism",
  927. offsetof(HYuvContext, non_determ), AV_OPT_TYPE_INT, { .i64 = 1 },
  928. 0, 1, AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
  929. { NULL },
  930. };
  931. static const AVClass normal_class = {
  932. .class_name = "huffyuv",
  933. .item_name = av_default_item_name,
  934. .option = options,
  935. .version = LIBAVUTIL_VERSION_INT,
  936. };
  937. static const AVClass ff_class = {
  938. .class_name = "ffvhuff",
  939. .item_name = av_default_item_name,
  940. .option = options,
  941. .version = LIBAVUTIL_VERSION_INT,
  942. };
  943. AVCodec ff_huffyuv_encoder = {
  944. .name = "huffyuv",
  945. .long_name = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"),
  946. .type = AVMEDIA_TYPE_VIDEO,
  947. .id = AV_CODEC_ID_HUFFYUV,
  948. .priv_data_size = sizeof(HYuvContext),
  949. .init = encode_init,
  950. .encode2 = encode_frame,
  951. .close = encode_end,
  952. .capabilities = AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY,
  953. .priv_class = &normal_class,
  954. .pix_fmts = (const enum AVPixelFormat[]){
  955. AV_PIX_FMT_YUV422P, AV_PIX_FMT_RGB24,
  956. AV_PIX_FMT_RGB32, AV_PIX_FMT_NONE
  957. },
  958. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
  959. FF_CODEC_CAP_INIT_CLEANUP,
  960. };
  961. #if CONFIG_FFVHUFF_ENCODER
  962. AVCodec ff_ffvhuff_encoder = {
  963. .name = "ffvhuff",
  964. .long_name = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"),
  965. .type = AVMEDIA_TYPE_VIDEO,
  966. .id = AV_CODEC_ID_FFVHUFF,
  967. .priv_data_size = sizeof(HYuvContext),
  968. .init = encode_init,
  969. .encode2 = encode_frame,
  970. .close = encode_end,
  971. .capabilities = AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY,
  972. .priv_class = &ff_class,
  973. .pix_fmts = (const enum AVPixelFormat[]){
  974. AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV411P,
  975. AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
  976. AV_PIX_FMT_GBRP,
  977. AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14,
  978. AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16,
  979. AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
  980. AV_PIX_FMT_GBRAP,
  981. AV_PIX_FMT_GRAY8A,
  982. AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV420P16,
  983. AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV422P16,
  984. AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV444P16,
  985. AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
  986. AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P16,
  987. AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P16,
  988. AV_PIX_FMT_RGB24,
  989. AV_PIX_FMT_RGB32, AV_PIX_FMT_NONE
  990. },
  991. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
  992. FF_CODEC_CAP_INIT_CLEANUP,
  993. };
  994. #endif