Thanks to visit codestin.com
Credit goes to www.ffmpeg.org

FFmpeg
tiffenc.c
Go to the documentation of this file.
1 /*
2  * TIFF image encoder
3  * Copyright (c) 2007 Bartlomiej Wolowiec
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 /**
23  * @file
24  * TIFF image encoder
25  * @author Bartlomiej Wolowiec
26  */
27 
28 #include "config.h"
29 #include "libavutil/attributes.h"
30 #if CONFIG_ZLIB
31 #include <zlib.h>
32 #endif
33 
34 #include "libavutil/log.h"
35 #include "libavutil/mem.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/pixdesc.h"
38 #include "avcodec.h"
39 #include "bytestream.h"
40 #include "codec_internal.h"
41 #include "encode.h"
42 #include "lzw.h"
43 #include "rle.h"
44 #include "tiff.h"
45 #include "tiff_common.h"
46 #include "version.h"
47 
48 #define TIFF_MAX_ENTRY 32
49 
50 /** sizes of various TIFF field types (string size = 1)*/
51 static const uint8_t type_sizes2[14] = {
52  0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4
53 };
54 
55 typedef struct TiffEncoderContext {
56  AVClass *class; ///< for private options
58 
59  int width; ///< picture width
60  int height; ///< picture height
61  unsigned int bpp; ///< bits per pixel
62  int compr; ///< compression level
63  int bpp_tab_size; ///< bpp_tab size
64  enum TiffPhotometric photometric_interpretation; ///< photometric interpretation
65  int strips; ///< number of strips
66  uint32_t *strip_sizes;
67  unsigned int strip_sizes_size;
68  uint32_t *strip_offsets;
69  unsigned int strip_offsets_size;
70  uint8_t *yuv_line;
71  unsigned int yuv_line_size;
72  int rps; ///< row per strip
73  uint8_t entries[TIFF_MAX_ENTRY * 12]; ///< entries in header
74  int num_entries; ///< number of entries
75  uint8_t **buf; ///< actual position in buffer
76  uint8_t *buf_start; ///< pointer to first byte in buffer
77  int buf_size; ///< buffer size
78  uint16_t subsampling[2]; ///< YUV subsampling factors
79  struct LZWEncodeState *lzws; ///< LZW encode state
80  uint32_t dpi; ///< image resolution in DPI
82 
83 /**
84  * Check free space in buffer.
85  *
86  * @param s Tiff context
87  * @param need Needed bytes
88  * @return 0 - ok, 1 - no free space
89  */
90 static inline int check_size(TiffEncoderContext *s, uint64_t need)
91 {
92  if (s->buf_size < *s->buf - s->buf_start + need) {
93  *s->buf = s->buf_start + s->buf_size + 1;
94  av_log(s->avctx, AV_LOG_ERROR, "Buffer is too small\n");
95  return 1;
96  }
97  return 0;
98 }
99 
100 /**
101  * Put n values to buffer.
102  *
103  * @param p pointer to pointer to output buffer
104  * @param n number of values
105  * @param val pointer to values
106  * @param type type of values
107  * @param flip = 0 - normal copy, >0 - flip
108  */
109 static void tnput(uint8_t **p, int n, const uint8_t *val, enum AVTiffDataType type,
110  int flip)
111 {
112  int i;
113 #if HAVE_BIGENDIAN
114  flip ^= ((int[]) { 0, 0, 0, 1, 3, 3 })[type];
115 #endif
116  for (i = 0; i < n * type_sizes2[type]; i++)
117  *(*p)++ = val[i ^ flip];
118 }
119 
120 /**
121  * Add entry to directory in tiff header.
122  *
123  * @param s Tiff context
124  * @param tag tag that identifies the entry
125  * @param type entry type
126  * @param count the number of values
127  * @param ptr_val pointer to values
128  */
130  enum AVTiffDataType type, int count, const void *ptr_val)
131 {
132  uint8_t *entries_ptr = s->entries + 12 * s->num_entries;
133 
134  av_assert0(s->num_entries < TIFF_MAX_ENTRY);
135 
136  bytestream_put_le16(&entries_ptr, tag);
137  bytestream_put_le16(&entries_ptr, type);
138  bytestream_put_le32(&entries_ptr, count);
139 
140  if (type_sizes[type] * (int64_t)count <= 4) {
141  tnput(&entries_ptr, count, ptr_val, type, 0);
142  } else {
143  bytestream_put_le32(&entries_ptr, *s->buf - s->buf_start);
144  if (check_size(s, count * (int64_t)type_sizes2[type]))
145  return AVERROR_INVALIDDATA;
146  tnput(s->buf, count, ptr_val, type, 0);
147  }
148 
149  s->num_entries++;
150  return 0;
151 }
152 
154  enum TiffTags tag, enum AVTiffDataType type, int val)
155 {
156  uint16_t w = val;
157  uint32_t dw = val;
158  return add_entry(s, tag, type, 1,
159  type == AV_TIFF_SHORT ? (void *)&w : (void *)&dw);
160 }
161 
162 /**
163  * Encode one strip in tiff file.
164  *
165  * @param s Tiff context
166  * @param src input buffer
167  * @param dst output buffer
168  * @param n size of input buffer
169  * @param compr compression method
170  * @return number of output bytes. If an output error is encountered, a negative
171  * value corresponding to an AVERROR error code is returned.
172  */
173 static int encode_strip(TiffEncoderContext *s, const int8_t *src,
174  uint8_t *dst, int n, int compr)
175 {
176  switch (compr) {
177 #if CONFIG_ZLIB
178  case TIFF_DEFLATE:
179  case TIFF_ADOBE_DEFLATE:
180  {
181  unsigned long zlen = s->buf_size - (*s->buf - s->buf_start);
182  if (compress(dst, &zlen, src, n) != Z_OK) {
183  av_log(s->avctx, AV_LOG_ERROR, "Compressing failed\n");
184  return AVERROR_EXTERNAL;
185  }
186  return zlen;
187  }
188 #endif
189  case TIFF_RAW:
190  if (check_size(s, n))
191  return AVERROR(EINVAL);
192  memcpy(dst, src, n);
193  return n;
194  case TIFF_PACKBITS:
195  return ff_rle_encode(dst, s->buf_size - (*s->buf - s->buf_start),
196  src, 1, n, 2, 0xff, -1, 0);
197  case TIFF_LZW:
198  return ff_lzw_encode(s->lzws, src, n);
199  default:
200  av_log(s->avctx, AV_LOG_ERROR, "Unsupported compression method: %d\n",
201  compr);
202  return AVERROR(EINVAL);
203  }
204 }
205 
206 static void pack_yuv(TiffEncoderContext *s, const AVFrame *p,
207  uint8_t *dst, int lnum)
208 {
209  int i, j, k;
210  int w = (s->width - 1) / s->subsampling[0] + 1;
211  const uint8_t *pu = &p->data[1][lnum / s->subsampling[1] * p->linesize[1]];
212  const uint8_t *pv = &p->data[2][lnum / s->subsampling[1] * p->linesize[2]];
213  if (s->width % s->subsampling[0] || s->height % s->subsampling[1]) {
214  for (i = 0; i < w; i++) {
215  for (j = 0; j < s->subsampling[1]; j++)
216  for (k = 0; k < s->subsampling[0]; k++)
217  *dst++ = p->data[0][FFMIN(lnum + j, s->height-1) * p->linesize[0] +
218  FFMIN(i * s->subsampling[0] + k, s->width-1)];
219  *dst++ = *pu++;
220  *dst++ = *pv++;
221  }
222  }else{
223  for (i = 0; i < w; i++) {
224  for (j = 0; j < s->subsampling[1]; j++)
225  for (k = 0; k < s->subsampling[0]; k++)
226  *dst++ = p->data[0][(lnum + j) * p->linesize[0] +
227  i * s->subsampling[0] + k];
228  *dst++ = *pu++;
229  *dst++ = *pv++;
230  }
231  }
232 }
233 
234 #define ADD_ENTRY(s, tag, type, count, ptr_val) \
235  do { \
236  ret = add_entry(s, tag, type, count, ptr_val); \
237  if (ret < 0) \
238  goto fail; \
239  } while (0)
240 
241 #define ADD_ENTRY1(s, tag, type, val) \
242  do { \
243  ret = add_entry1(s, tag, type, val); \
244  if (ret < 0) \
245  goto fail; \
246  } while (0)
247 
249  const AVFrame *pict, int *got_packet)
250 {
252  TiffEncoderContext *s = avctx->priv_data;
253  const AVFrame *const p = pict;
254  int i;
255  uint8_t *ptr;
256  uint8_t *offset;
257  uint32_t strips;
258  int bytes_per_row;
259  uint32_t res[2] = { s->dpi, 1 }; // image resolution (72/1)
260  uint16_t bpp_tab[4];
261  int ret = 0;
262  int is_yuv = 0, alpha = 0;
263  int shift_h, shift_v;
264  int packet_size;
265 
266  s->width = avctx->width;
267  s->height = avctx->height;
268  s->subsampling[0] = 1;
269  s->subsampling[1] = 1;
270 
271  if (!desc)
272  return AVERROR(EINVAL);
273 
274  avctx->bits_per_coded_sample =
275  s->bpp = av_get_bits_per_pixel(desc);
276  s->bpp_tab_size = desc->nb_components;
277 
278  switch (avctx->pix_fmt) {
279  case AV_PIX_FMT_RGBA64LE:
280  case AV_PIX_FMT_RGBA:
281  alpha = 1;
283  case AV_PIX_FMT_RGB48LE:
284  case AV_PIX_FMT_RGB24:
285  s->photometric_interpretation = TIFF_PHOTOMETRIC_RGB;
286  break;
287  case AV_PIX_FMT_GRAY8:
288  avctx->bits_per_coded_sample = 0x28;
290  case AV_PIX_FMT_GRAY8A:
291  case AV_PIX_FMT_YA16LE:
292  alpha = avctx->pix_fmt == AV_PIX_FMT_GRAY8A || avctx->pix_fmt == AV_PIX_FMT_YA16LE;
294  case AV_PIX_FMT_GRAY16LE:
296  s->photometric_interpretation = TIFF_PHOTOMETRIC_BLACK_IS_ZERO;
297  break;
298  case AV_PIX_FMT_PAL8:
299  s->photometric_interpretation = TIFF_PHOTOMETRIC_PALETTE;
300  break;
302  s->photometric_interpretation = TIFF_PHOTOMETRIC_WHITE_IS_ZERO;
303  break;
304  case AV_PIX_FMT_YUV420P:
305  case AV_PIX_FMT_YUV422P:
306  case AV_PIX_FMT_YUV440P:
307  case AV_PIX_FMT_YUV444P:
308  case AV_PIX_FMT_YUV410P:
309  case AV_PIX_FMT_YUV411P:
310  av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &shift_h, &shift_v);
311  s->photometric_interpretation = TIFF_PHOTOMETRIC_YCBCR;
312  s->subsampling[0] = 1 << shift_h;
313  s->subsampling[1] = 1 << shift_v;
314  is_yuv = 1;
315  break;
316  default:
317  av_log(s->avctx, AV_LOG_ERROR,
318  "This colors format is not supported\n");
319  return AVERROR(EINVAL);
320  }
321 
322  for (i = 0; i < s->bpp_tab_size; i++)
323  bpp_tab[i] = desc->comp[i].depth;
324 
325  if (s->compr == TIFF_DEFLATE ||
326  s->compr == TIFF_ADOBE_DEFLATE ||
327  s->compr == TIFF_LZW)
328  // best choice for DEFLATE
329  s->rps = s->height;
330  else
331  // suggest size of strip
332  s->rps = FFMAX(8192 / (((s->width * s->bpp) >> 3) + 1), 1);
333  // round rps up
334  s->rps = ((s->rps - 1) / s->subsampling[1] + 1) * s->subsampling[1];
335 
336  strips = (s->height - 1) / s->rps + 1;
337 
338  bytes_per_row = (((s->width - 1) / s->subsampling[0] + 1) * s->bpp *
339  s->subsampling[0] * s->subsampling[1] + 7) >> 3;
340  packet_size = avctx->height * bytes_per_row * 2 +
341  avctx->height * 4 + FF_INPUT_BUFFER_MIN_SIZE;
342 
343  if ((ret = ff_alloc_packet(avctx, pkt, packet_size)) < 0)
344  return ret;
345  ptr = pkt->data;
346  s->buf_start = pkt->data;
347  s->buf = &ptr;
348  s->buf_size = pkt->size;
349 
350  if (check_size(s, 8)) {
351  ret = AVERROR(EINVAL);
352  goto fail;
353  }
354 
355  // write header
356  bytestream_put_le16(&ptr, 0x4949);
357  bytestream_put_le16(&ptr, 42);
358 
359  offset = ptr;
360  bytestream_put_le32(&ptr, 0);
361 
362  if (strips > INT_MAX / FFMAX(sizeof(s->strip_sizes[0]), sizeof(s->strip_offsets[0]))) {
363  ret = AVERROR(ENOMEM);
364  goto fail;
365  }
366  av_fast_padded_mallocz(&s->strip_sizes , &s->strip_sizes_size , sizeof(s->strip_sizes [0]) * strips);
367  av_fast_padded_mallocz(&s->strip_offsets, &s->strip_offsets_size, sizeof(s->strip_offsets[0]) * strips);
368 
369  if (!s->strip_sizes || !s->strip_offsets) {
370  ret = AVERROR(ENOMEM);
371  goto fail;
372  }
373 
374  if (is_yuv) {
375  av_fast_padded_malloc(&s->yuv_line, &s->yuv_line_size, bytes_per_row);
376  if (s->yuv_line == NULL) {
377  av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n");
378  ret = AVERROR(ENOMEM);
379  goto fail;
380  }
381  }
382 
383 #if CONFIG_ZLIB
384  if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
385  uint8_t *zbuf;
386  int zlen, zn;
387  int j;
388 
389  zlen = bytes_per_row * s->rps;
390  zbuf = av_malloc(zlen);
391  if (!zbuf) {
392  ret = AVERROR(ENOMEM);
393  goto fail;
394  }
395  s->strip_offsets[0] = ptr - pkt->data;
396  zn = 0;
397  for (j = 0; j < s->rps; j++) {
398  if (is_yuv) {
399  pack_yuv(s, p, s->yuv_line, j);
400  memcpy(zbuf + zn, s->yuv_line, bytes_per_row);
401  j += s->subsampling[1] - 1;
402  } else
403  memcpy(zbuf + j * bytes_per_row,
404  p->data[0] + j * p->linesize[0], bytes_per_row);
405  zn += bytes_per_row;
406  }
407  ret = encode_strip(s, zbuf, ptr, zn, s->compr);
408  av_free(zbuf);
409  if (ret < 0) {
410  av_log(s->avctx, AV_LOG_ERROR, "Encode strip failed\n");
411  goto fail;
412  }
413  ptr += ret;
414  s->strip_sizes[0] = ptr - pkt->data - s->strip_offsets[0];
415  } else
416 #endif
417  {
418  if (s->compr == TIFF_LZW) {
420  if (!s->lzws) {
421  ret = AVERROR(ENOMEM);
422  goto fail;
423  }
424  }
425  for (i = 0; i < s->height; i++) {
426  if (s->strip_sizes[i / s->rps] == 0) {
427  if (s->compr == TIFF_LZW) {
428  ff_lzw_encode_init(s->lzws, ptr,
429  s->buf_size - (*s->buf - s->buf_start),
430  12, FF_LZW_TIFF, 0);
431  }
432  s->strip_offsets[i / s->rps] = ptr - pkt->data;
433  }
434  if (is_yuv) {
435  pack_yuv(s, p, s->yuv_line, i);
436  ret = encode_strip(s, s->yuv_line, ptr, bytes_per_row, s->compr);
437  i += s->subsampling[1] - 1;
438  } else
439  ret = encode_strip(s, p->data[0] + i * p->linesize[0],
440  ptr, bytes_per_row, s->compr);
441  if (ret < 0) {
442  av_log(s->avctx, AV_LOG_ERROR, "Encode strip failed\n");
443  goto fail;
444  }
445  s->strip_sizes[i / s->rps] += ret;
446  ptr += ret;
447  if (s->compr == TIFF_LZW &&
448  (i == s->height - 1 || i % s->rps == s->rps - 1)) {
449  ret = ff_lzw_encode_flush(s->lzws);
450  s->strip_sizes[(i / s->rps)] += ret;
451  ptr += ret;
452  }
453  }
454  if (s->compr == TIFF_LZW)
455  av_freep(&s->lzws);
456  }
457 
458  s->num_entries = 0;
459 
461  ADD_ENTRY1(s, TIFF_WIDTH, AV_TIFF_LONG, s->width);
462  ADD_ENTRY1(s, TIFF_HEIGHT, AV_TIFF_LONG, s->height);
463 
464  if (s->bpp_tab_size)
465  ADD_ENTRY(s, TIFF_BPP, AV_TIFF_SHORT, s->bpp_tab_size, bpp_tab);
466 
468  ADD_ENTRY1(s, TIFF_PHOTOMETRIC, AV_TIFF_SHORT, s->photometric_interpretation);
469  ADD_ENTRY(s, TIFF_STRIP_OFFS, AV_TIFF_LONG, strips, s->strip_offsets);
470 
472  if (sd) {
473  int orientation = av_exif_matrix_to_orientation((int32_t *) sd->data);
474  if (orientation >= 1 && orientation <= 8)
475  ADD_ENTRY1(s, TIFF_ORIENTATION, AV_TIFF_SHORT, orientation);
476  }
477 
478  if (s->bpp_tab_size)
480 
482  ADD_ENTRY(s, TIFF_STRIP_SIZE, AV_TIFF_LONG, strips, s->strip_sizes);
484  if (avctx->sample_aspect_ratio.num > 0 &&
485  avctx->sample_aspect_ratio.den > 0) {
486  AVRational y = av_mul_q(av_make_q(s->dpi, 1),
487  avctx->sample_aspect_ratio);
488  res[0] = y.num;
489  res[1] = y.den;
490  }
493 
494  if (!(avctx->flags & AV_CODEC_FLAG_BITEXACT))
496  strlen(LIBAVCODEC_IDENT) + 1, LIBAVCODEC_IDENT);
497 
498  if (avctx->pix_fmt == AV_PIX_FMT_PAL8) {
499  uint16_t pal[256 * 3];
500  for (i = 0; i < 256; i++) {
501  uint32_t rgb = *(uint32_t *) (p->data[1] + i * 4);
502  pal[i] = ((rgb >> 16) & 0xff) * 257;
503  pal[i + 256] = ((rgb >> 8) & 0xff) * 257;
504  pal[i + 512] = (rgb & 0xff) * 257;
505  }
506  ADD_ENTRY(s, TIFF_PAL, AV_TIFF_SHORT, 256 * 3, pal);
507  }
508  if (alpha)
510  if (is_yuv) {
511  /** according to CCIR Recommendation 601.1 */
512  uint32_t refbw[12] = { 15, 1, 235, 1, 128, 1, 240, 1, 128, 1, 240, 1 };
513  ADD_ENTRY(s, TIFF_YCBCR_SUBSAMPLING, AV_TIFF_SHORT, 2, s->subsampling);
517  }
518  // write offset to dir
519  bytestream_put_le32(&offset, ptr - pkt->data);
520 
521  if (check_size(s, 6 + s->num_entries * 12)) {
522  ret = AVERROR(EINVAL);
523  goto fail;
524  }
525  bytestream_put_le16(&ptr, s->num_entries); // write tag count
526  bytestream_put_buffer(&ptr, s->entries, s->num_entries * 12);
527  bytestream_put_le32(&ptr, 0);
528 
529  pkt->size = ptr - pkt->data;
530  *got_packet = 1;
531 
532 fail:
533  return ret < 0 ? ret : 0;
534 }
535 
537 {
538  TiffEncoderContext *s = avctx->priv_data;
539 
540 #if !CONFIG_ZLIB
541  if (s->compr == TIFF_DEFLATE) {
542  av_log(avctx, AV_LOG_ERROR,
543  "Deflate compression needs zlib compiled in\n");
544  return AVERROR(ENOSYS);
545  }
546 #endif
547 
548  s->avctx = avctx;
549 
550  return 0;
551 }
552 
554 {
555  TiffEncoderContext *s = avctx->priv_data;
556 
557  av_freep(&s->strip_sizes);
558  av_freep(&s->strip_offsets);
559  av_freep(&s->yuv_line);
560 
561  return 0;
562 }
563 
564 #define OFFSET(x) offsetof(TiffEncoderContext, x)
565 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
566 static const AVOption options[] = {
567  {"dpi", "set the image resolution (in dpi)", OFFSET(dpi), AV_OPT_TYPE_INT, {.i64 = 72}, 1, 0x10000, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_ENCODING_PARAM},
568  { "compression_algo", NULL, OFFSET(compr), AV_OPT_TYPE_INT, { .i64 = TIFF_PACKBITS }, TIFF_RAW, TIFF_DEFLATE, VE, .unit = "compression_algo" },
569  { "packbits", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = TIFF_PACKBITS }, 0, 0, VE, .unit = "compression_algo" },
570  { "raw", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = TIFF_RAW }, 0, 0, VE, .unit = "compression_algo" },
571  { "lzw", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = TIFF_LZW }, 0, 0, VE, .unit = "compression_algo" },
572  { "deflate", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = TIFF_DEFLATE }, 0, 0, VE, .unit = "compression_algo" },
573  { NULL },
574 };
575 
576 static const AVClass tiffenc_class = {
577  .class_name = "TIFF encoder",
578  .item_name = av_default_item_name,
579  .option = options,
580  .version = LIBAVUTIL_VERSION_INT,
581 };
582 
584  .p.name = "tiff",
585  CODEC_LONG_NAME("TIFF image"),
586  .p.type = AVMEDIA_TYPE_VIDEO,
587  .p.id = AV_CODEC_ID_TIFF,
588  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
590  .priv_data_size = sizeof(TiffEncoderContext),
591  .init = encode_init,
592  .close = encode_close,
601  .color_ranges = AVCOL_RANGE_MPEG,
602  .p.priv_class = &tiffenc_class,
603 };
encode_close
static av_cold int encode_close(AVCodecContext *avctx)
Definition: tiffenc.c:553
CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:392
check_size
static int check_size(TiffEncoderContext *s, uint64_t need)
Check free space in buffer.
Definition: tiffenc.c:90
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
encode_strip
static int encode_strip(TiffEncoderContext *s, const int8_t *src, uint8_t *dst, int n, int compr)
Encode one strip in tiff file.
Definition: tiffenc.c:173
LIBAVCODEC_IDENT
#define LIBAVCODEC_IDENT
Definition: version.h:43
rle.h
TiffEncoderContext::entries
uint8_t entries[TIFF_MAX_ENTRY *12]
entries in header
Definition: tiffenc.c:73
av_frame_get_side_data
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:659
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
TiffEncoderContext::bpp_tab_size
int bpp_tab_size
bpp_tab size
Definition: tiffenc.c:63
TIFF_YCBCR_POSITIONING
@ TIFF_YCBCR_POSITIONING
Definition: tiff.h:86
TiffEncoderContext::strip_sizes_size
unsigned int strip_sizes_size
Definition: tiffenc.c:67
TiffEncoderContext::width
int width
picture width
Definition: tiffenc.c:59
int64_t
long long int64_t
Definition: coverity.c:34
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:435
pixdesc.h
TIFF_ADOBE_DEFLATE
@ TIFF_ADOBE_DEFLATE
Definition: tiff.h:134
LZWEncodeState
LZW encode state.
Definition: lzwenc.c:51
AVPacket::data
uint8_t * data
Definition: packet.h:595
AVOption
AVOption.
Definition: opt.h:429
encode.h
TiffTags
TiffTags
abridged list of TIFF and TIFF/EP tags
Definition: tiff.h:44
AV_PIX_FMT_MONOWHITE
@ AV_PIX_FMT_MONOWHITE
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb.
Definition: pixfmt.h:82
ff_lzw_encode_init
void ff_lzw_encode_init(struct LZWEncodeState *s, uint8_t *outbuf, int outsize, int maxbits, enum FF_LZW_MODES mode, int little_endian)
Initialize LZW encoder.
Definition: lzwenc.c:206
FFCodec
Definition: codec_internal.h:127
version.h
AV_FRAME_DATA_DISPLAYMATRIX
@ AV_FRAME_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: frame.h:85
av_get_bits_per_pixel
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel used by the pixel format described by pixdesc.
Definition: pixdesc.c:3408
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:106
TIFF_ROWSPERSTRIP
@ TIFF_ROWSPERSTRIP
Definition: tiff.h:59
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
TiffEncoderContext::avctx
AVCodecContext * avctx
Definition: tiffenc.c:57
TIFF_RAW
@ TIFF_RAW
Definition: tiff.h:127
TiffEncoderContext::subsampling
uint16_t subsampling[2]
YUV subsampling factors.
Definition: tiffenc.c:78
TIFF_PHOTOMETRIC_WHITE_IS_ZERO
@ TIFF_PHOTOMETRIC_WHITE_IS_ZERO
Definition: tiff.h:191
TIFF_PACKBITS
@ TIFF_PACKBITS
Definition: tiff.h:135
FF_INPUT_BUFFER_MIN_SIZE
#define FF_INPUT_BUFFER_MIN_SIZE
Used by some encoders as upper bound for the length of headers.
Definition: encode.h:33
TiffEncoderContext::yuv_line_size
unsigned int yuv_line_size
Definition: tiffenc.c:71
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
AV_TIFF_SHORT
@ AV_TIFF_SHORT
Definition: exif.h:45
rgb
Definition: rpzaenc.c:60
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
fail
#define fail()
Definition: checkasm.h:224
TIFF_YCBCR_SUBSAMPLING
@ TIFF_YCBCR_SUBSAMPLING
Definition: tiff.h:85
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:496
val
static double val(void *priv, double ch)
Definition: aeval.c:77
av_pix_fmt_get_chroma_sub_sample
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
Definition: pixdesc.c:3484
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
OFFSET
#define OFFSET(x)
Definition: tiffenc.c:564
TiffEncoderContext::num_entries
int num_entries
number of entries
Definition: tiffenc.c:74
TIFF_SOFTWARE_NAME
@ TIFF_SOFTWARE_NAME
Definition: tiff.h:72
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:359
FF_LZW_TIFF
@ FF_LZW_TIFF
Definition: lzw.h:39
AVRational::num
int num
Numerator.
Definition: rational.h:59
ADD_ENTRY1
#define ADD_ENTRY1(s, tag, type, val)
Definition: tiffenc.c:241
VE
#define VE
Definition: tiffenc.c:565
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:119
TIFF_SUBFILE
@ TIFF_SUBFILE
Definition: tiff.h:45
TIFF_RES_UNIT
@ TIFF_RES_UNIT
Definition: tiff.h:70
type_sizes2
static const uint8_t type_sizes2[14]
sizes of various TIFF field types (string size = 1)
Definition: tiffenc.c:51
s
#define s(width, name)
Definition: cbs_vp9.c:198
TiffEncoderContext::strips
int strips
number of strips
Definition: tiffenc.c:65
AV_TIFF_RATIONAL
@ AV_TIFF_RATIONAL
Definition: exif.h:47
TIFF_STRIP_SIZE
@ TIFF_STRIP_SIZE
Definition: tiff.h:60
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
av_fallthrough
#define av_fallthrough
Definition: attributes.h:67
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:100
if
if(ret)
Definition: filter_design.txt:179
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:95
need
must be printed separately If there s no standard function for printing the type you need
Definition: tablegen.txt:45
AV_PIX_FMT_GRAY8A
@ AV_PIX_FMT_GRAY8A
alias for AV_PIX_FMT_YA8
Definition: pixfmt.h:143
ADD_ENTRY
#define ADD_ENTRY(s, tag, type, count, ptr_val)
Definition: tiffenc.c:234
TIFF_LZW
@ TIFF_LZW
Definition: tiff.h:131
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
TIFF_PHOTOMETRIC_YCBCR
@ TIFF_PHOTOMETRIC_YCBCR
Definition: tiff.h:197
TiffEncoderContext::buf
uint8_t ** buf
actual position in buffer
Definition: tiffenc.c:75
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVCHROMA_LOC_TOPLEFT
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition: pixfmt.h:800
AV_PIX_FMT_RGB48LE
@ AV_PIX_FMT_RGB48LE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
Definition: pixfmt.h:110
AV_PIX_FMT_YA16LE
@ AV_PIX_FMT_YA16LE
16 bits gray, 16 bits alpha (little-endian)
Definition: pixfmt.h:210
add_entry1
static int add_entry1(TiffEncoderContext *s, enum TiffTags tag, enum AVTiffDataType type, int val)
Definition: tiffenc.c:153
AV_PIX_FMT_MONOBLACK
@ AV_PIX_FMT_MONOBLACK
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb.
Definition: pixfmt.h:83
tiff.h
TIFF_PHOTOMETRIC_PALETTE
@ TIFF_PHOTOMETRIC_PALETTE
Definition: tiff.h:194
tiff_common.h
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
AV_PIX_FMT_RGBA64LE
@ AV_PIX_FMT_RGBA64LE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:203
TiffEncoderContext
Definition: tiffenc.c:55
TiffEncoderContext::dpi
uint32_t dpi
image resolution in DPI
Definition: tiffenc.c:80
options
Definition: swscale.c:45
TIFF_PAL
@ TIFF_PAL
Definition: tiff.h:77
TiffEncoderContext::strip_offsets
uint32_t * strip_offsets
Definition: tiffenc.c:68
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
TIFF_SAMPLES_PER_PIXEL
@ TIFF_SAMPLES_PER_PIXEL
Definition: tiff.h:58
TiffEncoderContext::lzws
struct LZWEncodeState * lzws
LZW encode state.
Definition: tiffenc.c:79
TIFF_WIDTH
@ TIFF_WIDTH
Definition: tiff.h:46
AV_OPT_FLAG_ENCODING_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition: opt.h:352
AVTiffDataType
AVTiffDataType
Data type identifiers for TIFF tags.
Definition: exif.h:42
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:551
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:75
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
flip
static void flip(AVCodecContext *avctx, AVFrame *frame)
Definition: rawdec.c:131
AVPacket::size
int size
Definition: packet.h:596
TIFF_EXTRASAMPLES
@ TIFF_EXTRASAMPLES
Definition: tiff.h:83
codec_internal.h
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
lzw.h
LZW decoding routines.
encode_frame
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
Definition: tiffenc.c:248
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
AVFrameSideData::data
uint8_t * data
Definition: frame.h:292
TiffEncoderContext::strip_sizes
uint32_t * strip_sizes
Definition: tiffenc.c:66
TiffEncoderContext::buf_size
int buf_size
buffer size
Definition: tiffenc.c:77
TiffEncoderContext::compr
int compr
compression level
Definition: tiffenc.c:62
tiffenc_class
static const AVClass tiffenc_class
Definition: tiffenc.c:576
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
attributes.h
AV_TIFF_STRING
@ AV_TIFF_STRING
Definition: exif.h:44
TIFF_COMPR
@ TIFF_COMPR
Definition: tiff.h:49
TIFF_HEIGHT
@ TIFF_HEIGHT
Definition: tiff.h:47
TiffEncoderContext::photometric_interpretation
enum TiffPhotometric photometric_interpretation
photometric interpretation
Definition: tiffenc.c:64
AVCodecContext::bits_per_coded_sample
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition: avcodec.h:1558
bytestream_put_buffer
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
Definition: bytestream.h:372
log.h
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
TIFF_PHOTOMETRIC_BLACK_IS_ZERO
@ TIFF_PHOTOMETRIC_BLACK_IS_ZERO
Definition: tiff.h:192
av_fast_padded_malloc
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition: utils.c:53
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AV_OPT_FLAG_VIDEO_PARAM
#define AV_OPT_FLAG_VIDEO_PARAM
Definition: opt.h:358
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
ff_lzw_encode_flush
int ff_lzw_encode_flush(struct LZWEncodeState *s)
Write end code and flush bitstream.
Definition: lzwenc.c:263
AVCodecContext::chroma_sample_location
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition: avcodec.h:684
AVCodecContext::height
int height
Definition: avcodec.h:600
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:639
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
TIFF_STRIP_OFFS
@ TIFF_STRIP_OFFS
Definition: tiff.h:56
TIFF_MAX_ENTRY
#define TIFF_MAX_ENTRY
Definition: tiffenc.c:48
avcodec.h
AV_PIX_FMT_PAL8
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition: pixfmt.h:84
tag
uint32_t tag
Definition: movenc.c:2048
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
TIFF_BPP
@ TIFF_BPP
Definition: tiff.h:48
ff_rle_encode
int ff_rle_encode(uint8_t *outbuf, int out_size, const uint8_t *ptr, int bpp, int w, int add_rep, int xor_rep, int add_raw, int xor_raw)
RLE compress the row, with maximum size of out_size.
Definition: rle.c:53
ff_tiff_encoder
const FFCodec ff_tiff_encoder
Definition: tiffenc.c:583
TIFF_PHOTOMETRIC
@ TIFF_PHOTOMETRIC
Definition: tiff.h:50
TiffPhotometric
TiffPhotometric
list of TIFF, TIFF/AP and DNG PhotometricInterpretation (TIFF_PHOTOMETRIC) values
Definition: tiff.h:189
AVCodecContext
main external API structure.
Definition: avcodec.h:439
TiffEncoderContext::bpp
unsigned int bpp
bits per pixel
Definition: tiffenc.c:61
options
static const AVOption options[]
Definition: tiffenc.c:566
tnput
static void tnput(uint8_t **p, int n, const uint8_t *val, enum AVTiffDataType type, int flip)
Put n values to buffer.
Definition: tiffenc.c:109
TiffEncoderContext::yuv_line
uint8_t * yuv_line
Definition: tiffenc.c:70
AVRational::den
int den
Denominator.
Definition: rational.h:60
TiffEncoderContext::strip_offsets_size
unsigned int strip_offsets_size
Definition: tiffenc.c:69
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
av_fast_padded_mallocz
void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_padded_malloc except that buffer will always be 0-initialized after call.
Definition: utils.c:66
add_entry
static int add_entry(TiffEncoderContext *s, enum TiffTags tag, enum AVTiffDataType type, int count, const void *ptr_val)
Add entry to directory in tiff header.
Definition: tiffenc.c:129
TIFF_ORIENTATION
@ TIFF_ORIENTATION
Definition: tiff.h:57
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
TIFF_YRES
@ TIFF_YRES
Definition: tiff.h:62
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
TiffEncoderContext::height
int height
picture height
Definition: tiffenc.c:60
AV_PIX_FMT_GRAY16LE
@ AV_PIX_FMT_GRAY16LE
Y , 16bpp, little-endian.
Definition: pixfmt.h:105
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
mem.h
TiffEncoderContext::rps
int rps
row per strip
Definition: tiffenc.c:72
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:322
pack_yuv
static void pack_yuv(TiffEncoderContext *s, const AVFrame *p, uint8_t *dst, int lnum)
Definition: tiffenc.c:206
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:290
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
w
uint8_t w
Definition: llvidencdsp.c:39
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
TIFF_DEFLATE
@ TIFF_DEFLATE
Definition: tiff.h:136
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
TIFF_PHOTOMETRIC_RGB
@ TIFF_PHOTOMETRIC_RGB
Definition: tiff.h:193
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
AVPacket
This structure stores compressed data.
Definition: packet.h:572
TiffEncoderContext::buf_start
uint8_t * buf_start
pointer to first byte in buffer
Definition: tiffenc.c:76
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:80
ff_lzw_encode_state_size
const int ff_lzw_encode_state_size
Definition: lzwenc.c:68
TIFF_XRES
@ TIFF_XRES
Definition: tiff.h:61
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:600
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
TIFF_REFERENCE_BW
@ TIFF_REFERENCE_BW
Definition: tiff.h:87
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
encode_init
static av_cold int encode_init(AVCodecContext *avctx)
Definition: tiffenc.c:536
AV_CODEC_ID_TIFF
@ AV_CODEC_ID_TIFF
Definition: codec_id.h:148
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
type_sizes
static const uint8_t type_sizes[14]
sizes of various TIFF field types (string size = 100)
Definition: tiff_common.h:37
ff_lzw_encode
int ff_lzw_encode(struct LZWEncodeState *s, const uint8_t *inbuf, int insize)
LZW main compress function.
Definition: lzwenc.c:230
av_exif_matrix_to_orientation
int av_exif_matrix_to_orientation(const int32_t *matrix)
Convert a display matrix used by AV_FRAME_DATA_DISPLAYMATRIX into an orientation constant used by EXI...
Definition: exif.c:1330
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
AV_TIFF_LONG
@ AV_TIFF_LONG
Definition: exif.h:46
ff_alloc_packet
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition: encode.c:61
AVCodecContext::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition: avcodec.h:624
src
#define src
Definition: vp8dsp.c:248