Merge commit 'd78fd2fa21cde28465e40dd0be4446b1387d22a6'
authorClément Bœsch <u@pkh.me>
Thu, 14 Jul 2016 16:39:46 +0000 (18:39 +0200)
committerClément Bœsch <u@pkh.me>
Thu, 14 Jul 2016 16:52:20 +0000 (18:52 +0200)
* commit 'd78fd2fa21cde28465e40dd0be4446b1387d22a6':
  Add MagicYUV decoder

Changes observed from Libav:
- many cosmetics (function renames/move, spacing, line breaks)
- MagicYUVContext.slices_size is now unsigned
- use of pixdesc (include fixed in FFmpeg)
- mention of "Lossless" in the long name dropped (also removed from
  general.texi in FFmpeg)
- addition of the FF_CODEC_CAP_INIT_THREADSAFE caps
- use of qsort() instead of AV_QSORT() (NOT MERGED)
- use of AVCodecContext.{width,height} instead of AVCodecContext.coded_{width,height} (NOT MERGED)

See also 77f9c4b7aa9eb793b3019025e177245896821816

Merged-by: Clément Bœsch <u@pkh.me>
1  2 
doc/general.texi
libavcodec/codec_desc.c
libavcodec/magicyuv.c

@@@ -742,10 -669,10 +742,10 @@@ following image formats are supported
  @item LCL (LossLess Codec Library) MSZH  @tab     @tab  X
  @item LCL (LossLess Codec Library) ZLIB  @tab  E  @tab  E
  @item LOCO                   @tab     @tab  X
 -@item LucasArts SANM         @tab     @tab  X
 -    @tab Used in LucasArts SMUSH animations.
 +@item LucasArts SANM/Smush   @tab     @tab  X
 +    @tab Used in LucasArts games / SMUSH animations.
  @item lossless MJPEG         @tab  X  @tab  X
- @item MagicYUV Lossless Video @tab     @tab  X
 -@item MagicYUV Lossless Video @tab    @tab  X
++@item MagicYUV Video         @tab     @tab  X
  @item Microsoft ATC Screen   @tab     @tab  X
      @tab Also known as Microsoft Screen 3.
  @item Microsoft Expression Encoder Screen  @tab     @tab  X
@@@ -1518,50 -1406,6 +1518,50 @@@ static const AVCodecDescriptor codec_de
          .name      = "xwd",
          .long_name = NULL_IF_CONFIG_SMALL("XWD (X Window Dump) image"),
          .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
-         .long_name = NULL_IF_CONFIG_SMALL("MagicYUV Lossless Video"),
 +        .mime_types= MT("image/x-xwindowdump"),
 +    },
 +    {
 +        .id        = AV_CODEC_ID_APNG,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "apng",
 +        .long_name = NULL_IF_CONFIG_SMALL("APNG (Animated Portable Network Graphics) image"),
 +        .props     = AV_CODEC_PROP_LOSSLESS,
 +        .mime_types= MT("image/png"),
 +    },
 +    {
 +        .id        = AV_CODEC_ID_CFHD,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "cfhd",
 +        .long_name = NULL_IF_CONFIG_SMALL("Cineform HD"),
 +        .props     = AV_CODEC_PROP_LOSSY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_TRUEMOTION2RT,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "truemotion2rt",
 +        .long_name = NULL_IF_CONFIG_SMALL("Duck TrueMotion 2.0 Real Time"),
 +        .props     = AV_CODEC_PROP_LOSSY,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_MAGICYUV,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "magicyuv",
++        .long_name = NULL_IF_CONFIG_SMALL("MagicYUV video"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_SHEERVIDEO,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "sheervideo",
 +        .long_name = NULL_IF_CONFIG_SMALL("BitJazz SheerVideo"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
 +    },
 +    {
 +        .id        = AV_CODEC_ID_YLC,
 +        .type      = AVMEDIA_TYPE_VIDEO,
 +        .name      = "ylc",
 +        .long_name = NULL_IF_CONFIG_SMALL("YUY2 Lossless Codec"),
 +        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
      },
  
      /* various PCM "codecs" */
@@@ -22,8 -22,8 +22,9 @@@
  #include <stdlib.h>
  #include <string.h>
  
 -#include "../libavutil/pixdesc.h"
++#include "libavutil/pixdesc.h"
 +#include "libavutil/qsort.h"
  #include "avcodec.h"
  #include "bytestream.h"
  #include "get_bits.h"
@@@ -91,7 -84,7 +85,7 @@@ static int huff_build(VLC *vlc, uint8_
          he[i].sym = 255 - i;
          he[i].len = len[i];
      }
-     AV_QSORT(he, 256, HuffEntry, ff_magy_huff_cmp_len);
 -    qsort(he, 256, sizeof(HuffEntry), huff_cmp_len);
++    AV_QSORT(he, 256, HuffEntry, huff_cmp_len);
  
      code = 1;
      for (i = 255; i >= 0; i--) {
@@@ -119,18 -112,21 +113,21 @@@ static int magy_decode_slice(AVCodecCon
      uint8_t *dst;
  
      for (i = 0; i < s->planes; i++) {
 -        int height = AV_CEIL_RSHIFT(FFMIN(s->slice_height, avctx->height - j * s->slice_height), s->vshift[i]);
 -        int width = AV_CEIL_RSHIFT(avctx->width, s->hshift[i]);
+         int left, lefttop, top;
 +        int height = AV_CEIL_RSHIFT(FFMIN(s->slice_height, avctx->coded_height - j * s->slice_height), s->vshift[i]);
 +        int width = AV_CEIL_RSHIFT(avctx->coded_width, s->hshift[i]);
          int sheight = AV_CEIL_RSHIFT(s->slice_height, s->vshift[i]);
-         int fake_stride = p->linesize[i] * (1 + interlaced);
-         int stride = p->linesize[i];
+         ptrdiff_t fake_stride = p->linesize[i] * (1 + interlaced);
+         ptrdiff_t stride = p->linesize[i];
          int flags, pred;
+         int ret = init_get_bits8(&gb, s->buf + s->slices[i][j].start,
+                                  s->slices[i][j].size);
  
-         if ((ret = init_get_bits8(&b, s->buf + s->slices[i][j].start, s->slices[i][j].size)) < 0)
+         if (ret < 0)
              return ret;
  
-         flags = get_bits(&b, 8);
-         pred  = get_bits(&b, 8);
+         flags = get_bits(&gb, 8);
+         pred  = get_bits(&gb, 8);
  
          dst = p->data[i] + j * sheight * stride;
          if (flags & 1) {
@@@ -297,39 -296,41 +297,41 @@@ static int magy_decode_frame(AVCodecCon
          break;
      case 0x6b:
          avctx->pix_fmt = AV_PIX_FMT_GRAY8;
-         s->planes = 1;
          break;
      default:
-         avpriv_request_sample(avctx, "unsupported format: 0x%X", format);
+         avpriv_request_sample(avctx, "Format 0x%X", format);
          return AVERROR_PATCHWELCOME;
      }
+     s->planes = av_pix_fmt_count_planes(avctx->pix_fmt);
  
-     bytestream2_skip(&gb, 2);
-     s->interlaced = !!(bytestream2_get_byte(&gb) & 2);
-     bytestream2_skip(&gb, 3);
+     bytestream2_skip(&gbyte, 2);
+     s->interlaced = !!(bytestream2_get_byte(&gbyte) & 2);
+     bytestream2_skip(&gbyte, 3);
  
-     width  = bytestream2_get_le32(&gb);
-     height = bytestream2_get_le32(&gb);
-     if ((ret = ff_set_dimensions(avctx, width, height)) < 0)
+     width  = bytestream2_get_le32(&gbyte);
+     height = bytestream2_get_le32(&gbyte);
+     ret = ff_set_dimensions(avctx, width, height);
+     if (ret < 0)
          return ret;
  
-     slice_width = bytestream2_get_le32(&gb);
+     slice_width = bytestream2_get_le32(&gbyte);
 -    if (slice_width != width) {
 +    if (slice_width != avctx->coded_width) {
-         avpriv_request_sample(avctx, "unsupported slice width: %d", slice_width);
+         avpriv_request_sample(avctx, "Slice width %"PRIu32, slice_width);
          return AVERROR_PATCHWELCOME;
      }
-     s->slice_height = bytestream2_get_le32(&gb);
-     if ((s->slice_height <= 0) || (s->slice_height > INT_MAX - avctx->coded_height)) {
-         av_log(avctx, AV_LOG_ERROR, "invalid slice height: %d\n", s->slice_height);
+     s->slice_height = bytestream2_get_le32(&gbyte);
 -    if (s->slice_height <= 0 || s->slice_height > INT_MAX - height) {
++    if (s->slice_height <= 0 || s->slice_height > INT_MAX - avctx->coded_height) {
+         av_log(avctx, AV_LOG_ERROR,
+                "invalid slice height: %d\n", s->slice_height);
          return AVERROR_INVALIDDATA;
      }
  
-     bytestream2_skip(&gb, 4);
+     bytestream2_skip(&gbyte, 4);
  
 -    s->nb_slices = (height + s->slice_height - 1) / s->slice_height;
 +    s->nb_slices = (avctx->coded_height + s->slice_height - 1) / s->slice_height;
      if (s->nb_slices > INT_MAX / sizeof(Slice)) {
-         av_log(avctx, AV_LOG_ERROR, "invalid number of slices: %d\n", s->nb_slices);
+         av_log(avctx, AV_LOG_ERROR,
+                "invalid number of slices: %d\n", s->nb_slices);
          return AVERROR_INVALIDDATA;
      }