summaryrefslogtreecommitdiff
path: root/libav
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2002-10-08 17:58:36 +0000
committerFabrice Bellard <fabrice@bellard.org>2002-10-08 17:58:36 +0000
commitf20dca4020fdff4d9d0cdec5f51bf3c33f1bc9ef (patch)
tree2141031c1266d0ff0b44d7f64f7c2c0dc3b39b76 /libav
parent1c05e11d02024ad74ba6481bbb72acfcd3ece0f6 (diff)
added raw DV demux (audio is currently not handled)
Originally committed as revision 1015 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libav')
-rw-r--r--libav/Makefile2
-rw-r--r--libav/allformats.c3
-rw-r--r--libav/avformat.h3
-rw-r--r--libav/avienc.c1
-rw-r--r--libav/dv.c135
5 files changed, 142 insertions, 2 deletions
diff --git a/libav/Makefile b/libav/Makefile
index b8b93cc362..bd33e4aea0 100644
--- a/libav/Makefile
+++ b/libav/Makefile
@@ -12,7 +12,7 @@ OBJS= utils.o cutils.o allformats.o
# mux and demuxes
OBJS+=mpeg.o mpegts.o ffm.o crc.o img.o raw.o rm.o asf.o \
- avienc.o avidec.o wav.o swf.o au.o gif.o mov.o jpeg.o
+ avienc.o avidec.o wav.o swf.o au.o gif.o mov.o jpeg.o dv.o
# framehook.o
# file I/O
OBJS+= avio.o aviobuf.o file.o
diff --git a/libav/allformats.c b/libav/allformats.c
index 3ccc7dc4d7..e4102157b8 100644
--- a/libav/allformats.c
+++ b/libav/allformats.c
@@ -44,7 +44,8 @@ void av_register_all(void)
gif_init();
mov_init();
jpeg_init();
-
+ dv_init();
+
#ifdef CONFIG_VORBIS
ogg_init();
#endif
diff --git a/libav/avformat.h b/libav/avformat.h
index b9a618d35b..943f63bc83 100644
--- a/libav/avformat.h
+++ b/libav/avformat.h
@@ -216,6 +216,9 @@ int raw_init(void);
/* ogg.c */
int ogg_init(void);
+/* dv.c */
+int dv_init(void);
+
/* ffm.c */
int ffm_init(void);
diff --git a/libav/avienc.c b/libav/avienc.c
index 38bef1eb46..0a75b2399f 100644
--- a/libav/avienc.c
+++ b/libav/avienc.c
@@ -77,6 +77,7 @@ CodecTag codec_bmp_tags[] = {
{ CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
+ { CODEC_ID_DVVIDEO, MKTAG('D', 'V', 'S', 'D') },
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
{ 0, 0 },
};
diff --git a/libav/dv.c b/libav/dv.c
new file mode 100644
index 0000000000..5a781b8dbe
--- /dev/null
+++ b/libav/dv.c
@@ -0,0 +1,135 @@
+/*
+ * Raw DV format
+ * Copyright (c) 2002 Fabrice Bellard.
+ *
+ * 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 NTSC_FRAME_SIZE 120000
+#define PAL_FRAME_SIZE 144000
+
+typedef struct DVDemuxContext {
+ int is_audio;
+} DVDemuxContext;
+
+/* raw input */
+static int dv_read_header(AVFormatContext *s,
+ AVFormatParameters *ap)
+{
+ AVStream *vst, *ast;
+
+ vst = av_new_stream(s, 0);
+ if (!vst)
+ return AVERROR_NOMEM;
+ vst->codec.codec_type = CODEC_TYPE_VIDEO;
+ vst->codec.codec_id = CODEC_ID_DVVIDEO;
+
+#if 0
+ ast = av_new_stream(s, 1);
+ if (!ast)
+ return AVERROR_NOMEM;
+
+ ast->codec.codec_type = CODEC_TYPE_AUDIO;
+ ast->codec.codec_id = CODEC_ID_DVAUDIO;
+#endif
+ return 0;
+}
+
+/* XXX: build fake audio stream when DV audio decoder will be finished */
+int dv_read_packet(AVFormatContext *s,
+ AVPacket *pkt)
+{
+ int ret, size, dsf;
+ uint8_t buf[4];
+
+ ret = get_buffer(&s->pb, buf, 4);
+ if (ret <= 0)
+ return -EIO;
+ dsf = buf[3] & 0x80;
+ if (!dsf)
+ size = NTSC_FRAME_SIZE;
+ else
+ size = PAL_FRAME_SIZE;
+
+ if (av_new_packet(pkt, size) < 0)
+ return -EIO;
+
+ pkt->stream_index = 0;
+ memcpy(pkt->data, buf, 4);
+ ret = get_buffer(&s->pb, pkt->data + 4, size - 4);
+ if (ret <= 0) {
+ av_free_packet(pkt);
+ return -EIO;
+ }
+ return ret;
+}
+
+int dv_read_close(AVFormatContext *s)
+{
+ return 0;
+}
+
+AVInputFormat dv_iformat = {
+ "dv",
+ "DV video format",
+ sizeof(DVDemuxContext),
+ NULL,
+ dv_read_header,
+ dv_read_packet,
+ dv_read_close,
+ extensions: "dv",
+};
+
+#if 0
+int dv_write_header(struct AVFormatContext *s)
+{
+ return 0;
+}
+
+int dv_write_packet(struct AVFormatContext *s,
+ int stream_index,
+ unsigned char *buf, int size, int force_pts)
+{
+ put_buffer(&s->pb, buf, size);
+ put_flush_packet(&s->pb);
+ return 0;
+}
+
+int dv_write_trailer(struct AVFormatContext *s)
+{
+ return 0;
+}
+
+AVOutputFormat dv_oformat = {
+ "dv",
+ "DV video format",
+ NULL,
+ "dv",
+ 0,
+ CODEC_ID_DVVIDEO,
+ CODEC_ID_DVAUDIO,
+ dv_write_header,
+ dv_write_packet,
+ dv_write_trailer,
+};
+#endif
+
+int dv_init(void)
+{
+ av_register_input_format(&dv_iformat);
+ // av_register_output_format(&dv_oformat);
+ return 0;
+}