[vlc-commits] qtsound: fix crashes and some other issues
David Fuhrmann
git at videolan.org
Sun Jun 15 14:33:45 CEST 2014
vlc/vlc-2.2 | branch: master | David Fuhrmann <dfuhrmann at videolan.org> | Sun Jun 15 14:11:43 2014 +0200| [e5ef2c6977908863be5b8b1d3b71527bd2478a60] | committer: David Fuhrmann
qtsound: fix crashes and some other issues
- do not misuse a block_t as a plain array
- use correct size of buffers
- do not overwrite buffer pointers of the second block_t, instead
copy the data
close #7886
(cherry picked from commit 070237de4a867f263b5aa4cab0503812ed5d5d67)
> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=e5ef2c6977908863be5b8b1d3b71527bd2478a60
---
modules/access/qtsound.m | 44 ++++++++++++++++++++------------------------
1 file changed, 20 insertions(+), 24 deletions(-)
diff --git a/modules/access/qtsound.m b/modules/access/qtsound.m
index 3e366e4..776d601 100644
--- a/modules/access/qtsound.m
+++ b/modules/access/qtsound.m
@@ -131,7 +131,7 @@ vlc_module_end ()
/*
* Allocate storage for the interleaved audio data
*/
- rawAudioData = block_Alloc(totalDataSize * sizeof(float));
+ rawAudioData = malloc(totalDataSize);
if (NULL == rawAudioData) {
msg_Err(p_qtsound, "Raw audiodata could not be allocated");
return;
@@ -181,10 +181,7 @@ vlc_module_end ()
- (void)freeAudioMem
{
- @synchronized (self) {
- if (rawAudioData)
- block_Release(rawAudioData);
- }
+ FREENULL(rawAudioData);
}
- (mtime_t)getCurrentPts
@@ -499,41 +496,40 @@ static void Close(vlc_object_t *p_this)
static int Demux(demux_t *p_demux)
{
demux_sys_t *p_sys = p_demux->p_sys;
- block_t *p_blocka;
+ block_t *p_blocka = nil;
NSAutoreleasePool *pool;
- p_blocka = block_Alloc(p_sys->i_audio_max_buffer_size);
- if(!p_blocka) {
- msg_Err(p_demux, "cannot get audio block");
- return 0;
- }
@synchronized (p_sys->audiooutput) {
if ([p_sys->audiooutput checkCurrentAudioBuffer]) {
- p_blocka->i_buffer = p_blocka->i_size = [p_sys->audiooutput getCurrentTotalDataSize];
- p_blocka->p_buffer = p_blocka->p_start = [p_sys->audiooutput getCurrentAudioBufferData];
+ unsigned i_buffer_size = [p_sys->audiooutput getCurrentTotalDataSize];
+ p_blocka = block_Alloc(i_buffer_size);
+
+ if(!p_blocka) {
+ msg_Err(p_demux, "cannot get audio block");
+ return 0;
+ }
+
+ memcpy(p_blocka->p_buffer, [p_sys->audiooutput getCurrentAudioBufferData], i_buffer_size);
p_blocka->i_nb_samples = [p_sys->audiooutput getNumberOfSamples];
p_blocka->i_pts = [p_sys->audiooutput getCurrentPts];
+
+ [p_sys->audiooutput freeAudioMem];
}
}
- if(!p_blocka->i_pts) {
- // Nothing to transfer yet, just forget
- block_Release(p_blocka);
- msleep(10000);
- return 1;
- }
+ if (p_blocka) {
+ if (!p_blocka->i_pts) {
+ // Nothing to transfer yet, just forget
+ msleep(10000);
+ return 1;
+ }
- if(p_blocka) {
es_out_Control(p_demux->out, ES_OUT_SET_PCR, p_blocka->i_pts);
es_out_Send(p_demux->out, p_sys->p_es_audio, p_blocka);
}
- @synchronized (p_sys->audiooutput) {
- [p_sys->audiooutput freeAudioMem];
- }
-
return 1;
}
More information about the vlc-commits
mailing list