add V.Flash PTX decoder

Originally committed as revision 8856 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Ivo van Poorten 2007-04-29 09:37:07 +00:00
parent 25406e5002
commit b46d68c634
6 changed files with 125 additions and 0 deletions

View File

@ -81,6 +81,7 @@ version <next>
- Bethsoft VID demuxer and video decoder - Bethsoft VID demuxer and video decoder
- CRYO APC demuxer - CRYO APC demuxer
- Atrac3 decoder - Atrac3 decoder
- V.Flash PTX decoder
version 0.4.9-pre1: version 0.4.9-pre1:

View File

@ -152,6 +152,7 @@ Codecs:
msvideo1.c Mike Melanson msvideo1.c Mike Melanson
nuv.c Reimar Doeffinger nuv.c Reimar Doeffinger
oggtheora.c Mans Rullgard oggtheora.c Mans Rullgard
ptx.c Ivo van Poorten
qdm2.c, qdm2data.h Roberto Togni qdm2.c, qdm2data.h Roberto Togni
qdrw.c Kostya Shishkov qdrw.c Kostya Shishkov
qpeg.c Kostya Shishkov qpeg.c Kostya Shishkov

View File

@ -116,6 +116,7 @@ OBJS-$(CONFIG_MSZH_DECODER) += lcl.o
OBJS-$(CONFIG_NUV_DECODER) += nuv.o rtjpeg.o OBJS-$(CONFIG_NUV_DECODER) += nuv.o rtjpeg.o
OBJS-$(CONFIG_PNG_DECODER) += png.o OBJS-$(CONFIG_PNG_DECODER) += png.o
OBJS-$(CONFIG_PNG_ENCODER) += png.o OBJS-$(CONFIG_PNG_ENCODER) += png.o
OBJS-$(CONFIG_PTX_DECODER) += ptx.o
OBJS-$(CONFIG_QDM2_DECODER) += qdm2.o OBJS-$(CONFIG_QDM2_DECODER) += qdm2.o
OBJS-$(CONFIG_QDRAW_DECODER) += qdrw.o OBJS-$(CONFIG_QDRAW_DECODER) += qdrw.o
OBJS-$(CONFIG_QPEG_DECODER) += qpeg.o OBJS-$(CONFIG_QPEG_DECODER) += qpeg.o

View File

@ -116,6 +116,7 @@ void avcodec_register_all(void)
REGISTER_ENCODER(PGMYUV, pgmyuv); REGISTER_ENCODER(PGMYUV, pgmyuv);
REGISTER_ENCDEC (PNG, png); REGISTER_ENCDEC (PNG, png);
REGISTER_ENCODER(PPM, ppm); REGISTER_ENCODER(PPM, ppm);
REGISTER_DECODER(PTX, ptx);
REGISTER_DECODER(QDRAW, qdraw); REGISTER_DECODER(QDRAW, qdraw);
REGISTER_DECODER(QPEG, qpeg); REGISTER_DECODER(QPEG, qpeg);
REGISTER_DECODER(QTRLE, qtrle); REGISTER_DECODER(QTRLE, qtrle);

View File

@ -162,6 +162,7 @@ enum CodecID {
CODEC_ID_SGI, CODEC_ID_SGI,
CODEC_ID_C93, CODEC_ID_C93,
CODEC_ID_BETHSOFTVID, CODEC_ID_BETHSOFTVID,
CODEC_ID_PTX,
/* various PCM "codecs" */ /* various PCM "codecs" */
CODEC_ID_PCM_S16LE= 0x10000, CODEC_ID_PCM_S16LE= 0x10000,
@ -2321,6 +2322,7 @@ extern AVCodec mszh_decoder;
extern AVCodec nuv_decoder; extern AVCodec nuv_decoder;
extern AVCodec oggvorbis_decoder; extern AVCodec oggvorbis_decoder;
extern AVCodec png_decoder; extern AVCodec png_decoder;
extern AVCodec ptx_decoder;
extern AVCodec qdm2_decoder; extern AVCodec qdm2_decoder;
extern AVCodec qdraw_decoder; extern AVCodec qdraw_decoder;
extern AVCodec qpeg_decoder; extern AVCodec qpeg_decoder;

119
libavcodec/ptx.c Normal file
View File

@ -0,0 +1,119 @@
/*
* V.Flash PTX (.ptx) image decoder
* Copyright (c) 2007 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
*
*/
#include "avcodec.h"
typedef struct PTXContext {
AVFrame picture;
} PTXContext;
static int ptx_init(AVCodecContext *avctx) {
PTXContext *s = avctx->priv_data;
avcodec_get_frame_defaults((AVFrame*)&s->picture);
avctx->coded_frame= (AVFrame*)&s->picture;
s->picture.data[0] = NULL;
return 0;
}
static int ptx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
uint8_t *buf, int buf_size) {
PTXContext * const s = avctx->priv_data;
AVFrame *picture = data;
AVFrame * const p = (AVFrame *)&s->picture;
unsigned int offset, w, h, y, stride, bytes_per_pixel;
uint8_t *ptr;
offset = AV_RL16(buf);
w = AV_RL16(buf+8);
h = AV_RL16(buf+10);
bytes_per_pixel = AV_RL16(buf+12) >> 3;
if (bytes_per_pixel != 2) {
av_log(avctx, AV_LOG_ERROR, "image format is not rgb15, please report on ffmpeg-users mailing list\n");
return -1;
}
avctx->pix_fmt = PIX_FMT_RGB555;
if (offset != 0x2c)
av_log(avctx, AV_LOG_WARNING, "offset != 0x2c, untested due to lack of sample files\n");
buf += offset;
if (p->data[0])
avctx->release_buffer(avctx, p);
if (avcodec_check_dimensions(avctx, w, h))
return -1;
if (w != avctx->width || h != avctx->height)
avcodec_set_dimensions(avctx, w, h);
if (avctx->get_buffer(avctx, p) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return -1;
}
p->pict_type = FF_I_TYPE;
ptr = p->data[0];
stride = p->linesize[0];
for (y=0; y<h; y++) {
#ifdef WORDS_BIGENDIAN
unsigned int x;
for (x=0; x<w*bytes_per_pixel; x+=bytes_per_pixel)
ST16(ptr+x, AV_RL16(buf+x));
#else
memcpy(ptr, buf, w*bytes_per_pixel);
#endif
ptr += stride;
buf += w*bytes_per_pixel;
}
*picture = *(AVFrame *)&s->picture;
*data_size = sizeof(AVPicture);
return offset + w*h*bytes_per_pixel;
}
static int ptx_end(AVCodecContext *avctx) {
PTXContext *s = avctx->priv_data;
if(s->picture.data[0])
avctx->release_buffer(avctx, &s->picture);
return 0;
}
AVCodec ptx_decoder = {
"ptx",
CODEC_TYPE_VIDEO,
CODEC_ID_PTX,
sizeof(PTXContext),
ptx_init,
NULL,
ptx_end,
ptx_decode_frame,
0,
NULL
};