changeset 3788:d554b5b33d76

improved audio codec detection
author alex
date Thu, 27 Dec 2001 10:15:13 +0000
parents 55603340d1b2
children 811b2e1ff030
files libmpdemux/demux_real.c
diffstat 1 files changed, 91 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_real.c	Thu Dec 27 05:09:43 2001 +0000
+++ b/libmpdemux/demux_real.c	Thu Dec 27 10:15:13 2001 +0000
@@ -6,6 +6,18 @@
     Based on FFmpeg's libav/rm.c.
 */
 
+/*
+Some codecs for Real (from Mike Melanson):
+
+RV10: As has been mentioned, H.263-based; not an unreasonable guess
+RV20: RealVideo 2.0, nothing known
+RV30: RealVideo 3.0,nothing known, but I don't believe I've ever seen any
+media encoded with it
+DNET: apparently one of their original audio codecs, to be used with music
+SIPR: SiprNet, based on ACELP, and is great for compressing voice
+COKR(?): Cooker, the fabled G2 audio codec
+*/
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -204,12 +216,54 @@
 		stream_skip(demuxer->stream, 2); /* flags */
 		break;
 	    case MKTAG('C', 'O', 'N', 'T'):
+	    {
+		char *buf;
+		int len;
+
 		printf("Broadcasting informations (title, author, copyright, comment)\n");
-		skip_str(0, demuxer);	/* title */
-		skip_str(0, demuxer);	/* author */
-		skip_str(0, demuxer);	/* copyright */
-		skip_str(0, demuxer);	/* comment */
+
+		len = stream_read_word(demuxer->stream);
+		if (len > 0)
+		{
+		    buf = malloc(len+1);
+		    stream_read(demuxer->stream, buf, len);
+		    demux_info_add(demuxer, "name", buf);
+		    free(buf);
+		}
+
+		len = stream_read_word(demuxer->stream);
+		if (len > 0)
+		{
+		    buf = malloc(len+1);
+		    stream_read(demuxer->stream, buf, len);
+		    demux_info_add(demuxer, "author", buf);
+		    free(buf);
+		}
+
+		len = stream_read_word(demuxer->stream);
+		if (len > 0)
+		{
+		    buf = malloc(len+1);
+		    stream_read(demuxer->stream, buf, len);
+		    demux_info_add(demuxer, "copyright", buf);
+		    free(buf);
+		}
+
+		len = stream_read_word(demuxer->stream);
+		if (len > 0)
+		{
+		    buf = malloc(len+1);
+	    	    stream_read(demuxer->stream, buf, len);
+		    demux_info_add(demuxer, "comment", buf);
+		    free(buf);
+		}
+
+//		skip_str(0, demuxer);	/* title */
+//		skip_str(0, demuxer);	/* author */
+//		skip_str(0, demuxer);	/* copyright */
+//		skip_str(0, demuxer);	/* comment */
 		break;
+	    }
 	    case MKTAG('M', 'D', 'P', 'R'):
 	    {
 		/* new stream */
@@ -242,10 +296,12 @@
 		    sh_audio_t *sh = new_sh_audio(demuxer, stream_id);
 
 		    printf("Found audio stream!\n");
-		    stream_skip(demuxer->stream, 4); /* version */
-		    stream_skip(demuxer->stream, 4); /* .ra4 */
+//		    printf("pos: %x\n", stream_tell(demuxer->stream));
+		    stream_skip(demuxer->stream, 2); /* version (4 or 5) */
+		    stream_skip(demuxer->stream, 2);
+		    stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */
 		    stream_skip(demuxer->stream, 4);
-		    stream_skip(demuxer->stream, 2);
+		    stream_skip(demuxer->stream, 2); /* version (4 or 5) */
 		    stream_skip(demuxer->stream, 4); /* header size */
 		    stream_skip(demuxer->stream, 2); /* add codec info */
 		    stream_skip(demuxer->stream, 4); /* coded frame size */
@@ -263,16 +319,28 @@
 		    {
 			char buf[128];
 			
-			get_str(1, demuxer, buf, sizeof(buf));
+			skip_str(1, demuxer);
+//			get_str(1, demuxer, buf, sizeof(buf));
 			get_str(1, demuxer, buf, sizeof(buf));
 
 			v = 0; /* not supported audio codec */
-			if (!strcmp(buf, "dnet"))
+			if (strstr(buf, "dnet"))
 			{
 			    printf("Found AC3 audio\n");
 			    sh->format = 0x2000; /* ac3 */
 			    v = 1;
 			}
+			if (strstr(buf, "sipr"))
+			{
+			    printf("Found SiproLab's ACELP\n");
+			    sh->format = 0x130;
+			    v = 1;
+			}
+			if (strstr(buf, "cook"))
+			{
+			    printf("Found Real's GeneralCooker (unsupported)\n");
+			    v = 0;
+			}
 		    }
 //		    skip_str(1, demuxer); /* desc */
 //		    skip_str(1, demuxer); /* desc */
@@ -283,7 +351,18 @@
 
 		    if (v)
 		    {
-		    printf("Audio codec: 0x%x\n", sh->format);
+		    
+		    /* Emulate WAVEFORMATEX struct: */
+		    sh->wf = malloc(sizeof(WAVEFORMATEX));
+		    memset(sh->wf, 0, sizeof(WAVEFORMATEX));
+		    sh->wf->wFormatTag = sh->format;
+		    sh->wf->nChannels = sh->channels;
+		    sh->wf->wBitsPerSample = 16;
+		    sh->wf->nSamplesPerSec = sh->samplerate;
+		    sh->wf->nAvgBytesPerSec = bitrate;
+		    sh->wf->nBlockAlign = 19; /* 19 for acelp, pff */
+		    sh->wf->cbSize = 0;
+		    
 		    /* insert as stream */
 		    demuxer->audio->sh = sh;
 		    sh->ds = demuxer->audio;
@@ -345,10 +424,12 @@
 			    /* codec id: rv10 */
 			    break;
 			case 0x20001000:
+			case 0x20100001:
 			    /* codec id: rv20 */
 			    break;
 			default:
 			    /* codec id: none */
+			    printf("unknown id: %x\n", v);
 		    }
 		        
 		    /* insert as stream */