static int Demux (demux_t *);
static int Control (demux_t *, int, va_list);
-static gme_err_t Reader (void *, void *, int);
+static gme_err_t ReaderStream (void *, void *, int);
+static gme_err_t ReaderBlock (void *, void *, int);
static int Open (vlc_object_t *obj)
{
demux_t *demux = (demux_t *)obj;
int64_t size = stream_Size (demux->s);
- if (size < 4 /* GME needs to know the file size */
- || size > LONG_MAX /* too big for GME */)
+ if (size > LONG_MAX /* too big for GME */)
return VLC_EGENERIC;
/* Auto detection */
return VLC_EGENERIC;
msg_Dbg (obj, "detected file type %s", type);
+ block_t *data = NULL;
+ if (size <= 0)
+ {
+ data = stream_BlockRemaining (demux->s, 100000000);
+ if (!data )
+ return VLC_EGENERIC;
+ }
+
/* Initialization */
demux_sys_t *sys = malloc (sizeof (*sys));
if (unlikely(sys == NULL))
free (sys);
return VLC_ENOMEM;
}
- gme_load_custom (sys->emu, Reader, size, demux->s);
+ if (data)
+ {
+ gme_load_custom (sys->emu, ReaderBlock, data->i_buffer, data);
+ block_Release(data);
+ }
+ else
+ {
+ gme_load_custom (sys->emu, ReaderStream, size, demux->s);
+ }
gme_start_track (sys->emu, sys->track_id = 0);
es_format_t fmt;
}
-static gme_err_t Reader (void *data, void *buf, int length)
+static gme_err_t ReaderStream (void *data, void *buf, int length)
{
stream_t *s = data;
return "short read";
return NULL;
}
+static gme_err_t ReaderBlock (void *data, void *buf, int length)
+{
+ block_t *block = data;
+ int max = __MIN (length, (int)block->i_buffer);
+ memcpy (buf, block->p_buffer, max);
+ block->i_buffer -= max;
+ block->p_buffer += max;
+ if (max != length)
+ return "short read";
+ return NULL;
+}
#define SAMPLES (RATE / 10)
break;
int seek = (sys->titlev[sys->track_id]->i_length / 1000) * pos;
- if (seek > INT_MAX || gme_seek (sys->emu, seek))
+ if (gme_seek (sys->emu, seek))
break;
return VLC_SUCCESS;
}
unsigned n = sys->titlec;
*titlev = malloc (sizeof (**titlev) * n);
- if (unlikely(titlev == NULL))
+ if (unlikely(*titlev == NULL))
n = 0;
*titlec = n;
for (unsigned i = 0; i < n; i++)