]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/raw.c
Fix typo in comment
[ffmpeg] / libavformat / raw.c
index 68b8e012287a1fe4d8c99f26c829a35e38ee0a5f..752dbf093127f6aa9bfc4fd284ba1608c7023186 100644 (file)
@@ -1,6 +1,7 @@
-/* 
+/*
  * RAW encoder and decoder
  * Copyright (c) 2001 Fabrice Bellard.
+ * Copyright (c) 2005 Alex Beregszaszi
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -14,7 +15,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 #include "avformat.h"
 
@@ -25,6 +26,20 @@ static int raw_write_header(struct AVFormatContext *s)
     return 0;
 }
 
+static int flac_write_header(struct AVFormatContext *s)
+{
+    static const uint8_t header[8] = {
+        0x66, 0x4C, 0x61, 0x43, 0x80, 0x00, 0x00, 0x22
+    };
+    uint8_t *streaminfo = s->streams[0]->codec->extradata;
+    int len = s->streams[0]->codec->extradata_size;
+    if(streaminfo != NULL && len > 0) {
+        put_buffer(&s->pb, header, 8);
+        put_buffer(&s->pb, streaminfo, len);
+    }
+    return 0;
+}
+
 static int raw_write_packet(struct AVFormatContext *s, AVPacket *pkt)
 {
     put_buffer(&s->pb, pkt->data, pkt->size);
@@ -47,7 +62,7 @@ static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
     st = av_new_stream(s, 0);
     if (!st)
         return AVERROR_NOMEM;
-    if (ap) {
+
         id = s->iformat->value;
         if (id == CODEC_ID_RAWVIDEO) {
             st->codec->codec_type = CODEC_TYPE_VIDEO;
@@ -73,9 +88,6 @@ static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
         default:
             return -1;
         }
-    } else {
-        return -1;
-    }
     return 0;
 }
 
@@ -85,7 +97,7 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     int ret, size;
     //    AVStream *st = s->streams[0];
-    
+
     size= RAW_PACKET_SIZE;
 
     ret= av_get_packet(&s->pb, pkt, size);
@@ -108,7 +120,7 @@ static int raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
 
     if (av_new_packet(pkt, size) < 0)
         return AVERROR_IO;
-    
+
     pkt->pos= url_ftell(&s->pb);
     pkt->stream_index = 0;
     ret = get_partial_buffer(&s->pb, pkt->data, size);
@@ -120,12 +132,48 @@ static int raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
     return ret;
 }
 
+// http://www.artificis.hu/files/texts/ingenient.txt
+static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    int ret, size, w, h, unk1, unk2;
+
+    if (get_le32(&s->pb) != MKTAG('M', 'J', 'P', 'G'))
+        return AVERROR_IO; // FIXME
+
+    size = get_le32(&s->pb);
+
+    w = get_le16(&s->pb);
+    h = get_le16(&s->pb);
+
+    url_fskip(&s->pb, 8); // zero + size (padded?)
+    url_fskip(&s->pb, 2);
+    unk1 = get_le16(&s->pb);
+    unk2 = get_le16(&s->pb);
+    url_fskip(&s->pb, 22); // ascii timestamp
+
+    av_log(NULL, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
+        size, w, h, unk1, unk2);
+
+    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;
+    return ret;
+}
+
 static int raw_read_close(AVFormatContext *s)
 {
     return 0;
 }
 
-int pcm_read_seek(AVFormatContext *s, 
+int pcm_read_seek(AVFormatContext *s,
                   int stream_index, int64_t timestamp, int flags)
 {
     AVStream *st;
@@ -153,13 +201,13 @@ int pcm_read_seek(AVFormatContext *s,
         byte_rate = st->codec->bit_rate / 8;
         break;
     }
-    
+
     if (block_align <= 0 || byte_rate <= 0)
         return -1;
 
     /* compute the position by aligning it to block_align */
-    pos = av_rescale_rnd(timestamp * byte_rate, 
-                         st->time_base.num, 
+    pos = av_rescale_rnd(timestamp * byte_rate,
+                         st->time_base.num,
                          st->time_base.den * (int64_t)block_align,
                          (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
     pos *= block_align;
@@ -202,6 +250,22 @@ static int shorten_read_header(AVFormatContext *s,
     return 0;
 }
 
+/* flac read */
+static int flac_read_header(AVFormatContext *s,
+                            AVFormatParameters *ap)
+{
+    AVStream *st;
+
+    st = av_new_stream(s, 0);
+    if (!st)
+        return AVERROR_NOMEM;
+    st->codec->codec_type = CODEC_TYPE_AUDIO;
+    st->codec->codec_id = CODEC_ID_FLAC;
+    st->need_parsing = 1;
+    /* the parameters will be extracted from the compressed bitstream */
+    return 0;
+}
+
 /* dts read */
 static int dts_read_header(AVFormatContext *s,
                            AVFormatParameters *ap)
@@ -219,6 +283,23 @@ static int dts_read_header(AVFormatContext *s,
     return 0;
 }
 
+/* aac read */
+static int aac_read_header(AVFormatContext *s,
+                           AVFormatParameters *ap)
+{
+    AVStream *st;
+
+    st = av_new_stream(s, 0);
+    if (!st)
+        return AVERROR_NOMEM;
+
+    st->codec->codec_type = CODEC_TYPE_AUDIO;
+    st->codec->codec_id = CODEC_ID_AAC;
+    st->need_parsing = 1;
+    /* the parameters will be extracted from the compressed bitstream */
+    return 0;
+}
+
 /* mpeg1/h263 input */
 static int video_read_header(AVFormatContext *s,
                              AVFormatParameters *ap)
@@ -235,9 +316,9 @@ static int video_read_header(AVFormatContext *s,
 
     /* for mjpeg, specify frame rate */
     /* for mpeg4 specify it too (most mpeg4 streams dont have the fixed_vop_rate set ...)*/
-    if (ap && ap->time_base.num) {
+    if (ap->time_base.num) {
         av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
-    } else if ( st->codec->codec_id == CODEC_ID_MJPEG || 
+    } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
                 st->codec->codec_id == CODEC_ID_MPEG4 ||
                 st->codec->codec_id == CODEC_ID_H264) {
         av_set_pts_info(st, 64, 1, 25);
@@ -246,34 +327,35 @@ static int video_read_header(AVFormatContext *s,
     return 0;
 }
 
-#define SEQ_START_CODE         0x000001b3
-#define GOP_START_CODE         0x000001b8
-#define PICTURE_START_CODE     0x00000100
+#define SEQ_START_CODE          0x000001b3
+#define GOP_START_CODE          0x000001b8
+#define PICTURE_START_CODE      0x00000100
+#define SLICE_START_CODE        0x00000101
+#define PACK_START_CODE         0x000001ba
+#define VIDEO_ID                0x000001e0
+#define AUDIO_ID                0x000001c0
 
-/* XXX: improve that by looking at several start codes */
 static int mpegvideo_probe(AVProbeData *p)
 {
-    int code;
-    const uint8_t *d;
-
-    /* we search the first start code. If it is a sequence, gop or
-       picture start code then we decide it is an mpeg video
-       stream. We do not send highest value to give a chance to mpegts */
-    /* NOTE: the search range was restricted to avoid too many false
-       detections */
-
-    if (p->buf_size < 6)
-        return 0;
-    d = p->buf;
-    code = (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | (d[3]);
-    if ((code & 0xffffff00) == 0x100) {
-        if (code == SEQ_START_CODE ||
-            code == GOP_START_CODE ||
-            code == PICTURE_START_CODE)
-            return 50 - 1;
-        else
-            return 0;
+    uint32_t code= -1;
+    int pic=0, seq=0, slice=0, pspack=0, pes=0;
+    int i;
+
+    for(i=0; i<p->buf_size; i++){
+        code = (code<<8) + p->buf[i];
+        if ((code & 0xffffff00) == 0x100) {
+            switch(code){
+            case     SEQ_START_CODE:   seq++; break;
+            case PICTURE_START_CODE:   pic++; break;
+            case   SLICE_START_CODE: slice++; break;
+            case    PACK_START_CODE: pspack++; break;
+            case           VIDEO_ID:
+            case           AUDIO_ID:   pes++; break;
+            }
+        }
     }
+    if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
+        return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
     return 0;
 }
 
@@ -307,9 +389,9 @@ static int h261_probe(AVProbeData *p)
     return 0;
 }
 
-AVInputFormat shorten_iformat = {
+AVInputFormat shorten_demuxer = {
     "shn",
-    "raw shn",
+    "raw shorten",
     0,
     NULL,
     shorten_read_header,
@@ -318,7 +400,33 @@ AVInputFormat shorten_iformat = {
     .extensions = "shn",
 };
 
-AVInputFormat ac3_iformat = {
+AVInputFormat flac_demuxer = {
+    "flac",
+    "raw flac",
+    0,
+    NULL,
+    flac_read_header,
+    raw_read_partial_packet,
+    raw_read_close,
+    .extensions = "flac",
+};
+
+#ifdef CONFIG_MUXERS
+AVOutputFormat flac_muxer = {
+    "flac",
+    "raw flac",
+    "audio/x-flac",
+    "flac",
+    0,
+    CODEC_ID_FLAC,
+    0,
+    flac_write_header,
+    raw_write_packet,
+    raw_write_trailer,
+};
+#endif //CONFIG_MUXERS
+
+AVInputFormat ac3_demuxer = {
     "ac3",
     "raw ac3",
     0,
@@ -330,10 +438,10 @@ AVInputFormat ac3_iformat = {
 };
 
 #ifdef CONFIG_MUXERS
-AVOutputFormat ac3_oformat = {
+AVOutputFormat ac3_muxer = {
     "ac3",
     "raw ac3",
-    "audio/x-ac3", 
+    "audio/x-ac3",
     "ac3",
     0,
     CODEC_ID_AC3,
@@ -344,7 +452,7 @@ AVOutputFormat ac3_oformat = {
 };
 #endif //CONFIG_MUXERS
 
-AVInputFormat dts_iformat = {
+AVInputFormat dts_demuxer = {
     "dts",
     "raw dts",
     0,
@@ -355,7 +463,18 @@ AVInputFormat dts_iformat = {
     .extensions = "dts",
 };
 
-AVInputFormat h261_iformat = {
+AVInputFormat aac_demuxer = {
+    "aac",
+    "ADTS AAC",
+    0,
+    NULL,
+    aac_read_header,
+    raw_read_partial_packet,
+    raw_read_close,
+    .extensions = "aac",
+};
+
+AVInputFormat h261_demuxer = {
     "h261",
     "raw h261",
     0,
@@ -368,7 +487,7 @@ AVInputFormat h261_iformat = {
 };
 
 #ifdef CONFIG_MUXERS
-AVOutputFormat h261_oformat = {
+AVOutputFormat h261_muxer = {
     "h261",
     "raw h261",
     "video/x-h261",
@@ -382,7 +501,7 @@ AVOutputFormat h261_oformat = {
 };
 #endif //CONFIG_MUXERS
 
-AVInputFormat h263_iformat = {
+AVInputFormat h263_demuxer = {
     "h263",
     "raw h263",
     0,
@@ -395,7 +514,7 @@ AVInputFormat h263_iformat = {
 };
 
 #ifdef CONFIG_MUXERS
-AVOutputFormat h263_oformat = {
+AVOutputFormat h263_muxer = {
     "h263",
     "raw h263",
     "video/x-h263",
@@ -409,7 +528,7 @@ AVOutputFormat h263_oformat = {
 };
 #endif //CONFIG_MUXERS
 
-AVInputFormat m4v_iformat = {
+AVInputFormat m4v_demuxer = {
     "m4v",
     "raw MPEG4 video format",
     0,
@@ -422,7 +541,7 @@ AVInputFormat m4v_iformat = {
 };
 
 #ifdef CONFIG_MUXERS
-AVOutputFormat m4v_oformat = {
+AVOutputFormat m4v_muxer = {
     "m4v",
     "raw MPEG4 video format",
     NULL,
@@ -436,7 +555,7 @@ AVOutputFormat m4v_oformat = {
 };
 #endif //CONFIG_MUXERS
 
-AVInputFormat h264_iformat = {
+AVInputFormat h264_demuxer = {
     "h264",
     "raw H264 video format",
     0,
@@ -449,7 +568,7 @@ AVInputFormat h264_iformat = {
 };
 
 #ifdef CONFIG_MUXERS
-AVOutputFormat h264_oformat = {
+AVOutputFormat h264_muxer = {
     "h264",
     "raw H264 video format",
     NULL,
@@ -463,7 +582,7 @@ AVOutputFormat h264_oformat = {
 };
 #endif //CONFIG_MUXERS
 
-AVInputFormat mpegvideo_iformat = {
+AVInputFormat mpegvideo_demuxer = {
     "mpegvideo",
     "MPEG video",
     0,
@@ -475,7 +594,7 @@ AVInputFormat mpegvideo_iformat = {
 };
 
 #ifdef CONFIG_MUXERS
-AVOutputFormat mpeg1video_oformat = {
+AVOutputFormat mpeg1video_muxer = {
     "mpeg1video",
     "MPEG video",
     "video/x-mpeg",
@@ -490,7 +609,7 @@ AVOutputFormat mpeg1video_oformat = {
 #endif //CONFIG_MUXERS
 
 #ifdef CONFIG_MUXERS
-AVOutputFormat mpeg2video_oformat = {
+AVOutputFormat mpeg2video_muxer = {
     "mpeg2video",
     "MPEG2 video",
     NULL,
@@ -504,7 +623,7 @@ AVOutputFormat mpeg2video_oformat = {
 };
 #endif //CONFIG_MUXERS
 
-AVInputFormat mjpeg_iformat = {
+AVInputFormat mjpeg_demuxer = {
     "mjpeg",
     "MJPEG video",
     0,
@@ -516,8 +635,20 @@ AVInputFormat mjpeg_iformat = {
     .value = CODEC_ID_MJPEG,
 };
 
+AVInputFormat ingenient_demuxer = {
+    "ingenient",
+    "Ingenient MJPEG",
+    0,
+    NULL,
+    video_read_header,
+    ingenient_read_packet,
+    raw_read_close,
+    .extensions = "cgi", // FIXME
+    .value = CODEC_ID_MJPEG,
+};
+
 #ifdef CONFIG_MUXERS
-AVOutputFormat mjpeg_oformat = {
+AVOutputFormat mjpeg_muxer = {
     "mjpeg",
     "MJPEG video",
     "video/x-mjpeg",
@@ -534,7 +665,7 @@ AVOutputFormat mjpeg_oformat = {
 /* pcm formats */
 
 #define PCMINPUTDEF(name, long_name, ext, codec) \
-AVInputFormat pcm_ ## name ## _iformat = {\
+AVInputFormat pcm_ ## name ## _demuxer = {\
     #name,\
     long_name,\
     0,\
@@ -547,17 +678,8 @@ AVInputFormat pcm_ ## name ## _iformat = {\
     .value = codec,\
 };
 
-#if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
-
-#define PCMDEF(name, long_name, ext, codec) \
-    PCMINPUTDEF(name, long_name, ext, codec)
-
-#else
-
-#define PCMDEF(name, long_name, ext, codec) \
-    PCMINPUTDEF(name, long_name, ext, codec)\
-\
-AVOutputFormat pcm_ ## name ## _oformat = {\
+#define PCMOUTPUTDEF(name, long_name, ext, codec) \
+AVOutputFormat pcm_ ## name ## _muxer = {\
     #name,\
     long_name,\
     NULL,\
@@ -569,7 +691,21 @@ AVOutputFormat pcm_ ## name ## _oformat = {\
     raw_write_packet,\
     raw_write_trailer,\
 };
-#endif //CONFIG_MUXERS
+
+
+#if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
+#define PCMDEF(name, long_name, ext, codec) \
+        PCMINPUTDEF(name, long_name, ext, codec)
+#elif defined(CONFIG_MUXERS) && !defined(CONFIG_DEMUXERS)
+#define PCMDEF(name, long_name, ext, codec) \
+        PCMOUTPUTDEF(name, long_name, ext, codec)
+#elif defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
+#define PCMDEF(name, long_name, ext, codec) \
+        PCMINPUTDEF(name, long_name, ext, codec)\
+        PCMOUTPUTDEF(name, long_name, ext, codec)
+#else
+#define PCMDEF(name, long_name, ext, codec)
+#endif
 
 #ifdef WORDS_BIGENDIAN
 #define BE_DEF(s) s
@@ -580,28 +716,28 @@ AVOutputFormat pcm_ ## name ## _oformat = {\
 #endif
 
 
-PCMDEF(s16le, "pcm signed 16 bit little endian format", 
+PCMDEF(s16le, "pcm signed 16 bit little endian format",
        LE_DEF("sw"), CODEC_ID_PCM_S16LE)
 
-PCMDEF(s16be, "pcm signed 16 bit big endian format", 
+PCMDEF(s16be, "pcm signed 16 bit big endian format",
        BE_DEF("sw"), CODEC_ID_PCM_S16BE)
 
-PCMDEF(u16le, "pcm unsigned 16 bit little endian format", 
+PCMDEF(u16le, "pcm unsigned 16 bit little endian format",
        LE_DEF("uw"), CODEC_ID_PCM_U16LE)
 
-PCMDEF(u16be, "pcm unsigned 16 bit big endian format", 
+PCMDEF(u16be, "pcm unsigned 16 bit big endian format",
        BE_DEF("uw"), CODEC_ID_PCM_U16BE)
 
-PCMDEF(s8, "pcm signed 8 bit format", 
+PCMDEF(s8, "pcm signed 8 bit format",
        "sb", CODEC_ID_PCM_S8)
 
-PCMDEF(u8, "pcm unsigned 8 bit format", 
+PCMDEF(u8, "pcm unsigned 8 bit format",
        "ub", CODEC_ID_PCM_U8)
 
-PCMDEF(mulaw, "pcm mu law format", 
+PCMDEF(mulaw, "pcm mu law format",
        "ul", CODEC_ID_PCM_MULAW)
 
-PCMDEF(alaw, "pcm A law format", 
+PCMDEF(alaw, "pcm A law format",
        "al", CODEC_ID_PCM_ALAW)
 
 static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
@@ -626,7 +762,7 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
     }
 }
 
-AVInputFormat rawvideo_iformat = {
+AVInputFormat rawvideo_demuxer = {
     "rawvideo",
     "raw video format",
     0,
@@ -639,7 +775,7 @@ AVInputFormat rawvideo_iformat = {
 };
 
 #ifdef CONFIG_MUXERS
-AVOutputFormat rawvideo_oformat = {
+AVOutputFormat rawvideo_muxer = {
     "rawvideo",
     "raw video format",
     NULL,
@@ -659,7 +795,7 @@ static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt)
     return 0;
 }
 
-AVOutputFormat null_oformat = {
+AVOutputFormat null_muxer = {
     "null",
     "null video format",
     NULL,
@@ -677,64 +813,3 @@ AVOutputFormat null_oformat = {
     .flags = AVFMT_NOFILE | AVFMT_RAWPICTURE,
 };
 #endif //CONFIG_MUXERS
-
-#ifndef CONFIG_MUXERS
-#define av_register_output_format(format)
-#endif
-#ifndef CONFIG_DEMUXERS
-#define av_register_input_format(format)
-#endif
-
-int raw_init(void)
-{
-
-    av_register_input_format(&shorten_iformat);
-
-    av_register_input_format(&ac3_iformat);
-    av_register_output_format(&ac3_oformat);
-
-    av_register_input_format(&dts_iformat);
-
-    av_register_input_format(&h261_iformat);
-    av_register_output_format(&h261_oformat);
-
-    av_register_input_format(&h263_iformat);
-    av_register_output_format(&h263_oformat);
-    
-    av_register_input_format(&m4v_iformat);
-    av_register_output_format(&m4v_oformat);
-    
-    av_register_input_format(&h264_iformat);
-    av_register_output_format(&h264_oformat);
-
-    av_register_input_format(&mpegvideo_iformat);
-    av_register_output_format(&mpeg1video_oformat);
-
-    av_register_output_format(&mpeg2video_oformat);
-
-    av_register_input_format(&mjpeg_iformat);
-    av_register_output_format(&mjpeg_oformat);
-
-    av_register_input_format(&pcm_s16le_iformat);
-    av_register_output_format(&pcm_s16le_oformat);
-    av_register_input_format(&pcm_s16be_iformat);
-    av_register_output_format(&pcm_s16be_oformat);
-    av_register_input_format(&pcm_u16le_iformat);
-    av_register_output_format(&pcm_u16le_oformat);
-    av_register_input_format(&pcm_u16be_iformat);
-    av_register_output_format(&pcm_u16be_oformat);
-    av_register_input_format(&pcm_s8_iformat);
-    av_register_output_format(&pcm_s8_oformat);
-    av_register_input_format(&pcm_u8_iformat);
-    av_register_output_format(&pcm_u8_oformat);
-    av_register_input_format(&pcm_mulaw_iformat);
-    av_register_output_format(&pcm_mulaw_oformat);
-    av_register_input_format(&pcm_alaw_iformat);
-    av_register_output_format(&pcm_alaw_oformat);
-
-    av_register_input_format(&rawvideo_iformat);
-    av_register_output_format(&rawvideo_oformat);
-
-    av_register_output_format(&null_oformat);
-    return 0;
-}