changeset 184:2438e76dde67 libavformat

yuv4mpeg pipe reader for libavformat patch by (D Richard Felker III <dalias at aerifal dot cx>)
author michaelni
date Tue, 05 Aug 2003 09:32:31 +0000
parents b3b056122bd8
children d98ed04d62a6
files allformats.c avformat.h yuv4mpeg.c
diffstat 3 files changed, 101 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/allformats.c	Thu Jul 24 23:37:40 2003 +0000
+++ b/allformats.c	Tue Aug 05 09:32:31 2003 +0000
@@ -54,7 +54,7 @@
 #ifdef AMR_NB
     amr_init();
 #endif
-    av_register_output_format(&yuv4mpegpipe_oformat);
+    yuv4mpeg_init();
     
 #ifdef CONFIG_VORBIS
     ogg_init();
--- a/avformat.h	Thu Jul 24 23:37:40 2003 +0000
+++ b/avformat.h	Tue Aug 05 09:32:31 2003 +0000
@@ -328,6 +328,9 @@
 /* raw.c */
 int raw_init(void);
 
+/* yuv4mpeg.c */
+int yuv4mpeg_init(void);
+
 /* ogg.c */
 int ogg_init(void);
 
--- a/yuv4mpeg.c	Thu Jul 24 23:37:40 2003 +0000
+++ b/yuv4mpeg.c	Tue Aug 05 09:32:31 2003 +0000
@@ -173,4 +173,101 @@
     .flags = AVFMT_RAWPICTURE,
 };
 
+#define MAX_YUV4_HEADER 50
+#define MAX_FRAME_HEADER 10
 
+static int yuv4_read_header(AVFormatContext *s, AVFormatParameters *ap)
+{
+    char header[MAX_YUV4_HEADER+1];
+    int i;
+    ByteIOContext *pb = &s->pb;
+    int width, height, raten, rated, aspectn, aspectd;
+    char lacing;
+    AVStream *st;
+    
+    for (i=0; i<MAX_YUV4_HEADER; i++) {
+        header[i] = get_byte(pb);
+	if (header[i] == '\n') {
+	    header[i+1] = 0;
+	    break;
+	}
+    }
+    if (i == MAX_YUV4_HEADER) return -1;
+    if (strncmp(header, Y4M_MAGIC, strlen(Y4M_MAGIC))) return -1;
+    sscanf(header+strlen(Y4M_MAGIC), " W%d H%d F%d:%d I%c A%d:%d",
+           &width, &height, &raten, &rated, &lacing, &aspectn, &aspectd);
+    
+    st = av_new_stream(s, 0);
+    st = s->streams[0];
+    st->codec.width = width;
+    st->codec.height = height;
+    av_reduce(&raten, &rated, raten, rated, (1UL<<31)-1);
+    st->codec.frame_rate = raten;
+    st->codec.frame_rate_base = rated;
+    st->codec.pix_fmt = PIX_FMT_YUV420P;
+    st->codec.codec_type = CODEC_TYPE_VIDEO;
+    st->codec.codec_id = CODEC_ID_RAWVIDEO;
+
+    return 0;
+}
+
+static int yuv4_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    int i;
+    char header[MAX_FRAME_HEADER+1];
+    int packet_size, ret, width, height;
+    AVStream *st = s->streams[0];
+
+    for (i=0; i<MAX_FRAME_HEADER; i++) {
+        header[i] = get_byte(&s->pb);
+	if (header[i] == '\n') {
+	    header[i+1] = 0;
+	    break;
+	}
+    }
+    if (i == MAX_FRAME_HEADER) return -1;
+    if (strncmp(header, Y4M_FRAME_MAGIC, strlen(Y4M_FRAME_MAGIC))) return -1;
+    
+    width = st->codec.width;
+    height = st->codec.height;
+
+    packet_size = avpicture_get_size(st->codec.pix_fmt, width, height);
+    if (packet_size < 0)
+        av_abort();
+
+    if (av_new_packet(pkt, packet_size) < 0)
+        return -EIO;
+
+    pkt->stream_index = 0;
+    ret = get_buffer(&s->pb, pkt->data, pkt->size);
+    if (ret != pkt->size) {
+        av_free_packet(pkt);
+        return -EIO;
+    } else {
+        return 0;
+    }
+}
+
+static int yuv4_read_close(AVFormatContext *s)
+{
+    return 0;
+}
+
+AVInputFormat yuv4mpegpipe_iformat = {
+    "yuv4mpegpipe",
+    "YUV4MPEG pipe format",
+    0,
+    NULL,
+    yuv4_read_header,
+    yuv4_read_packet,
+    yuv4_read_close,
+    .extensions = "yuv4mpeg"
+};
+
+int yuv4mpeg_init(void)
+{
+    av_register_input_format(&yuv4mpegpipe_iformat);
+    av_register_output_format(&yuv4mpegpipe_oformat);
+    return 0;
+}
+