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