summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_real.c
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-12-27 10:15:13 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-12-27 10:15:13 +0000
commitecee4bef8c071b34e7e1622ba61783cab7950978 (patch)
tree349f7856ce339e3054dd9e83359e68263afae8ba /libmpdemux/demux_real.c
parenta527e0f5080d801e87faf29960ee3f5cfc223e96 (diff)
downloadmpv-ecee4bef8c071b34e7e1622ba61783cab7950978.tar.bz2
mpv-ecee4bef8c071b34e7e1622ba61783cab7950978.tar.xz
improved audio codec detection
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3789 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_real.c')
-rw-r--r--libmpdemux/demux_real.c101
1 files changed, 91 insertions, 10 deletions
diff --git a/libmpdemux/demux_real.c b/libmpdemux/demux_real.c
index a9d3ad6ca6..f494e06f1b 100644
--- a/libmpdemux/demux_real.c
+++ b/libmpdemux/demux_real.c
@@ -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 @@ void demux_open_real(demuxer_t* demuxer)
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 @@ void demux_open_real(demuxer_t* demuxer)
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 */
- stream_skip(demuxer->stream, 4);
+// 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); /* 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 @@ void demux_open_real(demuxer_t* demuxer)
{
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 @@ void demux_open_real(demuxer_t* demuxer)
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 @@ void demux_open_real(demuxer_t* demuxer)
/* 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 */