diff options
author | lumag <lumag@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-10-04 22:00:25 +0000 |
---|---|---|
committer | lumag <lumag@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-10-04 22:00:25 +0000 |
commit | 1e880aa659cc8d82357c175d6142cfd0606eea22 (patch) | |
tree | e85a5a66e08f6ad71f8638470e19539c26a6bb54 /libmpdemux | |
parent | 31235dd9a42beb26105918190af7cffc2f20ff07 (diff) | |
download | mpv-1e880aa659cc8d82357c175d6142cfd0606eea22.tar.bz2 mpv-1e880aa659cc8d82357c175d6142cfd0606eea22.tar.xz |
FLAC decoding support via imported libmpflac.
TODO: fix FLAC-in-ogg decoding.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@11005 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_audio.c | 20 | ||||
-rw-r--r-- | libmpdemux/demux_ogg.c | 16 | ||||
-rw-r--r-- | libmpdemux/extension.c | 2 |
3 files changed, 38 insertions, 0 deletions
diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c index e8fdde5e80..390df643f6 100644 --- a/libmpdemux/demux_audio.c +++ b/libmpdemux/demux_audio.c @@ -17,6 +17,7 @@ #define MP3 1 #define WAV 2 +#define fLaC 3 #define HDR_SIZE 4 @@ -79,6 +80,10 @@ int demux_audio_open(demuxer_t* demuxer) { } else if((n = mp_get_mp3_header(hdr,&mp3_chans,&mp3_freq)) > 0) { frmt = MP3; break; + } else if( hdr[0] == 'f' && hdr[1] == 'L' && hdr[2] == 'a' && hdr[3] == 'C' ) { + frmt = fLaC; + stream_skip(s,-4); + break; } // Add here some other audio format detection if(step < HDR_SIZE) @@ -202,6 +207,11 @@ int demux_audio_open(demuxer_t* demuxer) { demuxer->movi_end = s->end_pos; // printf("wav: %X .. %X\n",(int)demuxer->movi_start,(int)demuxer->movi_end); } break; + case fLaC: + sh_audio->format = mmioFOURCC('f', 'L', 'a', 'C'); + demuxer->movi_start = stream_tell(s); + demuxer->movi_end = s->end_pos; + break; } priv = (da_priv_t*)malloc(sizeof(da_priv_t)); @@ -272,6 +282,16 @@ int demux_audio_fill_buffer(demux_stream_t *ds) { ds_add_packet(ds,dp); return 1; } + case fLaC: { + int l = 65535; + demux_packet_t* dp = new_demux_packet(l); + l = stream_read(s,dp->buffer,l); + resize_demux_packet(dp, l); + priv->last_pts = priv->last_pts < 0 ? 0 : priv->last_pts + l/(float)sh_audio->i_bps; + ds->pts = priv->last_pts - (ds_tell_pts(demux->audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; + ds_add_packet(ds,dp); + return 1; + } default: printf("Audio demuxer : unknown format %d\n",priv->frmt); } diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c index 9f64231f5f..03577ce039 100644 --- a/libmpdemux/demux_ogg.c +++ b/libmpdemux/demux_ogg.c @@ -112,6 +112,7 @@ typedef struct ogg_stream { int hdr_packets; int vorbis; int theora; + int flac; } ogg_stream_t; typedef struct ogg_demuxer { @@ -362,6 +363,11 @@ static unsigned char* demux_ogg_read_packet(ogg_stream_t* os,ogg_packet* pack,vo } } #endif /* HAVE_OGGTHEORA */ +# ifdef HAVE_FLAC + } else if (os->flac) { + /* we pass complete packets to flac, mustn't strip the header! */ + data = pack->packet; +#endif /* HAVE_FLAC */ } else { // Find data start int16_t hdrlen = (*pack->packet & PACKET_LEN_BITS01)>>6; @@ -679,6 +685,16 @@ int demux_ogg_open(demuxer_t* demuxer) { if(verbose>0) print_video_header(sh_v->bih); } # endif /* HAVE_OGGTHEORA */ +# ifdef HAVE_FLAC + } else if (pack.bytes >= 4 && !strncmp (&pack.packet[0], "fLaC", 4)) { + sh_a = new_sh_audio(demuxer,ogg_d->num_sub); + sh_a->format = mmioFOURCC('f', 'L', 'a', 'C'); + n_audio++; + ogg_d->subs[ogg_d->num_sub].flac = 1; + sh_a->wf = NULL; + mp_msg(MSGT_DEMUX,MSGL_V,"OGG : stream %d is FLAC\n",ogg_d->num_sub); +# endif /* HAVE_FLAC */ + /// Check for old header } else if(pack.bytes >= 142 && ! strncmp(&pack.packet[1],"Direct Show Samples embedded in Ogg",35) ) { diff --git a/libmpdemux/extension.c b/libmpdemux/extension.c index 93ccbc1e4b..a069672d52 100644 --- a/libmpdemux/extension.c +++ b/libmpdemux/extension.c @@ -36,6 +36,8 @@ static struct { { "y4m", DEMUXER_TYPE_Y4M }, { "mp3", DEMUXER_TYPE_AUDIO }, { "wav", DEMUXER_TYPE_AUDIO }, + { "flac", DEMUXER_TYPE_AUDIO }, + { "fla", DEMUXER_TYPE_AUDIO }, { "ogg", DEMUXER_TYPE_OGG }, { "ogm", DEMUXER_TYPE_OGG }, // { "pls", DEMUXER_TYPE_PLAYLIST }, |