]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/raw.c
Interplay C93 demuxer and video decoder
[ffmpeg] / libavformat / raw.c
index bb706376ac67626b25d48c650918dd1ccf36f506..73a20379ae2610cc274e243f305c9d0e09f2eda2 100644 (file)
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 #include "avformat.h"
+#include "ac3.h"
 
 #ifdef CONFIG_MUXERS
 /* simple formats */
@@ -336,9 +337,9 @@ static int mpegvideo_probe(AVProbeData *p)
             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     ((code & 0x1f0) == VIDEO_ID)   pes++;
+            else if((code & 0x1e0) == AUDIO_ID)   pes++;
         }
     }
     if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
@@ -346,6 +347,36 @@ static int mpegvideo_probe(AVProbeData *p)
     return 0;
 }
 
+#define VIDEO_OBJECT_START_CODE        0x00000100
+#define VIDEO_OBJECT_LAYER_START_CODE  0x00000120
+#define VISUAL_OBJECT_START_CODE       0x000001b5
+#define VOP_START_CODE                 0x000001b6
+
+static int mpeg4video_probe(AVProbeData *probe_packet)
+{
+    uint32_t temp_buffer= -1;
+    int VO=0, VOL=0, VOP = 0, VISO = 0;
+    int i;
+
+    for(i=0; i<probe_packet->buf_size; i++){
+        temp_buffer = (temp_buffer<<8) + probe_packet->buf[i];
+        if ((temp_buffer & 0xffffff00) == 0x100) {
+            switch(temp_buffer){
+            case VOP_START_CODE:             VOP++; break;
+            case VISUAL_OBJECT_START_CODE:  VISO++; break;
+            }
+            switch(temp_buffer & 0xfffffff0){
+            case VIDEO_OBJECT_START_CODE:            VO++; break;
+            case VIDEO_OBJECT_LAYER_START_CODE:     VOL++; break;
+            }
+        }
+    }
+
+    if ( VOP >= VISO && VOP >= VOL && VO >= VOL && VOL > 0)
+        return AVPROBE_SCORE_MAX/2;
+    return 0;
+}
+
 static int h263_probe(AVProbeData *p)
 {
     int code;
@@ -376,6 +407,37 @@ static int h261_probe(AVProbeData *p)
     return 0;
 }
 
+static int ac3_probe(AVProbeData *p)
+{
+    int max_frames, first_frames, frames;
+    uint8_t *buf, *buf2, *end;
+    AC3HeaderInfo hdr;
+
+    if(p->buf_size < 7)
+        return 0;
+
+    max_frames = 0;
+    buf = p->buf;
+    end = buf + FFMIN(4096, p->buf_size - 7);
+
+    for(; buf < end; buf++) {
+        buf2 = buf;
+
+        for(frames = 0; buf2 < end; frames++) {
+            if(ff_ac3_parse_header(buf2, &hdr) < 0)
+                break;
+            buf2 += hdr.frame_size;
+        }
+        max_frames = FFMAX(max_frames, frames);
+        if(buf == p->buf)
+            first_frames = frames;
+    }
+    if   (first_frames>=3) return AVPROBE_SCORE_MAX * 3 / 4;
+    else if(max_frames>=3) return AVPROBE_SCORE_MAX / 2;
+    else if(max_frames>=1) return 1;
+    else                   return 0;
+}
+
 AVInputFormat shorten_demuxer = {
     "shn",
     "raw shorten",
@@ -384,6 +446,7 @@ AVInputFormat shorten_demuxer = {
     shorten_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "shn",
 };
 
@@ -395,6 +458,7 @@ AVInputFormat flac_demuxer = {
     flac_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "flac",
 };
 
@@ -418,10 +482,11 @@ AVInputFormat ac3_demuxer = {
     "ac3",
     "raw ac3",
     0,
-    NULL,
+    ac3_probe,
     ac3_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "ac3",
 };
 
@@ -449,6 +514,7 @@ AVInputFormat dts_demuxer = {
     dts_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "dts",
 };
 
@@ -460,6 +526,7 @@ AVInputFormat aac_demuxer = {
     aac_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "aac",
 };
 
@@ -471,6 +538,7 @@ AVInputFormat h261_demuxer = {
     video_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "h261",
     .value = CODEC_ID_H261,
 };
@@ -499,6 +567,7 @@ AVInputFormat h263_demuxer = {
     video_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
 //    .extensions = "h263", //FIXME remove after writing mpeg4_probe
     .value = CODEC_ID_H263,
 };
@@ -523,10 +592,11 @@ AVInputFormat m4v_demuxer = {
     "m4v",
     "raw MPEG4 video format",
     0,
-    NULL /*mpegvideo_probe*/,
+    mpeg4video_probe, /** probing for mpeg4 data */
     video_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "m4v", //FIXME remove after writing mpeg4_probe
     .value = CODEC_ID_MPEG4,
 };
@@ -555,6 +625,7 @@ AVInputFormat h264_demuxer = {
     video_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
     .value = CODEC_ID_H264,
 };
@@ -583,6 +654,7 @@ AVInputFormat mpegvideo_demuxer = {
     video_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .value = CODEC_ID_MPEG1VIDEO,
 };
 
@@ -626,6 +698,7 @@ AVInputFormat mjpeg_demuxer = {
     video_read_header,
     raw_read_partial_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "mjpg,mjpeg",
     .value = CODEC_ID_MJPEG,
 };
@@ -638,6 +711,7 @@ AVInputFormat ingenient_demuxer = {
     video_read_header,
     ingenient_read_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "cgi", // FIXME
     .value = CODEC_ID_MJPEG,
 };
@@ -658,6 +732,18 @@ AVOutputFormat mjpeg_muxer = {
 };
 #endif //CONFIG_MUXERS
 
+AVInputFormat vc1_demuxer = {
+    "vc1",
+    "raw vc1",
+    0,
+    NULL /* vc1_probe */,
+    video_read_header,
+    raw_read_partial_packet,
+    raw_read_close,
+    .extensions = "vc1",
+    .value = CODEC_ID_VC1,
+};
+
 /* pcm formats */
 
 #define PCMINPUTDEF(name, long_name, ext, codec) \
@@ -670,6 +756,7 @@ AVInputFormat pcm_ ## name ## _demuxer = {\
     raw_read_packet,\
     raw_read_close,\
     pcm_read_seek,\
+    .flags= AVFMT_GENERIC_INDEX,\
     .extensions = ext,\
     .value = codec,\
 };
@@ -767,6 +854,7 @@ AVInputFormat rawvideo_demuxer = {
     raw_read_header,
     rawvideo_read_packet,
     raw_read_close,
+    .flags= AVFMT_GENERIC_INDEX,
     .extensions = "yuv,cif,qcif",
     .value = CODEC_ID_RAWVIDEO,
 };