Merge commit '1bcd4a476ba45a7fdf59d1701b8f0e274418cc32'
authorHendrik Leppkes <h.leppkes@gmail.com>
Sat, 26 Sep 2015 09:14:25 +0000 (11:14 +0200)
committerHendrik Leppkes <h.leppkes@gmail.com>
Sat, 26 Sep 2015 09:14:25 +0000 (11:14 +0200)
* commit '1bcd4a476ba45a7fdf59d1701b8f0e274418cc32':
  dxv: Support RAW intermediate compression

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
libavcodec/dxv.c

diff --combined libavcodec/dxv.c
@@@ -2,20 -2,20 +2,20 @@@
   * Resolume DXV decoder
   * Copyright (C) 2015 Vittorio Giovara <vittorio.giovara@gmail.com>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -314,6 -314,15 +314,15 @@@ static int dxv_decompress_lzf(AVCodecCo
      return ff_lzf_uncompress(&ctx->gbc, &ctx->tex_data, &ctx->tex_size);
  }
  
+ static int dxv_decompress_raw(AVCodecContext *avctx)
+ {
+     DXVContext *ctx = avctx->priv_data;
+     GetByteContext *gbc = &ctx->gbc;
+     bytestream2_get_buffer(gbc, ctx->tex_data, ctx->tex_size);
+     return 0;
+ }
  static int dxv_decode(AVCodecContext *avctx, void *data,
                        int *got_frame, AVPacket *avpkt)
  {
          size = tag & 0x00FFFFFF;
          old_type = tag >> 24;
          version_major = (old_type & 0x0F) - 1;
-         msgcomp = "LZF";
+         if (old_type & 0x80) {
+             msgcomp = "RAW";
+             decompress_tex = dxv_decompress_raw;
+         } else {
+             msgcomp = "LZF";
+             decompress_tex = dxv_decompress_lzf;
+         }
  
          if (old_type & 0x40) {
              msgtext = "DXT5";
              av_log(avctx, AV_LOG_ERROR, "Unsupported header (0x%08X)\n.", tag);
              return AVERROR_INVALIDDATA;
          }
-         decompress_tex = dxv_decompress_lzf;
          ctx->tex_rat = 1;
          break;
      }
          version_major = bytestream2_get_byte(gbc) - 1;
          version_minor = bytestream2_get_byte(gbc);
  
-         bytestream2_skip(gbc, 2); // unknown
+         /* Encoder copies texture data when compression is not advantageous. */
+         if (bytestream2_get_byte(gbc)) {
+             msgcomp = "RAW";
+             ctx->tex_rat = 1;
+             decompress_tex = dxv_decompress_raw;
+         }
+         bytestream2_skip(gbc, 1); // unknown
          size = bytestream2_get_le32(gbc);
      }
      av_log(avctx, AV_LOG_DEBUG,
      ret = ff_thread_get_buffer(avctx, &tframe, 0);
      if (ret < 0)
          return ret;
 -    ff_thread_finish_setup(avctx);
  
      /* Now decompress the texture with the standard functions. */
      avctx->execute2(avctx, decompress_texture_thread,