mmplugins/lib3gp/impl/src/buffer.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmplugins/lib3gp/impl/src/buffer.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,341 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "mp4atom.h"
+#include <3gplibrary/mp4config.h>
+#include "mp4buffer.h"
+#include "mp4memwrap.h"
+#include "mp4file.h"
+#include "mp4list.h"
+
+
+
+/*
+ * Function:
+ *
+ *   mp4_i32 addData(MP4HandleImp handle,
+ *                   mp4_u8 *buffer,
+ *                   mp4_u32 bytestowrite)
+ *
+ * Description:
+ *
+ *   This function allocates memory for the data and copies it from
+ *   buffer to the new allocated buffer.
+ *
+ * Parameters:
+ *
+ *   handle        MP4 library handle
+ *   buffer        Buffer containing data
+ *   bytestowrite  Size of buffer in bytes
+ *
+ * Return value:
+ *
+ *   Negative      Error
+ *   0             Success
+ *
+ */
+mp4_i32 addData(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestowrite)
+{
+  void *newBuffer;
+
+  newBuffer = mp4malloc(bytestowrite);
+  if (newBuffer == NULL)
+    return -1;
+
+  mp4memcpy(newBuffer, buffer, bytestowrite);
+
+  if (listAppend(handle->mem, newBuffer, bytestowrite)) /* Success */
+    return 0;
+  else
+	  {
+	  if (newBuffer)
+		  {
+		  delete newBuffer;
+		  newBuffer = NULL;
+		  }
+	  return -1;
+	  }
+}
+
+
+/*
+ * Function:
+ *
+ *   mp4_u32 getBufferedBytes(MP4HandleImp handle)
+ *
+ * Description:
+ *
+ *   This function returns the number of bytes in the library internal
+ *   buffers.
+ *
+ * Parameters:
+ *
+ *   handle   MP4 library handle
+ *
+ * Return value:
+ *
+ *   0   The input is in a file and therefore no memory is used to store MP4
+ *       data or no memory in buffers.
+ *   >0  Number of bytes stored in the library internal buffers
+ *
+ */
+mp4_u32 getBufferedBytes(MP4HandleImp handle)
+{
+  if (handle->file)
+    return 0;
+
+  return listBytesInList(handle->mem);
+}
+
+
+/*
+ * Function:
+ *
+ *   mp4_u32 getCumulativeBufferedBytes(MP4HandleImp handle)
+ *
+ * Description:
+ *
+ *   This function returns the number of bytes passed through the library
+ *   internal buffers.
+ *
+ * Parameters:
+ *
+ *   handle   MP4 library handle
+ *
+ * Return value:
+ *
+ *   0   The input is in a file and therefore no memory is used to store MP4
+ *       data or no memory in buffers.
+ *   >0  Number of bytes stored in the library internal buffers
+ *
+ */
+mp4_u32 getCumulativeBufferedBytes(MP4HandleImp handle)
+{
+  if (handle->file)
+    return 0;
+
+  return listCumulativeBytesInList(handle->mem);
+}
+
+
+/*
+ * Function:
+ *
+ *   mp4_i32 readData(MP4HandleImp handle,
+ *                    mp4_u8 *buffer,
+ *                    mp4_u32 bytestoread)
+ *
+ * Description:
+ *
+ *   This function reads bytestoread bytes from memory buffers or file
+ *   to buffer.
+ *
+ * Parameters:
+ *
+ *   handle       MP4 library handle
+ *   buffer       Caller allocated buffer for the data
+ *   bytestoread  Number of bytes to read
+ *
+ * Return value:
+ *
+ *   >= 0         Success. Value tells the number of bytes read.
+ *   -1           File has not been opened
+ *   -2           End of file or file error
+ *   -10          Not enough data in memory
+ *
+ */
+mp4_i32 readData(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestoread)
+{
+  if (handle->file) /* Input is in a file */
+  {
+    switch (readFile(handle, buffer, bytestoread))
+    {
+    case -2: /* EOF or error */
+      return -2;
+    case -1: /* File not open */
+      return -1;
+    case 0: /* Ok */
+      return bytestoread;
+    default:
+      break;
+    }
+  }
+  else /* Input is in memory list */
+  {
+    mp4_u32 i, j;
+    node_s *node;
+
+    if (handle->mem->bytesInList - handle->absPosition < bytestoread)
+      return -10;
+
+    i = 0;
+    j = handle->absPosition;
+
+    node = handle->mem->first;
+
+    while (i < bytestoread)
+    {
+      if ((mp4_i32)(node->dataSize - j) <= 0)
+      {
+        j -= node->dataSize;
+        node = node->next;
+        continue;
+      }
+
+      {
+        mp4_u32 k;
+
+        k = node->dataSize - j >= bytestoread - i ? bytestoread - i : node->dataSize - j;
+
+        mp4memcpy(buffer + i, ((mp4_u8 *)node->data) + j, k);
+        i += k;
+        j += k;
+      }
+    }
+
+    handle->position = j;
+    handle->absPosition += bytestoread;
+
+    node = handle->mem->first;
+  }
+
+  return bytestoread;
+}
+
+/*
+ * Function:
+ *
+ *   mp4_i32 peekData(MP4HandleImp handle,
+ *                    mp4_u8 *buffer,
+ *                    mp4_u32 bytestoread)
+ *
+ * Description:
+ *
+ *   This function reads bytestoread bytes from memory buffers or file
+ *   to buffer but doesn't change the internal position in the file/stream.
+ *
+ * Parameters:
+ *
+ *   handle       MP4 library handle
+ *   buffer       Caller allocated buffer for the data
+ *   bytestoread  Number of bytes to read
+ *
+ * Return value:
+ *
+ *   >= 0         Success. Value tells the number of bytes read.
+ *   -1           File has not been opened
+ *   -2           End of file or file error
+ *   -3           fseek failed
+ *   -10          Not enough data in memory
+ *
+ */
+mp4_i32 peekData(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestoread)
+{
+  if (handle->file) /* Input is in a file */
+  {
+    switch (peekFile(handle, buffer, bytestoread))
+    {
+    case -3: /* fseek failed */
+      return -3;
+    case -2: /* EOF or error */
+      return -2;
+    case -1: /* File not open */
+      return -1;
+    case 0: /* Ok */
+      return bytestoread;
+    default:
+      break;
+    }
+  }
+  else /* Input is in memory list */
+  {
+    mp4_u32 i, j;
+    node_s *node;
+
+    if ((mp4_i32)(handle->mem->bytesInList - handle->absPosition) < (mp4_i32)bytestoread)
+      return -10;
+
+    i = 0;
+    j = handle->absPosition;
+
+    node = handle->mem->first;
+
+    while (i < bytestoread)
+    {
+      if ((mp4_i32)(node->dataSize - j) <= 0)
+      {
+        j -= node->dataSize;
+        node = node->next;
+        continue;
+      }
+
+      {
+        mp4_u32 k;
+
+        k = node->dataSize - j >= bytestoread - i ? bytestoread - i : node->dataSize - j;
+
+        mp4memcpy(buffer + i, ((mp4_u8 *)node->data) + j, k);
+        i += k;
+        j += k;
+      }
+    }
+  }
+
+  return bytestoread;
+}
+
+
+/*
+ * Function:
+ *
+ *   mp4_i32 discardData(MP4HandleImp handle,
+ *                       mp4_i32 bytesToDiscard)
+ *
+ * Description:
+ *
+ *   This function reads and discards bytesToDiscard bytes from file/stream.
+ *
+ * Parameters:
+ *
+ *   handle             MP4 library handle
+ *   bytesToDiscard     This many bytes are discarded
+ *
+ * Return value:
+ *
+ *   Negative integer   Error
+ *   >= 0               Success. Value tells how many bytes were read.
+ *
+ */
+mp4_i32 discardData(MP4HandleImp handle, mp4_i32 bytesToDiscard)
+{
+  mp4_i32 bytesread;
+  mp4_i32 bytestoread;
+  mp4_i32 totalbytesread = 0;
+
+  while (totalbytesread < bytesToDiscard)
+  {
+    bytestoread = bytesToDiscard - totalbytesread;
+    if (bytestoread > TMPBUFSIZE)
+      bytestoread = TMPBUFSIZE;
+
+    bytesread = readData(handle, handle->buf, bytestoread);
+    if (bytesread < 0)
+      return -1;
+    totalbytesread += bytesread;
+  }
+
+  return totalbytesread;
+}
+// End of File