summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux/demux_audio.c')
-rw-r--r--libmpdemux/demux_audio.c20
1 files changed, 20 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);
}