gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/asobj/NetStreamFfmpeg.cp...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/asobj/NetStreamFfmpeg.cp...
Date: Fri, 09 May 2008 10:03:25 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  08/05/09 10:03:25

Modified files:
        .              : ChangeLog 
        server/asobj   : NetStreamFfmpeg.cpp NetStreamFfmpeg.h 

Log message:
        * server/asobj/NetStreamFfmpeg.{cpp,h}: maintain a decoder
          buffer so to reuse it in case resampling is needed;
          allocate for it AVCODEC_MAX_AUDIO_FRAME_SIZE rather then 3/2
          of it; allocate computed number of bytes for the resampled
          buffer.
        
        NOTE: this is in response to valgrind's massif tool profiler, which
        reported decodeAudio being the most expensive memory-related function
        during a run of youtube beta player.
        
        From:
        
         ->41.19% (4,896,000B) 0x42E3CFD: 
gnash::NetStreamFfmpeg::decodeAudio(AVPacket*) (NetStreamFfmpeg.cpp:836)
        
        To:
        
         ->01.55% (192,000B) 0x42E52A6: 
gnash::NetStreamFfmpeg::decodeAudio(AVPacket*) (NetStreamFfmpeg.cpp:824)
        
        I guess I could do video next, being on top of new massif report

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.6565&r2=1.6566
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStreamFfmpeg.cpp?cvsroot=gnash&r1=1.114&r2=1.115
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStreamFfmpeg.h?cvsroot=gnash&r1=1.59&r2=1.60

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.6565
retrieving revision 1.6566
diff -u -b -r1.6565 -r1.6566
--- ChangeLog   9 May 2008 09:21:51 -0000       1.6565
+++ ChangeLog   9 May 2008 10:03:24 -0000       1.6566
@@ -1,3 +1,11 @@
+2008-05-09 Sandro Santilli <address@hidden>
+
+       * server/asobj/NetStreamFfmpeg.{cpp,h}: maintain a decoder
+         buffer so to reuse it in case resampling is needed;
+         allocate for it AVCODEC_MAX_AUDIO_FRAME_SIZE rather then 3/2
+         of it; allocate computed number of bytes for the resampled
+         buffer.
+
 2008-05-09 Zou Lunkai <address@hidden>
        
        * testsuite/actionscript.all/setProperty.as, Makefile.am: 

Index: server/asobj/NetStreamFfmpeg.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStreamFfmpeg.cpp,v
retrieving revision 1.114
retrieving revision 1.115
diff -u -b -r1.114 -r1.115
--- server/asobj/NetStreamFfmpeg.cpp    9 May 2008 07:27:14 -0000       1.114
+++ server/asobj/NetStreamFfmpeg.cpp    9 May 2008 10:03:25 -0000       1.115
@@ -77,7 +77,9 @@
        m_last_audio_timestamp(0),
        m_current_timestamp(0),
        m_unqueued_data(NULL),
-       m_time_of_pause(0)
+       m_time_of_pause(0),
+
+       _decoderBuffer(0)
 {
 
        ByteIOCxt.buffer = NULL;
@@ -85,6 +87,7 @@
 
 NetStreamFfmpeg::~NetStreamFfmpeg()
 {
+       if ( _decoderBuffer ) delete [] _decoderBuffer;
        close();
 }
 
@@ -815,11 +818,15 @@
        if (!m_ACodecCtx) return false;
 
        int frame_size;
-       unsigned int bufsize = (AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2;
+       //static const unsigned int bufsize = (AVCODEC_MAX_AUDIO_FRAME_SIZE * 
3) / 2;
+       static const unsigned int bufsize = AVCODEC_MAX_AUDIO_FRAME_SIZE;
+
+       if ( ! _decoderBuffer ) _decoderBuffer = new boost::uint8_t[bufsize];
+
+       boost::uint8_t* ptr = _decoderBuffer;
 
-       boost::uint8_t* ptr = new boost::uint8_t[bufsize];
 #ifdef FFMPEG_AUDIO2
-       frame_size = bufsize;
+       frame_size = bufsize; // TODO: is it safe not initializing this ifndef 
FFMPEG_AUDIO2 ?
        if (avcodec_decode_audio2(m_ACodecCtx, (boost::int16_t*) ptr, 
&frame_size, packet->data, packet->size) >= 0)
 #else
        if (avcodec_decode_audio(m_ACodecCtx, (boost::int16_t*) ptr, 
&frame_size, packet->data, packet->size) >= 0)
@@ -833,20 +840,57 @@
                {
                        // Resampling is needed.
                        
-                       boost::uint8_t* output = new boost::uint8_t[bufsize];
+                       // Compute new size based on frame_size and
+                       // resampling configuration
+                       double resampleFactor = 
(44100.0/m_ACodecCtx->sample_rate) * (2.0/m_ACodecCtx->channels);
+                       int resampledFrameSize = 
int(ceil(frame_size*resampleFactor));
+
+                       // Allocate just the required amount of bytes
+                       boost::uint8_t* output = new 
boost::uint8_t[resampledFrameSize];
                        
                        samples = 
_resampler.resample(reinterpret_cast<boost::int16_t*>(ptr), 
                                                         
reinterpret_cast<boost::int16_t*>(output), 
                                                         samples);
-                       delete [] ptr;
+
+                       if (resampledFrameSize < samples*2*2)
+                       {
+                               log_error(" --- Computation of resampled frame 
size (%d) < then the one based on samples (%d)",
+                                       resampledFrameSize, samples*2*2);
+
+                               log_debug(" input frame size: %d", frame_size);
+                               log_debug(" input sample rate: %d", 
m_ACodecCtx->sample_rate);
+                               log_debug(" input channels: %d", 
m_ACodecCtx->channels);
+                               log_debug(" input samples: %d", samples);
+
+                               log_debug(" output sample rate (assuming): %d", 
44100);
+                               log_debug(" output channels (assuming): %d", 2);
+                               log_debug(" output samples: %d", samples);
+
+                               abort(); // the call to resample() likely 
corrupted memory...
+                       }
+
+                       frame_size = samples*2*2;
+
+                       // ownership of memory pointed-to by 'ptr' will be
+                       // transferred below
                        ptr = reinterpret_cast<boost::uint8_t*>(output);
+
+                       // we'll reuse _decoderBuffer 
+               }
+               else
+               {
+                       // ownership of memory pointed-to by 'ptr' will be
+                       // transferred below, so we reset _decoderBuffer here.
+                       // Doing so, next time we'll need to decode we'll create
+                       // a new buffer
+                       _decoderBuffer=0;
                }
                
                media::raw_mediadata_t* raw = new media::raw_mediadata_t();
                
-               raw->m_data = ptr;
+               raw->m_data = ptr; // ownership of memory pointed by 'ptr' 
transferred here
                raw->m_ptr = raw->m_data;
-               raw->m_size = samples * 2 * 2; // 2 for stereo and 2 for 
samplesize = 2 bytes
+               raw->m_size = frame_size;
                raw->m_stream_index = m_audio_index;
 
                // set presentation timestamp

Index: server/asobj/NetStreamFfmpeg.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStreamFfmpeg.h,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -b -r1.59 -r1.60
--- server/asobj/NetStreamFfmpeg.h      9 May 2008 07:27:14 -0000       1.59
+++ server/asobj/NetStreamFfmpeg.h      9 May 2008 10:03:25 -0000       1.60
@@ -211,6 +211,9 @@
 
        // Time of when pause started, in seconds since VM started
        volatile boost::uint64_t m_time_of_pause;
+
+       // Decoder buffer
+       boost::uint8_t* _decoderBuffer;
 };
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]