gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...
Date: Mon, 17 Sep 2007 12:21:48 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/09/17 12:21:47

Modified files:
        .              : ChangeLog 
        server         : sprite_instance.cpp 
        server/parser  : BitmapMovieDefinition.cpp 
                         BitmapMovieDefinition.h movie_def_impl.cpp 
                         movie_def_impl.h movie_definition.h 
                         sprite_definition.cpp sprite_definition.h 

Log message:
                * server/parser/movie_definition.h: changed signature of 
get_playlist:
                  rename to getPlaylist, return by pointer, have the default
                  implementation return 0.
                * server/parser/BitmapMovieDefinition.{cpp,h}: don't build a 
dummy
                  PlayList just for implementing the get_playlist abstract 
method,
                  it's not needed anymore (the default implementation does 
fine).
                * server/parser/movie_def_impl.{cpp,h}: use a std::map instead 
of a
                  std::vector to contain PlayList of each frame. This reduced 
memory
                  use for movies that don't have actions in *each* frame and 
removes
                  race conditions due to unexpected growth of frames while 
parsing
                  (when number of frames advertised in header doesn't match 
number
                  of SHOWFRAME found in the stream); (add_frame_name): don't 
insist
                  in _frames_loaded being less then advertised frame count.
                * server/parser/sprite_definition.{cpp,h}: use a std::map 
instead
                  of a std::vector for PlayList of frames. Cleanup construction
                  of dynamic sprite definitions now that we don't need to create
                  a fake PlayList only to store a dummy execute tag.
                * server/sprite_instance.cpp: update calls to getPlaylist.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4331&r2=1.4332
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.342&r2=1.343
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/BitmapMovieDefinition.cpp?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/BitmapMovieDefinition.h?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_def_impl.cpp?cvsroot=gnash&r1=1.80&r2=1.81
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_def_impl.h?cvsroot=gnash&r1=1.52&r2=1.53
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_definition.h?cvsroot=gnash&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.cpp?cvsroot=gnash&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.h?cvsroot=gnash&r1=1.28&r2=1.29

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.4331
retrieving revision 1.4332
diff -u -b -r1.4331 -r1.4332
--- ChangeLog   17 Sep 2007 11:04:17 -0000      1.4331
+++ ChangeLog   17 Sep 2007 12:21:46 -0000      1.4332
@@ -1,3 +1,24 @@
+2007-09-17 Sandro Santilli <address@hidden>
+
+       * server/parser/movie_definition.h: changed signature of get_playlist:
+         rename to getPlaylist, return by pointer, have the default
+         implementation return 0.
+       * server/parser/BitmapMovieDefinition.{cpp,h}: don't build a dummy
+         PlayList just for implementing the get_playlist abstract method, 
+         it's not needed anymore (the default implementation does fine).
+       * server/parser/movie_def_impl.{cpp,h}: use a std::map instead of a
+         std::vector to contain PlayList of each frame. This reduced memory
+         use for movies that don't have actions in *each* frame and removes
+         race conditions due to unexpected growth of frames while parsing
+         (when number of frames advertised in header doesn't match number
+         of SHOWFRAME found in the stream); (add_frame_name): don't insist
+         in _frames_loaded being less then advertised frame count.
+       * server/parser/sprite_definition.{cpp,h}: use a std::map instead
+         of a std::vector for PlayList of frames. Cleanup construction
+         of dynamic sprite definitions now that we don't need to create
+         a fake PlayList only to store a dummy execute tag.
+       * server/sprite_instance.cpp: update calls to getPlaylist.
+
 2007-09-17 Zou Lunkai <address@hidden>
 
        * server/gnash.h: another code map for proper key handling.

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.342
retrieving revision 1.343
diff -u -b -r1.342 -r1.343
--- server/sprite_instance.cpp  16 Sep 2007 16:48:13 -0000      1.342
+++ server/sprite_instance.cpp  17 Sep 2007 12:21:47 -0000      1.343
@@ -1930,9 +1930,12 @@
        //       to properly queue actions back on the global queue.
        //
        _callingFrameActions=true;
-       const PlayList& playlist = m_def->get_playlist(frame_number);
-       std::for_each(playlist.begin(), playlist.end(),
+       const PlayList* playlist = m_def->getPlaylist(frame_number);
+       if ( playlist )
+       {
+               std::for_each(playlist->begin(), playlist->end(),
                boost::bind(&execute_tag::execute_action, _1, this)); 
+       }
        _callingFrameActions=false;
 
 }
@@ -2438,23 +2441,25 @@
                }
        }
 
-       const PlayList& playlist = m_def->get_playlist(frame);
-
+       const PlayList* playlist = m_def->getPlaylist(frame);
+       if ( playlist )
+       {
        IF_VERBOSE_ACTION(
                // Use 1-based frame numbers
                log_action(_("Executing " SIZET_FMT " tags in frame "
                        SIZET_FMT "/" SIZET_FMT " of sprite %s"),
-                       playlist.size(), frame+1, get_frame_count(),
+                               playlist->size(), frame+1, get_frame_count(),
                        getTargetPath().c_str());
        );
 
-       for (PlayList::const_iterator it=playlist.begin(), itEnd=playlist.end();
+               for (PlayList::const_iterator it=playlist->begin(), 
itEnd=playlist->end();
                        it != itEnd; ++it)
        {
                execute_tag* tag = *it;
                if ( typeflags & TAG_DLIST ) tag->execute_state(this);
                if ( typeflags & TAG_ACTION ) tag->execute_action(this);
        }
+       }
 
        testInvariant();
 }

Index: server/parser/BitmapMovieDefinition.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/parser/BitmapMovieDefinition.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/parser/BitmapMovieDefinition.cpp     10 Sep 2007 16:53:30 -0000      
1.12
+++ server/parser/BitmapMovieDefinition.cpp     17 Sep 2007 12:21:47 -0000      
1.13
@@ -84,7 +84,6 @@
        // image::rgb size is in pixels
        _framesize(0, 0, image->width()*20, image->height()*20),
        _framecount(1),
-       _playlist(_framecount),
        _framerate(12),
        _url(url),
        _image(image)

Index: server/parser/BitmapMovieDefinition.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/BitmapMovieDefinition.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/parser/BitmapMovieDefinition.h       1 Jul 2007 10:54:33 -0000       
1.8
+++ server/parser/BitmapMovieDefinition.h       17 Sep 2007 12:21:47 -0000      
1.9
@@ -48,7 +48,6 @@
        int _version;
        rect _framesize;
        size_t _framecount;
-       std::vector<PlayList> _playlist;
        float _framerate;
        std::string _url;
 
@@ -146,12 +145,6 @@
                return new BitmapMovieInstance(this);
        }
 
-       virtual const PlayList& get_playlist(size_t frame_number) const
-       {
-               assert ( frame_number < _playlist.size() );
-               return _playlist[frame_number];
-       }
-
        virtual const std::string& get_url() const {
                return _url;
        }

Index: server/parser/movie_def_impl.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/parser/movie_def_impl.cpp,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -b -r1.80 -r1.81
--- server/parser/movie_def_impl.cpp    18 Aug 2007 08:05:00 -0000      1.80
+++ server/parser/movie_def_impl.cpp    17 Sep 2007 12:21:47 -0000      1.81
@@ -226,23 +226,33 @@
        // Request cancelation of the loading thread
        _loadingCanceled = true;
 
-    // Release our playlist data.
-    {for (size_t i = m_playlist.size() - 1; i != static_cast<size_t>(-1); i--) 
// Optimized
+       // Release frame tags
+       for (PlayListMap::iterator i=m_playlist.begin(), e=m_playlist.end(); 
i!=e; ++i)
         {
-            for (size_t j = m_playlist[i].size()-1; j != 
static_cast<size_t>(-1); j--)
+               PlayList& pl = i->second;
+
+               for (PlayList::iterator j=pl.begin(), je=pl.end(); j!=je; ++j)
                 {
-                    delete m_playlist[i][j];
+                    delete *j;
+                }
+
+               //pl.clear(); // useless, as we're going to clean the whole map
                 }
-        }}
+       //m_playlist.clear(); // useless, as we're going to call it's 
destructor next 
 
     // Release init action data.
-    {for (size_t i = m_init_action_list.size() - 1; i != 
static_cast<size_t>(-1); i--) //Optimized
+       for (PlayListMap::iterator i=m_init_action_list.begin(), 
e=m_init_action_list.end(); i!=e; ++i)
         {
-            for (size_t j = m_init_action_list[i].size()-1; j != 
static_cast<size_t>(-1); j--)
+               PlayList& pl = i->second;
+
+               for (PlayList::iterator j=pl.begin(), je=pl.end(); j!=je; ++j)
                 {
-                    delete m_init_action_list[i][j];
+                    delete *j;
+                }
+
+               //pl.clear(); // useless, as we're going to clean the whole map
                 }
-        }}
+       //m_init_action_list.clear(); // useless, as we're going to call it's 
destructor next 
 
        // It's supposed to be cleaned up in read()
        // TODO: join with loader thread instead ?
@@ -499,8 +509,8 @@
 
        // Allocate 1 more then the expected slots
        // for actions, to make handling malformed SWF easier.
-       m_playlist.resize(m_frame_count+1);
-       m_init_action_list.resize(m_frame_count+1);
+       //m_playlist.resize(m_frame_count+1);
+       //m_init_action_list.resize(m_frame_count+1);
 
        IF_VERBOSE_PARSE(
                m_frame_size.print();
@@ -991,8 +1001,8 @@
                                get_url().c_str(), _frames_loaded,
                                m_frame_count);
                );
-               m_playlist.resize(_frames_loaded+1);
-               m_init_action_list.resize(_frames_loaded+1);
+               //m_playlist.resize(_frames_loaded+1);
+               //m_init_action_list.resize(_frames_loaded+1);
        }
 
 #ifdef DEBUG_FRAMES_LOAD
@@ -1116,7 +1126,8 @@
 movie_def_impl::add_frame_name(const std::string& n)
 {
        //log_msg(_("labelframe: frame %d, name %s"), _frames_loaded, name);
-       assert(_frames_loaded < m_frame_count);
+       //why do we care about m_frame_count here ?
+       //assert(_frames_loaded < m_frame_count);
     m_named_frames[n] = _frames_loaded;
 }
 

Index: server/parser/movie_def_impl.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/movie_def_impl.h,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -b -r1.52 -r1.53
--- server/parser/movie_def_impl.h      18 Aug 2007 08:05:00 -0000      1.52
+++ server/parser/movie_def_impl.h      17 Sep 2007 12:21:47 -0000      1.53
@@ -209,11 +209,13 @@
        typedef std::map<int, boost::intrusive_ptr<sound_sample> > 
SoundSampleMap;
        SoundSampleMap m_sound_samples;
 
-       /// A list of movie control events for each frame.
-       std::vector<PlayList> m_playlist;
+       typedef std::map<size_t, PlayList> PlayListMap;
+
+       /// Movie control events for each frame.
+       PlayListMap m_playlist;
 
        /// Init actions for each frame.
-       std::vector<PlayList> m_init_action_list;
+       PlayListMap m_init_action_list;
 
        /// 0-based frame #'s
        typedef std::map<std::string, size_t> NamedFrameMap;
@@ -477,17 +479,14 @@
        void    add_execute_tag(execute_tag* tag)
        {
            assert(tag);
-           if (_frames_loaded < m_playlist.size()) {
              m_playlist[_frames_loaded].push_back(tag);
            }
-       }
 
        /// Need to execute the given tag before entering the
        /// currently-loading frame for the first time.
        void    add_init_action(execute_tag* e)
        {
            assert(e);
-           assert(_frames_loaded < m_init_action_list.size());
            m_init_action_list[_frames_loaded].push_back(e);
        }
 
@@ -508,17 +507,22 @@
            return m_jpeg_in.get();
        }
 
-       virtual const PlayList& get_playlist(size_t frame_number) const
+       virtual const PlayList* getPlaylist(size_t frame_number) const
        {
                assert(frame_number <= _frames_loaded);
-               return m_playlist[frame_number];
+
+               PlayListMap::const_iterator it = m_playlist.find(frame_number);
+               if ( it == m_playlist.end() ) return NULL;
+               else return &(it->second);
        }
 
        virtual const PlayList* get_init_actions(size_t frame_number)
        {
                assert(frame_number <= _frames_loaded);
-               //ensure_frame_loaded(frame_number);
-               return &m_init_action_list[frame_number];
+
+               PlayListMap::iterator it = 
m_init_action_list.find(frame_number);
+               if ( it == m_init_action_list.end() ) return NULL;
+               else return &(it->second);
        }
 
        /// Calls readHeader() and completeLoad() in sequence.

Index: server/parser/movie_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/movie_definition.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- server/parser/movie_definition.h    18 Aug 2007 08:05:00 -0000      1.29
+++ server/parser/movie_definition.h    17 Sep 2007 12:21:47 -0000      1.30
@@ -232,7 +232,13 @@
        /// @param frame_number
        ///      Frame number, 0-based (ie: first frame is 0)
        ///
-       virtual const PlayList& get_playlist(size_t frame_number) const = 0;
+       /// @return NULL if no execute tags are defined for the given frame 
number
+       ///         (the default implementation) or a pointer to the vector of 
them (PlayList)
+       ///
+       virtual const PlayList* getPlaylist(size_t /*frame_number*/) const
+       {
+               return 0;
+       }
 
        /// Return the list of init actions for given frame number
        //

Index: server/parser/sprite_definition.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- server/parser/sprite_definition.cpp 4 Sep 2007 23:09:33 -0000       1.19
+++ server/parser/sprite_definition.cpp 17 Sep 2007 12:21:47 -0000      1.20
@@ -48,11 +48,13 @@
 sprite_definition::~sprite_definition()
 {
        // Release our playlist data.
-       for (int i = 0, n = m_playlist.size(); i < n; i++)
+       for (PlayListMap::iterator i=m_playlist.begin(), e=m_playlist.end(); 
i!=e; ++i)
        {
-               for (int j = 0, m = m_playlist[i].size(); j < m; j++)
+               PlayList& pl = i->second;
+
+               for (PlayList::iterator j=pl.begin(), je=pl.end(); j!=je; ++j)
                {
-                   delete m_playlist[i][j];
+                    delete *j;
                }
        }
 }
@@ -73,9 +75,6 @@
                m_frame_count = 1;
        }
 
-       // need a playlist for each frame
-       m_playlist.resize(m_frame_count);
-
                IF_VERBOSE_PARSE (
        log_parse(_("  frames = " SIZET_FMT), m_frame_count);
                );
@@ -187,9 +186,6 @@
        {
                m_frame_count = 1;
                m_loading_frame = 1;
-
-               m_playlist.resize(1);
-               m_playlist[0].push_back(new execute_tag());
        }
        else
        {

Index: server/parser/sprite_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.h,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -b -r1.28 -r1.29
--- server/parser/sprite_definition.h   18 Aug 2007 08:05:00 -0000      1.28
+++ server/parser/sprite_definition.h   17 Sep 2007 12:21:47 -0000      1.29
@@ -122,8 +122,10 @@
        /// (the definition read from SWF stream)
        movie_definition* m_movie_def;
 
+       typedef std::map<size_t, PlayList> PlayListMap;
+
        /// movie control events for each frame.
-       std::vector<PlayList> m_playlist;
+       PlayListMap m_playlist;
 
        // stores 0-based frame #'s
        typedef std::map<std::string, size_t> NamedFrameMap;
@@ -131,6 +133,7 @@
 
        size_t m_frame_count;
 
+       // Number of frames completely parsed 
        size_t m_loading_frame;
 
        // overloads from movie_definition
@@ -314,9 +317,15 @@
        bool get_labeled_frame(const std::string& label, size_t& frame_number);
 
        /// frame_number is 0-based
-       const PlayList& get_playlist(size_t frame_number) const
+       const PlayList* getPlaylist(size_t frame_number) const
        {
-               return m_playlist[frame_number];
+               // Don't access playlist of a frame which has not been
+               // completely parsed yet.
+               assert(frame_number < m_loading_frame);
+
+               PlayListMap::const_iterator it = m_playlist.find(frame_number);
+               if ( it == m_playlist.end() ) return NULL;
+               else return &(it->second);
        }
 
        // Sprites do not have init actions in their




reply via email to

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