Merge commit 'c0b105756f61d253bdabcc2bb49453a2557e7c3b'

* commit 'c0b105756f61d253bdabcc2bb49453a2557e7c3b':
  txd: Use the TextureDSP module for decoding

Conflicts:
	configure
	libavcodec/s3tc.c
	libavcodec/s3tc.h
	libavcodec/txd.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2015-06-22 21:15:50 +02:00
commit a5b2b22d9a
8 changed files with 46 additions and 175 deletions

1
configure vendored
View File

@ -2293,6 +2293,7 @@ truemotion2_decoder_select="bswapdsp"
truespeech_decoder_select="bswapdsp"
tscc_decoder_select="zlib"
twinvq_decoder_select="mdct lsp sinewin"
txd_decoder_select="texturedsp"
utvideo_decoder_select="bswapdsp"
utvideo_encoder_select="bswapdsp huffman huffyuvencdsp"
vble_decoder_select="huffyuvdsp"

View File

@ -485,7 +485,7 @@ OBJS-$(CONFIG_TSCC2_DECODER) += tscc2.o
OBJS-$(CONFIG_TTA_DECODER) += tta.o ttadata.o ttadsp.o
OBJS-$(CONFIG_TTA_ENCODER) += ttaenc.o ttadata.o
OBJS-$(CONFIG_TWINVQ_DECODER) += twinvqdec.o twinvq.o
OBJS-$(CONFIG_TXD_DECODER) += txd.o s3tc.o
OBJS-$(CONFIG_TXD_DECODER) += txd.o
OBJS-$(CONFIG_ULTI_DECODER) += ulti.o
OBJS-$(CONFIG_UTVIDEO_DECODER) += utvideodec.o utvideo.o
OBJS-$(CONFIG_UTVIDEO_ENCODER) += utvideoenc.o utvideo.o

View File

@ -1,102 +0,0 @@
/*
* S3 Texture Compression (S3TC) decoding functions
* Copyright (c) 2007 by Ivo van Poorten
*
* see also: http://wiki.multimedia.cx/index.php?title=S3TC
*
* This file is part of FFmpeg.
*
* 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.
*
* 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avcodec.h"
#include "bytestream.h"
#include "s3tc.h"
static inline void dxt1_decode_pixels(GetByteContext *gb, uint32_t *d,
unsigned int w, unsigned int h,
unsigned int qstride, unsigned int flag,
uint64_t alpha) {
unsigned int x, y, c0, c1, a = (!flag * 255u) << 24;
unsigned int rb0, rb1, rb2, rb3, g0, g1, g2, g3;
uint32_t colors[4], pixels;
c0 = bytestream2_get_le16(gb);
c1 = bytestream2_get_le16(gb);
rb0 = (c0<<3 | c0<<8) & 0xf800f8;
rb1 = (c1<<3 | c1<<8) & 0xf800f8;
rb0 += (rb0>>5) & 0x070007;
rb1 += (rb1>>5) & 0x070007;
g0 = (c0 <<5) & 0x00fc00;
g1 = (c1 <<5) & 0x00fc00;
g0 += (g0 >>6) & 0x000300;
g1 += (g1 >>6) & 0x000300;
colors[0] = rb0 + g0 + a;
colors[1] = rb1 + g1 + a;
if (c0 > c1 || flag) {
rb2 = (((2*rb0+rb1) * 21) >> 6) & 0xff00ff;
rb3 = (((2*rb1+rb0) * 21) >> 6) & 0xff00ff;
g2 = (((2*g0 +g1 ) * 21) >> 6) & 0x00ff00;
g3 = (((2*g1 +g0 ) * 21) >> 6) & 0x00ff00;
colors[3] = rb3 + g3 + a;
} else {
rb2 = ((rb0+rb1) >> 1) & 0xff00ff;
g2 = ((g0 +g1 ) >> 1) & 0x00ff00;
colors[3] = 0;
}
colors[2] = rb2 + g2 + a;
pixels = bytestream2_get_le32(gb);
for (y=0; y<h; y++) {
for (x=0; x<w; x++) {
a = (alpha & 0x0f) << 28;
a += a >> 4;
d[x] = a + colors[pixels&3];
pixels >>= 2;
alpha >>= 4;
}
for (; x<4; x++) {
pixels >>= 2;
alpha >>= 4;
}
d += qstride;
}
}
void ff_decode_dxt1(GetByteContext *gb, uint8_t *dst,
const unsigned int w, const unsigned int h,
const unsigned int stride) {
unsigned int x, y, qstride = stride/4;
uint32_t *d = (uint32_t *) dst;
for (y=0; y < h; y += 4, d += stride-w)
for (x = 0; x < w; d += FFMIN(4, w-x), x += 4)
dxt1_decode_pixels(gb, d, FFMIN(4, w-x), FFMIN(4, h-y), qstride, 0, 0LL);
}
void ff_decode_dxt3(GetByteContext *gb, uint8_t *dst,
const unsigned int w, const unsigned int h,
const unsigned int stride) {
unsigned int x, y, qstride = stride/4;
uint32_t *d = (uint32_t *) dst;
for (y=0; y < h; y += 4, d += stride-w)
for (x = 0; x < w; d += FFMIN(4, w-x), x += 4)
dxt1_decode_pixels(gb, d, FFMIN(4, w-x), FFMIN(4, h-y), qstride, 1, bytestream2_get_le64(gb));
}

View File

@ -1,55 +0,0 @@
/*
* S3 Texture Compression (S3TC) decoding functions
* Copyright (c) 2007 by Ivo van Poorten
*
* This file is part of FFmpeg.
*
* 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.
*
* 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_S3TC_H
#define AVCODEC_S3TC_H
#include <stdint.h>
#include "bytestream.h"
#define FF_S3TC_DXT1 0x31545844
#define FF_S3TC_DXT3 0x33545844
/**
* Decode DXT1 encoded data to RGB32
* @param gb GetByteContext
* @param dst destination buffer
* @param w width of output image
* @param h height of output image
* @param stride line size of output image
*/
void ff_decode_dxt1(GetByteContext *gb, uint8_t *dst,
const unsigned int w, const unsigned int h,
const unsigned int stride);
/**
* Decode DXT3 encoded data to RGB32
* @param gb GetByteContext
* @param dst destination buffer
* @param w width of output image
* @param h height of output image
* @param stride line size of output image
*/
void ff_decode_dxt3(GetByteContext *gb, uint8_t *dst,
const unsigned int w, const unsigned int h,
const unsigned int stride);
#endif /* AVCODEC_S3TC_H */

View File

@ -26,18 +26,25 @@
#include "bytestream.h"
#include "avcodec.h"
#include "internal.h"
#include "s3tc.h"
#include "texturedsp.h"
#define TXD_DXT1 0x31545844
#define TXD_DXT3 0x33545844
static int txd_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
AVPacket *avpkt) {
GetByteContext gb;
TextureDSPContext dxtc;
AVFrame * const p = data;
unsigned int version, w, h, d3d_format, depth, stride, flags;
unsigned int y, v;
uint8_t *ptr;
uint32_t *pal;
int i, j;
int ret;
ff_texturedsp_init(&dxtc);
bytestream2_init(&gb, avpkt->data, avpkt->size);
version = bytestream2_get_le32(&gb);
bytestream2_skip(&gb, 72);
@ -57,7 +64,7 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
if (depth == 8) {
avctx->pix_fmt = AV_PIX_FMT_PAL8;
} else if (depth == 16 || depth == 32) {
avctx->pix_fmt = AV_PIX_FMT_RGB32;
avctx->pix_fmt = AV_PIX_FMT_RGBA;
} else {
av_log(avctx, AV_LOG_ERROR, "depth of %i is unsupported\n", depth);
return AVERROR_PATCHWELCOME;
@ -66,6 +73,9 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
if ((ret = ff_set_dimensions(avctx, w, h)) < 0)
return ret;
avctx->coded_width = FFALIGN(w, 4);
avctx->coded_height = FFALIGN(h, 4);
if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
return ret;
@ -93,15 +103,27 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
case 0:
if (!(flags & 1))
goto unsupported;
case FF_S3TC_DXT1:
case TXD_DXT1:
if (bytestream2_get_bytes_left(&gb) < FF_CEIL_RSHIFT(w, 2) * FF_CEIL_RSHIFT(h, 2) * 8)
return AVERROR_INVALIDDATA;
ff_decode_dxt1(&gb, ptr, w, h, stride);
for (j = 0; j < avctx->height; j += 4) {
for (i = 0; i < avctx->width; i += 4) {
uint8_t *p = ptr + i * 4 + j * stride;
int step = dxtc.dxt1_block(p, stride, gb.buffer);
bytestream2_skip(&gb, step);
}
}
break;
case FF_S3TC_DXT3:
case TXD_DXT3:
if (bytestream2_get_bytes_left(&gb) < FF_CEIL_RSHIFT(w, 2) * FF_CEIL_RSHIFT(h, 2) * 16)
return AVERROR_INVALIDDATA;
ff_decode_dxt3(&gb, ptr, w, h, stride);
for (j = 0; j < avctx->height; j += 4) {
for (i = 0; i < avctx->width; i += 4) {
uint8_t *p = ptr + i * 4 + j * stride;
int step = dxtc.dxt3_block(p, stride, gb.buffer);
bytestream2_skip(&gb, step);
}
}
break;
default:
goto unsupported;

View File

@ -280,6 +280,9 @@ fate-tmv: CMD = framecrc -i $(TARGET_SAMPLES)/tmv/pop-partial.tmv -pix_fmt rgb24
FATE_TXD += fate-txd-16bpp
fate-txd-16bpp: CMD = framecrc -i $(TARGET_SAMPLES)/txd/misc.txd -pix_fmt bgra -an
FATE_TXD += fate-txd-odd
fate-txd-odd: CMD = framecrc -i $(TARGET_SAMPLES)/txd/odd.txd -pix_fmt bgra -an
FATE_TXD += fate-txd-pal8
fate-txd-pal8: CMD = framecrc -i $(TARGET_SAMPLES)/txd/outro.txd -pix_fmt rgb24 -an

View File

@ -1,12 +1,12 @@
#tb 0: 1/5
0, 0, 0, 1, 16384, 0x213f9ea8
0, 1, 1, 1, 16384, 0x8185fdb1
0, 2, 2, 1, 16384, 0xf03581d1
0, 3, 3, 1, 16384, 0x629cd573
0, 4, 4, 1, 16384, 0xfe7a5b63
0, 5, 5, 1, 16384, 0x4afc05b2
0, 6, 6, 1, 16384, 0x074b8515
0, 7, 7, 1, 16384, 0x17fde900
0, 8, 8, 1, 16384, 0x831bac76
0, 9, 9, 1, 16384, 0x2fb579f3
0, 10, 10, 1, 16384, 0x68762bed
0, 0, 0, 1, 16384, 0x4c7bb4cb
0, 1, 1, 1, 16384, 0x914e14b4
0, 2, 2, 1, 16384, 0x81e293cb
0, 3, 3, 1, 16384, 0xf733ed43
0, 4, 4, 1, 16384, 0x739a6c21
0, 5, 5, 1, 16384, 0x47f9184a
0, 6, 6, 1, 16384, 0x329f9d3e
0, 7, 7, 1, 16384, 0x231ffd9c
0, 8, 8, 1, 16384, 0xe7c2c4c6
0, 9, 9, 1, 16384, 0x880d8ffb
0, 10, 10, 1, 16384, 0xf83238d2

2
tests/ref/fate/txd-odd Normal file
View File

@ -0,0 +1,2 @@
#tb 0: 1/5
0, 0, 0, 1, 385452, 0xb22514d6