amrparse: consider header size in byte <-> time conversions
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 28 May 2009 11:09:24 +0000 (13:09 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 28 May 2009 11:09:24 +0000 (13:09 +0200)
gst/amrparse/gstamrparse.c
gst/amrparse/gstamrparse.h

index aeb928e..5ec0c6c 100644 (file)
@@ -309,12 +309,12 @@ gst_amrparse_parse_header (GstAmrParse * amrparse,
     GST_DEBUG_OBJECT (amrparse, "AMR-WB detected");
     amrparse->block_size = block_size_wb;
     amrparse->wide = TRUE;
-    *skipsize = 9;
+    *skipsize = amrparse->header = 9;
   } else if (!memcmp (data, "#!AMR\n", 6)) {
     GST_DEBUG_OBJECT (amrparse, "AMR-NB detected");
     amrparse->block_size = block_size_nb;
     amrparse->wide = FALSE;
-    *skipsize = 6;
+    *skipsize = amrparse->header = 6;
   } else
     return FALSE;
 
@@ -453,6 +453,7 @@ gst_amrparse_start (GstBaseParse * parse)
   amrparse = GST_AMRPARSE (parse);
   GST_DEBUG ("start");
   amrparse->need_header = TRUE;
+  amrparse->header = 0;
   amrparse->sync = TRUE;
   amrparse->eos = FALSE;
   amrparse->framecount = 0;
@@ -478,6 +479,7 @@ gst_amrparse_stop (GstBaseParse * parse)
   amrparse = GST_AMRPARSE (parse);
   GST_DEBUG ("stop");
   amrparse->need_header = TRUE;
+  amrparse->header = 0;
   amrparse->ts = -1;
   return TRUE;
 }
@@ -548,7 +550,7 @@ gst_amrparse_convert (GstBaseParse * parse,
       GST_DEBUG ("converting bytes -> time");
 
       if (amrparse->framecount) {
-        *dest_value = AMR_FRAME_DURATION * src_value / bpf;
+        *dest_value = AMR_FRAME_DURATION * (src_value - amrparse->header) / bpf;
         GST_DEBUG ("conversion result: %lld ms", *dest_value / GST_MSECOND);
         ret = TRUE;
       }
@@ -557,7 +559,7 @@ gst_amrparse_convert (GstBaseParse * parse,
     GST_DEBUG ("converting time -> bytes");
     if (dest_format == GST_FORMAT_BYTES) {
       if (amrparse->framecount) {
-        *dest_value = bpf * src_value / AMR_FRAME_DURATION;
+        *dest_value = bpf * src_value / AMR_FRAME_DURATION + amrparse->header;
         GST_DEBUG ("time %lld ms in bytes = %lld",
             src_value / GST_MSECOND, *dest_value);
         ret = TRUE;
index e776f29..4cd432e 100644 (file)
@@ -61,6 +61,7 @@ struct _GstAmrParse {
   GstBaseParse element;
   const gint *block_size;
   gboolean need_header;
+  gint header;
   gboolean wide;
   gboolean eos;
   gboolean sync;