summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authornicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-04-24 09:48:57 +0000
committernicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-04-24 09:48:57 +0000
commit538ae3dd8c60d63386113b064bfefc8fa0a513ae (patch)
tree203a2a037ab4f9528dc7c3ba1ecd0cf9e6435301 /libmpdemux
parent3a406e94d77b06d75e670cf1ed8ae9c52e207e0a (diff)
downloadmpv-538ae3dd8c60d63386113b064bfefc8fa0a513ae.tar.bz2
mpv-538ae3dd8c60d63386113b064bfefc8fa0a513ae.tar.xz
simplified parse_audio()
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18239 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/muxer_mpeg.c135
1 files changed, 63 insertions, 72 deletions
diff --git a/libmpdemux/muxer_mpeg.c b/libmpdemux/muxer_mpeg.c
index 2add308c1d..b90ac3b569 100644
--- a/libmpdemux/muxer_mpeg.c
+++ b/libmpdemux/muxer_mpeg.c
@@ -2046,57 +2046,50 @@ extern int aac_parse_frame(uint8_t *buf, int *srate, int *num);
static int parse_audio(muxer_stream_t *s, int finalize, unsigned int *nf, double *timer, double delay, int drop)
{
int i, j, len, chans, srate, spf, layer, dummy, tot, num, frm_idx;
+ int finished;
unsigned int frames;
uint64_t idur;
double dur;
muxer_headers_t *spriv = (muxer_headers_t *) s->priv;
i = tot = frames = 0;
- switch(s->wf->wFormatTag)
+ finished = 0;
+ while(1)
{
+ len = 0;
+ switch(s->wf->wFormatTag)
+ {
case AUDIO_MP2:
case AUDIO_MP3:
- {
- while(i + 3 < s->b_buffer_len)
{
+ if(i + 3 >= s->b_buffer_len)
+ {
+ finished = 1;
+ break;
+ }
+
if(s->b_buffer[i] == 0xFF && ((s->b_buffer[i+1] & 0xE0) == 0xE0))
{
len = mp_get_mp3_header(&(s->b_buffer[i]), &chans, &srate, &spf, &layer, NULL);
if(len > 0 && (srate == s->wf->nSamplesPerSec) && (i + len <= s->b_buffer_len))
{
dur = (double) spf / (double) srate;
- spriv->timer += dur;
- if(spriv->drop_delayed_frames && delay < 0 && spriv->timer <= -delay)
- {
- i += len;
- tot = i;
- continue;
- }
- frames++;
- fill_last_frame(spriv, &(s->b_buffer[tot]), i - tot);
-
idur = (27000000ULL * spf) / srate;
- frm_idx = add_frame(spriv, idur, &(s->b_buffer[i]), len, 0, spriv->last_pts, spriv->last_pts);
- if(frm_idx < 0)
- continue;
- for(j = frm_idx; j < spriv->framebuf_cnt; j++)
- spriv->framebuf[j].pts = spriv->last_pts;
- spriv->last_pts += idur;
-
- i += len;
- tot = i;
- continue;
}
+ else
+ len = 0;
}
- i++;
}
- }
break;
case AUDIO_A52:
- {
- while(i + 6 < s->b_buffer_len)
{
+ if(i + 6 >= s->b_buffer_len)
+ {
+ finished = 1;
+ break;
+ }
+
if(s->b_buffer[i] == 0x0B && s->b_buffer[i+1] == 0x77)
{
srate = 0;
@@ -2108,73 +2101,71 @@ static int parse_audio(muxer_stream_t *s, int finalize, unsigned int *nf, double
if((len > 0) && (srate == s->wf->nSamplesPerSec) && (i + len <= s->b_buffer_len))
{
dur = (double) 1536 / (double) srate;
- spriv->timer += dur;
- if(spriv->drop_delayed_frames && delay < 0 && spriv->timer <= -delay)
- {
- i += len;
- tot = i;
- continue;
- }
- frames++;
- fill_last_frame(spriv, &(s->b_buffer[tot]), i - tot);
-
idur = (27000000ULL * 1536) / srate;
- frm_idx = add_frame(spriv, idur, &(s->b_buffer[i]), len, 0, spriv->last_pts, spriv->last_pts);
- if(frm_idx < 0)
- continue;
- for(j = frm_idx; j < spriv->framebuf_cnt; j++)
- spriv->framebuf[j].pts = spriv->last_pts;
- spriv->last_pts += idur;
-
- i += len;
- tot = i;
- continue;
}
+ else
+ len = 0;
}
- i++;
}
- }
break;
case AUDIO_AAC1:
case AUDIO_AAC2:
- {
- while(i + 7 < s->b_buffer_len)
{
+ if(i + 7 >= s->b_buffer_len)
+ {
+ finished = 1;
+ break;
+ }
+
if(s->b_buffer[i] == 0xFF && ((s->b_buffer[i+1] & 0xF6) == 0xF0))
{
len = aac_parse_frame(&(s->b_buffer[i]), &srate, &num);
if((len > 0) && (srate == s->wf->nSamplesPerSec) && (i + len <= s->b_buffer_len))
{
dur = (double) 1024 / (double) srate;
- spriv->timer += dur;
- if(spriv->drop_delayed_frames && delay < 0 && spriv->timer <= -delay)
- {
- i += len;
- tot = i;
- continue;
- }
- frames++;
- fill_last_frame(spriv, &(s->b_buffer[tot]), i - tot);
-
idur = (27000000ULL * 1024 * num) / srate;
- frm_idx = add_frame(spriv, idur, &(s->b_buffer[i]), len, 0, spriv->last_pts, spriv->last_pts);
- if(frm_idx < 0)
- continue;
- for(j = frm_idx; j < spriv->framebuf_cnt; j++)
- spriv->framebuf[j].pts = spriv->last_pts;
- spriv->last_pts += idur;
-
- i += len;
- tot = i;
- continue;
}
+ else
+ len = 0;
}
- i++;
}
}
+
+ if(finished)
+ break;
+
+ if(!len)
+ {
+ i++;
+ continue;
+ }
+
+ spriv->timer += dur;
+ if(spriv->drop_delayed_frames && delay < 0 && spriv->timer <= -delay)
+ {
+ i += len;
+ tot = i;
+ continue;
+ }
+
+ frames++;
+ fill_last_frame(spriv, &(s->b_buffer[tot]), i - tot);
+ frm_idx = add_frame(spriv, idur, &(s->b_buffer[i]), len, 0, spriv->last_pts, spriv->last_pts);
+ if(frm_idx < 0)
+ {
+ mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't add audio frame buffer(frame), abort\n");
+ goto audio_exit;
+ }
+ for(j = frm_idx; j < spriv->framebuf_cnt; j++)
+ spriv->framebuf[j].pts = spriv->last_pts;
+ spriv->last_pts += idur;
+
+ i += len;
+ tot = i;
}
+audio_exit:
if(tot)
{
memmove(s->b_buffer, &(s->b_buffer[tot]), s->b_buffer_len - tot);