Change a way to copy data between gstreamer plugin. 85/18185/1
authorKitae Kim <kt920.kim@samsung.com>
Thu, 6 Feb 2014 06:12:31 +0000 (15:12 +0900)
committerKitae Kim <kt920.kim@samsung.com>
Mon, 17 Mar 2014 10:03:21 +0000 (19:03 +0900)
Remove a memory region for meta data(video resolution, frame rate and etc.)
which is reserved in the first block of device memory.
After changing the way, copy data including the meta data and in/out buffer
into the same memory region.

Change-Id: I87b1e180cce128ba073a3620f2f4f75f009071c5
Signed-off-by: Kitae Kim <kt920.kim@samsung.com>
packaging/gst-plugins-emulator.spec
src/gstmaru.c
src/gstmaru.h
src/gstmaruinterface.c
src/gstmarumem.c
src/gstmarumem.h

index 6c1a160..8bc1352 100644 (file)
@@ -1,5 +1,5 @@
 Name: gst-plugins-emulator
-Version: 0.2.1
+Version: 0.2.2
 Release: 0
 Summary: GStreamer Decoder and Encoder Plugins for Emulator
 Group: Multimedia/Libraries
index 81f472e..bb24845 100644 (file)
@@ -134,7 +134,7 @@ static gboolean
 plugin_init (GstPlugin *plugin)
 {
   GST_DEBUG_CATEGORY_INIT (maru_debug,
-      "tizen-maru", 0, "Tizen Emulator Codec Elements");
+      "tizen-emul", 0, "Tizen Emulator Codec Elements");
 
   gst_maru_init_pix_fmt_info ();
 
@@ -177,7 +177,7 @@ GST_PLUGIN_DEFINE (
   "tizen-emul",
   "Codecs for Tizen Emulator",
   plugin_init,
-  "0.1.2",
+  "0.2.2",
   "LGPL",
   "gst-plugins-emulator",
   "http://tizen.org"
index 9011941..8827f4e 100644 (file)
@@ -56,7 +56,7 @@ enum codec_log_level {
 };
 
 #define CODEC_DEV   "/dev/brillcodec"
-#define CODEC_VER   1
+#define CODEC_VER   2
 
 #define CODEC_LOG(level, fmt, ...) \
   do { \
index ba755ef..7181f4c 100644 (file)
@@ -78,7 +78,6 @@ static int
 secure_device_mem (int fd, guint ctx_id, guint buf_size, gpointer* buffer)
 {
   int ret = 0;
-//  uint32_t opaque = 0;
   CodecBufferId opaque;
 
   CODEC_LOG (DEBUG, "enter: %s\n", __func__);
@@ -86,6 +85,9 @@ secure_device_mem (int fd, guint ctx_id, guint buf_size, gpointer* buffer)
   opaque.buffer_size = buf_size;
 
   ret = ioctl (fd, CODEC_CMD_SECURE_BUFFER, &opaque);
+  /* ioctl: CODEC_CMD_SECURE_BUFFER
+   *  - sets device memory offset into opaque.buffer_size
+   */
   *buffer = (gpointer)((uint32_t)device_mem + opaque.buffer_size);
   CODEC_LOG (DEBUG, "buffer: 0x%x\n", (int)buffer);
 
@@ -154,13 +156,13 @@ codec_buffer_alloc_and_copy (GstPad *pad, guint64 offset, guint size,
 
     GST_BUFFER_FREE_FUNC (*buf) = g_free;
 
-    memcpy (info.start, (uint32_t)device_mem + opaque.buffer_size, size);
-    release_device_mem(marudec->dev->fd, (uint32_t)device_mem + opaque.buffer_size);
+    memcpy (info.start, device_mem + opaque.buffer_size, size);
+    release_device_mem(marudec->dev->fd, device_mem + opaque.buffer_size);
 
     CODEC_LOG (DEBUG, "we secured last buffer, so we will use heap buffer\n");
   } else {
     // address of "device_mem" and "opaque" is aleady aligned.
-    info.start = (gpointer)((uint32_t)device_mem + opaque.buffer_size);
+    info.start = (gpointer)(device_mem + opaque.buffer_size);
     info.offset = opaque.buffer_size;
 
     GST_BUFFER_FREE_FUNC (*buf) = codec_buffer_free;
@@ -184,34 +186,52 @@ codec_buffer_alloc_and_copy (GstPad *pad, guint64 offset, guint size,
 int
 codec_init (CodecContext *ctx, CodecElement *codec, CodecDevice *dev)
 {
-  int ret = 0, opened = 0, size = 8;
-  uint32_t meta_offset = 0;
+  int opened = 0;
+  gpointer buffer = NULL;
+  CodecBufferId opaque;
 
   CODEC_LOG (DEBUG, "enter: %s\n", __func__);
 
-  ret = ioctl(dev->fd, CODEC_CMD_GET_CONTEXT_INDEX, &ctx->index);
-  if (ret < 0) {
-    GST_ERROR ("failed to get context index\n");
+  if (ioctl(dev->fd, CODEC_CMD_GET_CONTEXT_INDEX, &ctx->index) < 0) {
+    CODEC_LOG (ERR,
+      "[%s] failed to get a context index\n", __func__);
     return -1;
   }
   CODEC_LOG (DEBUG, "get context index: %d\n", ctx->index);
 
-  meta_offset = (ctx->index - 1) * CODEC_META_DATA_SIZE;
-  CODEC_LOG (DEBUG,
-    "init. ctx: %d meta_offset = 0x%x\n", ctx->index, meta_offset);
+  /* buffer size is 0. It means that this function is required to
+   * use small size.
+  */
+  if (secure_device_mem(dev->fd, ctx->index, 0, &buffer) < 0) {
+    CODEC_LOG (ERR,
+      "[%s] failed to get a memory block\n", __func__);
+    return -1;
+  }
+
+  codec_init_data_to (ctx, codec, buffer);
 
-  _codec_init_meta_to (ctx, codec, device_mem + meta_offset + size);
+  dev->mem_info.offset = GET_OFFSET(buffer);
+  _codec_invoke_qemu (ctx->index, CODEC_INIT, GET_OFFSET(buffer), dev->fd);
 
-  _codec_invoke_qemu (ctx->index, CODEC_INIT, 0, dev->fd);
+  opaque.buffer_index = ctx->index;
+  opaque.buffer_size = SMALLDATA;
 
-  CODEC_LOG (DEBUG,
-    "init. ctx: %d meta_offset = 0x%x, size: %d\n", ctx->index, meta_offset, size);
+  if (ioctl (dev->fd, CODEC_CMD_PUT_DATA_INTO_BUFFER, &opaque) < 0) {
+    CODEC_LOG (ERR,
+      "[%s] failed to accquire a memory block\n", __func__);
+    return -1;
+  }
 
   opened =
-    _codec_init_meta_from (ctx, codec->media_type, device_mem + meta_offset + size);
-  ctx->codec = codec;
+    codec_init_data_from (ctx, codec->media_type, device_mem + opaque.buffer_size);
 
-  CODEC_LOG (DEBUG, "opened: %d\n", opened);
+  if (opened < 0) {
+    CODEC_LOG (ERR, "failed to open Context for %s\n", codec->name);
+  } else {
+    ctx->codec = codec;
+  }
+
+  release_device_mem(dev->fd, device_mem + opaque.buffer_size);
 
   CODEC_LOG (DEBUG, "leave: %s\n", __func__);
 
@@ -245,16 +265,12 @@ codec_decode_video (CodecContext *ctx, uint8_t *in_buf, int in_size,
                     gint idx, gint64 in_offset, GstBuffer **out_buf,
                     int *got_picture_ptr, CodecDevice *dev)
 {
-  int len = 0, ret = 0, size = 8;
+  int len = 0, ret = 0;
   gpointer buffer = NULL;
-  uint32_t meta_offset = 0;
+  CodecBufferId opaque;
 
   CODEC_LOG (DEBUG, "enter: %s\n", __func__);
 
-  meta_offset = (ctx->index - 1) * CODEC_META_DATA_SIZE;
-  CODEC_LOG (DEBUG, "decode_video. ctx_id: %d meta_offset = 0x%x\n", ctx->index, meta_offset);
-  _codec_decode_video_meta_to (in_size, idx, in_offset, device_mem + meta_offset + size);
-
   ret = secure_device_mem(dev->fd, ctx->index, in_size, &buffer);
   if (ret < 0) {
     CODEC_LOG (ERR,
@@ -262,13 +278,23 @@ codec_decode_video (CodecContext *ctx, uint8_t *in_buf, int in_size,
     return -1;
   }
 
-  _codec_decode_video_inbuf (in_buf, in_size, buffer);
+  codec_decode_video_data_to (in_size, idx, in_offset, in_buf, buffer);
+
   dev->mem_info.offset = GET_OFFSET(buffer);
   _codec_invoke_qemu (ctx->index, CODEC_DECODE_VIDEO, GET_OFFSET(buffer), dev->fd);
 
-  // after decoding video, no need to get outbuf.
-  len =
-    _codec_decode_video_meta_from (&ctx->video, got_picture_ptr, device_mem + meta_offset + size);
+  opaque.buffer_index = ctx->index;
+  opaque.buffer_size = SMALLDATA;
+
+  if (ioctl (dev->fd, CODEC_CMD_PUT_DATA_INTO_BUFFER, &opaque) < 0) {
+    CODEC_LOG (ERR,
+      "[%s] failed to accquire a memory block\n", __func__);
+    return -1;
+  }
+
+  len = codec_decode_video_data_from (got_picture_ptr, &ctx->video, device_mem + opaque.buffer_size);
+
+  release_device_mem(dev->fd, device_mem + opaque.buffer_size);
 
   CODEC_LOG (DEBUG, "leave: %s\n", __func__);
 
@@ -280,17 +306,12 @@ codec_decode_audio (CodecContext *ctx, int16_t *samples,
                     int *have_data, uint8_t *in_buf,
                     int in_size, CodecDevice *dev)
 {
-  int len = 0, ret = 0, size = 8;
+  int len = 0, ret = 0;
   gpointer buffer = NULL;
-  uint32_t meta_offset = 0;
   CodecBufferId opaque;
 
   CODEC_LOG (DEBUG, "enter: %s\n", __func__);
 
-  meta_offset = (ctx->index - 1) * CODEC_META_DATA_SIZE;
-  CODEC_LOG (DEBUG, "decode_audio. ctx_id: %d meta_offset = 0x%x\n", ctx->index, meta_offset);
-  _codec_decode_audio_meta_to (in_size, device_mem + meta_offset + size);
-
   ret = secure_device_mem(dev->fd, ctx->index, in_size, &buffer);
   if (ret < 0) {
     CODEC_LOG (ERR,
@@ -298,7 +319,9 @@ codec_decode_audio (CodecContext *ctx, int16_t *samples,
     return -1;
   }
 
-  _codec_decode_audio_inbuf (in_buf, in_size, buffer);
+  CODEC_LOG (DEBUG, "decode_audio. in_buffer size %d\n", in_size);
+  codec_decode_audio_data_to (in_size, in_buf, buffer);
+
   dev->mem_info.offset = GET_OFFSET(buffer);
   _codec_invoke_qemu (ctx->index, CODEC_DECODE_AUDIO, GET_OFFSET(buffer), dev->fd);
 
@@ -309,16 +332,14 @@ codec_decode_audio (CodecContext *ctx, int16_t *samples,
   if (ret < 0) {
     return -1;
   }
+
   CODEC_LOG (DEBUG, "after decode_audio. ctx_id: %d, buffer = 0x%x\n",
-            ctx->index, (int)device_mem + opaque.buffer_size);
+            ctx->index, device_mem + opaque.buffer_size);
 
   len =
-    _codec_decode_audio_meta_from (&ctx->audio, have_data, device_mem + meta_offset + size);
-  if (len > 0) {
-    _codec_decode_audio_outbuf (*have_data, samples, device_mem + opaque.buffer_size);
-  } else {
-    CODEC_LOG (DEBUG, "decode_audio failure. ctx_id: %d\n", ctx->index);
-  }
+      codec_decode_audio_data_from (have_data, samples,
+                                   &ctx->audio, device_mem + opaque.buffer_size);
+
   CODEC_LOG (DEBUG, "decode_audio. ctx_id: %d len: %d\n", ctx->index, len);
 
   release_device_mem(dev->fd, device_mem + opaque.buffer_size);
@@ -333,24 +354,20 @@ codec_encode_video (CodecContext *ctx, uint8_t *out_buf,
                     int out_size, uint8_t *in_buf,
                     int in_size, int64_t in_timestamp, CodecDevice *dev)
 {
-  int len = 0, ret = 0, size = 8;
+  int len = 0, ret = 0;
   gpointer buffer = NULL;
-  uint32_t meta_offset = 0;
   CodecBufferId opaque;
 
   CODEC_LOG (DEBUG, "enter: %s\n", __func__);
 
-  meta_offset = (ctx->index - 1) * CODEC_META_DATA_SIZE;
-  CODEC_LOG (DEBUG, "encode_video. meta_offset = 0x%x\n", meta_offset);
-  _codec_encode_video_meta_to (in_size, in_timestamp, device_mem + meta_offset + size);
-
   ret = secure_device_mem(dev->fd, ctx->index, in_size, &buffer);
   if (ret < 0) {
     CODEC_LOG (ERR, "failed to small size of buffer.\n");
     return -1;
   }
 
-  _codec_encode_video_inbuf (in_buf, in_size, buffer);
+  codec_encode_video_data_to (in_size, in_timestamp, in_buf, buffer);
+
   dev->mem_info.offset = GET_OFFSET(buffer);
   _codec_invoke_qemu (ctx->index, CODEC_ENCODE_VIDEO, GET_OFFSET(buffer), dev->fd);
 
@@ -361,15 +378,10 @@ codec_encode_video (CodecContext *ctx, uint8_t *out_buf,
   if (ret < 0) {
     return -1;
   }
-  CODEC_LOG (DEBUG, "read, encode_video. mem_offset = 0x%x\n", opaque.buffer_size);
-
-  memcpy (&len, device_mem + meta_offset + size, sizeof(len));
+  CODEC_LOG (DEBUG, "encode_video. mem_offset = 0x%x\n", opaque.buffer_size);
 
-  CODEC_LOG (DEBUG, "encode_video. outbuf size: %d\n", len);
-  if (len > 0) {
-    memcpy (out_buf, device_mem + opaque.buffer_size, len);
-    dev->mem_info.offset = opaque.buffer_size;
-  }
+  len = codec_encode_video_data_from (out_buf, device_mem + opaque.buffer_size);
+  dev->mem_info.offset = opaque.buffer_size;
 
   release_device_mem(dev->fd, device_mem + opaque.buffer_size);
 
@@ -383,23 +395,19 @@ codec_encode_audio (CodecContext *ctx, uint8_t *out_buf,
                     int max_size, uint8_t *in_buf,
                     int in_size, CodecDevice *dev)
 {
-  int len = 0, ret = 0, size = 8;
+  int len = 0, ret = 0;
   gpointer buffer = NULL;
-  uint32_t meta_offset = 0;
   CodecBufferId opaque;
 
   CODEC_LOG (DEBUG, "enter: %s\n", __func__);
 
-  meta_offset = (ctx->index - 1) * CODEC_META_DATA_SIZE;
-  CODEC_LOG (DEBUG, "encode_audio. meta mem_offset = 0x%x\n", meta_offset);
-  _codec_encode_audio_meta_to (max_size, in_size, device_mem + meta_offset + size);
-
   ret = secure_device_mem(dev->fd, ctx->index, in_size, &buffer);
   if (ret < 0) {
     return -1;
   }
 
-  _codec_encode_audio_inbuf (in_buf, in_size, buffer);
+  codec_encode_audio_data_to (in_size, max_size, in_buf, buffer);
+
   dev->mem_info.offset = GET_OFFSET(buffer);
   _codec_invoke_qemu (ctx->index, CODEC_ENCODE_AUDIO, GET_OFFSET(buffer), dev->fd);
 
@@ -411,9 +419,9 @@ codec_encode_audio (CodecContext *ctx, uint8_t *out_buf,
     return -1;
   }
 
-  CODEC_LOG (DEBUG, "read, encode_video. mem_offset = 0x%x\n", opaque.buffer_size);
+  CODEC_LOG (DEBUG, "encode_video. mem_offset = 0x%x\n", opaque.buffer_size);
 
-  len = _codec_encode_audio_outbuf (out_buf, device_mem + opaque.buffer_size);
+  len = codec_encode_audio_data_from (out_buf, device_mem + opaque.buffer_size);
 
   release_device_mem(dev->fd, device_mem + opaque.buffer_size);
 
index 7b0664d..4fdd83d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * GStreamer codec plugin for Tizen Emulator.
  *
- * Copyright (C) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2013 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact:
  * KiTae Kim <kt920.kim@samsung.com>
  *  codec data such as codec name, longname, media type and etc.
  */
 static int
-_codec_info_data (CodecElement *codec, uint8_t *device_buf)
+_codec_info_data (CodecElement *codec, gpointer buffer)
 {
-  int size = 0;
+  int size = sizeof(size);
 
   CODEC_LOG (DEBUG, "enter, %s\n", __func__);
 
   CODEC_LOG (DEBUG, "type: %d, name: %s\n", codec->codec_type, codec->name);
-  memcpy (device_buf, &codec->codec_type, sizeof(codec->codec_type));
-  size = sizeof(codec->codec_type);
+  memcpy (buffer + size, &codec->codec_type, sizeof(codec->codec_type));
+  size += sizeof(codec->codec_type);
 
-  memcpy (device_buf + size, codec->name, sizeof(codec->name));
+  memcpy (buffer + size, codec->name, sizeof(codec->name));
   size += sizeof(codec->name);
 
   CODEC_LOG (DEBUG, "leave, %s\n", __func__);
@@ -53,237 +53,220 @@ _codec_info_data (CodecElement *codec, uint8_t *device_buf)
 }
 
 void
-_codec_init_meta_to (CodecContext *ctx,
-                      CodecElement *codec,
-                      uint8_t *device_buf)
+codec_init_data_to (CodecContext *ctx, CodecElement *codec, gpointer buffer)
 {
   int size = 0;
 
   CODEC_LOG (DEBUG, "enter, %s\n", __func__);
 
-  size = _codec_info_data (codec, device_buf);
+  size = _codec_info_data (codec, buffer);
 
   CODEC_LOG (INFO, "context_id: %d, name: %s, media type: %s\n",
     ctx->index, codec->name, codec->media_type ? "AUDIO" : "VIDEO");
 
-  CODEC_LOG (DEBUG, "init. write data to qemu, size: %d\n", size);
-  memcpy (device_buf + size, ctx, sizeof(CodecContext) - 12);
+  memcpy (buffer + size, ctx, sizeof(CodecContext) - 12);
   size += (sizeof(CodecContext) - 12);
-  memcpy (device_buf + size, ctx->codecdata, ctx->codecdata_size);
+  memcpy (buffer + size, ctx->codecdata, ctx->codecdata_size);
+  size += ctx->codecdata_size;
+
+  // data length
+  size -= sizeof(size);
+  memcpy (buffer, &size, sizeof(size));
 
   CODEC_LOG (DEBUG, "leave, %s\n", __func__);
 }
 
 int
-_codec_init_meta_from (CodecContext *ctx,
-                        int media_type,
-                        uint8_t *device_buf)
+codec_init_data_from (CodecContext *ctx, int media_type, gpointer buffer)
 {
   int ret = 0, size = 0;
 
   CODEC_LOG (DEBUG, "after init. read data from device.\n");
 
-  memcpy (&ret, device_buf, sizeof(ret));
+  memcpy (&ret, buffer, sizeof(ret));
   size = sizeof(ret);
-  if (!ret) {
+  if (ret < 0) {
+    return ret;
+  } else {
     if (media_type == AVMEDIA_TYPE_AUDIO) {
-      AudioData audio = { 0 };
+      memcpy (&ctx->audio.sample_fmt, buffer + size, sizeof(ctx->audio.sample_fmt));
+      size += sizeof(ctx->audio.sample_fmt);
+
+      memcpy (&ctx->audio.frame_size, buffer + size, sizeof(ctx->audio.frame_size));
+      size += sizeof(ctx->audio.frame_size);
 
+      memcpy(&ctx->audio.bits_per_sample_fmt, buffer + size, sizeof(ctx->audio.bits_per_sample_fmt));
 #if 0
-      memcpy(&audio, device_buf + size, sizeof(AudioData));
-      ctx->audio.sample_fmt = audio.sample_fmt;
-      ctx->audio.frame_size = audio.frame_size;
-      ctx->audio.bits_per_sample_fmt = audio.bits_per_sample_fmt;
+      // TODO: check!!
+      memcpy (&ctx->audio, buffer + size, sizeof(ctx->audio));
 #endif
-      CODEC_LOG (DEBUG,
-        "audio sample_fmt: %d\n", *(int *)(device_buf + size));
-
-      memcpy(&ctx->audio.sample_fmt, device_buf + size, sizeof(audio.sample_fmt));
-      size += sizeof(audio.sample_fmt);
-      memcpy(&ctx->audio.frame_size, device_buf + size, sizeof(audio.frame_size));
-      size += sizeof(audio.frame_size);
-      memcpy(&ctx->audio.bits_per_sample_fmt, device_buf + size, sizeof(audio.bits_per_sample_fmt));
-
-      CODEC_LOG (DEBUG,
-        "after init. audio sample_fmt: %d\n", ctx->audio.sample_fmt);
+    } else {
+      CODEC_LOG (DEBUG, "video type\n");
     }
-  } else {
-    CODEC_LOG (ERR, "failed to open codec context\n");
   }
 
   return ret;
 }
 
 void
-_codec_decode_video_meta_to (int in_size, int idx, int64_t in_offset, uint8_t *device_buf)
-{
-  memcpy (device_buf, &in_size, sizeof(in_size));
-  memcpy (device_buf + sizeof(in_size), &idx, sizeof(idx));
-  memcpy (device_buf + sizeof(idx), &in_offset, sizeof(in_offset));
-}
-
-void
-_codec_decode_video_inbuf (uint8_t *in_buf, int in_size, uint8_t *device_buf)
+codec_decode_video_data_to (int in_size, int idx, int64_t in_offset,
+                          uint8_t *in_buf, gpointer buffer)
 {
   int size = 0;
 
-  memcpy(device_buf, &in_size, sizeof(in_size));
-  size = sizeof(in_size);
-  if (in_size > 0 ) {
-    memcpy (device_buf + size, in_buf, in_size);
+  size = sizeof(size);
+  memcpy (buffer + size, &in_size, sizeof(in_size));
+  size += sizeof(in_size);
+  memcpy (buffer + size, &idx, sizeof(idx));
+  size += sizeof(idx);
+  memcpy (buffer + size, &in_offset, sizeof(in_offset));
+  size += sizeof(in_offset);
+
+  if (in_size > 0) {
+    memcpy (buffer + size, in_buf, in_size);
+    size += in_size;
   }
 
   CODEC_LOG (DEBUG, "decode_video. inbuf_size: %d\n", in_size);
+
+  size -= sizeof(size);
+  memcpy (buffer, &size, sizeof(size));
 }
 
 int
-_codec_decode_video_meta_from (VideoData *video,
-                              int *got_picture_ptr,
-                              uint8_t *device_buf)
+codec_decode_video_data_from (int *got_picture_ptr, VideoData *video, gpointer buffer)
 {
-  int len = 0, size = 0;
+  int size = 0, len = 0;
 
-  CODEC_LOG (DEBUG, "decode_video. read data from qemu.\n");
-
-  memcpy (&len, device_buf, sizeof(len));
+  memcpy (&len, buffer, sizeof(len));
   size = sizeof(len);
-  memcpy (got_picture_ptr,
-    device_buf + size, sizeof(*got_picture_ptr));
+  memcpy (got_picture_ptr, buffer + size, sizeof(*got_picture_ptr));
   size += sizeof(*got_picture_ptr);
-  memcpy (video, device_buf + size, sizeof(VideoData));
+  memcpy (video, buffer + size, sizeof(VideoData));
 
-  CODEC_LOG (DEBUG, "decode_video. len: %d, have_data: %d\n",
-    len, *got_picture_ptr);
+  CODEC_LOG (DEBUG, "decode_video. len: %d, have_data: %d\n", len, *got_picture_ptr);
 
   return len;
 }
 
 void
-_codec_decode_audio_meta_to (int in_size, uint8_t *device_buf)
-{
-  memcpy (device_buf, &in_size, sizeof(in_size));
-}
-
-
-void
-_codec_decode_audio_inbuf (uint8_t *in_buf, int in_size, uint8_t *device_buf)
+codec_decode_audio_data_to (int in_size, uint8_t *in_buf, gpointer buffer)
 {
   int size = 0;
 
-  memcpy (device_buf, &in_size, sizeof(in_size));
-  size = sizeof(in_size);
+  size = sizeof(size);
+  memcpy (buffer + size, &in_size, sizeof(in_size));
+  size += sizeof(in_size);
   if (in_size > 0) {
-    memcpy (device_buf + size, in_buf, in_size);
+    memcpy (buffer + size, in_buf, in_size);
+    size += in_size;
   }
 
-  CODEC_LOG (DEBUG, "decode_audio. inbuf_size: %d\n", in_size);
+  size -= sizeof(size);
+  memcpy (buffer, &size, sizeof(size));
 }
 
 int
-_codec_decode_audio_meta_from (AudioData *audio, int *frame_size_ptr,
-                                uint8_t *device_buf)
+codec_decode_audio_data_from (int *have_data, int16_t *samples,
+                              AudioData *audio, gpointer buffer)
 {
   int len = 0, size = 0;
 
-  CODEC_LOG (DEBUG, "decode_audio. read data from device.\n");
+  memcpy (&len, buffer, sizeof(len));
+  size = sizeof(len);
+  memcpy (have_data, buffer + size, sizeof(*have_data));
+  size += sizeof(*have_data);
 
-  memcpy (&audio->sample_rate,
-    device_buf, sizeof(audio->sample_rate));
-  size = sizeof(audio->sample_rate);
-  memcpy (&audio->channels,
-    device_buf + size, sizeof(audio->channels));
-  size += sizeof(audio->channels);
-  memcpy (&audio->channel_layout,
-    device_buf + size, sizeof(audio->channel_layout));
-  size += sizeof(audio->channel_layout);
-  memcpy (&len, device_buf + size, sizeof(len));
-  size += sizeof(len);
-  memcpy (frame_size_ptr, device_buf + size, sizeof(*frame_size_ptr));
+  CODEC_LOG (DEBUG, "decode_audio. len %d, have_data %d\n",
+            len, (*have_data));
 
-  CODEC_LOG (DEBUG, "decode_audio. len: %d, frame_size: %d\n",
-          len, (*frame_size_ptr));
+  if (*have_data) {
+    memcpy (&audio->sample_rate, buffer + size, sizeof(audio->sample_rate));
+    size += sizeof(audio->sample_rate);
 
-  return len;
-}
+    memcpy (&audio->channels, buffer + size, sizeof(audio->channels));
+    size += sizeof(audio->channels);
 
-void
-_codec_decode_audio_outbuf (int outbuf_size, int16_t *samples, uint8_t *device_buf)
-{
-  CODEC_LOG (DEBUG, "decode_audio. read outbuf %d\n", outbuf_size);
-  memcpy (samples, device_buf, outbuf_size);
-}
+    memcpy (&audio->channel_layout, buffer + size, sizeof(audio->channel_layout));
+    size += sizeof(audio->channel_layout);
 
-void
-_codec_encode_video_meta_to (int in_size, int64_t in_timestamp, uint8_t *device_buf)
-{
-  CODEC_LOG (DEBUG, "encode_video. write data to device.\n");
+    CODEC_LOG (DEBUG, "decode_audio. sample_rate %d, channels %d, ch_layout %lld\n", audio->sample_rate, audio->channels, audio->channel_layout);
 
-  memcpy (device_buf, &in_size, sizeof(in_size));
-  memcpy (device_buf + sizeof(in_size), &in_timestamp, sizeof(in_timestamp));
+    memcpy (samples, buffer + size, (*have_data));
+  }
+
+  return len;
 }
 
 void
-_codec_encode_video_inbuf (uint8_t *in_buf, int in_size, uint8_t *device_buf)
+codec_encode_video_data_to (int in_size, int64_t in_timestamp,
+                            uint8_t *in_buf, gpointer buffer)
 {
   int size = 0;
 
-  memcpy ((uint8_t *)device_buf, &in_size, sizeof(in_size));
+  size = sizeof(size);
+  memcpy (buffer + size, &in_size, sizeof(in_size));
   size += sizeof(in_size);
+  memcpy (buffer + size, &in_timestamp, sizeof(in_timestamp));
+  size += sizeof(in_timestamp);
   if (in_size > 0) {
-    memcpy (device_buf + size, in_buf, in_size);
+    memcpy (buffer + size, in_buf, in_size);
+    size += in_size;
   }
-  CODEC_LOG (DEBUG, "encode_video. inbuf_size: %d\n", in_size);
+
+  size -= sizeof(size);
+  memcpy (buffer, &size, sizeof(size));
 }
 
-void
-_codec_encode_video_outbuf (int len, uint8_t *out_buf, uint8_t *device_buf)
+int
+codec_encode_video_data_from (uint8_t *out_buf, gpointer buffer)
 {
-//  int len, size;
+  int len = 0, size = 0;
 
-  CODEC_LOG (DEBUG, "encode_video. read data from device.\n");
+  memcpy (&len, buffer, sizeof(len));
+  size = sizeof(len);
 
-//  memcpy (&len, device_buf, sizeof(len));
-//  size = sizeof(len);
-  memcpy (out_buf, device_buf, len);
+  CODEC_LOG (DEBUG, "encode_video. outbuf size: %d\n", len);
+  if (len > 0) {
+    memcpy (out_buf, buffer + size, len);
+    // dev->mem_info.offset = opaque.buffer_size;
+  }
 
-//  return len;
+  return len;
 }
 
 void
-_codec_encode_audio_meta_to (int max_size, int in_size, uint8_t *device_buf)
+codec_encode_audio_data_to (int in_size, int max_size, uint8_t *in_buf, gpointer buffer)
 {
   int size = 0;
 
-  CODEC_LOG (DEBUG, "encode_audio. write data to device.\n");
-
-  memcpy (device_buf, &in_size, sizeof(in_size));
-  size = sizeof(in_size);
-  memcpy (device_buf + size, &max_size, sizeof(max_size));
-}
-
-void
-_codec_encode_audio_inbuf (uint8_t *in_buf, int in_size, uint8_t *device_buf)
-{
-  int size = 0;
+  size = sizeof(size);
+  memcpy (buffer + size, &in_size, sizeof(in_size));
+  size += sizeof(in_size);
+  memcpy (buffer + size, &max_size, sizeof(max_size));
+  size += sizeof(max_size);
 
-  memcpy (device_buf, &in_size, sizeof(in_size));
-  size = sizeof(in_size);
   if (in_size > 0) {
-    memcpy (device_buf + size, in_buf, in_size);
+    memcpy (buffer + size, in_buf, in_size);
+    size += in_size;
   }
-  CODEC_LOG (DEBUG, "encode_audio. inbuf_size: %d\n", in_size);
+
+  size -= sizeof(size);
+  memcpy (buffer, &size, sizeof(size));
 }
 
 int
-_codec_encode_audio_outbuf (uint8_t *out_buf, uint8_t *device_buf)
+codec_encode_audio_data_from (uint8_t *out_buf, gpointer buffer)
 {
-  int len, size;
-
-  CODEC_LOG (DEBUG, "encode_audio. read data from device\n");
+  int len = 0, size = 0;
 
-  memcpy (&len, (uint8_t *)device_buf, sizeof(len));
+  memcpy (&len, buffer, sizeof(len));
   size = sizeof(len);
-  memcpy (out_buf, (uint8_t *)device_buf + size, len);
+  if (len > 0) {
+    memcpy (out_buf, buffer + size, len);
+  }
+
+  CODEC_LOG (DEBUG, "encode_audio. outbuf size: %d\n", len);
 
   return len;
 }
index 9aff8ff..bade429 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * GStreamer codec plugin for Tizen Emulator.
  *
- * Copyright (C) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2013 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact:
  * KiTae Kim <kt920.kim@samsung.com>
 
 #include "gstmaru.h"
 
-void _codec_init_meta_to (CodecContext *ctx, CodecElement *codec, uint8_t *device_buf);
+void codec_init_data_to (CodecContext *, CodecElement *, gpointer);
 
-int _codec_init_meta_from (CodecContext *ctx, int media_type, uint8_t *device_buf);
+int codec_init_data_from (CodecContext *, int, gpointer);
 
-void _codec_decode_video_meta_to (int in_size, int idx, int64_t in_offset, uint8_t *device_buf);
+void codec_decode_video_data_to (int, int, int64_t, uint8_t *, gpointer);
 
-void _codec_decode_video_inbuf (uint8_t *in_buf, int in_size, uint8_t *device_buf);
+int codec_decode_video_data_from (int *, VideoData *, gpointer);
 
-int _codec_decode_video_meta_from (VideoData *video, int *got_picture_ptr,
-                                  uint8_t *device_buf);
+void codec_decode_audio_data_to (int, uint8_t *, gpointer);
 
-void _codec_decode_audio_meta_to (int in_size, uint8_t *device_buf);
+int codec_decode_audio_data_from (int *, int16_t *, AudioData *, gpointer);
 
+void codec_encode_video_data_to (int, int64_t, uint8_t *, gpointer);
 
-void _codec_decode_audio_inbuf (uint8_t *in_buf, int in_size,
-                                  uint8_t *device_buf);
+int codec_encode_video_data_from (uint8_t *, gpointer);
 
-int _codec_decode_audio_meta_from (AudioData *audio, int *frame_size_ptr,
-                                  uint8_t *device_buf);
+void codec_encode_audio_data_to (int in_size, int max_size, uint8_t *in_buf, gpointer buffer);
 
-void _codec_decode_audio_outbuf (int outbuf_size, int16_t *samples,
-                                  uint8_t *device_buf);
-
-void _codec_encode_video_meta_to (int in_size, int64_t in_timestamp, uint8_t *device_buf);
-
-void _codec_encode_video_inbuf (uint8_t *in_buf, int in_size,
-                                  uint8_t *device_buf);
-
-void _codec_encode_video_outbuf (int len, uint8_t *outbuf, uint8_t *device_buf);
-
-void _codec_encode_audio_meta_to (int max_size, int in_size, uint8_t *device_buf);
-
-void _codec_encode_audio_inbuf (uint8_t *in_buf, int in_size, uint8_t *device_buf);
-
-int _codec_encode_audio_outbuf (uint8_t *out_buf, uint8_t *device_buf);
+int codec_encode_audio_data_from (uint8_t *out_buf, gpointer buffer);
 
 #endif