Mercurial > mplayer.hg
comparison libmpdemux/demux_real.c @ 37104:91b00a4407cd
demux_real: Improve buffer allocation for interleaved audio handling.
Allocate buffers where they are needed.
This avoids code duplication, allocating them when they are not
needed, and might avoid a crash if an audio stream is specified
via -aid that does not exist in the headers but does exist in the
file since then we might run the deinterleaving without having
the buffers allocated first (note: I have not tested this can
actually happen).
author | reimar |
---|---|
date | Tue, 13 May 2014 21:06:38 +0000 |
parents | 92dd1764392a |
children | f05b151463ca |
comparison
equal
deleted
inserted
replaced
37103:bc3d67969fcc | 37104:91b00a4407cd |
---|---|
742 return 1; | 742 return 1; |
743 } | 743 } |
744 if ((priv->intl_id[demuxer->audio->id] == mmioFOURCC('I', 'n', 't', '4')) || | 744 if ((priv->intl_id[demuxer->audio->id] == mmioFOURCC('I', 'n', 't', '4')) || |
745 (priv->intl_id[demuxer->audio->id] == mmioFOURCC('g', 'e', 'n', 'r')) || | 745 (priv->intl_id[demuxer->audio->id] == mmioFOURCC('g', 'e', 'n', 'r')) || |
746 (priv->intl_id[demuxer->audio->id] == mmioFOURCC('s', 'i', 'p', 'r'))) { | 746 (priv->intl_id[demuxer->audio->id] == mmioFOURCC('s', 'i', 'p', 'r'))) { |
747 if (!priv->audio_buf) { | |
748 priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]); | |
749 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double)); | |
750 } | |
747 sps = priv->sub_packet_size[demuxer->audio->id]; | 751 sps = priv->sub_packet_size[demuxer->audio->id]; |
748 sph = priv->sub_packet_h[demuxer->audio->id]; | 752 sph = priv->sub_packet_h[demuxer->audio->id]; |
749 cfs = priv->coded_framesize[demuxer->audio->id]; | 753 cfs = priv->coded_framesize[demuxer->audio->id]; |
750 w = priv->audiopk_size[demuxer->audio->id]; | 754 w = priv->audiopk_size[demuxer->audio->id]; |
751 spc = priv->sub_packet_cnt; | 755 spc = priv->sub_packet_cnt; |
1076 if((unsigned)rm_stream_id<MAX_STREAMS){ | 1080 if((unsigned)rm_stream_id<MAX_STREAMS){ |
1077 if(demuxer->audio->id==-1 && demuxer->a_streams[mp_stream_id]){ | 1081 if(demuxer->audio->id==-1 && demuxer->a_streams[mp_stream_id]){ |
1078 sh_audio_t *sh = demuxer->a_streams[mp_stream_id]; | 1082 sh_audio_t *sh = demuxer->a_streams[mp_stream_id]; |
1079 demuxer->audio->id=mp_stream_id; | 1083 demuxer->audio->id=mp_stream_id; |
1080 demuxer->audio->sh=sh; | 1084 demuxer->audio->sh=sh; |
1081 priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]); | |
1082 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double)); | |
1083 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected RM audio ID = %d (rm id %d)\n",mp_stream_id, rm_stream_id); | 1085 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected RM audio ID = %d (rm id %d)\n",mp_stream_id, rm_stream_id); |
1084 goto got_audio; | 1086 goto got_audio; |
1085 } | 1087 } |
1086 | 1088 |
1087 if(demuxer->video->id==-1 && demuxer->v_streams[mp_stream_id]){ | 1089 if(demuxer->video->id==-1 && demuxer->v_streams[mp_stream_id]){ |
1507 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Multirate autoselected audio id %d with bitrate %d\n", stream_id, bitrate); | 1509 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Multirate autoselected audio id %d with bitrate %d\n", stream_id, bitrate); |
1508 } | 1510 } |
1509 | 1511 |
1510 if(demuxer->audio->id==stream_id){ | 1512 if(demuxer->audio->id==stream_id){ |
1511 demuxer->audio->sh=sh; | 1513 demuxer->audio->sh=sh; |
1512 priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]); | |
1513 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double)); | |
1514 } | 1514 } |
1515 | 1515 |
1516 ++a_streams; | 1516 ++a_streams; |
1517 | 1517 |
1518 #ifdef stream_skip | 1518 #ifdef stream_skip |