gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/parser/video_stream_def....


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/parser/video_stream_def....
Date: Fri, 19 Oct 2007 12:17:28 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/10/19 12:17:28

Modified files:
        .              : ChangeLog 
        server/parser  : video_stream_def.cpp video_stream_def.h 
        server/swf     : tag_loaders.cpp 

Log message:
                * server/parser/video_stream_def.{cpp,h}: split read into
                  readDefineVideoStream and readDefineVideoFrame, make
                  presence of a non-null _decoder member a sign of a
                  completed call to readDefineVideoStream (thus a sign
                  of a statically-defined videostream vs. a dynamically
                  created one [ using new Video ] ).
                * server/swf/tag_loaders.cpp: update calls to video_stream_def
                  ::read*

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4645&r2=1.4646
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/video_stream_def.cpp?cvsroot=gnash&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/video_stream_def.h?cvsroot=gnash&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/tag_loaders.cpp?cvsroot=gnash&r1=1.147&r2=1.148

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.4645
retrieving revision 1.4646
diff -u -b -r1.4645 -r1.4646
--- ChangeLog   19 Oct 2007 10:29:17 -0000      1.4645
+++ ChangeLog   19 Oct 2007 12:17:27 -0000      1.4646
@@ -1,5 +1,16 @@
 2007-10-19 Sandro Santilli <address@hidden>
 
+       * server/parser/video_stream_def.{cpp,h}: split read into
+         readDefineVideoStream and readDefineVideoFrame, make
+         presence of a non-null _decoder member a sign of a
+         completed call to readDefineVideoStream (thus a sign
+         of a statically-defined videostream vs. a dynamically
+         created one [ using new Video ] ).
+       * server/swf/tag_loaders.cpp: update calls to video_stream_def
+         ::read*
+
+2007-10-19 Sandro Santilli <address@hidden>
+
        * server/parser/video_stream_def.cpp (read): rework the input
          buffer padding to be cleaner, safer and a bit faster (only
          memset the pad); (destructor): get rid of the embedded video

Index: server/parser/video_stream_def.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/parser/video_stream_def.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- server/parser/video_stream_def.cpp  19 Oct 2007 10:29:17 -0000      1.21
+++ server/parser/video_stream_def.cpp  19 Oct 2007 12:17:28 -0000      1.22
@@ -16,7 +16,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 // 
-// $Id: video_stream_def.cpp,v 1.21 2007/10/19 10:29:17 strk Exp $
+// $Id: video_stream_def.cpp,v 1.22 2007/10/19 12:17:28 strk Exp $
 
 #include "video_stream_def.h"
 #include "video_stream_instance.h"
@@ -51,15 +51,14 @@
 
 
 void
-video_stream_definition::read(stream* in, SWF::tag_type tag, movie_definition* 
m)
+video_stream_definition::readDefineVideoStream(stream* in, SWF::tag_type tag, 
movie_definition* m)
 {
 
        // Character ID has been read already, and was loaded in the constructor
 
-       assert(tag == SWF::DEFINEVIDEOSTREAM || tag == SWF::VIDEOFRAME);
+       assert(tag == SWF::DEFINEVIDEOSTREAM);
+       assert(!_decoder.get()); // allowed to be called only once
 
-       if (tag == SWF::DEFINEVIDEOSTREAM)
-       {
                m_start_frame = m->get_loading_frame();
 
                m_num_frames = in->read_u16();
@@ -82,11 +81,18 @@
                _decoder.reset( new VideoDecoder() );
 #endif
                bool ret = _decoder->setup(_width, _height, m_deblocking_flags, 
m_smoothing_flags, m_codec_id, gnash::render::videoFrameFormat());
-               if (!ret) _decoder.reset();
+       if (!ret) _decoder.reset(new VideoDecoder()); // This is so 
statically-defined video_stream_def always have a _decoder != NULL
+
+}
+
+void
+video_stream_definition::readDefineVideoFrame(stream* in, SWF::tag_type tag, 
movie_definition* m)
+{
+       // Character ID has been read already, and was loaded in the constructor
+
+       assert(tag == SWF::VIDEOFRAME);
+       assert ( _decoder.get() ); // not allowed to be called for a 
dynamically-created video_stream_def
 
-       }
-       else if (tag == SWF::VIDEOFRAME && _decoder)
-       {
                // We don't use the videoframe number, but instead
                // each video frame is tied to the swf-frame where
                // it belongs.
@@ -116,17 +122,12 @@
                        //       in the tag instead of skipping it ?
                        size_t frameNum = m->get_loading_frame();
 
-                       // TODO: use a private function for this as we
-                       //       should eventually delete any previously
-                       //       existing element for key frameNum
-                       m_video_frames[frameNum] = img.release();
+               setFrameData(frameNum, img);
                }
                else
                {
                        log_error(_("An error occured while decoding video 
frame in frame %d"), m->get_loading_frame());
                }
-       }
-
 }
 
 
@@ -150,5 +151,19 @@
        }
 }
 
+void
+video_stream_definition::setFrameData(uint32_t frameNum, 
std::auto_ptr<image::image_base> image)
+{
+       image::image_base*& ptr = m_video_frames[frameNum];
+       if ( ptr )
+       {
+               IF_VERBOSE_MALFORMED_SWF(
+               log_swferror(_("Mulitple video frames defined for frame %u"), 
frameNum);
+               );
+               return;
+       }
+       ptr = image.release();
+}
+
 } // namespace gnash
 

Index: server/parser/video_stream_def.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/video_stream_def.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- server/parser/video_stream_def.h    19 Oct 2007 09:30:24 -0000      1.14
+++ server/parser/video_stream_def.h    19 Oct 2007 12:17:28 -0000      1.15
@@ -16,7 +16,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 // 
-// $Id: video_stream_def.h,v 1.14 2007/10/19 09:30:24 strk Exp $
+// $Id: video_stream_def.h,v 1.15 2007/10/19 12:17:28 strk Exp $
 
 #ifndef GNASH_VIDEO_STREAM_DEF_H
 #define GNASH_VIDEO_STREAM_DEF_H
@@ -57,25 +57,24 @@
 
        character* create_character_instance(character* parent, int id);
 
-       /// Read tag SWF::DEFINEVIDEOSTREAM or SWF::VIDEOFRAME
+       /// Read tag SWF::DEFINEVIDEOSTREAM 
        //
-       /// For DEFINEVIDEOSTREAM tag, the character_id is assumed to have been
-       /// already read by caller.
+       /// The character_id is assumed to have been already read by caller.
        ///
-       /// For VIDEOFRAME, again, the character_id (which contains association
-       /// between the VIDEOFRAME tag and the VIDEOSTREAM defined before) is
-       /// assumed to have been already read.
+       /// This function is allowed to be called only *once* for each
+       /// instance of this class.
        ///
-       /// For clarity, a *single* instance of this class should theoretically
-       /// read a DEFINEVIDEOSTREAM on first call and zero or more VIDEOFRAME
-       /// tags.
+       void readDefineVideoStream(stream* in, SWF::tag_type tag, 
movie_definition* m);
+
+       /// Read tag SWF::VIDEOFRAME
+       //
+       /// The character_id (used to find this instance in the character's 
dictionary)
+       /// is assumed to have been already read.
        ///
-       /// TODO: separate the two reader functions, provide a constructor
-       ///       reading the DEFINEVIDEOSTREAM and only expose the parser
-       ///           for VIDEOFRAME (to ensure, at C++ level, that we won't
-       ///       parse DEFINEVIDEOSTREAM twice).
+       /// This function is allowed to be called zero or more times, as long
+       /// as readDefineVideoStream was read before.
        ///
-       void    read(stream* in, SWF::tag_type tag, movie_definition* m);
+       void readDefineVideoFrame(stream* in, SWF::tag_type tag, 
movie_definition* m);
 
        /// Return local video bounds in twips
        const rect&     get_bound() const
@@ -138,6 +137,22 @@
        typedef std::map<uint32_t, image::image_base*> EmbedFrameMap;
        EmbedFrameMap m_video_frames;
 
+       /// Set data for the given frame
+       //
+       /// If a frame image is already known for the given frame number
+       /// it will NOT be replaced, and an SWF error will be printed.
+       /// The 'img' parameter will be deleted.
+       ///
+       /// See get_frame_data to extract it.
+       ///
+       /// @param frameNum
+       ///     Frame number.
+       ///
+       /// @param img
+       ///     Frame data. Ownership is transferred. 
+       ///
+       void setFrameData(uint32_t frameNum, std::auto_ptr<image::image_base> 
img);
+
        /// Width of the video
        uint32_t _width;
 

Index: server/swf/tag_loaders.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/tag_loaders.cpp,v
retrieving revision 1.147
retrieving revision 1.148
diff -u -b -r1.147 -r1.148
--- server/swf/tag_loaders.cpp  19 Oct 2007 09:20:55 -0000      1.147
+++ server/swf/tag_loaders.cpp  19 Oct 2007 12:17:28 -0000      1.148
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: tag_loaders.cpp,v 1.147 2007/10/19 09:20:55 strk Exp $ */
+/* $Id: tag_loaders.cpp,v 1.148 2007/10/19 12:17:28 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -1391,10 +1391,10 @@
     assert(tag == SWF::DEFINEVIDEOSTREAM); // 60
     uint16_t character_id = in->read_u16();
 
-    video_stream_definition* ch = new video_stream_definition(character_id);
-    ch->read(in, tag, m);
+    std::auto_ptr<video_stream_definition> chdef ( new 
video_stream_definition(character_id) );
+    chdef->readDefineVideoStream(in, tag, m);
 
-    m->add_character(character_id, ch);
+    m->add_character(character_id, chdef.release());
 
 }
 
@@ -1424,7 +1424,7 @@
         return;
     }
 
-    vdef->read(in, tag, m);
+    vdef->readDefineVideoFrame(in, tag, m);
 }
 
 void




reply via email to

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