mirror of
https://github.com/mpv-player/mpv
synced 2025-04-18 13:16:43 +00:00
improved audio codec detection
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3789 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
a527e0f508
commit
ecee4bef8c
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user