[Top][All Lists]
[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;
};
- [Gnash-commit] gnash ChangeLog server/asobj/NetStreamFfmpeg.cp...,
Sandro Santilli <=