+ CloseCommon((imem_sys_t*)access->p_sys);
+}
+
+/**
+ * It controls an imem access
+ */
+static int ControlAccess(access_t *access, int i_query, va_list args)
+{
+ imem_sys_t *sys = (imem_sys_t*)access->p_sys;
+
+ switch (i_query)
+ {
+ case ACCESS_CAN_SEEK:
+ case ACCESS_CAN_FASTSEEK: {
+ bool *b = va_arg( args, bool* );
+ *b = false;
+ return VLC_SUCCESS;
+ }
+ case ACCESS_CAN_PAUSE:
+ case ACCESS_CAN_CONTROL_PACE: {
+ bool *b = va_arg( args, bool* );
+ *b = true;
+ return VLC_SUCCESS;
+ }
+ case ACCESS_GET_PTS_DELAY: {
+ int64_t *delay = va_arg(args, int64_t *);
+ *delay = sys->pts_delay;
+ return VLC_SUCCESS;
+ }
+ case ACCESS_SET_PAUSE_STATE:
+ return VLC_SUCCESS;
+
+ case ACCESS_GET_TITLE_INFO:
+ case ACCESS_SET_TITLE:
+ case ACCESS_SET_SEEKPOINT:
+ case ACCESS_SET_PRIVATE_ID_STATE:
+ case ACCESS_GET_META:
+ case ACCESS_GET_PRIVATE_ID_STATE:
+ case ACCESS_GET_CONTENT_TYPE:
+ default:
+ return VLC_EGENERIC;
+ }
+}
+
+/**
+ * It retreives data using the get() callback, copies them,
+ * and then release them using the release() callback.
+ */
+static block_t *Block(access_t *access)
+{
+ imem_sys_t *sys = (imem_sys_t*)access->p_sys;
+
+ unsigned flags;
+ size_t buffer_size;
+ void *buffer;
+
+ if (sys->source.get(sys->source.data, sys->source.cookie,
+ NULL, NULL, &flags, &buffer_size, &buffer)) {
+ access->info.b_eof = true;
+ return NULL;
+ }
+
+ block_t *block = NULL;
+ if (buffer_size > 0) {
+ block = block_New(access, buffer_size);
+ if (block)
+ memcpy(block->p_buffer, buffer, buffer_size);
+ }
+
+ sys->source.release(sys->source.data, sys->source.cookie,
+ buffer_size, buffer);
+ return block;
+}
+
+/**
+ * It opens an imem access_demux.
+ */
+static int OpenDemux(vlc_object_t *object)
+{
+ demux_t *demux = (demux_t *)object;
+ imem_sys_t *sys;
+
+ if (OpenCommon(object, &sys, demux->psz_location))
+ return VLC_EGENERIC;
+
+ /* ES format */