[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gstreamer-cvs
Subject:    [gst-cvs] gst-plugins-good: avi: fix read offset and cleanups
From:       wtay () kemper ! freedesktop ! org (Wim Taymans)
Date:       2009-09-28 20:20:23
Message-ID: 20090928202023.B3EBA10053 () kemper ! freedesktop ! org
[Download RAW message or body]

Module: gst-plugins-good
Branch: master
Commit: b4a490655a1ac2ad4d6efcb65e974fb9e1b46c62
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=b4a490655a1ac2ad4d6efcb65e974fb9e1b46c62


Author: Wim Taymans <wim.taymans@collabora.co.uk>
Date:   Tue Sep 22 01:28:54 2009 +0200

avi: fix read offset and cleanups

---

 gst/avi/gstavidemux.c |   52 +++++++++++++++++++++++++-----------------------
 1 files changed, 27 insertions(+), 25 deletions(-)

diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index 68050f7..2caeba0 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -1200,7 +1200,7 @@ gst_avi_demux_read_subindexes_push (GstAviDemux * avi,
         continue;
       }
 
-      avi->offset += 8 + ((size + 1) & ~1);
+      avi->offset += 8 + GST_ROUND_UP_2 (size);
 
       buf = gst_buffer_new ();
       GST_BUFFER_DATA (buf) = gst_adapter_take (avi->adapter, size);
@@ -2076,6 +2076,15 @@ gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf)
             (entry.offset == 0 && n > 0)))
       continue;
 
+    /* figure out if the index is 0 based or relative to the MOVI start */
+    if (G_UNLIKELY (n == 0)) {
+      if (entry.offset < pos_before)
+        avi->index_offset = pos_before + 8;
+      else
+        avi->index_offset = 0;
+      GST_DEBUG ("index_offset = %" G_GUINT64_FORMAT, avi->index_offset);
+    }
+
     /* get the stream for this entry */
     stream_nr = CHUNKID_TO_STREAMNR (id);
     if (G_UNLIKELY (stream_nr >= avi->num_streams)) {
@@ -2138,21 +2147,14 @@ gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * \
buf)  goto out_of_mem;
     }
 
-    /* and copy */
     GST_LOG_OBJECT (avi,
         "Adding stream %d, index entry %d, flags %02x, size %u "
         ", offset %" G_GUINT64_FORMAT ", total %" G_GUINT64_FORMAT, stream_nr,
         stream->idx_n, entry.flags, entry.size, entry.offset, entry.total);
+
+    /* and copy */
     stream->index[stream->idx_n++] = entry;
 
-    /* figure out if the index is 0 based or relative to the MOVI start */
-    if (G_UNLIKELY (n == 0)) {
-      if (entry.offset < pos_before)
-        avi->index_offset = pos_before + 8;
-      else
-        avi->index_offset = 0;
-      GST_DEBUG ("index_offset = %" G_GUINT64_FORMAT, avi->index_offset);
-    }
     n++;
   }
   /* get stream stats now */
@@ -2438,8 +2440,8 @@ gst_avi_demux_stream_index (GstAviDemux * avi)
   if (tag == GST_RIFF_TAG_LIST) {
     /* this is the movi tag */
     GST_DEBUG_OBJECT (avi, "skip LIST chunk, size %" G_GUINT32_FORMAT,
-        (8 + ((size + 1) & ~1)));
-    offset += 8 + ((size + 1) & ~1);
+        (8 + GST_ROUND_UP_2 (size)));
+    offset += 8 + GST_ROUND_UP_2 (size);
     gst_buffer_unref (buf);
     res = gst_pad_pull_range (avi->sinkpad, offset, 8, &buf);
     if (res != GST_FLOW_OK)
@@ -3262,7 +3264,7 @@ gst_avi_demux_stream_header_push (GstAviDemux * avi)
   switch (avi->header_state) {
     case GST_AVI_DEMUX_HEADER_TAG_LIST:
       if (gst_avi_demux_peek_chunk (avi, &tag, &size)) {
-        avi->offset += 8 + ((size + 1) & ~1);
+        avi->offset += 8 + GST_ROUND_UP_2 (size);
         if (tag != GST_RIFF_TAG_LIST)
           goto header_no_list;
 
@@ -3392,7 +3394,7 @@ gst_avi_demux_stream_header_push (GstAviDemux * avi)
                       &avi->globaltags);
                   gst_buffer_unref (buf);
 
-                  avi->offset += ((size + 1) & ~1) - 4;
+                  avi->offset += GST_ROUND_UP_2 (size) - 4;
                 } else {
                   GST_DEBUG ("skipping INFO LIST prefix");
                 }
@@ -3403,8 +3405,8 @@ gst_avi_demux_stream_header_push (GstAviDemux * avi)
               break;
             default:
               if (gst_avi_demux_peek_chunk (avi, &tag, &size)) {
-                avi->offset += 8 + ((size + 1) & ~1);
-                gst_adapter_flush (avi->adapter, 8 + ((size + 1) & ~1));
+                avi->offset += 8 + GST_ROUND_UP_2 (size);
+                gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size));
                 // ??? goto iterate; ???
               } else {
                 /* Need more data */
@@ -3414,8 +3416,8 @@ gst_avi_demux_stream_header_push (GstAviDemux * avi)
           }
         } else {
           if (gst_avi_demux_peek_chunk (avi, &tag, &size)) {
-            avi->offset += 8 + ((size + 1) & ~1);
-            gst_adapter_flush (avi->adapter, 8 + ((size + 1) & ~1));
+            avi->offset += 8 + GST_ROUND_UP_2 (size);
+            gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size));
             //goto iterate;
           } else {
             /* Need more data */
@@ -3716,7 +3718,7 @@ gst_avi_demux_stream_header_pull (GstAviDemux * avi)
             GST_WARNING_OBJECT (avi,
                 "Skipping unknown list tag %" GST_FOURCC_FORMAT,
                 GST_FOURCC_ARGS (ltag));
-            avi->offset += 8 + ((size + 1) & ~1);
+            avi->offset += 8 + GST_ROUND_UP_2 (size);
             break;
         }
       }
@@ -3727,7 +3729,7 @@ gst_avi_demux_stream_header_pull (GstAviDemux * avi)
         /* Fall-through */
       case GST_MAKE_FOURCC ('J', 'U', 'N', 'Q'):
       case GST_MAKE_FOURCC ('J', 'U', 'N', 'K'):
-        avi->offset += 8 + ((size + 1) & ~1);
+        avi->offset += 8 + GST_ROUND_UP_2 (size);
         break;
     }
   } while (1);
@@ -4553,7 +4555,7 @@ gst_avi_demux_loop_data (GstAviDemux * avi)
     }
 
     /* correct for index offset */
-    offset += avi->index_offset;
+    offset += avi->index_offset + 8;
 
     GST_LOG ("reading buffer (size=%d) from stream %d at current pos %"
         G_GUINT64_FORMAT " (%llx)", size, stream_num, offset, offset);
@@ -4751,8 +4753,8 @@ gst_avi_demux_stream_data (GstAviDemux * avi)
       /* recoverable */
       GST_WARNING ("Invalid stream ID %d (%" GST_FOURCC_FORMAT ")",
           stream_nr, GST_FOURCC_ARGS (tag));
-      avi->offset += 8 + ((size + 1) & ~1);
-      gst_adapter_flush (avi->adapter, 8 + ((size + 1) & ~1));
+      avi->offset += 8 + GST_ROUND_UP_2 (size);
+      gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size));
     } else {
       GstAviStream *stream;
       GstClockTime next_ts = 0;
@@ -4761,10 +4763,10 @@ gst_avi_demux_stream_data (GstAviDemux * avi)
       gst_adapter_flush (avi->adapter, 8);
 
       /* get buffer */
-      buf = gst_adapter_take_buffer (avi->adapter, ((size + 1) & ~1));
+      buf = gst_adapter_take_buffer (avi->adapter, GST_ROUND_UP_2 (size));
       /* patch the size */
       GST_BUFFER_SIZE (buf) = size;
-      avi->offset += 8 + ((size + 1) & ~1);
+      avi->offset += 8 + GST_ROUND_UP_2 (size);
 
       stream = &avi->stream[stream_nr];
 


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
gstreamer-cvs mailing list
gstreamer-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gstreamer-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic