Commit b21cad66 authored by Laurent Aimar's avatar Laurent Aimar

Added support for raw data injection in imem.

parent c22f2d8b
...@@ -33,12 +33,16 @@ ...@@ -33,12 +33,16 @@
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_plugin.h> #include <vlc_plugin.h>
#include <vlc_access.h>
#include <vlc_demux.h> #include <vlc_demux.h>
#include <vlc_charset.h> #include <vlc_charset.h>
/***************************************************************************** /*****************************************************************************
* Module descriptior * Module descriptior
*****************************************************************************/ *****************************************************************************/
static int OpenAccess (vlc_object_t *);
static void CloseAccess(vlc_object_t *);
static int OpenDemux (vlc_object_t *); static int OpenDemux (vlc_object_t *);
static void CloseDemux(vlc_object_t *); static void CloseDemux(vlc_object_t *);
...@@ -59,10 +63,10 @@ static void CloseDemux(vlc_object_t *); ...@@ -59,10 +63,10 @@ static void CloseDemux(vlc_object_t *);
#define CAT_LONGTEXT N_(\ #define CAT_LONGTEXT N_(\
"Set the category of the elementary stream") "Set the category of the elementary stream")
static const int cat_values[] = { static const int cat_values[] = {
0, 1, 2, 3 0, 1, 2, 3, 4,
}; };
static const char *cat_texts[] = { static const char *cat_texts[] = {
N_("Unknown"), N_("Audio"), N_("Video"), N_("Subtitle") N_("Unknown"), N_("Audio"), N_("Video"), N_("Subtitle"), N_("Data")
}; };
#define CODEC_TEXT N_("Codec") #define CODEC_TEXT N_("Codec")
...@@ -169,6 +173,11 @@ vlc_module_begin() ...@@ -169,6 +173,11 @@ vlc_module_begin()
add_shortcut("imem") add_shortcut("imem")
set_capability("access_demux", 0) set_capability("access_demux", 0)
set_callbacks(OpenDemux, CloseDemux) set_callbacks(OpenDemux, CloseDemux)
add_submodule()
add_shortcut("imem")
set_capability("access", 0)
set_callbacks(OpenAccess, CloseAccess)
vlc_module_end() vlc_module_end()
/***************************************************************************** /*****************************************************************************
...@@ -190,6 +199,9 @@ typedef void (*imem_release_t)(void *data, const char *cookie, size_t, void *); ...@@ -190,6 +199,9 @@ typedef void (*imem_release_t)(void *data, const char *cookie, size_t, void *);
*****************************************************************************/ *****************************************************************************/
/* */ /* */
static block_t *Block(access_t *);
static int ControlAccess(access_t *, int, va_list);
static int Demux(demux_t *); static int Demux(demux_t *);
static int ControlDemux(demux_t *, int, va_list); static int ControlDemux(demux_t *, int, va_list);
...@@ -280,6 +292,114 @@ static int OpenCommon(vlc_object_t *object, imem_sys_t **sys_ptr, const char *ps ...@@ -280,6 +292,114 @@ static int OpenCommon(vlc_object_t *object, imem_sys_t **sys_ptr, const char *ps
return VLC_SUCCESS; return VLC_SUCCESS;
} }
/**
* It opens an imem access.
*/
static int OpenAccess(vlc_object_t *object)
{
access_t *access = (access_t *)object;
imem_sys_t *sys;
if (OpenCommon(object, &sys, access->psz_path))
return VLC_EGENERIC;
if (var_InheritInteger(object, "imem-cat") != 4) {
CloseCommon(sys);
return VLC_EGENERIC;
}
/* */
access_InitFields(access);
access->pf_control = ControlAccess;
access->pf_read = NULL;
access->pf_block = Block;
access->pf_seek = NULL;
access->p_sys = (access_sys_t*)sys;
return VLC_SUCCESS;
}
/**
* It closes an imem access
*/
static void CloseAccess(vlc_object_t *object)
{
access_t *access = (access_t *)object;
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. * It opens an imem access_demux.
*/ */
...@@ -288,7 +408,7 @@ static int OpenDemux(vlc_object_t *object) ...@@ -288,7 +408,7 @@ static int OpenDemux(vlc_object_t *object)
demux_t *demux = (demux_t *)object; demux_t *demux = (demux_t *)object;
imem_sys_t *sys; imem_sys_t *sys;
if (OpenCommon(VLC_OBJECT(demux), &sys, demux->psz_path)) if (OpenCommon(object, &sys, demux->psz_path))
return VLC_EGENERIC; return VLC_EGENERIC;
/* ES format */ /* ES format */
...@@ -303,7 +423,8 @@ static int OpenDemux(vlc_object_t *object) ...@@ -303,7 +423,8 @@ static int OpenDemux(vlc_object_t *object)
fmt.i_codec = vlc_fourcc_GetCodecFromString(UNKNOWN_ES, tmp); fmt.i_codec = vlc_fourcc_GetCodecFromString(UNKNOWN_ES, tmp);
free(tmp); free(tmp);
switch (var_CreateGetInteger(object, "imem-cat")) { const int cat = var_InheritInteger(object, "imem-cat");
switch (cat) {
case 1: { case 1: {
fmt.i_cat = AUDIO_ES; fmt.i_cat = AUDIO_ES;
fmt.audio.i_channels = var_CreateGetInteger(object, "imem-channels"); fmt.audio.i_channels = var_CreateGetInteger(object, "imem-channels");
...@@ -349,7 +470,8 @@ static int OpenDemux(vlc_object_t *object) ...@@ -349,7 +470,8 @@ static int OpenDemux(vlc_object_t *object)
break; break;
} }
default: default:
msg_Err(object, "Invalid ES category"); if (cat != 4)
msg_Err(object, "Invalid ES category");
es_format_Clean(&fmt); es_format_Clean(&fmt);
CloseCommon(sys); CloseCommon(sys);
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -387,7 +509,7 @@ static void CloseDemux(vlc_object_t *object) ...@@ -387,7 +509,7 @@ static void CloseDemux(vlc_object_t *object)
} }
/** /**
* It controls imem * It controls an imem access_demux
*/ */
static int ControlDemux(demux_t *demux, int i_query, va_list args) static int ControlDemux(demux_t *demux, int i_query, va_list args)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment