[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv... |
Date: |
Tue, 01 May 2007 20:33:27 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 07/05/01 20:33:27
Modified files:
. : ChangeLog
server/asobj : NetStream.cpp NetStream.h NetStreamFfmpeg.cpp
NetStreamFfmpeg.h NetStreamGst.cpp
NetStreamGst.h
Log message:
* server/asobj/: NetStream.{cpp,h}, NetStreamFfmpeg.{cpp,h},
NetStreamGst.{cpp,h}: move all onStatus handling to base class
and made thread safe.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3053&r2=1.3054
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStream.cpp?cvsroot=gnash&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStream.h?cvsroot=gnash&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStreamFfmpeg.cpp?cvsroot=gnash&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStreamFfmpeg.h?cvsroot=gnash&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStreamGst.cpp?cvsroot=gnash&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStreamGst.h?cvsroot=gnash&r1=1.12&r2=1.13
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.3053
retrieving revision 1.3054
diff -u -b -r1.3053 -r1.3054
--- ChangeLog 1 May 2007 18:02:51 -0000 1.3053
+++ ChangeLog 1 May 2007 20:33:27 -0000 1.3054
@@ -1,5 +1,11 @@
2007-05-01 Sandro Santilli <address@hidden>
+ * server/asobj/: NetStream.{cpp,h}, NetStreamFfmpeg.{cpp,h},
+ NetStreamGst.{cpp,h}: move all onStatus handling to base class
+ and made thread safe.
+
+2007-05-01 Sandro Santilli <address@hidden>
+
* server/movie_root.h: add getWidth() and getHeight()
* server/asobj/Stage.{cpp,h}: implement Stage.width and
Stage.height.
Index: server/asobj/NetStream.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStream.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- server/asobj/NetStream.cpp 18 Apr 2007 11:00:30 -0000 1.37
+++ server/asobj/NetStream.cpp 1 May 2007 20:33:27 -0000 1.38
@@ -17,7 +17,7 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
-/* $Id: NetStream.cpp,v 1.37 2007/04/18 11:00:30 jgilmore Exp $ */
+/* $Id: NetStream.cpp,v 1.38 2007/05/01 20:33:27 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -35,6 +35,7 @@
#include "builtin_function.h"
#include "GnashException.h"
#include "NetConnection.h"
+#include "action.h" // for call_method
#include "movie_root.h"
@@ -52,7 +53,8 @@
NetStream::NetStream()
:
as_object(getNetStreamInterface()),
- _netCon(NULL)
+ _netCon(NULL),
+ m_env(NULL)
{
}
@@ -249,4 +251,58 @@
}
+void
+NetStream::processStatusNotifications()
+{
+ boost::mutex::scoped_lock lock(statusMutex);
+
+ // TODO: check for System.onStatus too !
+ size_t size = m_status_messages.size();
+ as_value status;
+ if (size && get_member("onStatus", &status) && status.is_function())
+ {
+ log_debug("Processing %d status notifications", size);
+
+ for (size_t i = 0; i < size; ++i)
+ {
+ log_debug(" Invoking onStatus(%s)",
m_status_messages[i].c_str());
+
+ // TODO: optimize by reusing the same as_object ?
+ boost::intrusive_ptr<as_object> o = new as_object();
+ o->init_member("code", as_value(m_status_messages[i]),
1);
+
+ if (m_status_messages[i].find("StreamNotFound") ==
string::npos && m_status_messages[i].find("InvalidTime") == string::npos)
+ {
+ o->init_member("level", as_value("status"),
as_prop_flags::dontDelete|as_prop_flags::dontEnum);
+ }
+ else
+ {
+ o->init_member("level", as_value("error"),
as_prop_flags::dontDelete|as_prop_flags::dontEnum);
+ }
+
+ m_env->push_val(as_value(o.get()));
+ call_method(status, m_env, this, 1,
m_env->get_top_index() );
+ }
+ }
+
+ m_status_messages.clear();
+}
+
+void
+NetStream::setStatus(const std::string& status)
+{
+ // TODO: make thread safe !! protect by a mutex, and use the mutex from
status invoker
+ boost::mutex::scoped_lock lock(statusMutex);
+
+ if (m_status_messages.size() && m_status_messages.back() == status)
+ {
+ // status unchanged
+ return;
+ }
+
+ m_status_messages.push_back(status);
+}
+
+
+
} // end of gnash namespace
Index: server/asobj/NetStream.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStream.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- server/asobj/NetStream.h 7 Apr 2007 11:55:50 -0000 1.26
+++ server/asobj/NetStream.h 1 May 2007 20:33:27 -0000 1.27
@@ -18,7 +18,7 @@
//
//
-/* $Id: NetStream.h,v 1.26 2007/04/07 11:55:50 tgc Exp $ */
+/* $Id: NetStream.h,v 1.27 2007/05/01 20:33:27 strk Exp $ */
#ifndef __NETSTREAM_H__
#define __NETSTREAM_H__
@@ -49,6 +49,43 @@
boost::intrusive_ptr<NetConnection> _netCon;
+ // List of status messages to be processed
+ std::vector<std::string> m_status_messages;
+
+ /// Mutex protecting m_status_messages
+ boost::mutex statusMutex;
+
+ /// Set stream status.
+ //
+ /// Valid statuses are:
+ ///
+ /// Status level:
+ /// - NetStream.Buffer.Empty
+ /// - NetStream.Buffer.Full
+ /// - NetStream.Buffer.Flush
+ /// - NetStream.Play.Start
+ /// - NetStream.Play.Stop
+ /// - NetStream.Seek.Notify
+ ///
+ /// Error level:
+ /// - NetStream.Play.StreamNotFound
+ /// - NetStream.Seek.InvalidTime
+ ///
+ /// TODO: use an enum !
+ ///
+ void setStatus(const std::string& /*code*/);
+
+ /// \brief
+ /// Call any onStatus event handler passing it
+ /// any queued status change, see m_status_messages
+ //
+ /// TODO: move up to NetStream ?
+ ///
+ void processStatusNotifications();
+
+ // The actionscript enviroment for the AS callbacks
+ as_environment* m_env;
+
public:
NetStream();
@@ -65,8 +102,6 @@
virtual void setBufferTime(double /*time*/){}
- virtual void set_status(const char* /*code*/){}
-
virtual void setNetCon(boost::intrusive_ptr<NetConnection> nc)
{
_netCon = nc;
@@ -89,7 +124,11 @@
virtual bool newFrameReady() { return false; }
- virtual void setEnvironment(as_environment* /*env*/) { };
+ void setEnvironment(as_environment* env)
+ {
+ assert(env);
+ m_env = env;
+ }
};
Index: server/asobj/NetStreamFfmpeg.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStreamFfmpeg.cpp,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- server/asobj/NetStreamFfmpeg.cpp 18 Apr 2007 14:39:19 -0000 1.39
+++ server/asobj/NetStreamFfmpeg.cpp 1 May 2007 20:33:27 -0000 1.40
@@ -17,7 +17,7 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
-/* $Id: NetStreamFfmpeg.cpp,v 1.39 2007/04/18 14:39:19 martinwguy Exp $ */
+/* $Id: NetStreamFfmpeg.cpp,v 1.40 2007/05/01 20:33:27 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -33,7 +33,7 @@
#include "movie_root.h"
#include "NetConnection.h"
#include "sound_handler.h"
-#include "action.h"
+//#include "action.h"
#include <boost/scoped_array.hpp>
#if defined(_WIN32) || defined(WIN32)
@@ -73,9 +73,7 @@
m_isFLV(false),
m_newFrameReady(false),
m_bufferTime(100),
- m_statusChanged(false),
- m_start_onbuffer(false),
- m_env(NULL)
+ m_start_onbuffer(false)
{
ByteIOCxt.buffer = NULL;
@@ -87,19 +85,6 @@
delete m_parser;
}
-void NetStreamFfmpeg::setEnvironment(as_environment* env)
-{
- m_env = env;
-}
-
-
-// called from avstreamer thread, and a few other places... (thread safe?)
-void NetStreamFfmpeg::set_status(const char* status)
-{
- m_status_messages.push_back(status);
- m_statusChanged = true;
-}
-
void NetStreamFfmpeg::pause(int mode)
{
if (mode == -1)
@@ -382,7 +367,7 @@
assert(ns);
if ( !nc->openConnection(ns->url.c_str(), ns) ) {
log_error(_("Gnash could not open movie: %s"), ns->url.c_str());
- ns->set_status("NetStream.Buffer.StreamNotFound");
+ ns->setStatus("NetStream.Buffer.StreamNotFound");
return;
}
@@ -391,7 +376,7 @@
// Check if the file is a FLV, in which case we use our own parser
char head[4] = {0, 0, 0, 0};
if (nc->read(head, 3) < 3) {
- ns->set_status("NetStream.Buffer.StreamNotFound");
+ ns->setStatus("NetStream.Buffer.StreamNotFound");
return;
}
nc->seek(0);
@@ -399,7 +384,7 @@
ns->m_isFLV = true;
ns->m_parser = new FLVParser();
if (!nc->connectParser(ns->m_parser)) {
- ns->set_status("NetStream.Buffer.StreamNotFound");
+ ns->setStatus("NetStream.Buffer.StreamNotFound");
log_error(_("Gnash could not open FLV movie: %s"),
ns->url.c_str());
delete ns->m_parser;
return;
@@ -464,7 +449,7 @@
// Open the stream. the 4th argument is the filename, which we ignore.
if(av_open_input_stream(&ns->m_FormatCtx, &ns->ByteIOCxt, "", inputFmt,
NULL) < 0){
log_error(_("Couldn't open file '%s' for decoding"),
ns->url.c_str());
- ns->set_status("NetStream.Play.StreamNotFound");
+ ns->setStatus("NetStream.Play.StreamNotFound");
return;
}
@@ -619,7 +604,7 @@
// This should only happen if close() is called before setup is complete
if (!ns->m_go) return;
- ns->set_status("NetStream.Play.Start");
+ ns->setStatus("NetStream.Play.Start");
raw_videodata_t* video = NULL;
@@ -686,7 +671,7 @@
}
}
ns->m_go = false;
- ns->set_status("NetStream.Play.Stop");
+ ns->setStatus("NetStream.Play.Stop");
}
@@ -759,7 +744,7 @@
// We pause and load and buffer a second before
continuing.
m_pause = true;
m_bufferTime =
static_cast<uint32_t>(m_video_clock) * 1000 + 1000;
- set_status("NetStream.Buffer.Empty");
+ setStatus("NetStream.Buffer.Empty");
m_start_onbuffer = true;
}
return false;
@@ -1050,37 +1035,14 @@
{
// Check if we should start the playback when a certain amount is
buffered
if (m_go && m_pause && m_start_onbuffer && m_parser &&
m_parser->isTimeLoaded(m_bufferTime)) {
- set_status("NetStream.Buffer.Full");
+ setStatus("NetStream.Buffer.Full");
m_pause = false;
m_start_onbuffer = false;
}
// Check if there are any new status messages, and if we should
// pass them to a event handler
- as_value status;
- if (m_statusChanged && get_member(std::string("onStatus"), &status) &&
status.is_function()) {
-
- int size = m_status_messages.size();
- for (int i = 0; i < size; ++i) {
- boost::intrusive_ptr<as_object> o = new as_object();
- o->init_member(std::string("code"),
as_value(m_status_messages[i]), 1);
-
- if (m_status_messages[i].find("StreamNotFound") ==
string::npos && m_status_messages[i].find("InvalidTime") == string::npos) {
- o->init_member(std::string("level"),
as_value("status"), as_prop_flags::dontDelete|as_prop_flags::dontEnum);
- } else {
- o->init_member(std::string("level"),
as_value("error"), as_prop_flags::dontDelete|as_prop_flags::dontEnum);
- }
- m_env->push_val(as_value(o.get()));
-
- call_method(status, m_env, this, 1,
m_env->get_top_index() );
-
- }
- m_status_messages.clear();
- m_statusChanged = false;
- } else if (m_statusChanged) {
- m_status_messages.clear();
- m_statusChanged = false;
- }
+ processStatusNotifications();
}
int64_t
Index: server/asobj/NetStreamFfmpeg.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStreamFfmpeg.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- server/asobj/NetStreamFfmpeg.h 11 Apr 2007 17:54:21 -0000 1.22
+++ server/asobj/NetStreamFfmpeg.h 1 May 2007 20:33:27 -0000 1.23
@@ -14,7 +14,7 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-/* $Id: NetStreamFfmpeg.h,v 1.22 2007/04/11 17:54:21 bjacques Exp $ */
+/* $Id: NetStreamFfmpeg.h,v 1.23 2007/05/01 20:33:27 strk Exp $ */
#ifndef __NETSTREAMFFMPEG_H__
#define __NETSTREAMFFMPEG_H__
@@ -181,14 +181,12 @@
int play(const char* source);
void seek(double pos);
void setBufferTime(double time);
- void set_status(const char* code);
void setNetCon(as_object* nc);
int64_t time();
long bytesLoaded();
long bytesTotal();
void advance();
bool newFrameReady();
- void setEnvironment(as_environment* env);
// Used for ffmpeg data read and seek callbacks
static int readPacket(void* opaque, uint8_t* buf, int buf_size);
@@ -285,20 +283,12 @@
// The size of the buffer in milliseconds
uint32_t m_bufferTime;
- // Has the status message been updated?
- volatile bool m_statusChanged;
-
// The handler which is invoked on status change
boost::intrusive_ptr<as_function> m_statusHandler;
// should we start when buffer is full?
bool m_start_onbuffer;
- // The actionscript enviroment for the AS callbacks
- as_environment* m_env;
-
- // List of status messages to be processed
- std::vector<std::string> m_status_messages;
};
} // gnash namespace
Index: server/asobj/NetStreamGst.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStreamGst.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- server/asobj/NetStreamGst.cpp 18 Apr 2007 11:00:30 -0000 1.24
+++ server/asobj/NetStreamGst.cpp 1 May 2007 20:33:27 -0000 1.25
@@ -17,7 +17,7 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
-/* $Id: NetStreamGst.cpp,v 1.24 2007/04/18 11:00:30 jgilmore Exp $ */
+/* $Id: NetStreamGst.cpp,v 1.25 2007/05/01 20:33:27 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -33,7 +33,7 @@
#include "render.h"
#include "movie_root.h"
#include "NetConnection.h"
-#include "action.h"
+//#include "action.h"
#include "gstgnashsrc.h"
@@ -91,7 +91,6 @@
videoheight(0),
m_newFrameReady(false),
m_parser(NULL),
- m_env(NULL),
m_pausePlayback(false),
m_start_onbuffer(false)
{
@@ -102,20 +101,6 @@
close();
}
-void NetStreamGst::set_status(const char* status)
-{
- std::string std_status = status;
- if (!(m_status_messages.size() > 0 &&
m_status_messages.back().compare(std_status) == 0)) {
- m_status_messages.push_back(std_status);
- m_statusChanged = true;
- }
-}
-
-void NetStreamGst::setEnvironment(as_environment* env)
-{
- m_env = env;
-}
-
void NetStreamGst::pause(int mode)
{
if (mode == -1)
@@ -298,7 +283,7 @@
FLVFrame* frame = ns->m_parser->nextAudioFrame();
if (!frame) {
- ns->set_status("NetStream.Buffer.Empty");
+ ns->setStatus("NetStream.Buffer.Empty");
ns->m_pausePlayback = true;
return;
}
@@ -320,7 +305,7 @@
FLVFrame* frame = ns->m_parser->nextVideoFrame();
if (!frame) {
- ns->set_status("NetStream.Buffer.Empty");
+ ns->setStatus("NetStream.Buffer.Empty");
ns->m_pausePlayback = true;
return;
}
@@ -342,7 +327,7 @@
// Pass stuff from/to the NetConnection object.
assert(ns);
if ( !nc->openConnection(ns->url.c_str(), ns) ) {
- ns->set_status("NetStream.Play.StreamNotFound");
+ ns->setStatus("NetStream.Play.StreamNotFound");
log_warning(_("Gnash could not open movie: %s"),
ns->url.c_str());
return;
}
@@ -351,7 +336,7 @@
uint8_t head[3];
if (nc->read(head, 3) < 3) {
- ns->set_status("NetStream.Buffer.StreamNotFound");
+ ns->setStatus("NetStream.Buffer.StreamNotFound");
return;
}
nc->seek(0);
@@ -359,7 +344,7 @@
ns->m_isFLV = true;
ns->m_parser = new FLVParser();
if (!nc->connectParser(ns->m_parser)) {
- ns->set_status("NetStream.Play.StreamNotFound");
+ ns->setStatus("NetStream.Play.StreamNotFound");
log_error(_("Gnash could not open movie: %s"),
ns->url.c_str());
return;
@@ -606,7 +591,7 @@
ns->m_start_onbuffer = true;
}
- ns->set_status("NetStream.Play.Start");
+ ns->setStatus("NetStream.Play.Start");
return;
}
@@ -642,7 +627,7 @@
GST_SEEK_TYPE_SET, GST_SECOND *
static_cast<long>(newpos),
GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
log_error("Gstreamer seek failed");
- set_status("NetStream.Seek.InvalidTime");
+ setStatus("NetStream.Seek.InvalidTime");
return;
}*/
} else {
@@ -650,11 +635,11 @@
GST_SEEK_TYPE_SET, GST_SECOND * static_cast<long>(pos),
GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
log_error("Gstreamer seek failed");
- set_status("NetStream.Seek.InvalidTime");
+ setStatus("NetStream.Seek.InvalidTime");
return;
}
}
- set_status("NetStream.Seek.Notify");
+ setStatus("NetStream.Seek.Notify");
}
void
@@ -669,7 +654,7 @@
{
// Check if we should start the playback when a certain amount is
buffered
if (m_isFLV && m_pause && m_go && m_start_onbuffer && m_parser &&
m_parser->isTimeLoaded(m_bufferTime)) {
- set_status("NetStream.Buffer.Full");
+ setStatus("NetStream.Buffer.Full");
m_pause = false;
gst_element_set_state (GST_ELEMENT (pipeline),
GST_STATE_PLAYING);
}
@@ -680,7 +665,7 @@
m_pausePlayback = false;
if (_netCon->loadCompleted()) {
- set_status("NetStream.Play.Stop");
+ setStatus("NetStream.Play.Stop");
gst_element_set_state (GST_ELEMENT (pipeline),
GST_STATE_NULL);
m_go = false;
} else {
@@ -706,31 +691,7 @@
// Check if there are any new status messages, and if we should
// pass them to a event handler
- as_value status;
- if (m_statusChanged && get_member(std::string("onStatus"), &status) &&
status.is_function()) {
-
- int size = m_status_messages.size();
- for (int i = 0; i < size; ++i) {
- boost::intrusive_ptr<as_object> o = new as_object();
- o->init_member(std::string("code"),
as_value(m_status_messages[i]), 1);
-
- if (m_status_messages[i].find("StreamNotFound") ==
string::npos && m_status_messages[i].find("InvalidTime") == string::npos) {
- o->init_member(std::string("level"),
as_value("status"), as_prop_flags::dontDelete|as_prop_flags::dontEnum);
- } else {
- o->init_member(std::string("level"),
as_value("error"), as_prop_flags::dontDelete|as_prop_flags::dontEnum);
- }
- m_env->push_val(as_value(o.get()));
-
- call_method(status, m_env, this, 1,
m_env->get_top_index() );
-
-
- }
- m_status_messages.clear();
- m_statusChanged = false;
- } else if (m_statusChanged) {
- m_status_messages.clear();
- m_statusChanged = false;
- }
+ processStatusNotifications();
}
int64_t
Index: server/asobj/NetStreamGst.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStreamGst.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/asobj/NetStreamGst.h 7 Apr 2007 11:55:50 -0000 1.12
+++ server/asobj/NetStreamGst.h 1 May 2007 20:33:27 -0000 1.13
@@ -46,14 +46,12 @@
int play(const char* source);
void seek(double pos);
void setBufferTime(double time);
- void set_status(const char* code);
void setNetCon(as_object* nc);
int64_t time();
long bytesLoaded();
long bytesTotal();
void advance();
bool newFrameReady();
- void setEnvironment(as_environment* env);
// Used for gstreamer data read and seek callbacks
static int readPacket(void* opaque, char* buf, int buf_size);
@@ -128,9 +126,6 @@
// The status message
std::string m_status;
- // Has the status message been updated?
- volatile bool m_statusChanged;
-
// The handler which is invoked on status change
boost::intrusive_ptr<as_function> m_statusHandler;
@@ -140,17 +135,12 @@
// The parser for FLV
FLVParser* m_parser;
- // The actionscript enviroment for the AS callbacks
- as_environment* m_env;
-
// On next advance() should we pause?
volatile bool m_pausePlayback;
- // List of status messages to be processed
- std::vector<std::string> m_status_messages;
-
// should we start when buffer is full?
bool m_start_onbuffer;
+
};
} // gnash namespace
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv...,
Sandro Santilli <=
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Sandro Santilli, 2007/05/04
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Sandro Santilli, 2007/05/05
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Tomas Groth, 2007/05/15
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Tomas Groth, 2007/05/16
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Sandro Santilli, 2007/05/28
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Tomas Groth, 2007/05/28
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Sandro Santilli, 2007/05/30
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Sandro Santilli, 2007/05/30
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Sandro Santilli, 2007/05/31
- [Gnash-commit] gnash ChangeLog server/asobj/NetStream.cpp serv..., Tomas Groth, 2007/05/31