ffmpeg-cvslog
Threads by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
July 2006
- 24 participants
- 328 discussions
CVS: ffmpeg/libavcodec kmvc.c, NONE, 1.1 Makefile, 1.250, 1.251 allcodecs.c, 1.134, 1.135 avcodec.h, 1.461, 1.462
by kostya@mplayerhq.hu 03 Apr '07
by kostya@mplayerhq.hu 03 Apr '07
03 Apr '07
Update of /cvsroot/ffmpeg/ffmpeg/libavcodec
In directory mail:/var2/tmp/cvs-serv12938/libavcodec
Modified Files:
Makefile allcodecs.c avcodec.h
Added Files:
kmvc.c
Log Message:
KMVC (used in Worms games) decoder. Works fine with samples from MPHQ
--- NEW FILE: kmvc.c ---
/*
* KMVC decoder
* Copyright (c) 2006 Konstantin Shishkov
*
* This library 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 of the License, or (at your option) any later version.
*
* This library 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 this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/**
* @file kmvc.c
* Karl Morton's Video Codec decoder
*/
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "avcodec.h"
#define KMVC_KEYFRAME 0x80
#define KMVC_PALETTE 0x40
#define KMVC_METHOD 0x0F
/*
* Decoder context
*/
typedef struct KmvcContext {
AVCodecContext *avctx;
AVFrame pic;
int setpal;
int palsize;
uint32_t pal[256];
uint8_t *cur, *prev;
uint8_t *frm0, *frm1;
} KmvcContext;
typedef struct BitBuf {
int bits;
int bitbuf;
} BitBuf;
#define BLK(data, x, y) data[(x) + (y) * 320]
#define kmvc_init_getbits(bb, src) bb.bits = 7; bb.bitbuf = *src++;
#define kmvc_getbit(bb, src, res) {\
res = 0; \
if (bb.bitbuf & (1 << bb.bits)) res = 1; \
bb.bits--; \
if(bb.bits == -1) { \
bb.bitbuf = *src++; \
bb.bits = 7; \
} \
}
static void kmvc_decode_intra_8x8(KmvcContext * ctx, uint8_t * src, int w, int h)
{
BitBuf bb;
int res, val;
int i, j;
int bx, by;
int l0x, l1x, l0y, l1y;
int mx, my;
kmvc_init_getbits(bb, src);
for (by = 0; by < h; by += 8)
for (bx = 0; bx < w; bx += 8) {
kmvc_getbit(bb, src, res);
if (!res) { // fill whole 8x8 block
val = *src++;
for (i = 0; i < 64; i++)
BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val;
} else { // handle four 4x4 subblocks
for (i = 0; i < 4; i++) {
l0x = bx + (i & 1) * 4;
l0y = by + (i & 2) * 2;
kmvc_getbit(bb, src, res);
if (!res) {
kmvc_getbit(bb, src, res);
if (!res) { // fill whole 4x4 block
val = *src++;
for (j = 0; j < 16; j++)
BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val;
} else { // copy block from already decoded place
val = *src++;
mx = val & 0xF;
my = val >> 4;
for (j = 0; j < 16; j++)
BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) =
BLK(ctx->cur, l0x + (j & 3) - mx, l0y + (j >> 2) - my);
}
} else { // descend to 2x2 sub-sub-blocks
for (j = 0; j < 4; j++) {
l1x = l0x + (j & 1) * 2;
l1y = l0y + (j & 2);
kmvc_getbit(bb, src, res);
if (!res) {
kmvc_getbit(bb, src, res);
if (!res) { // fill whole 2x2 block
val = *src++;
BLK(ctx->cur, l1x, l1y) = val;
BLK(ctx->cur, l1x + 1, l1y) = val;
BLK(ctx->cur, l1x, l1y + 1) = val;
BLK(ctx->cur, l1x + 1, l1y + 1) = val;
} else { // copy block from already decoded place
val = *src++;
mx = val & 0xF;
my = val >> 4;
BLK(ctx->cur, l1x, l1y) = BLK(ctx->cur, l1x - mx, l1y - my);
BLK(ctx->cur, l1x + 1, l1y) =
BLK(ctx->cur, l1x + 1 - mx, l1y - my);
BLK(ctx->cur, l1x, l1y + 1) =
BLK(ctx->cur, l1x - mx, l1y + 1 - my);
BLK(ctx->cur, l1x + 1, l1y + 1) =
BLK(ctx->cur, l1x + 1 - mx, l1y + 1 - my);
}
} else { // read values for block
BLK(ctx->cur, l1x, l1y) = *src++;
BLK(ctx->cur, l1x + 1, l1y) = *src++;
BLK(ctx->cur, l1x, l1y + 1) = *src++;
BLK(ctx->cur, l1x + 1, l1y + 1) = *src++;
}
}
}
}
}
}
}
static void kmvc_decode_inter_8x8(KmvcContext * ctx, uint8_t * src, int w, int h)
{
BitBuf bb;
int res, val;
int i, j;
int bx, by;
int l0x, l1x, l0y, l1y;
int mx, my;
kmvc_init_getbits(bb, src);
for (by = 0; by < h; by += 8)
for (bx = 0; bx < w; bx += 8) {
kmvc_getbit(bb, src, res);
if (!res) {
kmvc_getbit(bb, src, res);
if (!res) { // fill whole 8x8 block
val = *src++;
for (i = 0; i < 64; i++)
BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val;
} else { // copy block from previous frame
for (i = 0; i < 64; i++)
BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) =
BLK(ctx->prev, bx + (i & 0x7), by + (i >> 3));
}
} else { // handle four 4x4 subblocks
for (i = 0; i < 4; i++) {
l0x = bx + (i & 1) * 4;
l0y = by + (i & 2) * 2;
kmvc_getbit(bb, src, res);
if (!res) {
kmvc_getbit(bb, src, res);
if (!res) { // fill whole 4x4 block
val = *src++;
for (j = 0; j < 16; j++)
BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val;
} else { // copy block
val = *src++;
mx = (val & 0xF) - 8;
my = (val >> 4) - 8;
for (j = 0; j < 16; j++)
BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) =
BLK(ctx->prev, l0x + (j & 3) + mx, l0y + (j >> 2) + my);
}
} else { // descend to 2x2 sub-sub-blocks
for (j = 0; j < 4; j++) {
l1x = l0x + (j & 1) * 2;
l1y = l0y + (j & 2);
kmvc_getbit(bb, src, res);
if (!res) {
kmvc_getbit(bb, src, res);
if (!res) { // fill whole 2x2 block
val = *src++;
BLK(ctx->cur, l1x, l1y) = val;
BLK(ctx->cur, l1x + 1, l1y) = val;
BLK(ctx->cur, l1x, l1y + 1) = val;
BLK(ctx->cur, l1x + 1, l1y + 1) = val;
} else { // copy block
val = *src++;
mx = (val & 0xF) - 8;
my = (val >> 4) - 8;
BLK(ctx->cur, l1x, l1y) = BLK(ctx->prev, l1x + mx, l1y + my);
BLK(ctx->cur, l1x + 1, l1y) =
BLK(ctx->prev, l1x + 1 + mx, l1y + my);
BLK(ctx->cur, l1x, l1y + 1) =
BLK(ctx->prev, l1x + mx, l1y + 1 + my);
BLK(ctx->cur, l1x + 1, l1y + 1) =
BLK(ctx->prev, l1x + 1 + mx, l1y + 1 + my);
}
} else { // read values for block
BLK(ctx->cur, l1x, l1y) = *src++;
BLK(ctx->cur, l1x + 1, l1y) = *src++;
BLK(ctx->cur, l1x, l1y + 1) = *src++;
BLK(ctx->cur, l1x + 1, l1y + 1) = *src++;
}
}
}
}
}
}
}
static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, uint8_t * buf,
int buf_size)
{
KmvcContext *const ctx = (KmvcContext *) avctx->priv_data;
uint8_t *out, *src;
int i;
int header;
int blocksize;
if (ctx->pic.data[0])
avctx->release_buffer(avctx, &ctx->pic);
ctx->pic.reference = 1;
ctx->pic.buffer_hints = FF_BUFFER_HINTS_VALID;
if (avctx->get_buffer(avctx, &ctx->pic) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return -1;
}
header = buf[0];
buf++;
if (header & KMVC_KEYFRAME) {
ctx->pic.key_frame = 1;
ctx->pic.pict_type = FF_I_TYPE;
} else {
ctx->pic.key_frame = 0;
ctx->pic.pict_type = FF_P_TYPE;
}
if (header & KMVC_PALETTE) {
ctx->pic.palette_has_changed = 1;
// palette starts from index 1 and has 127 entries
for (i = 1; i <= ctx->palsize; i++) {
ctx->pal[i] = (buf[0] << 16) | (buf[1] << 8) | buf[2];
buf += 3;
}
}
if (ctx->setpal) {
ctx->setpal = 0;
ctx->pic.palette_has_changed = 1;
}
/* make the palette available on the way out */
memcpy(ctx->pic.data[1], ctx->pal, 1024);
blocksize = *buf++;
if (blocksize != 8) {
av_log(avctx, AV_LOG_ERROR, "Block size = %i\n", blocksize);
return -1;
}
memset(ctx->cur, 0, 320 * 200);
switch (header & KMVC_METHOD) {
case 3:
kmvc_decode_intra_8x8(ctx, buf, avctx->width, avctx->height);
break;
case 4:
kmvc_decode_inter_8x8(ctx, buf, avctx->width, avctx->height);
break;
default:
av_log(avctx, AV_LOG_ERROR, "Unknown compression method %i\n", header & KMVC_METHOD);
return -1;
}
out = ctx->pic.data[0];
src = ctx->cur;
for (i = 0; i < avctx->height; i++) {
memcpy(out, src, avctx->width);
src += 320;
out += ctx->pic.linesize[0];
}
/* flip buffers */
if (ctx->cur == ctx->frm0) {
ctx->cur = ctx->frm1;
ctx->prev = ctx->frm0;
} else {
ctx->cur = ctx->frm0;
ctx->prev = ctx->frm1;
}
*data_size = sizeof(AVFrame);
*(AVFrame *) data = ctx->pic;
/* always report that the buffer was completely consumed */
return buf_size;
}
/*
* Init kmvc decoder
*/
static int decode_init(AVCodecContext * avctx)
{
KmvcContext *const c = (KmvcContext *) avctx->priv_data;
int i;
c->avctx = avctx;
avctx->has_b_frames = 0;
c->pic.data[0] = NULL;
if (avctx->width > 320 || avctx->height > 200) {
av_log(avctx, AV_LOG_ERROR, "KMVC supports frames <= 320x200\n");
return -1;
}
c->frm0 = av_mallocz(320 * 200);
c->frm1 = av_mallocz(320 * 200);
c->cur = c->frm0;
c->prev = c->frm1;
for (i = 0; i < 256; i++) {
c->pal[i] = i * 0x10101;
}
if (avctx->extradata_size < 12) {
av_log(NULL, 0, "Extradata missing, decoding may not work properly...\n");
c->palsize = 127;
} else {
c->palsize = LE_16(avctx->extradata + 10);
}
if (avctx->extradata_size == 1036) { // palette in extradata
uint8_t *src = avctx->extradata + 12;
for (i = 0; i < c->palsize; i++) {
c->pal[i] = LE_32(src);
src += 4;
}
c->setpal = 1;
}
avctx->pix_fmt = PIX_FMT_PAL8;
return 0;
}
/*
* Uninit kmvc decoder
*/
static int decode_end(AVCodecContext * avctx)
{
KmvcContext *const c = (KmvcContext *) avctx->priv_data;
if (c->frm0)
av_free(c->frm0);
if (c->frm1)
av_free(c->frm1);
if (c->pic.data[0])
avctx->release_buffer(avctx, &c->pic);
return 0;
}
AVCodec kmvc_decoder = {
"kmvc",
CODEC_TYPE_VIDEO,
CODEC_ID_KMVC,
sizeof(KmvcContext),
decode_init,
NULL,
decode_end,
decode_frame
};
Index: Makefile
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/Makefile,v
retrieving revision 1.250
retrieving revision 1.251
diff -u -d -r1.250 -r1.251
--- Makefile 29 Mar 2006 10:59:09 -0000 1.250
+++ Makefile 7 Apr 2006 16:59:57 -0000 1.251
@@ -98,6 +98,9 @@
ifeq ($(CONFIG_INTERPLAY_VIDEO_DECODER),yes)
OBJS+= interplayvideo.o
endif
+ifeq ($(CONFIG_KMVC_DECODER),yes)
+ OBJS+= kmvc.o
+endif
ifneq ($(CONFIG_MSZH_DECODER)$(CONFIG_ZLIB_DECODER)$(CONFIG_ZLIB_ENCODER),)
OBJS+= lcl.o
endif
Index: allcodecs.c
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/allcodecs.c,v
retrieving revision 1.134
retrieving revision 1.135
diff -u -d -r1.134 -r1.135
--- allcodecs.c 31 Mar 2006 13:06:24 -0000 1.134
+++ allcodecs.c 7 Apr 2006 16:59:57 -0000 1.135
@@ -289,6 +289,9 @@
#ifdef CONFIG_LOCO_DECODER
register_avcodec(&loco_decoder);
#endif //CONFIG_LOCO_DECODER
+#ifdef CONFIG_KMVC_DECODER
+ register_avcodec(&kmvc_decoder);
+#endif //CONFIG_KMVC_DECODER
#ifdef CONFIG_WNV1_DECODER
register_avcodec(&wnv1_decoder);
#endif //CONFIG_WNV1_DECODER
Index: avcodec.h
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/avcodec.h,v
retrieving revision 1.461
retrieving revision 1.462
diff -u -d -r1.461 -r1.462
--- avcodec.h 5 Apr 2006 18:56:22 -0000 1.461
+++ avcodec.h 7 Apr 2006 16:59:57 -0000 1.462
@@ -21,8 +21,8 @@
#define AV_STRINGIFY(s) AV_TOSTRING(s)
#define AV_TOSTRING(s) #s
-#define LIBAVCODEC_VERSION_INT ((51<<16)+(8<<8)+0)
-#define LIBAVCODEC_VERSION 51.8.0
+#define LIBAVCODEC_VERSION_INT ((51<<16)+(9<<8)+0)
+#define LIBAVCODEC_VERSION 51.9.0
#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
@@ -120,6 +120,7 @@
CODEC_ID_AVS,
CODEC_ID_SMACKVIDEO,
CODEC_ID_NUV,
+ CODEC_ID_KMVC,
/* various pcm "codecs" */
CODEC_ID_PCM_S16LE= 0x10000,
5
7
CVS: ffmpeg/libavformat tta.c, NONE, 1.1 Makefile, 1.121, 1.122 allformats.c, 1.57, 1.58 avformat.h, 1.141, 1.142
by alex@mplayerhq.hu 30 Mar '07
by alex@mplayerhq.hu 30 Mar '07
30 Mar '07
Update of /cvsroot/ffmpeg/ffmpeg/libavformat
In directory mail:/var2/tmp/cvs-serv22032
Modified Files:
Makefile allformats.c avformat.h
Added Files:
tta.c
Log Message:
tta demuxer, also usable for moving tta audio data into an other container
--- NEW FILE: tta.c ---
/*
* TTA demuxer
* Copyright (c) 2006 Alex Beregszaszi
*
* This library 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 of the License, or (at your option) any later version.
*
* This library 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 this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "avformat.h"
#define ALT_BITSREAM_READER_LE
#include "bitstream.h"
typedef struct {
int totalframes, currentframe;
uint32_t *seektable;
} TTAContext;
static int tta_probe(AVProbeData *p)
{
const uint8_t *d = p->buf;
if (p->buf_size < 4)
return 0;
if (d[0] == 'T' && d[1] == 'T' && d[2] == 'A' && d[3] == '1')
return 80;
return 0;
}
static int tta_read_header(AVFormatContext *s, AVFormatParameters *ap)
{
TTAContext *c = s->priv_data;
AVStream *st;
int i, channels, bps, samplerate, datalen, framelen, start;
start = url_ftell(&s->pb);
if (get_le32(&s->pb) != ff_get_fourcc("TTA1"))
return -1; // not tta file
url_fskip(&s->pb, 2); // FIXME: flags
channels = get_le16(&s->pb);
bps = get_le16(&s->pb);
samplerate = get_le32(&s->pb);
datalen = get_le32(&s->pb);
url_fskip(&s->pb, 4); // header crc
framelen = 1.04489795918367346939 * samplerate;
c->totalframes = datalen / framelen + ((datalen % framelen) ? 1 : 0);
c->currentframe = 0;
c->seektable = av_mallocz(sizeof(uint32_t)*c->totalframes);
if (!c->seektable)
return AVERROR_NOMEM;
for (i = 0; i < c->totalframes; i++)
c->seektable[i] = get_le32(&s->pb);
url_fskip(&s->pb, 4); // seektable crc
st = av_new_stream(s, 0);
// av_set_pts_info(st, 32, 1, 1000);
if (!st)
return AVERROR_NOMEM;
st->codec->codec_type = CODEC_TYPE_AUDIO;
st->codec->codec_id = CODEC_ID_TTA;
st->codec->channels = channels;
st->codec->sample_rate = samplerate;
st->codec->bits_per_sample = bps;
st->codec->extradata_size = url_ftell(&s->pb) - start;
st->codec->extradata = av_mallocz(st->codec->extradata_size);
url_fseek(&s->pb, start, SEEK_SET); // or SEEK_CUR and -size ? :)
get_buffer(&s->pb, st->codec->extradata, st->codec->extradata_size);
return 0;
}
static int tta_read_packet(AVFormatContext *s, AVPacket *pkt)
{
TTAContext *c = s->priv_data;
int ret, size;
// FIXME!
if (c->currentframe > c->totalframes)
size = 0;
else
size = c->seektable[c->currentframe];
c->currentframe++;
if (av_new_packet(pkt, size) < 0)
return AVERROR_IO;
pkt->pos = url_ftell(&s->pb);
pkt->stream_index = 0;
ret = get_buffer(&s->pb, pkt->data, size);
if (ret <= 0) {
av_free_packet(pkt);
return AVERROR_IO;
}
pkt->size = ret;
// av_log(s, AV_LOG_INFO, "TTA packet #%d desired size: %d read size: %d at pos %d\n",
// c->currentframe, size, ret, pkt->pos);
return 0; //ret;
}
static int tta_read_close(AVFormatContext *s)
{
TTAContext *c = s->priv_data;
if (c->seektable)
av_free(c->seektable);
return 0;
}
AVInputFormat tta_iformat = {
"tta",
"true-audio",
sizeof(TTAContext),
tta_probe,
tta_read_header,
tta_read_packet,
tta_read_close,
.extensions = "tta",
};
int tta_init(void)
{
av_register_input_format(&tta_iformat);
return 0;
}
Index: Makefile
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavformat/Makefile,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -d -r1.121 -r1.122
--- Makefile 11 Feb 2006 20:51:26 -0000 1.121
+++ Makefile 12 Feb 2006 02:18:37 -0000 1.122
@@ -23,7 +23,7 @@
nut.o wc3movie.o mp3.o westwood.o segafilm.o idcin.o flic.o \
sierravmd.o matroska.o sol.o electronicarts.o nsvdec.o asf.o \
ogg2.o oggparsevorbis.o oggparsetheora.o oggparseflac.o daud.o aiff.o \
- voc.o
+ voc.o tta.o
# muxers
ifeq ($(CONFIG_MUXERS),yes)
Index: allformats.c
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavformat/allformats.c,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- allformats.c 10 Feb 2006 01:24:32 -0000 1.57
+++ allformats.c 12 Feb 2006 02:18:37 -0000 1.58
@@ -116,6 +116,7 @@
nsvdec_init();
daud_init();
voc_init();
+ tta_init();
#ifdef CONFIG_MUXERS
/* image formats */
Index: avformat.h
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavformat/avformat.h,v
retrieving revision 1.141
retrieving revision 1.142
diff -u -d -r1.141 -r1.142
--- avformat.h 10 Feb 2006 01:24:32 -0000 1.141
+++ avformat.h 12 Feb 2006 02:18:37 -0000 1.142
@@ -555,6 +555,9 @@
/* voc.c */
int voc_init(void);
+/* tta.c */
+int tta_init(void);
+
/* adts.c */
int ff_adts_init(void);
2
1
r5787 - in trunk: MAINTAINERS libavformat/Makefile libavformat/allformats.c libavformat/allformats.h libavformat/gxf.h libavformat/gxfenc.c
by subversion@mplayerhq.hu 01 Sep '06
by subversion@mplayerhq.hu 01 Sep '06
01 Sep '06
Author: bcoudurier
Date: Wed Jul 19 11:38:22 2006
New Revision: 5787
Added:
trunk/libavformat/gxf.h
trunk/libavformat/gxfenc.c
Modified:
trunk/MAINTAINERS
trunk/libavformat/Makefile
trunk/libavformat/allformats.c
trunk/libavformat/allformats.h
Log:
GXF muxer
Modified: trunk/MAINTAINERS
==============================================================================
--- trunk/MAINTAINERS (original)
+++ trunk/MAINTAINERS Wed Jul 19 11:38:22 2006
@@ -191,6 +191,7 @@
flic.c Mike Melanson
flvdec.c, flvenc.c Michael Niedermayer
gxf.c Reimar Doeffinger
+ gxfenc.c Baptiste Coudurier
idcin.c Mike Melanson
idroq.c Mike Melanson
ipmovie.c Mike Melanson
Modified: trunk/libavformat/Makefile
==============================================================================
--- trunk/libavformat/Makefile (original)
+++ trunk/libavformat/Makefile Wed Jul 19 11:38:22 2006
@@ -183,6 +183,10 @@
OBJS-$(CONFIG_OGG_MUXER) += ogg.o
endif
+ifeq ($(CONFIG_GPL),yes)
+OBJS-$(CONFIG_GXF_MUXER) += gxfenc.o
+endif
+
OBJS += $(OBJS-yes)
NAME=avformat
Modified: trunk/libavformat/allformats.c
==============================================================================
--- trunk/libavformat/allformats.c (original)
+++ trunk/libavformat/allformats.c Wed Jul 19 11:38:22 2006
@@ -138,6 +138,9 @@
#ifdef CONFIG_GXF_DEMUXER
av_register_input_format(&gxf_demuxer);
#endif
+#if defined(CONFIG_GXF_MUXER) && defined(CONFIG_GPL)
+ av_register_output_format(&gxf_muxer);
+#endif
#ifdef CONFIG_IDCIN_DEMUXER
av_register_input_format(&idcin_demuxer);
#endif
Modified: trunk/libavformat/allformats.h
==============================================================================
--- trunk/libavformat/allformats.h (original)
+++ trunk/libavformat/allformats.h Wed Jul 19 11:38:22 2006
@@ -35,6 +35,7 @@
extern AVInputFormat video_grab_device_demuxer;
extern AVInputFormat video_grab_device_demuxer;
extern AVInputFormat gxf_demuxer;
+extern AVOutputFormat gxf_muxer;
extern AVInputFormat idcin_demuxer;
extern AVInputFormat roq_demuxer;
extern AVInputFormat image2_demuxer;
Added: trunk/libavformat/gxf.h
==============================================================================
--- (empty file)
+++ trunk/libavformat/gxf.h Wed Jul 19 11:38:22 2006
@@ -0,0 +1,13 @@
+#ifndef FFMPEG_GXF_H
+#define FFMPEG_GXF_H
+
+/* gxf.c */
+typedef enum {
+ PKT_MAP = 0xbc,
+ PKT_MEDIA = 0xbf,
+ PKT_EOS = 0xfb,
+ PKT_FLT = 0xfc,
+ PKT_UMF = 0xfd
+} pkt_type_t;
+
+#endif /* FFMPEG_GXF_H */
Added: trunk/libavformat/gxfenc.c
==============================================================================
--- (empty file)
+++ trunk/libavformat/gxfenc.c Wed Jul 19 11:38:22 2006
@@ -0,0 +1,823 @@
+/*
+ * GXF muxer.
+ * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>.
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This library 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avformat.h"
+#include "gxf.h"
+#include "riff.h"
+
+#define GXF_AUDIO_PACKET_SIZE 65536
+
+typedef struct GXFStreamContext {
+ AVCodecContext *codec;
+ FifoBuffer audio_buffer;
+ uint32_t track_type;
+ uint32_t sample_size;
+ uint32_t sample_rate;
+ uint16_t media_type;
+ uint16_t media_info;
+ uint8_t index;
+ int frame_rate_index;
+ int lines_index;
+ int fields;
+ int iframes;
+ int pframes;
+ int bframes;
+ int p_per_gop;
+ int b_per_gop;
+} GXFStreamContext;
+
+typedef struct GXFContext {
+ uint32_t nb_frames;
+ uint32_t material_flags;
+ uint16_t audio_tracks;
+ uint16_t mpeg_tracks;
+ int64_t creation_time;
+ uint32_t umf_start_offset;
+ uint32_t umf_track_offset;
+ uint32_t umf_media_offset;
+ uint32_t umf_user_data_offset;
+ uint32_t umf_user_data_size;
+ uint32_t umf_length;
+ uint16_t umf_track_size;
+ uint16_t umf_media_size;
+ int audio_written;
+ int sample_rate;
+ int field_number;
+ int flags;
+ AVFormatContext *fc;
+ GXFStreamContext streams[48];
+} GXFContext;
+
+typedef struct GXF_Lines {
+ int height;
+ int index;
+} GXF_Lines;
+
+
+/* FIXME check if it is relevant */
+static const GXF_Lines gxf_lines_tab[] = {
+ { 480, 1 }, /* NTSC */
+ { 512, 1 }, /* NTSC + VBI */
+ { 576, 2 }, /* PAL */
+ { 608, 2 }, /* PAL + VBI */
+ { 1080, 4 },
+ { 720, 6 },
+};
+
+static const CodecTag gxf_media_types[] = {
+ { CODEC_ID_MJPEG , 3 }, /* NTSC */
+ { CODEC_ID_MJPEG , 4 }, /* PAL */
+ { CODEC_ID_PCM_S24LE , 9 },
+ { CODEC_ID_PCM_S16LE , 10 },
+ { CODEC_ID_MPEG2VIDEO, 11 }, /* NTSC */
+ { CODEC_ID_MPEG2VIDEO, 12 }, /* PAL */
+ { CODEC_ID_DVVIDEO , 13 }, /* NTSC */
+ { CODEC_ID_DVVIDEO , 14 }, /* PAL */
+ { CODEC_ID_DVVIDEO , 15 }, /* 50M NTSC */
+ { CODEC_ID_DVVIDEO , 16 }, /* 50M PAL */
+ { CODEC_ID_AC3 , 17 },
+ //{ CODEC_ID_NONE, , 18 }, /* Non compressed 24 bit audio */
+ { CODEC_ID_MPEG2VIDEO, 20 }, /* MPEG HD */
+ { CODEC_ID_MPEG1VIDEO, 22 }, /* NTSC */
+ { CODEC_ID_MPEG1VIDEO, 23 }, /* PAL */
+ { 0, 0 },
+};
+
+#define SERVER_PATH "/space/"
+#define ES_NAME_PATTERN "ES."
+
+static int gxf_find_lines_index(GXFStreamContext *ctx)
+{
+ int i;
+
+ for (i = 0; i < 6; ++i) {
+ if (ctx->codec->height == gxf_lines_tab[i].height) {
+ ctx->lines_index = gxf_lines_tab[i].index;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+static void gxf_write_padding(ByteIOContext *pb, offset_t to_pad)
+{
+ while (to_pad--) {
+ put_byte(pb, 0);
+ }
+}
+
+static offset_t updatePacketSize(ByteIOContext *pb, offset_t pos)
+{
+ offset_t curpos;
+ int size;
+
+ size = url_ftell(pb) - pos;
+ if (size % 4) {
+ gxf_write_padding(pb, 4 - size % 4);
+ size = url_ftell(pb) - pos;
+ }
+ curpos = url_ftell(pb);
+ url_fseek(pb, pos + 6, SEEK_SET);
+ put_be32(pb, size);
+ url_fseek(pb, curpos, SEEK_SET);
+ return curpos - pos;
+}
+
+static offset_t updateSize(ByteIOContext *pb, offset_t pos)
+{
+ offset_t curpos;
+
+ curpos = url_ftell(pb);
+ url_fseek(pb, pos, SEEK_SET);
+ put_be16(pb, curpos - pos - 2);
+ url_fseek(pb, curpos, SEEK_SET);
+ return curpos - pos;
+}
+
+static void gxf_write_packet_header(ByteIOContext *pb, pkt_type_t type)
+{
+ put_be32(pb, 0); /* packet leader for synchro */
+ put_byte(pb, 1);
+ put_byte(pb, type); /* map packet */
+ put_be32(pb, 0); /* size */
+ put_be32(pb, 0); /* reserved */
+ put_byte(pb, 0xE1); /* trailer 1 */
+ put_byte(pb, 0xE2); /* trailer 2 */
+}
+
+static int gxf_write_mpeg_auxiliary(ByteIOContext *pb, GXFStreamContext *ctx)
+{
+ char buffer[1024];
+ int size;
+
+ if (ctx->iframes) {
+ ctx->p_per_gop = ctx->pframes / ctx->iframes;
+ if (ctx->pframes % ctx->iframes)
+ ctx->p_per_gop++;
+ if (ctx->pframes)
+ ctx->b_per_gop = ctx->bframes / ctx->pframes;
+ if (ctx->p_per_gop > 9)
+ ctx->p_per_gop = 9; /* ensure value won't take more than one char */
+ if (ctx->b_per_gop > 9)
+ ctx->b_per_gop = 9; /* ensure value won't take more than one char */
+ }
+ size = snprintf(buffer, 1024, "Ver 1\nBr %.6f\nIpg 1\nPpi %d\nBpiop %d\n"
+ "Pix 0\nCf %d\nCg 1\nSl 7\nnl16 %d\nVi 1\nf1 1\n",
+ (float)ctx->codec->bit_rate, ctx->p_per_gop, ctx->b_per_gop,
+ ctx->codec->pix_fmt == PIX_FMT_YUV422P ? 2 : 1,
+ ctx->codec->height / 16);
+ put_byte(pb, 0x4F);
+ put_byte(pb, size + 1);
+ put_buffer(pb, (uint8_t *)buffer, size + 1);
+ return size + 3;
+}
+
+static int gxf_write_timecode_auxiliary(ByteIOContext *pb, GXFStreamContext *ctx)
+{
+ /* FIXME implement that */
+ put_byte(pb, 0); /* fields */
+ put_byte(pb, 0); /* seconds */
+ put_byte(pb, 0); /* minutes */
+ put_byte(pb, 0); /* flags + hours */
+ /* reserved */
+ put_be32(pb, 0);
+ return 8;
+}
+
+static int gxf_write_track_description(ByteIOContext *pb, GXFStreamContext *stream)
+{
+ offset_t pos;
+
+ /* track description section */
+ put_byte(pb, stream->media_type + 0x80);
+ put_byte(pb, stream->index + 0xC0);
+
+ pos = url_ftell(pb);
+ put_be16(pb, 0); /* size */
+
+ /* media file name */
+ put_byte(pb, 0x4C);
+ put_byte(pb, strlen(ES_NAME_PATTERN) + 3);
+ put_tag(pb, ES_NAME_PATTERN);
+ put_be16(pb, stream->media_info);
+ put_byte(pb, 0);
+
+ if (stream->codec->codec_id != CODEC_ID_MPEG2VIDEO) {
+ /* auxiliary information */
+ put_byte(pb, 0x4D);
+ put_byte(pb, 8);
+ if (stream->codec->codec_id == CODEC_ID_NONE)
+ gxf_write_timecode_auxiliary(pb, stream);
+ else
+ put_le64(pb, 0);
+ }
+
+ /* file system version */
+ put_byte(pb, 0x4E);
+ put_byte(pb, 4);
+ put_be32(pb, 0);
+
+ if (stream->codec->codec_id == CODEC_ID_MPEG2VIDEO)
+ gxf_write_mpeg_auxiliary(pb, stream);
+
+ /* frame rate */
+ put_byte(pb, 0x50);
+ put_byte(pb, 4);
+ put_be32(pb, stream->frame_rate_index);
+
+ /* lines per frame */
+ put_byte(pb, 0x51);
+ put_byte(pb, 4);
+ put_be32(pb, stream->lines_index);
+
+ /* fields per frame */
+ put_byte(pb, 0x52);
+ put_byte(pb, 4);
+ put_be32(pb, stream->fields);
+
+ return updateSize(pb, pos);
+}
+
+static int gxf_write_material_data_section(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos;
+ const char *filename = strrchr(ctx->fc->filename, '/');
+
+ pos = url_ftell(pb);
+ put_be16(pb, 0); /* size */
+
+ /* name */
+ if (filename)
+ filename++;
+ else
+ filename = ctx->fc->filename;
+ put_byte(pb, 0x40);
+ put_byte(pb, strlen(SERVER_PATH) + strlen(filename) + 1);
+ put_tag(pb, SERVER_PATH);
+ put_tag(pb, filename);
+ put_byte(pb, 0);
+
+ /* first field */
+ put_byte(pb, 0x41);
+ put_byte(pb, 4);
+ put_be32(pb, 0);
+
+ /* last field */
+ put_byte(pb, 0x42);
+ put_byte(pb, 4);
+ put_be32(pb, ctx->nb_frames);
+
+ /* reserved */
+ put_byte(pb, 0x43);
+ put_byte(pb, 4);
+ put_be32(pb, 0);
+
+ put_byte(pb, 0x44);
+ put_byte(pb, 4);
+ put_be32(pb, ctx->nb_frames);
+
+ /* estimated size */
+ put_byte(pb, 0x45);
+ put_byte(pb, 4);
+ put_be32(pb, url_fsize(pb) / 1024);
+
+ return updateSize(pb, pos);
+}
+
+static int gxf_write_track_description_section(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos;
+ int i;
+
+ pos = url_ftell(pb);
+ put_be16(pb, 0); /* size */
+ for (i = 0; i < ctx->fc->nb_streams; ++i)
+ gxf_write_track_description(pb, &ctx->streams[i]);
+ return updateSize(pb, pos);
+}
+
+static int gxf_write_map_packet(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos = url_ftell(pb);
+
+ gxf_write_packet_header(pb, PKT_MAP);
+
+ /* preamble */
+ put_byte(pb, 0xE0); /* version */
+ put_byte(pb, 0xFF); /* reserved */
+
+ gxf_write_material_data_section(pb, ctx);
+ gxf_write_track_description_section(pb, ctx);
+
+ return updatePacketSize(pb, pos);
+}
+
+#if 0
+static int gxf_write_flt_packet(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos = url_ftell(pb);
+ int i;
+
+ gxf_write_packet_header(pb, PKT_FLT);
+
+ put_le32(pb, 1000); /* number of fields */
+ put_le32(pb, 0); /* number of active flt entries */
+
+ for (i = 0; i < 1000; ++i) {
+ put_le32(pb, 0);
+ }
+ return updatePacketSize(pb, pos);
+}
+#endif
+
+static int gxf_write_umf_material_description(ByteIOContext *pb, GXFContext *ctx)
+{
+ put_le32(pb, ctx->flags);
+ put_le32(pb, ctx->nb_frames); /* length of the longest track */
+ put_le32(pb, ctx->nb_frames); /* length of the shortest track */
+ put_le32(pb, 0); /* mark in */
+ put_le32(pb, ctx->nb_frames); /* mark out */
+ put_le32(pb, 0); /* timecode mark in */
+ put_le32(pb, ctx->nb_frames); /* timecode mark out */
+ put_le64(pb, ctx->fc->timestamp); /* modification time */
+ put_le64(pb, ctx->fc->timestamp); /* creation time */
+ put_le16(pb, 0); /* reserved */
+ put_le16(pb, 0); /* reserved */
+ put_le16(pb, ctx->audio_tracks);
+ put_le16(pb, 0); /* timecode track count */
+ put_le16(pb, 0); /* reserved */
+ put_le16(pb, ctx->mpeg_tracks);
+ return 48;
+}
+
+static int gxf_write_umf_payload(ByteIOContext *pb, GXFContext *ctx)
+{
+ put_le32(pb, ctx->umf_length); /* total length of the umf data */
+ put_le32(pb, 3); /* version */
+ put_le32(pb, ctx->fc->nb_streams);
+ put_le32(pb, ctx->umf_track_offset); /* umf track section offset */
+ put_le32(pb, ctx->umf_track_size);
+ put_le32(pb, ctx->fc->nb_streams);
+ put_le32(pb, ctx->umf_media_offset);
+ put_le32(pb, ctx->umf_media_size);
+ put_le32(pb, ctx->umf_user_data_offset); /* user data offset */
+ put_le32(pb, ctx->umf_user_data_size); /* user data size */
+ put_le32(pb, 0); /* reserved */
+ put_le32(pb, 0); /* reserved */
+ return 48;
+}
+
+static int gxf_write_umf_track_description(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos = url_ftell(pb);
+ int tracks[255]={0};
+ int i;
+
+ ctx->umf_track_offset = pos - ctx->umf_start_offset;
+ for (i = 0; i < ctx->fc->nb_streams; ++i) {
+ AVStream *st = ctx->fc->streams[i];
+ GXFStreamContext *sc = &ctx->streams[i];
+ int id = 0;
+
+ switch (st->codec->codec_id) {
+ case CODEC_ID_MPEG1VIDEO: id= 'L'; break;
+ case CODEC_ID_MPEG2VIDEO: id= 'M'; break;
+ case CODEC_ID_PCM_S16LE: id= 'A'; break;
+ case CODEC_ID_DVVIDEO: id= sc->track_type == 6 ? 'E' : 'D'; break;
+ case CODEC_ID_MJPEG: id= 'V'; break;
+ }
+ sc->media_info= id << 8;
+ /* FIXME first 10 audio tracks are 0 to 9 next 22 are A to V */
+ sc->media_info |= '0' + (tracks[id]++);
+ put_le16(pb, sc->media_info);
+ put_le16(pb, 1);
+ }
+ return url_ftell(pb) - pos;
+}
+
+static int gxf_write_umf_media_mpeg(ByteIOContext *pb, GXFStreamContext *stream)
+{
+ if (stream->codec->pix_fmt == PIX_FMT_YUV422P)
+ put_le32(pb, 2);
+ else
+ put_le32(pb, 1); /* default to 420 */
+ put_le32(pb, 1); /* closed = 1, open = 0, unknown = 255 */
+ put_le32(pb, 3); /* top = 1, bottom = 2, frame = 3, unknown = 0 */
+ put_le32(pb, 1); /* I picture per GOP */
+ put_le32(pb, stream->p_per_gop);
+ put_le32(pb, stream->b_per_gop);
+ if (stream->codec->codec_id == CODEC_ID_MPEG2VIDEO)
+ put_le32(pb, 2);
+ else if (stream->codec->codec_id == CODEC_ID_MPEG1VIDEO)
+ put_le32(pb, 1);
+ else
+ put_le32(pb, 0);
+ put_le32(pb, 0); /* reserved */
+ return 32;
+}
+
+static int gxf_write_umf_media_timecode(ByteIOContext *pb, GXFStreamContext *track)
+{
+ /* FIXME implement */
+ put_be32(pb, 0); /* drop frame flag */
+ put_be32(pb, 0); /* reserved */
+ put_be32(pb, 0); /* reserved */
+ put_be32(pb, 0); /* reserved */
+ put_be32(pb, 0); /* reserved */
+ put_be32(pb, 0); /* reserved */
+ put_be32(pb, 0); /* reserved */
+ put_be32(pb, 0); /* reserved */
+ return 32;
+}
+
+static int gxf_write_umf_media_dv(ByteIOContext *pb, GXFStreamContext *track)
+{
+ int i;
+
+ for (i = 0; i < 8; i++) {
+ put_be32(pb, 0);
+ }
+ return 32;
+}
+
+static int gxf_write_umf_media_audio(ByteIOContext *pb, GXFStreamContext *track)
+{
+ put_le64(pb, av_dbl2int(1)); /* sound level to begin to */
+ put_le64(pb, av_dbl2int(1)); /* sound level to begin to */
+ put_le32(pb, 0); /* number of fields over which to ramp up sound level */
+ put_le32(pb, 0); /* number of fields over which to ramp down sound level */
+ put_le32(pb, 0); /* reserved */
+ put_le32(pb, 0); /* reserved */
+ return 32;
+}
+
+#if 0
+static int gxf_write_umf_media_mjpeg(ByteIOContext *pb, GXFStreamContext *track)
+{
+ put_be64(pb, 0); /* FIXME FLOAT max chroma quant level */
+ put_be64(pb, 0); /* FIXME FLOAT max luma quant level */
+ put_be64(pb, 0); /* FIXME FLOAT min chroma quant level */
+ put_be64(pb, 0); /* FIXME FLOAT min luma quant level */
+ return 32;
+}
+#endif
+
+static int gxf_write_umf_media_description(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos;
+ int i;
+
+ pos = url_ftell(pb);
+ ctx->umf_media_offset = pos - ctx->umf_start_offset;
+ for (i = 0; i < ctx->fc->nb_streams; ++i) {
+ GXFStreamContext *sc = &ctx->streams[i];
+ char buffer[88];
+ offset_t startpos, curpos;
+ int path_size = strlen(ES_NAME_PATTERN);
+
+ startpos = url_ftell(pb);
+ put_le16(pb, 0); /* length */
+ put_le16(pb, sc->media_info);
+ put_le16(pb, 0); /* reserved */
+ put_le16(pb, 0); /* reserved */
+ put_le32(pb, ctx->nb_frames);
+ put_le32(pb, 0); /* attributes rw, ro */
+ put_le32(pb, 0); /* mark in */
+ put_le32(pb, ctx->nb_frames); /* mark out */
+ strncpy(buffer, ES_NAME_PATTERN, path_size);
+ put_buffer(pb, (uint8_t *)buffer, path_size);
+ put_be16(pb, sc->media_info);
+ put_buffer(pb, (uint8_t *)buffer + path_size + 2, 88 - path_size - 2);
+ put_le32(pb, sc->track_type);
+ put_le32(pb, sc->sample_rate);
+ put_le32(pb, sc->sample_size);
+ put_le32(pb, 0); /* reserved */
+ switch (sc->codec->codec_id) {
+ case CODEC_ID_MPEG2VIDEO:
+ gxf_write_umf_media_mpeg(pb, sc);
+ break;
+ case CODEC_ID_PCM_S16LE:
+ gxf_write_umf_media_audio(pb, sc);
+ break;
+ case CODEC_ID_DVVIDEO:
+ gxf_write_umf_media_dv(pb, sc);
+ break;
+ default:
+ gxf_write_umf_media_timecode(pb, sc); /* 8 0bytes */
+ }
+ curpos = url_ftell(pb);
+ url_fseek(pb, startpos, SEEK_SET);
+ put_le16(pb, curpos - startpos);
+ url_fseek(pb, curpos, SEEK_SET);
+ }
+ return url_ftell(pb) - pos;
+}
+
+static int gxf_write_umf_user_data(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos = url_ftell(pb);
+ ctx->umf_user_data_offset = pos - ctx->umf_start_offset;
+ put_le32(pb, 20);
+ put_le32(pb, 0);
+ put_le16(pb, 0);
+ put_le16(pb, 0);
+ put_le32(pb, 0);
+ put_byte(pb, 0);
+ put_byte(pb, 0);
+ put_byte(pb, 0);
+ put_byte(pb, 0);
+ return 20;
+}
+
+static int gxf_write_umf_packet(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos = url_ftell(pb);
+
+ gxf_write_packet_header(pb, PKT_UMF);
+
+ /* preamble */
+ put_byte(pb, 3); /* first and last (only) packet */
+ put_be32(pb, ctx->umf_length); /* data length */
+
+ ctx->umf_start_offset = url_ftell(pb);
+ gxf_write_umf_payload(pb, ctx);
+ gxf_write_umf_material_description(pb, ctx);
+ ctx->umf_track_size = gxf_write_umf_track_description(pb, ctx);
+ ctx->umf_media_size = gxf_write_umf_media_description(pb, ctx);
+ ctx->umf_user_data_size = gxf_write_umf_user_data(pb, ctx);
+ ctx->umf_length = url_ftell(pb) - ctx->umf_start_offset;
+ return updatePacketSize(pb, pos);
+}
+
+static int gxf_write_header(AVFormatContext *s)
+{
+ ByteIOContext *pb = &s->pb;
+ GXFContext *gxf = s->priv_data;
+ int i;
+
+ gxf->fc = s;
+ gxf->flags |= 0x00080000; /* material is simple clip */
+ for (i = 0; i < s->nb_streams; ++i) {
+ AVStream *st = s->streams[i];
+ GXFStreamContext *sc = &gxf->streams[i];
+
+ sc->codec = st->codec;
+ sc->index = i;
+ sc->media_type = codec_get_tag(gxf_media_types, sc->codec->codec_id);
+ if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
+ if (st->codec->codec_id != CODEC_ID_PCM_S16LE) {
+ av_log(s, AV_LOG_ERROR, "only 16 BIT PCM LE allowed for now\n");
+ return -1;
+ }
+ if (st->codec->sample_rate != 48000) {
+ av_log(s, AV_LOG_ERROR, "only 48000hz sampling rate is allowed\n");
+ return -1;
+ }
+ if (st->codec->channels != 1) {
+ av_log(s, AV_LOG_ERROR, "only mono tracks are allowed\n");
+ return -1;
+ }
+ sc->track_type = 2;
+ sc->sample_rate = st->codec->sample_rate;
+ sc->sample_size = 16;
+ sc->frame_rate_index = -2;
+ sc->lines_index = -2;
+ sc->fields = -2;
+ gxf->audio_tracks++;
+ gxf->flags |= 0x04000000; /* audio is 16 bit pcm */
+ fifo_init(&sc->audio_buffer, 3*GXF_AUDIO_PACKET_SIZE);
+ } else if (sc->codec->codec_type == CODEC_TYPE_VIDEO) {
+ /* FIXME check from time_base ? */
+ if (sc->codec->height == 480 || sc->codec->height == 512) { /* NTSC or NTSC+VBI */
+ sc->frame_rate_index = 5;
+ sc->sample_rate = 60;
+ gxf->flags |= 0x00000080;
+ } else { /* assume PAL */
+ sc->frame_rate_index = 6;
+ sc->media_type++;
+ sc->sample_rate = 50;
+ gxf->flags |= 0x00000040;
+ }
+ gxf->sample_rate = sc->sample_rate;
+ if (gxf_find_lines_index(sc) < 0)
+ sc->lines_index = -1;
+ sc->sample_size = st->codec->bit_rate;
+ sc->fields = 2; /* interlaced */
+ switch (sc->codec->codec_id) {
+ case CODEC_ID_MPEG2VIDEO:
+ sc->track_type = 4;
+ gxf->mpeg_tracks++;
+ gxf->flags |= 0x00008000;
+ break;
+ case CODEC_ID_DVVIDEO:
+ if (sc->codec->pix_fmt == PIX_FMT_YUV422P) {
+ sc->media_type += 2;
+ sc->track_type = 6;
+ gxf->flags |= 0x00002000;
+ } else {
+ sc->track_type = 5;
+ gxf->flags |= 0x00001000;
+ }
+ break;
+ default:
+ av_log(NULL, AV_LOG_ERROR, "video codec not supported\n");
+ return -1;
+ }
+ }
+ }
+ gxf_write_map_packet(pb, gxf);
+ //gxf_write_flt_packet(pb, gxf);
+ gxf_write_umf_packet(pb, gxf);
+ put_flush_packet(pb);
+ return 0;
+}
+
+static int gxf_write_eos_packet(ByteIOContext *pb, GXFContext *ctx)
+{
+ offset_t pos = url_ftell(pb);
+
+ gxf_write_packet_header(pb, PKT_EOS);
+ return updatePacketSize(pb, pos);
+}
+
+static int gxf_write_trailer(AVFormatContext *s)
+{
+ ByteIOContext *pb = &s->pb;
+ GXFContext *gxf = s->priv_data;
+ offset_t end;
+ int i;
+
+ for (i = 0; i < s->nb_streams; ++i) {
+ if (s->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) {
+ fifo_free(&gxf->streams[i].audio_buffer);
+ }
+ if (s->streams[i]->codec->frame_number > gxf->nb_frames)
+ gxf->nb_frames = 2 * s->streams[i]->codec->frame_number;
+ }
+
+ gxf_write_eos_packet(pb, gxf);
+ end = url_ftell(pb);
+ url_fseek(pb, 0, SEEK_SET);
+ /* overwrite map and umf packets with new values */
+ gxf_write_map_packet(pb, gxf);
+ //gxf_write_flt_packet(pb, gxf);
+ gxf_write_umf_packet(pb, gxf);
+ url_fseek(pb, end, SEEK_SET);
+ return 0;
+}
+
+static int gxf_write_media_preamble(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt, int size)
+{
+ GXFStreamContext *sc = &ctx->streams[pkt->stream_index];
+
+ put_byte(pb, sc->media_type);
+ put_byte(pb, sc->index);
+ put_be32(pb, ctx->field_number);
+ if (sc->codec->codec_type == CODEC_TYPE_AUDIO) {
+ put_be16(pb, 0);
+ put_be16(pb, size / 2);
+ } else if (sc->codec->codec_id == CODEC_ID_MPEG2VIDEO) {
+ if (pkt->flags & PKT_FLAG_KEY) {
+ put_byte(pb, 0x0d);
+ sc->iframes++;
+ } else if (pkt->pts != pkt->dts) {
+ put_byte(pb, 0x0f);
+ sc->bframes++;
+ } else {
+ put_byte(pb, 0x0e);
+ sc->pframes++;
+ }
+ put_be24(pb, size);
+ } else if (sc->codec->codec_id == CODEC_ID_DVVIDEO) {
+ put_byte(pb, size / 4096);
+ put_be24(pb, 0);
+ } else
+ put_be32(pb, size);
+ put_be32(pb, ctx->field_number);
+ put_byte(pb, 1); /* flags */
+ put_byte(pb, 0); /* reserved */
+ return 16;
+}
+
+static int gxf_write_media_packet(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt)
+{
+ GXFStreamContext *sc = &ctx->streams[pkt->stream_index];
+ offset_t pos = url_ftell(pb);
+ int padding = 0;
+
+ gxf_write_packet_header(pb, PKT_MEDIA);
+ if (sc->codec->codec_id == CODEC_ID_MPEG2VIDEO && pkt->size % 4) /* MPEG-2 frames must be padded */
+ padding = 4 - pkt->size % 4;
+ gxf_write_media_preamble(pb, ctx, pkt, pkt->size + padding);
+ if (sc->codec->codec_type == CODEC_TYPE_AUDIO)
+ put_buffer(pb, pkt->data, GXF_AUDIO_PACKET_SIZE);
+ else {
+ ctx->field_number += 2;
+ put_buffer(pb, pkt->data, pkt->size);
+ }
+ gxf_write_padding(pb, padding);
+ return updatePacketSize(pb, pos);
+}
+
+static int gxf_write_packet(AVFormatContext *s, AVPacket *pkt)
+{
+ GXFContext *gxf = s->priv_data;
+
+ gxf_write_media_packet(&s->pb, gxf, pkt);
+ put_flush_packet(&s->pb);
+ return 0;
+}
+
+static int gxf_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
+{
+ AVPacketList *pktl, **next_point, *this_pktl;
+ GXFContext *gxf = s->priv_data;
+ GXFStreamContext *sc;
+ int i;
+
+ if (pkt) {
+ sc = &gxf->streams[pkt->stream_index];
+ if (sc->codec->codec_type == CODEC_TYPE_AUDIO) {
+ fifo_write(&sc->audio_buffer, pkt->data, pkt->size, NULL);
+ } else {
+ this_pktl = av_mallocz(sizeof(AVPacketList));
+ this_pktl->pkt = *pkt;
+ if(pkt->destruct == av_destruct_packet)
+ pkt->destruct = NULL; // non shared -> must keep original from being freed
+ else
+ av_dup_packet(&this_pktl->pkt); //shared -> must dup
+ next_point = &s->packet_buffer;
+ while(*next_point){
+ AVStream *st= s->streams[ pkt->stream_index];
+ AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
+ int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
+ int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
+ if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
+ break;
+ next_point= &(*next_point)->next;
+ }
+ this_pktl->next = *next_point;
+ *next_point = this_pktl;
+ }
+ }
+
+ if (gxf->audio_written == gxf->audio_tracks) {
+ if (!s->packet_buffer) {
+ gxf->audio_written = 0;
+ return 0;
+ }
+ pktl = s->packet_buffer;
+ *out = pktl->pkt;
+ s->packet_buffer = pktl->next;
+ av_freep(&pktl);
+ return 1;
+ } else {
+ for (i = 0; i < s->nb_streams; i++) {
+ sc = &gxf->streams[i];
+ if (sc->codec->codec_type == CODEC_TYPE_AUDIO &&
+ (flush || fifo_size(&sc->audio_buffer, NULL) >= GXF_AUDIO_PACKET_SIZE)) {
+ int size = flush ? fifo_size(&sc->audio_buffer, NULL) : GXF_AUDIO_PACKET_SIZE;
+ av_new_packet(out, GXF_AUDIO_PACKET_SIZE);
+ fifo_read(&sc->audio_buffer, out->data, size, NULL);
+ gxf->audio_written++;
+ out->stream_index = i;
+ out->size = size;
+ return 1;
+ }
+ }
+ }
+ av_init_packet(out);
+ return 0;
+}
+
+AVOutputFormat gxf_muxer = {
+ "gxf",
+ "GXF format",
+ NULL,
+ "gxf",
+ sizeof(GXFContext),
+ CODEC_ID_PCM_S16LE,
+ CODEC_ID_MPEG2VIDEO,
+ gxf_write_header,
+ gxf_write_packet,
+ gxf_write_trailer,
+ 0,
+ NULL,
+ gxf_interleave_packet,
+};
2
2
Author: gpoirier
Date: Fri Jun 30 09:50:30 2006
New Revision: 5558
Modified:
trunk/libavcodec/dsputil.c
trunk/libavcodec/utils.c
Log:
Disable w53 and w97 cmp methods when snow encoder is disabled
Patch by Diego 'Flameeyes' Petteno flameeyes AH gentoo PP org
Original thread:
Date: Jun 30, 2006 1:16 AM
Subject: [Ffmpeg-devel] [PATCH] Disable w53 and w97 cmp methods when snow encoder is disabled
Modified: trunk/libavcodec/dsputil.c
==============================================================================
--- trunk/libavcodec/dsputil.c (original)
+++ trunk/libavcodec/dsputil.c Fri Jun 30 09:50:30 2006
@@ -292,8 +292,8 @@
}
-static inline int w_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int w, int h, int type){
#ifdef CONFIG_SNOW_ENCODER //dwt is in snow.c
+static inline int w_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int w, int h, int type){
int s, i, j;
const int dec_count= w==8 ? 3 : 4;
int tmp[32*32];
@@ -360,7 +360,6 @@
}
assert(s>=0);
return s>>9;
-#endif
}
static int w53_8_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h){
@@ -386,6 +385,7 @@
int w97_32_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h){
return w_c(v, pix1, pix2, line_size, 32, h, 0);
}
+#endif
static void get_pixels_c(DCTELEM *restrict block, const uint8_t *pixels, int line_size)
{
@@ -3212,12 +3212,14 @@
case FF_CMP_NSSE:
cmp[i]= c->nsse[i];
break;
+#ifdef CONFIG_SNOW_ENCODER
case FF_CMP_W53:
cmp[i]= c->w53[i];
break;
case FF_CMP_W97:
cmp[i]= c->w97[i];
break;
+#endif
default:
av_log(NULL, AV_LOG_ERROR,"internal error in cmp function selection\n");
}
@@ -4021,10 +4023,12 @@
c->vsse[4]= vsse_intra16_c;
c->nsse[0]= nsse16_c;
c->nsse[1]= nsse8_c;
+#ifdef CONFIG_SNOW_ENCODER
c->w53[0]= w53_16_c;
c->w53[1]= w53_8_c;
c->w97[0]= w97_16_c;
c->w97[1]= w97_8_c;
+#endif
c->add_bytes= add_bytes_c;
c->diff_bytes= diff_bytes_c;
Modified: trunk/libavcodec/utils.c
==============================================================================
--- trunk/libavcodec/utils.c (original)
+++ trunk/libavcodec/utils.c Fri Jun 30 09:50:30 2006
@@ -654,8 +654,10 @@
{"vsad", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_VSAD, INT_MIN, INT_MAX, V|E, "cmp_func"},
{"vsse", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_VSSE, INT_MIN, INT_MAX, V|E, "cmp_func"},
{"nsse", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_NSSE, INT_MIN, INT_MAX, V|E, "cmp_func"},
+#ifdef CONFIG_SNOW_ENCODER
{"w53", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_W53, INT_MIN, INT_MAX, V|E, "cmp_func"},
{"w97", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_W97, INT_MIN, INT_MAX, V|E, "cmp_func"},
+#endif
{"dctmax", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_DCTMAX, INT_MIN, INT_MAX, V|E, "cmp_func"},
{"chroma", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_CHROMA, INT_MIN, INT_MAX, V|E, "cmp_func"},
{"pre_dia_size", NULL, OFFSET(pre_dia_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
6
7
Author: mru
Date: Mon Jul 31 20:58:56 2006
New Revision: 5872
Modified:
trunk/configure
Log:
ignore explicit #warnings in compiler tests
Modified: trunk/configure
==============================================================================
--- trunk/configure (original)
+++ trunk/configure Mon Jul 31 20:58:56 2006
@@ -214,7 +214,7 @@
}
check_cmd(){
- "$@" 2>&1 | tee -a $logfile | { ! grep -q .; }
+ "$@" 2>&1 | tee -a $logfile | { ! grep -E -q -v '#warning|^In file'; }
}
check_cc(){
3
2
r5862 - in trunk/libavcodec: Makefile avcodec.h dsputil.c dsputil.h vc1dsp.c
by subversion@mplayerhq.hu 01 Aug '06
by subversion@mplayerhq.hu 01 Aug '06
01 Aug '06
Author: kostya
Date: Sun Jul 30 05:45:02 2006
New Revision: 5862
Added:
trunk/libavcodec/vc1dsp.c
Modified:
trunk/libavcodec/Makefile
trunk/libavcodec/avcodec.h
trunk/libavcodec/dsputil.c
trunk/libavcodec/dsputil.h
Log:
New functions in DSPContext for VC-1 decoding
Modified: trunk/libavcodec/Makefile
==============================================================================
--- trunk/libavcodec/Makefile (original)
+++ trunk/libavcodec/Makefile Sun Jul 30 05:45:02 2006
@@ -111,7 +111,7 @@
OBJS-$(CONFIG_TSCC_DECODER) += tscc.o
OBJS-$(CONFIG_TTA_DECODER) += tta.o
OBJS-$(CONFIG_ULTI_DECODER) += ulti.o
-OBJS-$(CONFIG_VC1_DECODER) += vc1.o
+OBJS-$(CONFIG_VC1_DECODER) += vc1.o vc1dsp.o
OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o
OBJS-$(CONFIG_VCR1_ENCODER) += vcr1.o
OBJS-$(CONFIG_VMDAUDIO_DECODER) += vmdav.o
Modified: trunk/libavcodec/avcodec.h
==============================================================================
--- trunk/libavcodec/avcodec.h (original)
+++ trunk/libavcodec/avcodec.h Sun Jul 30 05:45:02 2006
@@ -18,7 +18,7 @@
#define AV_TOSTRING(s) #s
#define LIBAVCODEC_VERSION_INT ((51<<16)+(10<<8)+0)
-#define LIBAVCODEC_VERSION 51.10.0
+#define LIBAVCODEC_VERSION 51.11.0
#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
Modified: trunk/libavcodec/dsputil.c
==============================================================================
--- trunk/libavcodec/dsputil.c (original)
+++ trunk/libavcodec/dsputil.c Sun Jul 30 05:45:02 2006
@@ -2588,6 +2588,15 @@
}
#endif /* CONFIG_CAVS_DECODER */
+#if defined(CONFIG_VC1_DECODER) || defined(CONFIG_WMV3_DECODER)
+/* VC-1 specific */
+void ff_vc1dsp_init(DSPContext* c, AVCodecContext *avctx);
+
+void ff_put_vc1_mspel_mc00_c(uint8_t *dst, uint8_t *src, int stride, int rnd) {
+ put_pixels8_c(dst, src, stride, 8);
+}
+#endif /* CONFIG_VC1_DECODER||CONFIG_WMV3_DECODER */
+
static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int w){
uint8_t *cm = cropTbl + MAX_NEG_CROP;
int i;
@@ -4010,6 +4019,9 @@
#ifdef CONFIG_CAVS_DECODER
ff_cavsdsp_init(c,avctx);
#endif
+#if defined(CONFIG_VC1_DECODER) || defined(CONFIG_WMV3_DECODER)
+ ff_vc1dsp_init(c,avctx);
+#endif
c->put_mspel_pixels_tab[0]= put_mspel8_mc00_c;
c->put_mspel_pixels_tab[1]= put_mspel8_mc10_c;
Modified: trunk/libavcodec/dsputil.h
==============================================================================
--- trunk/libavcodec/dsputil.h (original)
+++ trunk/libavcodec/dsputil.h Sun Jul 30 05:45:02 2006
@@ -365,6 +365,18 @@
void (*prefetch)(void *mem, int stride, int h);
void (*shrink[4])(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height);
+
+ /* vc1 functions */
+ void (*vc1_inv_trans_8x8)(DCTELEM *b);
+ void (*vc1_inv_trans_8x4)(DCTELEM *b, int n);
+ void (*vc1_inv_trans_4x8)(DCTELEM *b, int n);
+ void (*vc1_inv_trans_4x4)(DCTELEM *b, int n);
+ void (*vc1_v_overlap)(uint8_t* src, int stride, int rnd);
+ void (*vc1_h_overlap)(uint8_t* src, int stride, int rnd);
+ /* put 8x8 block with bicubic interpolation and quarterpel precision
+ * last argument is actually round value instead of height
+ */
+ op_pixels_func put_vc1_mspel_pixels_tab[16];
} DSPContext;
void dsputil_static_init(void);
Added: trunk/libavcodec/vc1dsp.c
==============================================================================
--- (empty file)
+++ trunk/libavcodec/vc1dsp.c Sun Jul 30 05:45:02 2006
@@ -0,0 +1,451 @@
+/*
+ * VC-1 and WMV3 decoder - DSP functions
+ * Copyright (c) 2006 Konstantin Shishkov
+ *
+ * This library 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 of the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+/**
+* @file vc1dsp.c
+ * VC-1 and WMV3 decoder
+ *
+ */
+
+#include "dsputil.h"
+
+
+/** Apply overlap transform to vertical edge
+*/
+static void vc1_v_overlap_c(uint8_t* src, int stride, int rnd)
+{
+ int i;
+ int a, b, c, d;
+ for(i = 0; i < 8; i++) {
+ a = src[-2*stride];
+ b = src[-stride];
+ c = src[0];
+ d = src[stride];
+
+ src[-2*stride] = clip_uint8((7*a + d + 4 - rnd) >> 3);
+ src[-stride] = clip_uint8((-a + 7*b + c + d + 3 + rnd) >> 3);
+ src[0] = clip_uint8((a + b + 7*c - d + 4 - rnd) >> 3);
+ src[stride] = clip_uint8((a + 7*d + 3 + rnd) >> 3);
+ src++;
+ }
+}
+
+/** Apply overlap transform to horizontal edge
+*/
+static void vc1_h_overlap_c(uint8_t* src, int stride, int rnd)
+{
+ int i;
+ int a, b, c, d;
+ for(i = 0; i < 8; i++) {
+ a = src[-2];
+ b = src[-1];
+ c = src[0];
+ d = src[1];
+
+ src[-2] = clip_uint8((7*a + d + 4 - rnd) >> 3);
+ src[-1] = clip_uint8((-a + 7*b + c + d + 3 + rnd) >> 3);
+ src[0] = clip_uint8((a + b + 7*c - d + 4 - rnd) >> 3);
+ src[1] = clip_uint8((a + 7*d + 3 + rnd) >> 3);
+ src += stride;
+ }
+}
+
+
+/** Do inverse transform on 8x8 block
+*/
+static void vc1_inv_trans_8x8_c(DCTELEM block[64])
+{
+ int i;
+ register int t1,t2,t3,t4,t5,t6,t7,t8;
+ DCTELEM *src, *dst;
+
+ src = block;
+ dst = block;
+ for(i = 0; i < 8; i++){
+ t1 = 12 * (src[0] + src[4]);
+ t2 = 12 * (src[0] - src[4]);
+ t3 = 16 * src[2] + 6 * src[6];
+ t4 = 6 * src[2] - 16 * src[6];
+
+ t5 = t1 + t3;
+ t6 = t2 + t4;
+ t7 = t2 - t4;
+ t8 = t1 - t3;
+
+ t1 = 16 * src[1] + 15 * src[3] + 9 * src[5] + 4 * src[7];
+ t2 = 15 * src[1] - 4 * src[3] - 16 * src[5] - 9 * src[7];
+ t3 = 9 * src[1] - 16 * src[3] + 4 * src[5] + 15 * src[7];
+ t4 = 4 * src[1] - 9 * src[3] + 15 * src[5] - 16 * src[7];
+
+ dst[0] = (t5 + t1 + 4) >> 3;
+ dst[1] = (t6 + t2 + 4) >> 3;
+ dst[2] = (t7 + t3 + 4) >> 3;
+ dst[3] = (t8 + t4 + 4) >> 3;
+ dst[4] = (t8 - t4 + 4) >> 3;
+ dst[5] = (t7 - t3 + 4) >> 3;
+ dst[6] = (t6 - t2 + 4) >> 3;
+ dst[7] = (t5 - t1 + 4) >> 3;
+
+ src += 8;
+ dst += 8;
+ }
+
+ src = block;
+ dst = block;
+ for(i = 0; i < 8; i++){
+ t1 = 12 * (src[ 0] + src[32]);
+ t2 = 12 * (src[ 0] - src[32]);
+ t3 = 16 * src[16] + 6 * src[48];
+ t4 = 6 * src[16] - 16 * src[48];
+
+ t5 = t1 + t3;
+ t6 = t2 + t4;
+ t7 = t2 - t4;
+ t8 = t1 - t3;
+
+ t1 = 16 * src[ 8] + 15 * src[24] + 9 * src[40] + 4 * src[56];
+ t2 = 15 * src[ 8] - 4 * src[24] - 16 * src[40] - 9 * src[56];
+ t3 = 9 * src[ 8] - 16 * src[24] + 4 * src[40] + 15 * src[56];
+ t4 = 4 * src[ 8] - 9 * src[24] + 15 * src[40] - 16 * src[56];
+
+ dst[ 0] = (t5 + t1 + 64) >> 7;
+ dst[ 8] = (t6 + t2 + 64) >> 7;
+ dst[16] = (t7 + t3 + 64) >> 7;
+ dst[24] = (t8 + t4 + 64) >> 7;
+ dst[32] = (t8 - t4 + 64 + 1) >> 7;
+ dst[40] = (t7 - t3 + 64 + 1) >> 7;
+ dst[48] = (t6 - t2 + 64 + 1) >> 7;
+ dst[56] = (t5 - t1 + 64 + 1) >> 7;
+
+ src++;
+ dst++;
+ }
+}
+
+/** Do inverse transform on 8x4 part of block
+*/
+static void vc1_inv_trans_8x4_c(DCTELEM block[64], int n)
+{
+ int i;
+ register int t1,t2,t3,t4,t5,t6,t7,t8;
+ DCTELEM *src, *dst;
+ int off;
+
+ off = n * 32;
+ src = block + off;
+ dst = block + off;
+ for(i = 0; i < 4; i++){
+ t1 = 12 * (src[0] + src[4]);
+ t2 = 12 * (src[0] - src[4]);
+ t3 = 16 * src[2] + 6 * src[6];
+ t4 = 6 * src[2] - 16 * src[6];
+
+ t5 = t1 + t3;
+ t6 = t2 + t4;
+ t7 = t2 - t4;
+ t8 = t1 - t3;
+
+ t1 = 16 * src[1] + 15 * src[3] + 9 * src[5] + 4 * src[7];
+ t2 = 15 * src[1] - 4 * src[3] - 16 * src[5] - 9 * src[7];
+ t3 = 9 * src[1] - 16 * src[3] + 4 * src[5] + 15 * src[7];
+ t4 = 4 * src[1] - 9 * src[3] + 15 * src[5] - 16 * src[7];
+
+ dst[0] = (t5 + t1 + 4) >> 3;
+ dst[1] = (t6 + t2 + 4) >> 3;
+ dst[2] = (t7 + t3 + 4) >> 3;
+ dst[3] = (t8 + t4 + 4) >> 3;
+ dst[4] = (t8 - t4 + 4) >> 3;
+ dst[5] = (t7 - t3 + 4) >> 3;
+ dst[6] = (t6 - t2 + 4) >> 3;
+ dst[7] = (t5 - t1 + 4) >> 3;
+
+ src += 8;
+ dst += 8;
+ }
+
+ src = block + off;
+ dst = block + off;
+ for(i = 0; i < 8; i++){
+ t1 = 17 * (src[ 0] + src[16]);
+ t2 = 17 * (src[ 0] - src[16]);
+ t3 = 22 * src[ 8];
+ t4 = 22 * src[24];
+ t5 = 10 * src[ 8];
+ t6 = 10 * src[24];
+
+ dst[ 0] = (t1 + t3 + t6 + 64) >> 7;
+ dst[ 8] = (t2 - t4 + t5 + 64) >> 7;
+ dst[16] = (t2 + t4 - t5 + 64) >> 7;
+ dst[24] = (t1 - t3 - t6 + 64) >> 7;
+
+ src ++;
+ dst ++;
+ }
+}
+
+/** Do inverse transform on 4x8 parts of block
+*/
+static void vc1_inv_trans_4x8_c(DCTELEM block[64], int n)
+{
+ int i;
+ register int t1,t2,t3,t4,t5,t6,t7,t8;
+ DCTELEM *src, *dst;
+ int off;
+
+ off = n * 4;
+ src = block + off;
+ dst = block + off;
+ for(i = 0; i < 8; i++){
+ t1 = 17 * (src[0] + src[2]);
+ t2 = 17 * (src[0] - src[2]);
+ t3 = 22 * src[1];
+ t4 = 22 * src[3];
+ t5 = 10 * src[1];
+ t6 = 10 * src[3];
+
+ dst[0] = (t1 + t3 + t6 + 4) >> 3;
+ dst[1] = (t2 - t4 + t5 + 4) >> 3;
+ dst[2] = (t2 + t4 - t5 + 4) >> 3;
+ dst[3] = (t1 - t3 - t6 + 4) >> 3;
+
+ src += 8;
+ dst += 8;
+ }
+
+ src = block + off;
+ dst = block + off;
+ for(i = 0; i < 4; i++){
+ t1 = 12 * (src[ 0] + src[32]);
+ t2 = 12 * (src[ 0] - src[32]);
+ t3 = 16 * src[16] + 6 * src[48];
+ t4 = 6 * src[16] - 16 * src[48];
+
+ t5 = t1 + t3;
+ t6 = t2 + t4;
+ t7 = t2 - t4;
+ t8 = t1 - t3;
+
+ t1 = 16 * src[ 8] + 15 * src[24] + 9 * src[40] + 4 * src[56];
+ t2 = 15 * src[ 8] - 4 * src[24] - 16 * src[40] - 9 * src[56];
+ t3 = 9 * src[ 8] - 16 * src[24] + 4 * src[40] + 15 * src[56];
+ t4 = 4 * src[ 8] - 9 * src[24] + 15 * src[40] - 16 * src[56];
+
+ dst[ 0] = (t5 + t1 + 64) >> 7;
+ dst[ 8] = (t6 + t2 + 64) >> 7;
+ dst[16] = (t7 + t3 + 64) >> 7;
+ dst[24] = (t8 + t4 + 64) >> 7;
+ dst[32] = (t8 - t4 + 64 + 1) >> 7;
+ dst[40] = (t7 - t3 + 64 + 1) >> 7;
+ dst[48] = (t6 - t2 + 64 + 1) >> 7;
+ dst[56] = (t5 - t1 + 64 + 1) >> 7;
+
+ src++;
+ dst++;
+ }
+}
+
+/** Do inverse transform on 4x4 part of block
+*/
+static void vc1_inv_trans_4x4_c(DCTELEM block[64], int n)
+{
+ int i;
+ register int t1,t2,t3,t4,t5,t6;
+ DCTELEM *src, *dst;
+ int off;
+
+ off = (n&1) * 4 + (n&2) * 16;
+ src = block + off;
+ dst = block + off;
+ for(i = 0; i < 4; i++){
+ t1 = 17 * (src[0] + src[2]);
+ t2 = 17 * (src[0] - src[2]);
+ t3 = 22 * src[1];
+ t4 = 22 * src[3];
+ t5 = 10 * src[1];
+ t6 = 10 * src[3];
+
+ dst[0] = (t1 + t3 + t6 + 4) >> 3;
+ dst[1] = (t2 - t4 + t5 + 4) >> 3;
+ dst[2] = (t2 + t4 - t5 + 4) >> 3;
+ dst[3] = (t1 - t3 - t6 + 4) >> 3;
+
+ src += 8;
+ dst += 8;
+ }
+
+ src = block + off;
+ dst = block + off;
+ for(i = 0; i < 4; i++){
+ t1 = 17 * (src[ 0] + src[16]);
+ t2 = 17 * (src[ 0] - src[16]);
+ t3 = 22 * src[ 8];
+ t4 = 22 * src[24];
+ t5 = 10 * src[ 8];
+ t6 = 10 * src[24];
+
+ dst[ 0] = (t1 + t3 + t6 + 64) >> 7;
+ dst[ 8] = (t2 - t4 + t5 + 64) >> 7;
+ dst[16] = (t2 + t4 - t5 + 64) >> 7;
+ dst[24] = (t1 - t3 - t6 + 64) >> 7;
+
+ src ++;
+ dst ++;
+ }
+}
+
+/* motion compensation functions */
+
+/** Filter used to interpolate fractional pel values
+ */
+static always_inline uint8_t vc1_mspel_filter(const uint8_t *src, int stride, int mode, int r)
+{
+ switch(mode){
+ case 0: //no shift
+ return src[0];
+ case 1: // 1/4 shift
+ return (-4*src[-stride] + 53*src[0] + 18*src[stride] - 3*src[stride*2] + 32 - r) >> 6;
+ case 2: // 1/2 shift
+ return (-src[-stride] + 9*src[0] + 9*src[stride] - src[stride*2] + 8 - r) >> 4;
+ case 3: // 3/4 shift
+ return (-3*src[-stride] + 18*src[0] + 53*src[stride] - 4*src[stride*2] + 32 - r) >> 6;
+ }
+ return 0; //should not occur
+}
+
+/** Function used to do motion compensation with bicubic interpolation
+ */
+static void vc1_mspel_mc(uint8_t *dst, const uint8_t *src, int stride, int mode, int rnd)
+{
+ int i, j;
+ uint8_t tmp[8*11], *tptr;
+ int m, r;
+
+ m = (mode & 3);
+ r = rnd;
+ src -= stride;
+ tptr = tmp;
+ for(j = 0; j < 11; j++) {
+ for(i = 0; i < 8; i++)
+ tptr[i] = vc1_mspel_filter(src + i, 1, m, r);
+ src += stride;
+ tptr += 8;
+ }
+ r = 1 - rnd;
+ m = (mode >> 2) & 3;
+
+ tptr = tmp + 8;
+ for(j = 0; j < 8; j++) {
+ for(i = 0; i < 8; i++)
+ dst[i] = vc1_mspel_filter(tptr + i, 8, m, r);
+ dst += stride;
+ tptr += 8;
+ }
+}
+
+/* pixel functions - really are entry points to vc1_mspel_mc */
+
+/* this one is defined in dsputil.c */
+void ff_put_vc1_mspel_mc00_c(uint8_t *dst, const uint8_t *src, int stride, int rnd);
+
+static void ff_put_vc1_mspel_mc10_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x1, rnd);
+}
+
+static void ff_put_vc1_mspel_mc20_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x2, rnd);
+}
+
+static void ff_put_vc1_mspel_mc30_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x3, rnd);
+}
+
+static void ff_put_vc1_mspel_mc01_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x4, rnd);
+}
+
+static void ff_put_vc1_mspel_mc11_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x5, rnd);
+}
+
+static void ff_put_vc1_mspel_mc21_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x6, rnd);
+}
+
+static void ff_put_vc1_mspel_mc31_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x7, rnd);
+}
+
+static void ff_put_vc1_mspel_mc02_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x8, rnd);
+}
+
+static void ff_put_vc1_mspel_mc12_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0x9, rnd);
+}
+
+static void ff_put_vc1_mspel_mc22_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0xA, rnd);
+}
+
+static void ff_put_vc1_mspel_mc32_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0xB, rnd);
+}
+
+static void ff_put_vc1_mspel_mc03_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0xC, rnd);
+}
+
+static void ff_put_vc1_mspel_mc13_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0xD, rnd);
+}
+
+static void ff_put_vc1_mspel_mc23_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0xE, rnd);
+}
+
+static void ff_put_vc1_mspel_mc33_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) {
+ vc1_mspel_mc(dst, src, stride, 0xF, rnd);
+}
+
+void ff_vc1dsp_init(DSPContext* dsp, AVCodecContext *avctx) {
+ dsp->vc1_inv_trans_8x8 = vc1_inv_trans_8x8_c;
+ dsp->vc1_inv_trans_4x8 = vc1_inv_trans_4x8_c;
+ dsp->vc1_inv_trans_8x4 = vc1_inv_trans_8x4_c;
+ dsp->vc1_inv_trans_4x4 = vc1_inv_trans_4x4_c;
+ dsp->vc1_h_overlap = vc1_h_overlap_c;
+ dsp->vc1_v_overlap = vc1_v_overlap_c;
+
+ dsp->put_vc1_mspel_pixels_tab[ 0] = ff_put_vc1_mspel_mc00_c;
+ dsp->put_vc1_mspel_pixels_tab[ 1] = ff_put_vc1_mspel_mc10_c;
+ dsp->put_vc1_mspel_pixels_tab[ 2] = ff_put_vc1_mspel_mc20_c;
+ dsp->put_vc1_mspel_pixels_tab[ 3] = ff_put_vc1_mspel_mc30_c;
+ dsp->put_vc1_mspel_pixels_tab[ 4] = ff_put_vc1_mspel_mc01_c;
+ dsp->put_vc1_mspel_pixels_tab[ 5] = ff_put_vc1_mspel_mc11_c;
+ dsp->put_vc1_mspel_pixels_tab[ 6] = ff_put_vc1_mspel_mc21_c;
+ dsp->put_vc1_mspel_pixels_tab[ 7] = ff_put_vc1_mspel_mc31_c;
+ dsp->put_vc1_mspel_pixels_tab[ 8] = ff_put_vc1_mspel_mc02_c;
+ dsp->put_vc1_mspel_pixels_tab[ 9] = ff_put_vc1_mspel_mc12_c;
+ dsp->put_vc1_mspel_pixels_tab[10] = ff_put_vc1_mspel_mc22_c;
+ dsp->put_vc1_mspel_pixels_tab[11] = ff_put_vc1_mspel_mc32_c;
+ dsp->put_vc1_mspel_pixels_tab[12] = ff_put_vc1_mspel_mc03_c;
+ dsp->put_vc1_mspel_pixels_tab[13] = ff_put_vc1_mspel_mc13_c;
+ dsp->put_vc1_mspel_pixels_tab[14] = ff_put_vc1_mspel_mc23_c;
+ dsp->put_vc1_mspel_pixels_tab[15] = ff_put_vc1_mspel_mc33_c;
+}
4
3
Author: diego
Date: Tue Aug 1 00:34:51 2006
New Revision: 5875
Modified:
trunk/common.mak
Log:
prettyprinting cosmetics
Modified: trunk/common.mak
==============================================================================
--- trunk/common.mak (original)
+++ trunk/common.mak Tue Aug 1 00:34:51 2006
@@ -67,9 +67,9 @@
install $(INSTALLSTRIP) -m 755 $(SLIBNAME) \
$(shlibdir)/$(SLIBNAME_WITH_VERSION)
ln -sf $(SLIBNAME_WITH_VERSION) \
- $(shlibdir)/$(SLIBNAME_WITH_MAJOR)
+ $(shlibdir)/$(SLIBNAME_WITH_MAJOR)
ln -sf $(SLIBNAME_WITH_VERSION) \
- $(shlibdir)/$(SLIBNAME)
+ $(shlibdir)/$(SLIBNAME)
endif
install-lib-static: $(LIB)
@@ -89,8 +89,8 @@
-rm -f $(prefix)/$(SLIBNAME)
else
-rm -f $(libdir)/$(SLIBNAME_WITH_MAJOR) \
- $(libdir)/$(SLIBNAME) \
- $(libdir)/$(SLIBNAME_WITH_VERSION)
+ $(libdir)/$(SLIBNAME) \
+ $(libdir)/$(SLIBNAME_WITH_VERSION)
endif
-rm -f $(libdir)/$(LIB)
1
0
Author: diego
Date: Tue Aug 1 00:30:32 2006
New Revision: 5874
Modified:
trunk/common.mak
Log:
Create $(shlibdir), not $(libdir) for shared libs.
Modified: trunk/common.mak
==============================================================================
--- trunk/common.mak (original)
+++ trunk/common.mak Tue Aug 1 00:30:32 2006
@@ -60,7 +60,7 @@
install-libs: $(INSTLIBTARGETS)
install-lib-shared: $(SLIBNAME)
- install -d "$(libdir)"
+ install -d "$(shlibdir)"
ifeq ($(CONFIG_MINGW),yes)
install $(INSTALLSTRIP) -m 755 $(SLIBNAME) "$(prefix)"
else
1
0
r5873 - in trunk: configure libavcodec/Makefile libavcodec/allcodecs.c libavcodec/avcodec.h libavcodec/oggtheora.c
by subversion@mplayerhq.hu 31 Jul '06
by subversion@mplayerhq.hu 31 Jul '06
31 Jul '06
Author: mru
Date: Mon Jul 31 22:56:15 2006
New Revision: 5873
Removed:
trunk/libavcodec/oggtheora.c
Modified:
trunk/configure
trunk/libavcodec/Makefile
trunk/libavcodec/allcodecs.c
trunk/libavcodec/avcodec.h
Log:
remove libtheora wrapper
Modified: trunk/configure
==============================================================================
--- trunk/configure (original)
+++ trunk/configure Mon Jul 31 22:56:15 2006
@@ -411,7 +411,6 @@
mp3lame="no"
libogg="no"
vorbis="no"
-theora="no"
faad="no"
faadbin="no"
faac="no"
@@ -909,14 +908,6 @@
exit 1;
fi
-if test "$theora" = "yes" ; then
- if test "$libogg" = "no"; then
- echo "libogg must be enabled to enable Theora."
- fail="yes"
- theora="no"
- fi
-fi
-
if test "$vorbis" = "yes" ; then
if test "$libogg" = "no"; then
echo "libogg must be enabled to enable Vorbis."
@@ -1256,7 +1247,6 @@
enabled mp3lame && require LAME lame/lame.h lame_init -lmp3lame
enabled vorbis && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbis -lvorbisenc -logg
enabled libogg && require libogg ogg/ogg.h ogg_sync_init -logg
-enabled theora && require libtheora theora/theora.h theora_info_init -ltheora
enabled xvid && require XviD xvid.h xvid_global -lxvidcore
enabled x264 && require x264 x264.h x264_encoder_open -lx264
enabled dc1394 && require libdc1394 libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394
@@ -1881,11 +1871,6 @@
echo "CONFIG_LIBVORBIS=yes" >> config.mak
fi
-if test "$theora" = "yes" ; then
- echo "#define CONFIG_LIBTHEORA 1" >> $TMPH
- echo "CONFIG_LIBTHEORA=yes" >> config.mak
-fi
-
if test "$faad" = "yes" ; then
echo "#define CONFIG_FAAD 1" >> $TMPH
echo "CONFIG_FAAD=yes" >> config.mak
Modified: trunk/libavcodec/Makefile
==============================================================================
--- trunk/libavcodec/Makefile (original)
+++ trunk/libavcodec/Makefile Mon Jul 31 22:56:15 2006
@@ -210,7 +210,6 @@
OBJS-$(CONFIG_X264) += x264.o
OBJS-$(CONFIG_MP3LAME) += mp3lameaudio.o
OBJS-$(CONFIG_LIBVORBIS) += oggvorbis.o
-OBJS-$(CONFIG_LIBTHEORA) += oggtheora.o
OBJS-$(CONFIG_LIBGSM) += libgsm.o
# currently using liba52 for ac3 decoding
Modified: trunk/libavcodec/allcodecs.c
==============================================================================
--- trunk/libavcodec/allcodecs.c (original)
+++ trunk/libavcodec/allcodecs.c Mon Jul 31 22:56:15 2006
@@ -59,11 +59,6 @@
register_avcodec(&oggvorbis_decoder);
#endif //CONFIG_OGGVORBIS_DECODER
#endif
-#ifdef CONFIG_LIBTHEORA
-#ifdef CONFIG_OGGTHEORA_DECODER
- register_avcodec(&oggtheora_decoder);
-#endif //CONFIG_OGGTHEORA_DECODER
-#endif
#ifdef CONFIG_FAAC
#ifdef CONFIG_FAAC_ENCODER
register_avcodec(&faac_encoder);
@@ -375,7 +370,7 @@
#ifdef CONFIG_VP3_DECODER
register_avcodec(&vp3_decoder);
#endif //CONFIG_VP3_DECODER
-#if (defined CONFIG_THEORA_DECODER && !defined CONFIG_LIBTHEORA)
+#ifdef CONFIG_THEORA_DECODER
register_avcodec(&theora_decoder);
#endif //CONFIG_THEORA_DECODER
#ifdef CONFIG_ASV1_DECODER
Modified: trunk/libavcodec/avcodec.h
==============================================================================
--- trunk/libavcodec/avcodec.h (original)
+++ trunk/libavcodec/avcodec.h Mon Jul 31 22:56:15 2006
@@ -201,8 +201,6 @@
CODEC_ID_TTA,
CODEC_ID_SMACKAUDIO,
- CODEC_ID_OGGTHEORA= 0x16000,
-
/* subtitle codecs */
CODEC_ID_DVD_SUBTITLE= 0x17000,
CODEC_ID_DVB_SUBTITLE,
@@ -2186,7 +2184,6 @@
extern AVCodec huffyuv_decoder;
extern AVCodec ffvhuff_decoder;
extern AVCodec oggvorbis_decoder;
-extern AVCodec oggtheora_decoder;
extern AVCodec cyuv_decoder;
extern AVCodec h264_decoder;
extern AVCodec indeo3_decoder;
1
0
Author: bcoudurier
Date: Mon Jul 31 17:26:33 2006
New Revision: 5871
Modified:
trunk/libavformat/mxf.c
Log:
simplify using function table
Modified: trunk/libavformat/mxf.c
==============================================================================
--- trunk/libavformat/mxf.c (original)
+++ trunk/libavformat/mxf.c Mon Jul 31 17:26:33 2006
@@ -143,21 +143,10 @@
enum CodecID id;
} MXFCodecUL;
-static const UID mxf_metadata_preface_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2F,0x00 };
-static const UID mxf_metadata_content_storage_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 };
-static const UID mxf_metadata_source_package_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 };
-static const UID mxf_metadata_material_package_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 };
-static const UID mxf_metadata_sequence_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 };
-static const UID mxf_metadata_source_clip_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 };
-static const UID mxf_metadata_multiple_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 };
-static const UID mxf_metadata_generic_sound_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 };
-static const UID mxf_metadata_cdci_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 };
-static const UID mxf_metadata_rgba_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 };
-static const UID mxf_metadata_mpegvideo_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 };
-static const UID mxf_metadata_wave_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 };
-static const UID mxf_metadata_aes3_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 };
-static const UID mxf_metadata_static_track_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 };
-static const UID mxf_metadata_track_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3b,0x00 };
+typedef struct MXFMetadataReadTableEntry {
+ const UID key;
+ int (*read)(MXFContext *mxf, KLVPacket *klv);
+} MXFMetadataReadTableEntry;
/* partial keys to match */
static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 };
@@ -838,14 +827,34 @@
return 0;
}
+static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = {
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2F,0x00 }, mxf_read_metadata_preface },
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_metadata_content_storage },
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_metadata_source_package },
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_metadata_material_package },
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 }, mxf_read_metadata_sequence },
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_metadata_source_clip },
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_metadata_multiple_descriptor },
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 }, mxf_read_metadata_generic_descriptor }, /* Generic Sound */
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_metadata_generic_descriptor }, /* CDCI */
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_metadata_generic_descriptor }, /* RGBA */
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_metadata_generic_descriptor }, /* MPEG 2 Video */
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_metadata_generic_descriptor }, /* Wave */
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_metadata_generic_descriptor }, /* AES3 */
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_metadata_track }, /* Static Track */
+ { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_metadata_track }, /* Generic Track */
+ { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL },
+};
+
static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap)
{
MXFContext *mxf = s->priv_data;
KLVPacket klv;
- int ret = 0;
mxf->fc = s;
while (!url_feof(&s->pb)) {
+ const MXFMetadataReadTableEntry *function;
+
if (klv_read_packet(&klv, &s->pb) < 0) {
av_log(s, AV_LOG_ERROR, "error reading KLV packet\n");
return -1;
@@ -853,46 +862,23 @@
#ifdef DEBUG
PRINT_KEY(klv.key);
#endif
- if (IS_KLV_KEY(klv.key, mxf_metadata_track_key))
- ret = mxf_read_metadata_track(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_static_track_key))
- ret = mxf_read_metadata_track(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_source_package_key))
- ret = mxf_read_metadata_source_package(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_sequence_key))
- ret = mxf_read_metadata_sequence(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_material_package_key))
- ret = mxf_read_metadata_material_package(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_source_clip_key))
- ret = mxf_read_metadata_source_clip(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_multiple_descriptor_key))
- ret = mxf_read_metadata_multiple_descriptor(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_wave_descriptor_key))
- ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_mpegvideo_descriptor_key))
- ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_cdci_descriptor_key))
- ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_rgba_descriptor_key))
- ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_generic_sound_descriptor_key))
- ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_aes3_descriptor_key))
- ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_preface_key))
- ret = mxf_read_metadata_preface(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_metadata_content_storage_key))
- ret = mxf_read_metadata_content_storage(mxf, &klv);
- else if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) {
+ if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) {
/* FIXME avoid seek */
url_fseek(&s->pb, klv.offset, SEEK_SET);
break;
- } else
- url_fskip(&s->pb, klv.length);
- if (ret < 0) {
- av_log(s, AV_LOG_ERROR, "error reading header metadata\n");
- return ret;
}
+
+ for (function = mxf_metadata_read_table; function->read; function++) {
+ if (IS_KLV_KEY(klv.key, function->key)) {
+ if (function->read(mxf, &klv) < 0) {
+ av_log(s, AV_LOG_ERROR, "error reading header metadata\n");
+ return -1;
+ }
+ break;
+ }
+ }
+ if (!function->read)
+ url_fskip(&s->pb, klv.length);
}
return mxf_parse_structural_metadata(mxf);
}
1
0