Commit dc39d0e1 authored by ivo's avatar ivo

add V.Flash PTX decoder


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@8856 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 63123bda
...@@ -81,6 +81,7 @@ version <next> ...@@ -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:
......
...@@ -152,6 +152,7 @@ Codecs: ...@@ -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
......
...@@ -116,6 +116,7 @@ OBJS-$(CONFIG_MSZH_DECODER) += lcl.o ...@@ -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
......
...@@ -116,6 +116,7 @@ void avcodec_register_all(void) ...@@ -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);
......
...@@ -162,6 +162,7 @@ enum CodecID { ...@@ -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; ...@@ -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;
......
/*
* 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
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment