Libav
lcldec.c
Go to the documentation of this file.
1 /*
2  * LCL (LossLess Codec Library) Codec
3  * Copyright (c) 2002-2004 Roberto Togni
4  *
5  * This file is part of Libav.
6  *
7  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
41 #include <stdio.h>
42 #include <stdlib.h>
43 
44 #include "libavutil/mem.h"
45 #include "avcodec.h"
46 #include "bytestream.h"
47 #include "internal.h"
48 #include "lcl.h"
49 
50 #if CONFIG_ZLIB_DECODER
51 #include <zlib.h>
52 #endif
53 
54 /*
55  * Decoder context
56  */
57 typedef struct LclDecContext {
58  // Image type
59  int imgtype;
60  // Compression type
62  // Flags
63  int flags;
64  // Decompressed data size
65  unsigned int decomp_size;
66  // Decompression buffer
67  unsigned char* decomp_buf;
68 #if CONFIG_ZLIB_DECODER
69  z_stream zstream;
70 #endif
72 
73 
78 static unsigned int mszh_decomp(const unsigned char * srcptr, int srclen, unsigned char * destptr, unsigned int destsize)
79 {
80  unsigned char *destptr_bak = destptr;
81  unsigned char *destptr_end = destptr + destsize;
82  const unsigned char *srcptr_end = srcptr + srclen;
83  unsigned mask = *srcptr++;
84  unsigned maskbit = 0x80;
85 
86  while (srcptr < srcptr_end && destptr < destptr_end) {
87  if (!(mask & maskbit)) {
88  memcpy(destptr, srcptr, 4);
89  destptr += 4;
90  srcptr += 4;
91  } else {
92  unsigned ofs = bytestream_get_le16(&srcptr);
93  unsigned cnt = (ofs >> 11) + 1;
94  ofs &= 0x7ff;
95  ofs = FFMIN(ofs, destptr - destptr_bak);
96  cnt *= 4;
97  cnt = FFMIN(cnt, destptr_end - destptr);
98  av_memcpy_backptr(destptr, ofs, cnt);
99  destptr += cnt;
100  }
101  maskbit >>= 1;
102  if (!maskbit) {
103  mask = *srcptr++;
104  while (!mask) {
105  if (destptr_end - destptr < 32 || srcptr_end - srcptr < 32) break;
106  memcpy(destptr, srcptr, 32);
107  destptr += 32;
108  srcptr += 32;
109  mask = *srcptr++;
110  }
111  maskbit = 0x80;
112  }
113  }
114 
115  return destptr - destptr_bak;
116 }
117 
118 
119 #if CONFIG_ZLIB_DECODER
120 
127 static int zlib_decomp(AVCodecContext *avctx, const uint8_t *src, int src_len, int offset, int expected)
128 {
129  LclDecContext *c = avctx->priv_data;
130  int zret = inflateReset(&c->zstream);
131  if (zret != Z_OK) {
132  av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret);
133  return AVERROR_UNKNOWN;
134  }
135  c->zstream.next_in = src;
136  c->zstream.avail_in = src_len;
137  c->zstream.next_out = c->decomp_buf + offset;
138  c->zstream.avail_out = c->decomp_size - offset;
139  zret = inflate(&c->zstream, Z_FINISH);
140  if (zret != Z_OK && zret != Z_STREAM_END) {
141  av_log(avctx, AV_LOG_ERROR, "Inflate error: %d\n", zret);
142  return AVERROR_UNKNOWN;
143  }
144  if (expected != (unsigned int)c->zstream.total_out) {
145  av_log(avctx, AV_LOG_ERROR, "Decoded size differs (%d != %lu)\n",
146  expected, c->zstream.total_out);
147  return AVERROR_UNKNOWN;
148  }
149  return c->zstream.total_out;
150 }
151 #endif
152 
153 
154 /*
155  *
156  * Decode a frame
157  *
158  */
159 static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
160 {
161  AVFrame *frame = data;
162  const uint8_t *buf = avpkt->data;
163  int buf_size = avpkt->size;
164  LclDecContext * const c = avctx->priv_data;
165  unsigned char *encoded = (unsigned char *)buf;
166  unsigned int pixel_ptr;
167  int row, col;
168  unsigned char *outptr;
169  uint8_t *y_out, *u_out, *v_out;
170  unsigned int width = avctx->width; // Real image width
171  unsigned int height = avctx->height; // Real image height
172  unsigned int mszh_dlen;
173  unsigned char yq, y1q, uq, vq;
174  int uqvq, ret;
175  unsigned int mthread_inlen, mthread_outlen;
176  unsigned int len = buf_size;
177 
178  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
179  av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
180  return ret;
181  }
182 
183  outptr = frame->data[0]; // Output image pointer
184 
185  /* Decompress frame */
186  switch (avctx->codec_id) {
187  case AV_CODEC_ID_MSZH:
188  switch (c->compression) {
189  case COMP_MSZH:
190  if (c->flags & FLAG_MULTITHREAD) {
191  mthread_inlen = AV_RL32(encoded);
192  mthread_inlen = FFMIN(mthread_inlen, len - 8);
193  mthread_outlen = AV_RL32(encoded+4);
194  mthread_outlen = FFMIN(mthread_outlen, c->decomp_size);
195  mszh_dlen = mszh_decomp(encoded + 8, mthread_inlen, c->decomp_buf, c->decomp_size);
196  if (mthread_outlen != mszh_dlen) {
197  av_log(avctx, AV_LOG_ERROR, "Mthread1 decoded size differs (%d != %d)\n",
198  mthread_outlen, mszh_dlen);
199  return AVERROR_INVALIDDATA;
200  }
201  mszh_dlen = mszh_decomp(encoded + 8 + mthread_inlen, len - 8 - mthread_inlen,
202  c->decomp_buf + mthread_outlen, c->decomp_size - mthread_outlen);
203  if (mthread_outlen != mszh_dlen) {
204  av_log(avctx, AV_LOG_ERROR, "Mthread2 decoded size differs (%d != %d)\n",
205  mthread_outlen, mszh_dlen);
206  return AVERROR_INVALIDDATA;
207  }
208  encoded = c->decomp_buf;
209  len = c->decomp_size;
210  } else {
211  mszh_dlen = mszh_decomp(encoded, len, c->decomp_buf, c->decomp_size);
212  if (c->decomp_size != mszh_dlen) {
213  av_log(avctx, AV_LOG_ERROR, "Decoded size differs (%d != %d)\n",
214  c->decomp_size, mszh_dlen);
215  return AVERROR_INVALIDDATA;
216  }
217  encoded = c->decomp_buf;
218  len = mszh_dlen;
219  }
220  break;
221  case COMP_MSZH_NOCOMP: {
222  int bppx2;
223  switch (c->imgtype) {
224  case IMGTYPE_YUV111:
225  case IMGTYPE_RGB24:
226  bppx2 = 6;
227  break;
228  case IMGTYPE_YUV422:
229  case IMGTYPE_YUV211:
230  bppx2 = 4;
231  break;
232  case IMGTYPE_YUV411:
233  case IMGTYPE_YUV420:
234  bppx2 = 3;
235  break;
236  default:
237  bppx2 = 0; // will error out below
238  break;
239  }
240  if (len < ((width * height * bppx2) >> 1))
241  return AVERROR_INVALIDDATA;
242  break;
243  }
244  default:
245  av_log(avctx, AV_LOG_ERROR, "BUG! Unknown MSZH compression in frame decoder.\n");
246  return AVERROR_INVALIDDATA;
247  }
248  break;
249 #if CONFIG_ZLIB_DECODER
250  case AV_CODEC_ID_ZLIB:
251  /* Using the original dll with normal compression (-1) and RGB format
252  * gives a file with ZLIB fourcc, but frame is really uncompressed.
253  * To be sure that's true check also frame size */
254  if (c->compression == COMP_ZLIB_NORMAL && c->imgtype == IMGTYPE_RGB24 &&
255  len == width * height * 3) {
256  if (c->flags & FLAG_PNGFILTER) {
257  memcpy(c->decomp_buf, encoded, len);
258  encoded = c->decomp_buf;
259  } else {
260  break;
261  }
262  } else if (c->flags & FLAG_MULTITHREAD) {
263  mthread_inlen = AV_RL32(encoded);
264  mthread_inlen = FFMIN(mthread_inlen, len - 8);
265  mthread_outlen = AV_RL32(encoded+4);
266  mthread_outlen = FFMIN(mthread_outlen, c->decomp_size);
267  ret = zlib_decomp(avctx, encoded + 8, mthread_inlen, 0, mthread_outlen);
268  if (ret < 0) return ret;
269  ret = zlib_decomp(avctx, encoded + 8 + mthread_inlen, len - 8 - mthread_inlen,
270  mthread_outlen, mthread_outlen);
271  if (ret < 0) return ret;
272  } else {
273  int ret = zlib_decomp(avctx, encoded, len, 0, c->decomp_size);
274  if (ret < 0) return ret;
275  }
276  encoded = c->decomp_buf;
277  len = c->decomp_size;
278  break;
279 #endif
280  default:
281  av_log(avctx, AV_LOG_ERROR, "BUG! Unknown codec in frame decoder compression switch.\n");
282  return AVERROR_INVALIDDATA;
283  }
284 
285 
286  /* Apply PNG filter */
287  if (avctx->codec_id == AV_CODEC_ID_ZLIB && (c->flags & FLAG_PNGFILTER)) {
288  switch (c->imgtype) {
289  case IMGTYPE_YUV111:
290  case IMGTYPE_RGB24:
291  for (row = 0; row < height; row++) {
292  pixel_ptr = row * width * 3;
293  yq = encoded[pixel_ptr++];
294  uqvq = AV_RL16(encoded+pixel_ptr);
295  pixel_ptr += 2;
296  for (col = 1; col < width; col++) {
297  encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
298  uqvq -= AV_RL16(encoded+pixel_ptr+1);
299  AV_WL16(encoded+pixel_ptr+1, uqvq);
300  pixel_ptr += 3;
301  }
302  }
303  break;
304  case IMGTYPE_YUV422:
305  for (row = 0; row < height; row++) {
306  pixel_ptr = row * width * 2;
307  yq = uq = vq =0;
308  for (col = 0; col < width/4; col++) {
309  encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
310  encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
311  encoded[pixel_ptr+2] = yq -= encoded[pixel_ptr+2];
312  encoded[pixel_ptr+3] = yq -= encoded[pixel_ptr+3];
313  encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
314  encoded[pixel_ptr+5] = uq -= encoded[pixel_ptr+5];
315  encoded[pixel_ptr+6] = vq -= encoded[pixel_ptr+6];
316  encoded[pixel_ptr+7] = vq -= encoded[pixel_ptr+7];
317  pixel_ptr += 8;
318  }
319  }
320  break;
321  case IMGTYPE_YUV411:
322  for (row = 0; row < height; row++) {
323  pixel_ptr = row * width / 2 * 3;
324  yq = uq = vq =0;
325  for (col = 0; col < width/4; col++) {
326  encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
327  encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
328  encoded[pixel_ptr+2] = yq -= encoded[pixel_ptr+2];
329  encoded[pixel_ptr+3] = yq -= encoded[pixel_ptr+3];
330  encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
331  encoded[pixel_ptr+5] = vq -= encoded[pixel_ptr+5];
332  pixel_ptr += 6;
333  }
334  }
335  break;
336  case IMGTYPE_YUV211:
337  for (row = 0; row < height; row++) {
338  pixel_ptr = row * width * 2;
339  yq = uq = vq =0;
340  for (col = 0; col < width/2; col++) {
341  encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
342  encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
343  encoded[pixel_ptr+2] = uq -= encoded[pixel_ptr+2];
344  encoded[pixel_ptr+3] = vq -= encoded[pixel_ptr+3];
345  pixel_ptr += 4;
346  }
347  }
348  break;
349  case IMGTYPE_YUV420:
350  for (row = 0; row < height/2; row++) {
351  pixel_ptr = row * width * 3;
352  yq = y1q = uq = vq =0;
353  for (col = 0; col < width/2; col++) {
354  encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
355  encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
356  encoded[pixel_ptr+2] = y1q -= encoded[pixel_ptr+2];
357  encoded[pixel_ptr+3] = y1q -= encoded[pixel_ptr+3];
358  encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
359  encoded[pixel_ptr+5] = vq -= encoded[pixel_ptr+5];
360  pixel_ptr += 6;
361  }
362  }
363  break;
364  default:
365  av_log(avctx, AV_LOG_ERROR, "BUG! Unknown imagetype in pngfilter switch.\n");
366  return AVERROR_INVALIDDATA;
367  }
368  }
369 
370  /* Convert colorspace */
371  y_out = frame->data[0] + (height - 1) * frame->linesize[0];
372  u_out = frame->data[1] + (height - 1) * frame->linesize[1];
373  v_out = frame->data[2] + (height - 1) * frame->linesize[2];
374  switch (c->imgtype) {
375  case IMGTYPE_YUV111:
376  for (row = 0; row < height; row++) {
377  for (col = 0; col < width; col++) {
378  y_out[col] = *encoded++;
379  u_out[col] = *encoded++ + 128;
380  v_out[col] = *encoded++ + 128;
381  }
382  y_out -= frame->linesize[0];
383  u_out -= frame->linesize[1];
384  v_out -= frame->linesize[2];
385  }
386  break;
387  case IMGTYPE_YUV422:
388  for (row = 0; row < height; row++) {
389  for (col = 0; col < width - 3; col += 4) {
390  memcpy(y_out + col, encoded, 4);
391  encoded += 4;
392  u_out[ col >> 1 ] = *encoded++ + 128;
393  u_out[(col >> 1) + 1] = *encoded++ + 128;
394  v_out[ col >> 1 ] = *encoded++ + 128;
395  v_out[(col >> 1) + 1] = *encoded++ + 128;
396  }
397  y_out -= frame->linesize[0];
398  u_out -= frame->linesize[1];
399  v_out -= frame->linesize[2];
400  }
401  break;
402  case IMGTYPE_RGB24:
403  for (row = height - 1; row >= 0; row--) {
404  pixel_ptr = row * frame->linesize[0];
405  memcpy(outptr + pixel_ptr, encoded, 3 * width);
406  encoded += 3 * width;
407  }
408  break;
409  case IMGTYPE_YUV411:
410  for (row = 0; row < height; row++) {
411  for (col = 0; col < width - 3; col += 4) {
412  memcpy(y_out + col, encoded, 4);
413  encoded += 4;
414  u_out[col >> 2] = *encoded++ + 128;
415  v_out[col >> 2] = *encoded++ + 128;
416  }
417  y_out -= frame->linesize[0];
418  u_out -= frame->linesize[1];
419  v_out -= frame->linesize[2];
420  }
421  break;
422  case IMGTYPE_YUV211:
423  for (row = 0; row < height; row++) {
424  for (col = 0; col < width - 1; col += 2) {
425  memcpy(y_out + col, encoded, 2);
426  encoded += 2;
427  u_out[col >> 1] = *encoded++ + 128;
428  v_out[col >> 1] = *encoded++ + 128;
429  }
430  y_out -= frame->linesize[0];
431  u_out -= frame->linesize[1];
432  v_out -= frame->linesize[2];
433  }
434  break;
435  case IMGTYPE_YUV420:
436  u_out = frame->data[1] + ((height >> 1) - 1) * frame->linesize[1];
437  v_out = frame->data[2] + ((height >> 1) - 1) * frame->linesize[2];
438  for (row = 0; row < height - 1; row += 2) {
439  for (col = 0; col < width - 1; col += 2) {
440  memcpy(y_out + col, encoded, 2);
441  encoded += 2;
442  memcpy(y_out + col - frame->linesize[0], encoded, 2);
443  encoded += 2;
444  u_out[col >> 1] = *encoded++ + 128;
445  v_out[col >> 1] = *encoded++ + 128;
446  }
447  y_out -= frame->linesize[0] << 1;
448  u_out -= frame->linesize[1];
449  v_out -= frame->linesize[2];
450  }
451  break;
452  default:
453  av_log(avctx, AV_LOG_ERROR, "BUG! Unknown imagetype in image decoder.\n");
454  return AVERROR_INVALIDDATA;
455  }
456 
457  *got_frame = 1;
458 
459  /* always report that the buffer was completely consumed */
460  return buf_size;
461 }
462 
463 /*
464  *
465  * Init lcl decoder
466  *
467  */
469 {
470  LclDecContext * const c = avctx->priv_data;
471  unsigned int basesize = avctx->width * avctx->height;
472  unsigned int max_basesize = FFALIGN(avctx->width, 4) *
473  FFALIGN(avctx->height, 4);
474  unsigned int max_decomp_size;
475 
476  if (avctx->extradata_size < 8) {
477  av_log(avctx, AV_LOG_ERROR, "Extradata size too small.\n");
478  return AVERROR_INVALIDDATA;
479  }
480 
481  /* Check codec type */
482  if ((avctx->codec_id == AV_CODEC_ID_MSZH && avctx->extradata[7] != CODEC_MSZH) ||
483  (avctx->codec_id == AV_CODEC_ID_ZLIB && avctx->extradata[7] != CODEC_ZLIB)) {
484  av_log(avctx, AV_LOG_ERROR, "Codec id and codec type mismatch. This should not happen.\n");
485  }
486 
487  /* Detect image type */
488  switch (c->imgtype = avctx->extradata[4]) {
489  case IMGTYPE_YUV111:
490  c->decomp_size = basesize * 3;
491  max_decomp_size = max_basesize * 3;
492  avctx->pix_fmt = AV_PIX_FMT_YUV444P;
493  av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 1:1:1.\n");
494  break;
495  case IMGTYPE_YUV422:
496  c->decomp_size = basesize * 2;
497  max_decomp_size = max_basesize * 2;
498  avctx->pix_fmt = AV_PIX_FMT_YUV422P;
499  av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 4:2:2.\n");
500  break;
501  case IMGTYPE_RGB24:
502  c->decomp_size = basesize * 3;
503  max_decomp_size = max_basesize * 3;
504  avctx->pix_fmt = AV_PIX_FMT_BGR24;
505  av_log(avctx, AV_LOG_DEBUG, "Image type is RGB 24.\n");
506  break;
507  case IMGTYPE_YUV411:
508  c->decomp_size = basesize / 2 * 3;
509  max_decomp_size = max_basesize / 2 * 3;
510  avctx->pix_fmt = AV_PIX_FMT_YUV411P;
511  av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 4:1:1.\n");
512  break;
513  case IMGTYPE_YUV211:
514  c->decomp_size = basesize * 2;
515  max_decomp_size = max_basesize * 2;
516  avctx->pix_fmt = AV_PIX_FMT_YUV422P;
517  av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 2:1:1.\n");
518  break;
519  case IMGTYPE_YUV420:
520  c->decomp_size = basesize / 2 * 3;
521  max_decomp_size = max_basesize / 2 * 3;
522  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
523  av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 4:2:0.\n");
524  break;
525  default:
526  av_log(avctx, AV_LOG_ERROR, "Unsupported image format %d.\n", c->imgtype);
527  return AVERROR_INVALIDDATA;
528  }
529 
530  /* Detect compression method */
531  c->compression = (int8_t)avctx->extradata[5];
532  switch (avctx->codec_id) {
533  case AV_CODEC_ID_MSZH:
534  switch (c->compression) {
535  case COMP_MSZH:
536  av_log(avctx, AV_LOG_DEBUG, "Compression enabled.\n");
537  break;
538  case COMP_MSZH_NOCOMP:
539  c->decomp_size = 0;
540  av_log(avctx, AV_LOG_DEBUG, "No compression.\n");
541  break;
542  default:
543  av_log(avctx, AV_LOG_ERROR, "Unsupported compression format for MSZH (%d).\n", c->compression);
544  return AVERROR_INVALIDDATA;
545  }
546  break;
547 #if CONFIG_ZLIB_DECODER
548  case AV_CODEC_ID_ZLIB:
549  switch (c->compression) {
550  case COMP_ZLIB_HISPEED:
551  av_log(avctx, AV_LOG_DEBUG, "High speed compression.\n");
552  break;
553  case COMP_ZLIB_HICOMP:
554  av_log(avctx, AV_LOG_DEBUG, "High compression.\n");
555  break;
556  case COMP_ZLIB_NORMAL:
557  av_log(avctx, AV_LOG_DEBUG, "Normal compression.\n");
558  break;
559  default:
560  if (c->compression < Z_NO_COMPRESSION || c->compression > Z_BEST_COMPRESSION) {
561  av_log(avctx, AV_LOG_ERROR, "Unsupported compression level for ZLIB: (%d).\n", c->compression);
562  return AVERROR_INVALIDDATA;
563  }
564  av_log(avctx, AV_LOG_DEBUG, "Compression level for ZLIB: (%d).\n", c->compression);
565  }
566  break;
567 #endif
568  default:
569  av_log(avctx, AV_LOG_ERROR, "BUG! Unknown codec in compression switch.\n");
570  return AVERROR_INVALIDDATA;
571  }
572 
573  /* Allocate decompression buffer */
574  if (c->decomp_size) {
575  if ((c->decomp_buf = av_malloc(max_decomp_size)) == NULL) {
576  av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n");
577  return AVERROR(ENOMEM);
578  }
579  }
580 
581  /* Detect flags */
582  c->flags = avctx->extradata[6];
583  if (c->flags & FLAG_MULTITHREAD)
584  av_log(avctx, AV_LOG_DEBUG, "Multithread encoder flag set.\n");
585  if (c->flags & FLAG_NULLFRAME)
586  av_log(avctx, AV_LOG_DEBUG, "Nullframe insertion flag set.\n");
587  if (avctx->codec_id == AV_CODEC_ID_ZLIB && (c->flags & FLAG_PNGFILTER))
588  av_log(avctx, AV_LOG_DEBUG, "PNG filter flag set.\n");
589  if (c->flags & FLAGMASK_UNUSED)
590  av_log(avctx, AV_LOG_ERROR, "Unknown flag set (%d).\n", c->flags);
591 
592  /* If needed init zlib */
593 #if CONFIG_ZLIB_DECODER
594  if (avctx->codec_id == AV_CODEC_ID_ZLIB) {
595  int zret;
596  c->zstream.zalloc = Z_NULL;
597  c->zstream.zfree = Z_NULL;
598  c->zstream.opaque = Z_NULL;
599  zret = inflateInit(&c->zstream);
600  if (zret != Z_OK) {
601  av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
602  av_freep(&c->decomp_buf);
603  return AVERROR_UNKNOWN;
604  }
605  }
606 #endif
607 
608  return 0;
609 }
610 
611 /*
612  *
613  * Uninit lcl decoder
614  *
615  */
617 {
618  LclDecContext * const c = avctx->priv_data;
619 
620  av_freep(&c->decomp_buf);
621 #if CONFIG_ZLIB_DECODER
622  if (avctx->codec_id == AV_CODEC_ID_ZLIB)
623  inflateEnd(&c->zstream);
624 #endif
625 
626  return 0;
627 }
628 
629 #if CONFIG_MSZH_DECODER
630 AVCodec ff_mszh_decoder = {
631  .name = "mszh",
632  .long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) MSZH"),
633  .type = AVMEDIA_TYPE_VIDEO,
634  .id = AV_CODEC_ID_MSZH,
635  .priv_data_size = sizeof(LclDecContext),
636  .init = decode_init,
637  .close = decode_end,
638  .decode = decode_frame,
639  .capabilities = CODEC_CAP_DR1,
640 };
641 #endif
642 
643 #if CONFIG_ZLIB_DECODER
644 AVCodec ff_zlib_decoder = {
645  .name = "zlib",
646  .long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"),
647  .type = AVMEDIA_TYPE_VIDEO,
648  .id = AV_CODEC_ID_ZLIB,
649  .priv_data_size = sizeof(LclDecContext),
650  .init = decode_init,
651  .close = decode_end,
652  .decode = decode_frame,
653  .capabilities = CODEC_CAP_DR1,
654 };
655 #endif
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:62
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:54
This structure describes decoded (raw) audio or video data.
Definition: frame.h:107
#define COMP_MSZH
Definition: lcl.h:35
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:70
memory handling functions
int size
Definition: avcodec.h:974
#define COMP_ZLIB_HISPEED
Definition: lcl.h:37
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1247
#define AV_RL16
Definition: intreadwrite.h:42
unsigned int decomp_size
Definition: lcldec.c:65
AVCodec.
Definition: avcodec.h:2755
#define FFALIGN(x, a)
Definition: common.h:62
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
Definition: mimic.c:269
uint8_t
#define FLAG_PNGFILTER
Definition: lcl.h:43
#define av_cold
Definition: attributes.h:66
#define IMGTYPE_YUV211
Definition: lcl.h:32
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:1162
#define COMP_ZLIB_NORMAL
Definition: lcl.h:39
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:711
const char data[16]
Definition: mxf.c:66
int imgtype
Definition: lcldec.c:59
uint8_t * data
Definition: avcodec.h:973
#define IMGTYPE_YUV420
Definition: lcl.h:33
#define IMGTYPE_YUV422
Definition: lcl.h:29
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:123
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: lcldec.c:159
static const uint16_t mask[17]
Definition: lzw.c:38
#define CODEC_ZLIB
Definition: lcl.h:47
#define AVERROR(e)
Definition: error.h:43
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:142
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:144
#define IMGTYPE_RGB24
Definition: lcl.h:30
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:148
const char * name
Name of the codec implementation.
Definition: avcodec.h:2762
#define FLAGMASK_UNUSED
Definition: lcl.h:44
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:69
#define IMGTYPE_YUV111
Definition: lcl.h:28
#define FFMIN(a, b)
Definition: common.h:57
int width
picture width / height.
Definition: avcodec.h:1217
int compression
Definition: lcldec.c:61
#define AV_RL32
Definition: intreadwrite.h:146
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:68
#define IMGTYPE_YUV411
Definition: lcl.h:31
#define CODEC_MSZH
Definition: lcl.h:46
NULL
Definition: eval.c:55
static int width
Definition: utils.c:156
int flags
Definition: lcldec.c:63
unsigned char * decomp_buf
Definition: lcldec.c:67
Libavcodec external API header.
enum AVCodecID codec_id
Definition: avcodec.h:1065
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:125
main external API structure.
Definition: avcodec.h:1054
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:489
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: utils.c:575
#define COMP_ZLIB_HICOMP
Definition: lcl.h:38
int extradata_size
Definition: avcodec.h:1163
#define FLAG_NULLFRAME
Definition: lcl.h:42
static av_cold int decode_end(AVCodecContext *avctx)
Definition: lcldec.c:616
static unsigned int mszh_decomp(const unsigned char *srcptr, int srclen, unsigned char *destptr, unsigned int destsize)
Definition: lcldec.c:78
static av_cold int decode_init(AVCodecContext *avctx)
Definition: lcldec.c:468
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:113
int height
Definition: gxfenc.c:72
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:65
common internal api header.
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:72
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:61
static av_cold int init(AVCodecParserContext *s)
Definition: h264_parser.c:498
void * priv_data
Definition: avcodec.h:1090
int len
#define FLAG_MULTITHREAD
Definition: lcl.h:41
#define COMP_MSZH_NOCOMP
Definition: lcl.h:36
void av_memcpy_backptr(uint8_t *dst, int back, int cnt)
deliberately overlapping memcpy implementation
Definition: mem.c:299
#define AV_WL16(p, d)
Definition: intreadwrite.h:225
This structure stores compressed data.
Definition: avcodec.h:950