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.

1040 lines
34KB

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