mirror of
https://github.com/Ponce/slackbuilds
synced 2024-11-21 19:42:24 +01:00
multimedia/mediatomb: Updated for version b66dc1f.
Signed-off-by: Heinz Wiesinger <pprkut@slackbuilds.org>
This commit is contained in:
parent
1c3f749344
commit
23f6a70116
9 changed files with 542 additions and 869 deletions
|
@ -1,64 +0,0 @@
|
|||
=== modified file 'src/metadata/ffmpeg_handler.cc'
|
||||
--- old/src/metadata/ffmpeg_handler.cc 2010-08-25 17:07:03 +0000
|
||||
+++ new/src/metadata/ffmpeg_handler.cc 2011-05-19 04:33:32 +0000
|
||||
@@ -89,6 +89,33 @@
|
||||
|
||||
Ref<StringConverter> sc = StringConverter::m2i();
|
||||
|
||||
+ /* Tabs are 4 characters here */
|
||||
+ typedef struct {const char *avname; metadata_fields_t field;} mapping_t;
|
||||
+ static const mapping_t mapping[] =
|
||||
+ {
|
||||
+ {"title", M_TITLE},
|
||||
+ {"artist", M_ARTIST},
|
||||
+ {"album", M_ALBUM},
|
||||
+ {"date", M_DATE},
|
||||
+ {"genre", M_GENRE},
|
||||
+ {"comment", M_DESCRIPTION},
|
||||
+ {"track", M_TRACKNUMBER},
|
||||
+ {NULL, M_MAX},
|
||||
+ };
|
||||
+
|
||||
+ if (!pFormatCtx->metadata)
|
||||
+ return;
|
||||
+ for (const mapping_t *m = mapping; m->avname != NULL; m++)
|
||||
+ {
|
||||
+ AVMetadataTag *tag = NULL;
|
||||
+ tag = av_metadata_get(pFormatCtx->metadata, m->avname, NULL, 0);
|
||||
+ if (tag && tag->value && tag->value[0])
|
||||
+ {
|
||||
+ log_debug("Added metadata %s: %s\n", m->avname, tag->value);
|
||||
+ item->setMetadata(MT_KEYS[m->field].upnp, sc->convert(tag->value));
|
||||
+ }
|
||||
+ }
|
||||
+ /* Old algorithm (doesn't work with libav >= 0.7)
|
||||
if (strlen(pFormatCtx->title) > 0)
|
||||
{
|
||||
log_debug("Added metadata title: %s\n", pFormatCtx->title);
|
||||
@@ -131,6 +158,7 @@
|
||||
item->setMetadata(MT_KEYS[M_TRACKNUMBER].upnp,
|
||||
sc->convert(String::from(pFormatCtx->track)));
|
||||
}
|
||||
+ */
|
||||
}
|
||||
|
||||
// ffmpeg library calls
|
||||
@@ -178,7 +206,7 @@
|
||||
for(i=0; i<pFormatCtx->nb_streams; i++)
|
||||
{
|
||||
AVStream *st = pFormatCtx->streams[i];
|
||||
- if((st != NULL) && (videoset == false) && (st->codec->codec_type == CODEC_TYPE_VIDEO))
|
||||
+ if((st != NULL) && (videoset == false) && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO))
|
||||
{
|
||||
if (st->codec->codec_tag > 0)
|
||||
{
|
||||
@@ -209,7 +237,7 @@
|
||||
*y = st->codec->height;
|
||||
}
|
||||
}
|
||||
- if(st->codec->codec_type == CODEC_TYPE_AUDIO)
|
||||
+ if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
|
||||
{
|
||||
// Increase number of audiochannels
|
||||
audioch++;
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
--- mediatomb-0.12.1.orig/src/metadata/ffmpeg_handler.cc 2012-06-18 02:50:35.000000000 -0400
|
||||
+++ mediatomb-0.12.1/src/metadata/ffmpeg_handler.cc 2012-06-18 02:59:02.000000000 -0400
|
||||
@@ -107,8 +107,8 @@
|
||||
return;
|
||||
for (const mapping_t *m = mapping; m->avname != NULL; m++)
|
||||
{
|
||||
- AVMetadataTag *tag = NULL;
|
||||
- tag = av_metadata_get(pFormatCtx->metadata, m->avname, NULL, 0);
|
||||
+ AVDictionaryEntry *tag = NULL;
|
||||
+ tag = av_dict_get(pFormatCtx->metadata, m->avname, NULL, 0);
|
||||
if (tag && tag->value && tag->value[0])
|
||||
{
|
||||
log_debug("Added metadata %s: %s\n", m->avname, tag->value);
|
||||
@@ -278,7 +278,7 @@
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
|
||||
- AVFormatContext *pFormatCtx;
|
||||
+ AVFormatContext *pFormatCtx = avformat_alloc_context();
|
||||
|
||||
// Suppress all log messages
|
||||
av_log_set_callback(FfmpegNoOutputStub);
|
||||
@@ -286,15 +286,15 @@
|
||||
// Register all formats and codecs
|
||||
av_register_all();
|
||||
|
||||
- // Open video file
|
||||
- if (av_open_input_file(&pFormatCtx,
|
||||
- item->getLocation().c_str(), NULL, 0, NULL) != 0)
|
||||
+ // Open video file
|
||||
+ if (avformat_open_input(&pFormatCtx,
|
||||
+ item->getLocation().c_str(), NULL, NULL) != 0)
|
||||
return; // Couldn't open file
|
||||
|
||||
// Retrieve stream information
|
||||
- if (av_find_stream_info(pFormatCtx) < 0)
|
||||
+ if (avformat_find_stream_info(pFormatCtx,NULL) < 0)
|
||||
{
|
||||
- av_close_input_file(pFormatCtx);
|
||||
+ avformat_close_input(&pFormatCtx);
|
||||
return; // Couldn't find stream information
|
||||
}
|
||||
// Add metadata using ffmpeg library calls
|
||||
@@ -303,7 +303,7 @@
|
||||
addFfmpegResourceFields(item, pFormatCtx, &x, &y);
|
||||
|
||||
// Close the video file
|
||||
- av_close_input_file(pFormatCtx);
|
||||
+ avformat_close_input(&pFormatCtx);
|
||||
}
|
||||
|
||||
Ref<IOHandler> FfmpegHandler::serveContent(Ref<CdsItem> item, int resNum, off_t *data_size)
|
|
@ -1,10 +0,0 @@
|
|||
--- a/src/zmm/object.h
|
||||
+++ b/src/zmm/object.h
|
||||
@@ -33,6 +33,7 @@
|
||||
#define __ZMM_OBJECT_H__
|
||||
|
||||
#include <new> // for size_t
|
||||
+#include <cstddef>
|
||||
#include "atomic.h"
|
||||
|
||||
namespace zmm
|
|
@ -1,120 +0,0 @@
|
|||
diff --git a/src/hash/dbo_hash.h b/src/hash/dbo_hash.h
|
||||
index 2e58627..16c15b3 100644
|
||||
--- a/src/hash/dbo_hash.h
|
||||
+++ b/src/hash/dbo_hash.h
|
||||
@@ -106,7 +106,7 @@ public:
|
||||
inline bool remove(KT key)
|
||||
{
|
||||
struct dbo_hash_slot<KT, VT> *slot;
|
||||
- if (! search(key, &slot))
|
||||
+ if (! this->search(key, &slot))
|
||||
return false;
|
||||
slot->key = deletedKey;
|
||||
slot->value->release();
|
||||
@@ -136,7 +136,7 @@ public:
|
||||
inline void put(KT key, zmm::Ref<VT> value)
|
||||
{
|
||||
struct dbo_hash_slot<KT, VT> *slot;
|
||||
- search(key, &slot);
|
||||
+ this->search(key, &slot);
|
||||
put(key, (hash_slot_t)slot, value);
|
||||
}
|
||||
void put(KT key, hash_slot_t destSlot, zmm::Ref<VT> value)
|
||||
@@ -162,7 +162,7 @@ public:
|
||||
inline zmm::Ref<VT> get(KT key)
|
||||
{
|
||||
struct dbo_hash_slot<KT, VT> *slot;
|
||||
- bool found = search(key, &slot);
|
||||
+ bool found = this->search(key, &slot);
|
||||
if (found)
|
||||
return zmm::Ref<VT>(slot->value);
|
||||
else
|
||||
@@ -174,7 +174,7 @@ public:
|
||||
inline zmm::Ref<VT> get(KT key, hash_slot_t *destSlot)
|
||||
{
|
||||
struct dbo_hash_slot<KT, VT> **slot = (struct dbo_hash_slot<KT, VT> **)destSlot;
|
||||
- bool found = search(key, slot);
|
||||
+ bool found = this->search(key, slot);
|
||||
if (found)
|
||||
return zmm::Ref<VT>((*slot)->value);
|
||||
else
|
||||
diff --git a/src/hash/dbr_hash.h b/src/hash/dbr_hash.h
|
||||
index 6e65d7f..7028890 100644
|
||||
--- a/src/hash/dbr_hash.h
|
||||
+++ b/src/hash/dbr_hash.h
|
||||
@@ -124,7 +124,7 @@ public:
|
||||
inline bool remove(KT key)
|
||||
{
|
||||
struct dbr_hash_slot<KT> *slot;
|
||||
- if (! search(key, &slot))
|
||||
+ if (! this->search(key, &slot))
|
||||
return false;
|
||||
slot->key = deletedKey;
|
||||
int array_slot = slot->array_slot;
|
||||
@@ -134,7 +134,7 @@ public:
|
||||
return true;
|
||||
}
|
||||
data_array[array_slot] = data_array[--this->count];
|
||||
- if (! search(data_array[array_slot], &slot))
|
||||
+ if (! this->search(data_array[array_slot], &slot))
|
||||
{
|
||||
log_debug("DBR-Hash-Error: (%d; array_slot=%d; count=%d)\n", data_array[array_slot], array_slot, this->count);
|
||||
throw zmm::Exception(_("DBR-Hash-Error: key in data_array not found in hashtable"));
|
||||
@@ -146,7 +146,7 @@ public:
|
||||
inline void put(KT key)
|
||||
{
|
||||
struct dbr_hash_slot<KT> *slot;
|
||||
- if (! search(key, &slot))
|
||||
+ if (! this->search(key, &slot))
|
||||
{
|
||||
#ifdef TOMBDEBUG
|
||||
if (this->count >= realCapacity)
|
||||
@@ -194,7 +194,7 @@ public:
|
||||
inline bool exists(KT key)
|
||||
{
|
||||
struct dbr_hash_slot<KT> *slot;
|
||||
- return search(key, &slot);
|
||||
+ return this->search(key, &slot);
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/src/hash/dso_hash.h b/src/hash/dso_hash.h
|
||||
index adfb97f..03ec852 100644
|
||||
--- a/src/hash/dso_hash.h
|
||||
+++ b/src/hash/dso_hash.h
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
inline bool remove(zmm::String key)
|
||||
{
|
||||
struct dso_hash_slot<VT> *slot;
|
||||
- if (! search(key, &slot))
|
||||
+ if (! this->search(key, &slot))
|
||||
return false;
|
||||
slot->key->release();
|
||||
slot->value->release();
|
||||
@@ -112,7 +112,7 @@ public:
|
||||
inline void put(zmm::String key, zmm::Ref<VT> value)
|
||||
{
|
||||
struct dso_hash_slot<VT> *slot;
|
||||
- search(key, &slot);
|
||||
+ this->search(key, &slot);
|
||||
put(key, (hash_slot_t)slot, value);
|
||||
}
|
||||
void put(zmm::String key, hash_slot_t destSlot, zmm::Ref<VT> value)
|
||||
@@ -141,7 +141,7 @@ public:
|
||||
inline zmm::Ref<VT> get(zmm::String key)
|
||||
{
|
||||
struct dso_hash_slot<VT> *slot;
|
||||
- bool found = search(key, &slot);
|
||||
+ bool found = this->search(key, &slot);
|
||||
if (found)
|
||||
return zmm::Ref<VT>(slot->value);
|
||||
else
|
||||
@@ -153,7 +153,7 @@ public:
|
||||
inline zmm::Ref<VT> get(zmm::String key, hash_slot_t *destSlot)
|
||||
{
|
||||
struct dso_hash_slot<VT> **slot = (struct dso_hash_slot<VT> **)destSlot;
|
||||
- bool found = search(key, slot);
|
||||
+ bool found = this->search(key, slot);
|
||||
if (found)
|
||||
return zmm::Ref<VT>((*slot)->value);
|
||||
else
|
|
@ -1,605 +0,0 @@
|
|||
--- mediatomb-0.12.1/configure.ac 2010-04-07 18:38:51.000000000 -0400
|
||||
+++ mediatomb-0.12.1/configure.ac 2011-11-16 21:56:46.000000000 -0500
|
||||
@@ -1006,14 +1006,23 @@
|
||||
MOZLIB=smjs
|
||||
],
|
||||
[
|
||||
- LDFLAGS="-L$JS_SEARCH_LIBS $LDFLAGS_SAVE -lmozjs $ADD_PTHREAD_CFLAGS"
|
||||
- AC_CHECK_LIB(mozjs, JS_NewObject,
|
||||
+ LDFLAGS="-L$JS_SEARCH_LIBS $LDFLAGS_SAVE -lmozjs185 $ADD_PTHREAD_CFLAGS"
|
||||
+ AC_CHECK_LIB(mozjs185, JS_NewObject,
|
||||
[
|
||||
- JS_LIBS="-L$JS_SEARCH_LIBS -lmozjs"
|
||||
- MOZLIB=mozjs
|
||||
+ JS_LIBS="-L$JS_SEARCH_LIBS -lmozjs185"
|
||||
+ MOZLIB=mozjs185
|
||||
],
|
||||
[
|
||||
- AC_MSG_ERROR([Spidermonkey not found in requested location $JS_SEARCH_LIBS])
|
||||
+ LDFLAGS="-L$JS_SEARCH_LIBS $LDFLAGS_SAVE -lmozjs $ADD_PTHREAD_CFLAGS"
|
||||
+ AC_CHECK_LIB(mozjs, JS_NewObject,
|
||||
+ [
|
||||
+ JS_LIBS="-L$JS_SEARCH_LIBS -lmozjs"
|
||||
+ MOZLIB=mozjs
|
||||
+ ],
|
||||
+ [
|
||||
+ AC_MSG_ERROR([Spidermonkey not found in requested location $JS_SEARCH_LIBS])
|
||||
+ ]
|
||||
+ )
|
||||
]
|
||||
)
|
||||
]
|
||||
@@ -1036,39 +1045,58 @@
|
||||
],
|
||||
[
|
||||
unset ac_cv_lib_smjs_JS_NewObject
|
||||
- AC_CHECK_LIB(mozjs, JS_NewObject,
|
||||
+ AC_CHECK_LIB(mozjs185, JS_NewObject,
|
||||
[
|
||||
- MOZLIB=mozjs
|
||||
- JS_LIBS="-lmozjs"
|
||||
+ MOZLIB=mozjs185
|
||||
+ JS_LIBS="-lmozjs185"
|
||||
],
|
||||
[
|
||||
- LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE $ADD_PTHREAD_CFLAGS"
|
||||
- unset ac_cv_lib_js_JS_NewObject
|
||||
- AC_CHECK_LIB(js, JS_NewObject,
|
||||
- [
|
||||
- JS_LIBS="-L$SEARCH_DIR_LIBS -ljs"
|
||||
- MOZLIB=js
|
||||
- ],
|
||||
- [
|
||||
- unset ac_cv_lib_smjs_JS_NewObject
|
||||
- AC_CHECK_LIB(smjs, JS_NewObject,
|
||||
- [
|
||||
- JS_LIBS="-L$SEARCH_DIR_LIBS -lsmjs"
|
||||
- MOZLIB=smjs
|
||||
- ],
|
||||
- [
|
||||
- LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE -lmozjs"
|
||||
- unset ac_cv_lib_mozjs_JS_NewObject
|
||||
- AC_CHECK_LIB(mozjs, JS_NewObject,
|
||||
- [
|
||||
- JS_LIBS="-L$SEARCH_DIR_LIBS -lmozjs"
|
||||
- MOZLIB=mozjs
|
||||
- ],
|
||||
- [
|
||||
- JS_OK=missing
|
||||
- AC_MSG_RESULT(libjs/libsmjs link failed, giving up)
|
||||
- ]
|
||||
- )
|
||||
+ unset ac_cv_lib_smjs_JS_NewObject
|
||||
+ AC_CHECK_LIB(mozjs, JS_NewObject,
|
||||
+ [
|
||||
+ MOZLIB=mozjs
|
||||
+ JS_LIBS="-lmozjs"
|
||||
+ ],
|
||||
+ [
|
||||
+ LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE $ADD_PTHREAD_CFLAGS"
|
||||
+ unset ac_cv_lib_js_JS_NewObject
|
||||
+ AC_CHECK_LIB(js, JS_NewObject,
|
||||
+ [
|
||||
+ JS_LIBS="-L$SEARCH_DIR_LIBS -ljs"
|
||||
+ MOZLIB=js
|
||||
+ ],
|
||||
+ [
|
||||
+ unset ac_cv_lib_smjs_JS_NewObject
|
||||
+ AC_CHECK_LIB(smjs, JS_NewObject,
|
||||
+ [
|
||||
+ JS_LIBS="-L$SEARCH_DIR_LIBS -lsmjs"
|
||||
+ MOZLIB=smjs
|
||||
+ ],
|
||||
+ [
|
||||
+ LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE -lmozjs185"
|
||||
+ unset ac_cv_lib_mozjs_JS_NewObject
|
||||
+ AC_CHECK_LIB(mozjs185, JS_NewObject,
|
||||
+ [
|
||||
+ JS_LIBS="-L$SEARCH_DIR_LIBS -lmozjs185"
|
||||
+ MOZLIB=mozjs185
|
||||
+ ],
|
||||
+ [
|
||||
+ LDFLAGS="-L$SEARCH_DIR_LIBS $LDFLAGS_SAVE -lmozjs"
|
||||
+ unset ac_cv_lib_mozjs_JS_NewObject
|
||||
+ AC_CHECK_LIB(mozjs, JS_NewObject,
|
||||
+ [
|
||||
+ JS_LIBS="-L$SEARCH_DIR_LIBS -lmozjs"
|
||||
+ MOZLIB=mozjs
|
||||
+ ],
|
||||
+ [
|
||||
+ JS_OK=missing
|
||||
+ AC_MSG_RESULT(libjs/libsmjs link failed, giving up)
|
||||
+ ]
|
||||
+ )
|
||||
+ ]
|
||||
+ )
|
||||
+ ]
|
||||
+ )
|
||||
]
|
||||
)
|
||||
]
|
||||
diff -ur mediatomb-0.12.1.orig/build/Makefile.in mediatomb-0.12.1/build/Makefile.in
|
||||
--- mediatomb-0.12.1.orig/build/Makefile.in 2010-04-07 18:40:15.000000000 -0400
|
||||
+++ mediatomb-0.12.1/build/Makefile.in 2011-11-16 22:28:06.000000000 -0500
|
||||
@@ -257,7 +257,7 @@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
-CXXFLAGS = @CXXFLAGS@
|
||||
+CXXFLAGS = -fpermissive @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DB_AUTOCREATE_OPTION_ENABLED = @DB_AUTOCREATE_OPTION_ENABLED@
|
||||
DB_AUTOCREATE_OPTION_REQUESTED = @DB_AUTOCREATE_OPTION_REQUESTED@
|
||||
diff -ur mediatomb-0.12.1.orig/src/scripting/import_script.cc mediatomb-0.12.1/src/scripting/import_script.cc
|
||||
--- mediatomb-0.12.1.orig/src/scripting/import_script.cc 2010-03-25 10:58:05.000000000 -0400
|
||||
+++ mediatomb-0.12.1/src/scripting/import_script.cc 2011-11-16 22:28:06.000000000 -0500
|
||||
@@ -53,8 +53,8 @@
|
||||
try
|
||||
{
|
||||
load(scriptPath);
|
||||
- root = JS_NewScriptObject(cx, script);
|
||||
- JS_AddNamedRoot(cx, &root, "ImportScript");
|
||||
+ root = JS_NewObject(cx, NULL, script, NULL);
|
||||
+ JS_AddNamedObjectRoot(cx, &root, "ImportScript");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -117,7 +117,7 @@
|
||||
#endif
|
||||
|
||||
if (root)
|
||||
- JS_RemoveRoot(cx, &root);
|
||||
+ JS_RemoveObjectRoot(cx, &root);
|
||||
|
||||
#ifdef JS_THREADSAFE
|
||||
JS_EndRequest(cx);
|
||||
diff -ur mediatomb-0.12.1.orig/src/scripting/js_functions.cc mediatomb-0.12.1/src/scripting/js_functions.cc
|
||||
--- mediatomb-0.12.1.orig/src/scripting/js_functions.cc 2010-03-25 10:58:05.000000000 -0400
|
||||
+++ mediatomb-0.12.1/src/scripting/js_functions.cc 2011-11-16 22:28:21.000000000 -0500
|
||||
@@ -49,30 +49,45 @@
|
||||
extern "C" {
|
||||
|
||||
JSBool
|
||||
-js_print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
+js_print(JSContext *cx, uintN argc, jsval *argv)
|
||||
{
|
||||
- uintN i;
|
||||
+ uintN i, j;
|
||||
JSString *str;
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
{
|
||||
- str = JS_ValueToString(cx, argv[i]);
|
||||
+ String fmtStr;
|
||||
+ for (j = 0; j < argc; j++)
|
||||
+ {
|
||||
+ if (j == i)
|
||||
+ fmtStr = fmtStr + "S";
|
||||
+ else
|
||||
+ fmtStr = fmtStr + "*";
|
||||
+ }
|
||||
+ if(!JS_ConvertArguments(cx, 1, JS_ARGV(cx, argv), fmtStr.c_str(), &str))
|
||||
+ {
|
||||
+ log_debug("Could not parse input arguments\n");
|
||||
+ return JS_TRUE;
|
||||
+ }
|
||||
+
|
||||
if (!str)
|
||||
return JS_TRUE;
|
||||
- argv[i] = STRING_TO_JSVAL(str);
|
||||
- log_js("%s\n", JS_GetStringBytes(str));
|
||||
+
|
||||
+ char * log_str = JS_EncodeString(cx, str);
|
||||
+ log_js("%s\n", log_str);
|
||||
+ JS_free(cx, log_str);
|
||||
}
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
JSBool
|
||||
-js_copyObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
+js_copyObject(JSContext *cx, uintN argc, jsval *argv)
|
||||
{
|
||||
jsval arg;
|
||||
JSObject *js_cds_obj;
|
||||
JSObject *js_cds_clone_obj;
|
||||
|
||||
- Script *self = (Script *)JS_GetPrivate(cx, obj);
|
||||
+ Script *self = (Script *)JS_GetPrivate(cx, JS_THIS_OBJECT(cx, argv));
|
||||
|
||||
try
|
||||
{
|
||||
@@ -91,7 +106,7 @@
|
||||
|
||||
self->cdsObject2jsObject(cds_obj, js_cds_clone_obj);
|
||||
|
||||
- *rval = OBJECT_TO_JSVAL(js_cds_clone_obj);
|
||||
+ JS_SET_RVAL(cx, argv, OBJECT_TO_JSVAL(js_cds_clone_obj));
|
||||
|
||||
return JS_TRUE;
|
||||
|
||||
@@ -110,28 +125,58 @@
|
||||
}
|
||||
|
||||
JSBool
|
||||
-js_addCdsObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
+js_addCdsObject(JSContext *cx, uintN argc, jsval *argv)
|
||||
{
|
||||
try
|
||||
{
|
||||
- jsval arg;
|
||||
- JSString *str;
|
||||
- String path;
|
||||
- String containerclass;
|
||||
+ // Inputs from native code
|
||||
+ JSObject *js_cds_obj = NULL;
|
||||
+ JSString *str = NULL;
|
||||
+ JSString *cont = NULL;
|
||||
|
||||
- JSObject *js_cds_obj;
|
||||
+ String path = nil;
|
||||
+ String containerclass = nil;
|
||||
+
|
||||
+ JSObject *obj = JS_THIS_OBJECT(cx, argv);
|
||||
JSObject *js_orig_obj = NULL;
|
||||
Ref<CdsObject> orig_object;
|
||||
|
||||
Ref<StringConverter> p2i;
|
||||
Ref<StringConverter> i2i;
|
||||
+ switch (argc)
|
||||
+ {
|
||||
+ case 0:
|
||||
+ log_debug("No input arguments given\n");
|
||||
+ return JS_FALSE;
|
||||
+ case 1:
|
||||
+ if(!JS_ConvertArguments(cx, 1, JS_ARGV(cx, argv), "o", &js_cds_obj))
|
||||
+ {
|
||||
+ log_debug("Could not parse input arguments\n");
|
||||
+ return JS_TRUE;
|
||||
+ }
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ if(!JS_ConvertArguments(cx, 2, JS_ARGV(cx, argv), "oS", &js_cds_obj, &str))
|
||||
+ {
|
||||
+ log_debug("Could not parse input arguments\n");
|
||||
+ return JS_TRUE;
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ if(!JS_ConvertArguments(cx, 3, JS_ARGV(cx, argv), "oSS", &js_cds_obj, &str, &cont))
|
||||
+ {
|
||||
+ log_debug("Could not parse input arguments\n");
|
||||
+ return JS_TRUE;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
Script *self = (Script *)JS_GetPrivate(cx, obj);
|
||||
|
||||
if (self == NULL)
|
||||
{
|
||||
log_debug("Could not retrieve class instance from global object\n");
|
||||
- return JS_FALSE;
|
||||
+ return JS_TRUE;
|
||||
}
|
||||
|
||||
if (self->whoami() == S_PLAYLIST)
|
||||
@@ -142,26 +187,17 @@
|
||||
{
|
||||
i2i = StringConverter::i2i();
|
||||
}
|
||||
-
|
||||
- arg = argv[0];
|
||||
- if (!JSVAL_IS_OBJECT(arg))
|
||||
- return JS_TRUE;
|
||||
- if (!JS_ValueToObject(cx, arg, &js_cds_obj))
|
||||
- return JS_TRUE;
|
||||
|
||||
- // root it
|
||||
- argv[0] = OBJECT_TO_JSVAL(js_cds_obj);
|
||||
|
||||
- str = JS_ValueToString(cx, argv[1]);
|
||||
if (!str)
|
||||
path = _("/");
|
||||
else
|
||||
- path = JS_GetStringBytes(str);
|
||||
+ path = JS_EncodeString(cx, str);
|
||||
+
|
||||
|
||||
- JSString *cont = JS_ValueToString(cx, argv[2]);
|
||||
if (cont)
|
||||
{
|
||||
- containerclass = JS_GetStringBytes(cont);
|
||||
+ containerclass = JS_EncodeString(cx, cont);
|
||||
if (!string_ok(containerclass) || containerclass == "undefined")
|
||||
containerclass = nil;
|
||||
}
|
||||
@@ -177,9 +213,6 @@
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
- // root it
|
||||
- argv[1] = OBJECT_TO_JSVAL(js_orig_obj);
|
||||
-
|
||||
orig_object = self->jsObject2cdsObject(js_orig_obj, self->getProcessedObject());
|
||||
if (orig_object == nil)
|
||||
return JS_TRUE;
|
||||
@@ -285,8 +318,7 @@
|
||||
JSString *str2 = JS_NewStringCopyN(cx, tmp.c_str(), tmp.length());
|
||||
if (!str2)
|
||||
return JS_TRUE;
|
||||
- *rval = STRING_TO_JSVAL(str2);
|
||||
-
|
||||
+ JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(str2));
|
||||
return JS_TRUE;
|
||||
}
|
||||
catch (ServerShutdownException se)
|
||||
@@ -302,7 +334,7 @@
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
-static JSBool convert_charset_generic(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval, charset_convert_t chr)
|
||||
+static JSBool convert_charset_generic(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, charset_convert_t chr)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -321,7 +353,7 @@
|
||||
{
|
||||
str = JS_ValueToString(cx, argv[0]);
|
||||
if (str)
|
||||
- result = JS_GetStringBytes(str);
|
||||
+ result = JS_EncodeString(cx, str);
|
||||
}
|
||||
|
||||
if (result != nil)
|
||||
@@ -330,7 +362,7 @@
|
||||
JSString *str2 = JS_NewStringCopyN(cx, result.c_str(), result.length());
|
||||
if (!str2)
|
||||
return JS_TRUE;
|
||||
- *rval = STRING_TO_JSVAL(str2);
|
||||
+ JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(str2));
|
||||
}
|
||||
}
|
||||
catch (ServerShutdownException se)
|
||||
@@ -347,24 +379,23 @@
|
||||
}
|
||||
|
||||
|
||||
-JSBool js_f2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
+JSBool js_f2i(JSContext *cx, uintN argc, jsval *argv)
|
||||
{
|
||||
- return convert_charset_generic(cx, obj, argc, argv, rval, F2I);
|
||||
+ return convert_charset_generic(cx, JS_THIS_OBJECT(cx, argv), argc, argv, F2I);
|
||||
}
|
||||
|
||||
-JSBool js_m2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
+JSBool js_m2i(JSContext *cx, uintN argc, jsval *argv)
|
||||
{
|
||||
- return convert_charset_generic(cx, obj, argc, argv, rval, M2I);
|
||||
-}
|
||||
+ return convert_charset_generic(cx, JS_THIS_OBJECT(cx, argv), argc, argv, M2I); }
|
||||
|
||||
-JSBool js_p2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
+JSBool js_p2i(JSContext *cx, uintN argc, jsval *argv)
|
||||
{
|
||||
- return convert_charset_generic(cx, obj, argc, argv, rval, P2I);
|
||||
+ return convert_charset_generic(cx, JS_THIS_OBJECT(cx, argv), argc, argv, P2I);
|
||||
}
|
||||
|
||||
-JSBool js_j2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
+JSBool js_j2i(JSContext *cx, uintN argc, jsval *argv)
|
||||
{
|
||||
- return convert_charset_generic(cx, obj, argc, argv, rval, J2I);
|
||||
+ return convert_charset_generic(cx, JS_THIS_OBJECT(cx, argv), argc, argv, J2I);
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
diff -ur mediatomb-0.12.1.orig/src/scripting/js_functions.h mediatomb-0.12.1/src/scripting/js_functions.h
|
||||
--- mediatomb-0.12.1.orig/src/scripting/js_functions.h 2010-03-25 10:58:05.000000000 -0400
|
||||
+++ mediatomb-0.12.1/src/scripting/js_functions.h 2011-11-16 22:28:06.000000000 -0500
|
||||
@@ -40,18 +40,18 @@
|
||||
extern "C" {
|
||||
|
||||
/// \brief Log output.
|
||||
-JSBool js_print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
+JSBool js_print(JSContext *cx, uintN argc, jsval *argv);
|
||||
|
||||
/// \brief Adds an object to the database.
|
||||
-JSBool js_addCdsObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
+JSBool js_addCdsObject(JSContext *cx, uintN argc, jsval *argv);
|
||||
|
||||
/// \brief Makes a copy of an CDS object.
|
||||
-JSBool js_copyObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
+JSBool js_copyObject(JSContext *cx, uintN argc, jsval *argv);
|
||||
|
||||
-JSBool js_f2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
-JSBool js_m2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
-JSBool js_p2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
-JSBool js_j2i(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
|
||||
+JSBool js_f2i(JSContext *cx, uintN argc, jsval *argv);
|
||||
+JSBool js_m2i(JSContext *cx, uintN argc, jsval *argv);
|
||||
+JSBool js_p2i(JSContext *cx, uintN argc, jsval *argv);
|
||||
+JSBool js_j2i(JSContext *cx, uintN argc, jsval *argv);
|
||||
|
||||
} // extern "C"
|
||||
|
||||
diff -ur mediatomb-0.12.1.orig/src/scripting/playlist_parser_script.cc mediatomb-0.12.1/src/scripting/playlist_parser_script.cc
|
||||
--- mediatomb-0.12.1.orig/src/scripting/playlist_parser_script.cc 2010-03-25 10:58:05.000000000 -0400
|
||||
+++ mediatomb-0.12.1/src/scripting/playlist_parser_script.cc 2011-11-16 22:28:06.000000000 -0500
|
||||
@@ -46,9 +46,9 @@
|
||||
extern "C" {
|
||||
|
||||
static JSBool
|
||||
-js_readln(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
+js_readln(JSContext *cx, uintN argc, jsval *argv)
|
||||
{
|
||||
- PlaylistParserScript *self = (PlaylistParserScript *)JS_GetPrivate(cx, obj);
|
||||
+ PlaylistParserScript *self = (PlaylistParserScript *)JS_GetPrivate(cx, JS_THIS_OBJECT(cx, argv));
|
||||
|
||||
String line;
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
JSString *jsline = JS_NewStringCopyZ(cx, line.c_str());
|
||||
|
||||
- *rval = STRING_TO_JSVAL(jsline);
|
||||
+ JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(jsline));
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
@@ -93,8 +93,8 @@
|
||||
|
||||
String scriptPath = ConfigManager::getInstance()->getOption(CFG_IMPORT_SCRIPTING_PLAYLIST_SCRIPT);
|
||||
load(scriptPath);
|
||||
- root = JS_NewScriptObject(cx, script);
|
||||
- JS_AddNamedRoot(cx, &root, "PlaylistScript");
|
||||
+ root = JS_NewObject(cx, NULL, script, NULL);
|
||||
+ JS_AddNamedObjectRoot(cx, &root, "PlaylistScript");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -245,7 +245,7 @@
|
||||
#endif
|
||||
|
||||
if (root)
|
||||
- JS_RemoveRoot(cx, &root);
|
||||
+ JS_RemoveObjectRoot(cx, &root);
|
||||
|
||||
#ifdef JS_THREADSAFE
|
||||
JS_EndRequest(cx);
|
||||
diff -ur mediatomb-0.12.1.orig/src/scripting/script.cc mediatomb-0.12.1/src/scripting/script.cc
|
||||
--- mediatomb-0.12.1.orig/src/scripting/script.cc 2010-03-25 10:58:05.000000000 -0400
|
||||
+++ mediatomb-0.12.1/src/scripting/script.cc 2011-11-16 22:28:06.000000000 -0500
|
||||
@@ -87,7 +87,7 @@
|
||||
str = JS_ValueToString(cx, val);
|
||||
if (! str)
|
||||
return nil;
|
||||
- return JS_GetStringBytes(str);
|
||||
+ return JS_EncodeString(cx, str);
|
||||
}
|
||||
|
||||
int Script::getBoolProperty(JSObject *obj, String name)
|
||||
@@ -427,14 +427,14 @@
|
||||
try
|
||||
{
|
||||
common_script = _load(common_scr_path);
|
||||
- common_root = JS_NewScriptObject(cx, common_script);
|
||||
- JS_AddNamedRoot(cx, &common_root, "common-script");
|
||||
+ common_root = JS_NewObject(cx, NULL, common_script, NULL);
|
||||
+ JS_AddNamedObjectRoot(cx, &common_root, "common-script");
|
||||
_execute(common_script);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (common_root)
|
||||
- JS_RemoveRoot(cx, &common_root);
|
||||
+ JS_RemoveObjectRoot(cx, &common_root);
|
||||
|
||||
log_js("Unable to load %s: %s\n", common_scr_path.c_str(),
|
||||
e.getMessage().c_str());
|
||||
@@ -460,7 +460,7 @@
|
||||
JS_BeginRequest(cx);
|
||||
#endif
|
||||
if (common_root)
|
||||
- JS_RemoveRoot(cx, &common_root);
|
||||
+ JS_RemoveObjectRoot(cx, &common_root);
|
||||
|
||||
/*
|
||||
* scripts are unrooted and will be cleaned up by GC
|
||||
@@ -504,11 +504,11 @@
|
||||
static JSClass global_class =
|
||||
{
|
||||
"global", /* name */
|
||||
- JSCLASS_HAS_PRIVATE, /* flags */
|
||||
+ JSCLASS_HAS_PRIVATE | JSCLASS_GLOBAL_FLAGS,/* flags */
|
||||
JS_PropertyStub, /* add property */
|
||||
JS_PropertyStub, /* del property */
|
||||
JS_PropertyStub, /* get property */
|
||||
- JS_PropertyStub, /* set property */
|
||||
+ JS_StrictPropertyStub, /* set property */
|
||||
JS_EnumerateStandardClasses, /* enumerate */
|
||||
JS_ResolveStub, /* resolve */
|
||||
JS_ConvertStub, /* convert */
|
||||
@@ -517,7 +517,7 @@
|
||||
};
|
||||
|
||||
/* create the global object here */
|
||||
- glob = JS_NewObject(cx, &global_class, NULL, NULL);
|
||||
+ glob = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
|
||||
if (! glob)
|
||||
throw _Exception(_("Scripting: could not initialize glboal class"));
|
||||
|
||||
@@ -539,12 +539,12 @@
|
||||
throw _Exception(_("Scripting: JS_DefineFunctions failed"));
|
||||
}
|
||||
|
||||
-JSScript *Script::_load(zmm::String scriptPath)
|
||||
+JSObject *Script::_load(zmm::String scriptPath)
|
||||
{
|
||||
if (glob == NULL)
|
||||
initGlobalObject();
|
||||
|
||||
- JSScript *scr;
|
||||
+ JSObject *scr;
|
||||
|
||||
String scriptText = read_text_file(scriptPath);
|
||||
|
||||
@@ -571,14 +571,11 @@
|
||||
|
||||
void Script::load(zmm::String scriptPath)
|
||||
{
|
||||
- if (script)
|
||||
- JS_DestroyScript(cx, script);
|
||||
-
|
||||
script = _load((scriptPath));
|
||||
}
|
||||
|
||||
|
||||
-void Script::_execute(JSScript *scr)
|
||||
+void Script::_execute(JSObject *scr)
|
||||
{
|
||||
jsval ret_val;
|
||||
|
||||
@@ -662,7 +659,7 @@
|
||||
JSObject *js_meta = getObjectProperty(js, _("meta"));
|
||||
if (js_meta)
|
||||
{
|
||||
- JS_AddNamedRoot(cx, &js_meta, "meta");
|
||||
+ JS_AddNamedObjectRoot(cx, &js_meta, "meta");
|
||||
/// \todo: only metadata enumerated in MT_KEYS is taken
|
||||
for (int i = 0; i < M_MAX; i++)
|
||||
{
|
||||
@@ -687,7 +684,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
- JS_RemoveRoot(cx, &js_meta);
|
||||
+ JS_RemoveObjectRoot(cx, &js_meta);
|
||||
}
|
||||
|
||||
// stuff that has not been exported to js
|
||||
diff -ur mediatomb-0.12.1.orig/src/scripting/script.h mediatomb-0.12.1/src/scripting/script.h
|
||||
--- mediatomb-0.12.1.orig/src/scripting/script.h 2010-03-25 10:58:05.000000000 -0400
|
||||
+++ mediatomb-0.12.1/src/scripting/script.h 2011-11-16 22:28:06.000000000 -0500
|
||||
@@ -66,8 +66,8 @@
|
||||
JSRuntime *rt;
|
||||
JSContext *cx;
|
||||
JSObject *glob;
|
||||
- JSScript *script;
|
||||
- JSScript *common_script;
|
||||
+ JSObject *script;
|
||||
+ JSObject *common_script;
|
||||
|
||||
public:
|
||||
Script(zmm::Ref<Runtime> runtime);
|
||||
@@ -115,8 +115,8 @@
|
||||
JSObject *common_root;
|
||||
|
||||
void initGlobalObject();
|
||||
- JSScript *_load(zmm::String scriptPath);
|
||||
- void _execute(JSScript *scr);
|
||||
+ JSObject *_load(zmm::String scriptPath);
|
||||
+ void _execute(JSObject *scr);
|
||||
zmm::Ref<StringConverter> _p2i;
|
||||
zmm::Ref<StringConverter> _j2i;
|
||||
zmm::Ref<StringConverter> _f2i;
|
86
multimedia/mediatomb/mediatomb-mp4v2-check.patch
Normal file
86
multimedia/mediatomb/mediatomb-mp4v2-check.patch
Normal file
|
@ -0,0 +1,86 @@
|
|||
commit bed8f03202336fc7863ec6a39e130473f59061c6
|
||||
Author: Sergey 'Jin' Bostandzhyan <jin at mediatomb dot cc>
|
||||
Date: Sun Jan 27 23:08:04 2013 +0100
|
||||
|
||||
Extra configure check for libmp4v2 compatibility
|
||||
|
||||
We do not support the newer libmpv2 version yet, so don't error out when
|
||||
compiling, catch it in configure.
|
||||
|
||||
diff --git a/acinclude.m4 b/acinclude.m4
|
||||
index f4962c6..3cc5ec3 100644
|
||||
--- a/acinclude.m4
|
||||
+++ b/acinclude.m4
|
||||
@@ -533,7 +533,8 @@ AC_DEFUN([MT_CHECK_OPTIONAL_PACKAGE],
|
||||
AC_MSG_ERROR([unable to configure $1 support])
|
||||
fi
|
||||
|
||||
- if test "x$mt_[]translit($1, `/.-', `___')_status" = xyes; then
|
||||
+ if ((test "x$mt_[]translit($1, `/.-', `___')_status" = xyes) &&
|
||||
+ (test "x$9" != "xundef")); then
|
||||
AC_DEFINE(translit(HAVE_$1, `a-z/.-', `A-Z___'), [1], [$1 library presence])
|
||||
fi
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index e72dd78..9241797 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -1390,7 +1390,7 @@ LIBMP4V2_STATUS=
|
||||
|
||||
MT_CHECK_OPTIONAL_PACKAGE([libmp4v2], [disable],
|
||||
[libmp4v2 support for mp4 metadata extraction],
|
||||
- [$MP4_HEADER], [mp4v2], [MP4Read])
|
||||
+ [$MP4_HEADER], [mp4v2], [MP4Read], [], [], [undef])
|
||||
|
||||
if test "x$LIBMP4V2_STATUS" = xyes; then
|
||||
CFLAGS="$CFLAGS $LIBMP4V2_CFLAGS"
|
||||
@@ -1399,6 +1399,37 @@ if test "x$LIBMP4V2_STATUS" = xyes; then
|
||||
AC_DEFINE_UNQUOTED([LIBMP4V2_INCLUDE], [<$MP4_HEADER.h>], [$MP4_HEADER.h])
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_CPLUSPLUS
|
||||
+ AC_MSG_CHECKING([for libmp4v2 compatibility])
|
||||
+ AC_COMPILE_IFELSE(
|
||||
+ [AC_LANG_PROGRAM(
|
||||
+ [
|
||||
+ #include <$MP4_HEADER.h>
|
||||
+ ],
|
||||
+ [
|
||||
+ (void)MP4GetMetadataName(0, 0);
|
||||
+ ]
|
||||
+ )],
|
||||
+ [
|
||||
+ AC_MSG_RESULT([yes])
|
||||
+ AC_DEFINE([HAVE_LIBMP4V2], [1], [libmp4v2 library presence])
|
||||
+ ],
|
||||
+ [
|
||||
+ AC_MSG_RESULT([not compatible])
|
||||
+ if test "x$LIBMP4V2_OPTION_REQUESTED" = "xyes"; then
|
||||
+ AC_MSG_ERROR([Unable to configure libmp4v2 support])
|
||||
+ else
|
||||
+ LIBMP4V2_STATUS="not compatible"
|
||||
+ fi
|
||||
+ ])
|
||||
+ LDFLAGS="$LDFLAGS_SAVE"
|
||||
+ CFLAGS="$CFLAGS_SAVE"
|
||||
+ CXXFLAGS="$CXXFLAGS_SAVE"
|
||||
+fi
|
||||
+
|
||||
+if test "x$LIBMP4V2_STATUS" = "xyes"; then
|
||||
+ CFLAGS="$CFLAGS $LIBMP4V2_CFLAGS"
|
||||
+ CXXFLAGS="$CXXFLAGS $LIBMP4V2_CFLAGS"
|
||||
+ LDFLAGS="$LDFLAGS $LIBMP4V2_LDFLAGS $LIBMP4V2_LIBS"
|
||||
AC_MSG_CHECKING([for MP4GetMetadataCoverArtCount() in libmp4v2])
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
@@ -1437,7 +1468,10 @@ if test "x$LIBMP4V2_STATUS" = xyes; then
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
|
||||
- AC_LANG_RESTORE
|
||||
+ AC_LANG_RESTORE
|
||||
+ LDFLAGS="$LDFLAGS_SAVE"
|
||||
+ CFLAGS="$CFLAGS_SAVE"
|
||||
+ CXXFLAGS="$CXXFLAGS_SAVE"
|
||||
fi
|
||||
|
||||
########## INOTIFY TOOLS
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
# Slackware build script for mediatomb
|
||||
|
||||
# Copyright 2010-2012 Heinz Wiesinger, Amsterdam, The Netherlands
|
||||
# Copyright 2010-2013 Heinz Wiesinger, Amsterdam, The Netherlands
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use of this script, with or without modification, is
|
||||
|
@ -23,8 +23,8 @@
|
|||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
PRGNAM=mediatomb
|
||||
VERSION=${VERSION:-0.12.1}
|
||||
BUILD=${BUILD:-5}
|
||||
VERSION=${VERSION:-b66dc1f}
|
||||
BUILD=${BUILD:-1}
|
||||
TAG=${TAG:-_SBo}
|
||||
|
||||
if [ -z "$ARCH" ]; then
|
||||
|
@ -72,26 +72,19 @@ rm -rf $PKG
|
|||
mkdir -p $TMP $PKG $OUTPUT
|
||||
cd $TMP
|
||||
rm -rf $PRGNAM-$VERSION
|
||||
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
|
||||
tar xvf $CWD/$PRGNAM-$VERSION.tar.xz
|
||||
cd $PRGNAM-$VERSION
|
||||
chown -R root:root .
|
||||
chmod -R u+w,go+r-w,a-s .
|
||||
|
||||
# Fix building with newer ffmpeg releases
|
||||
patch -p1 -i $CWD/libav_0.7_support.patch
|
||||
patch -p1 -i $CWD/libavformat.patch
|
||||
|
||||
# Fix building with new libmp4v2
|
||||
patch -p1 -R -i $CWD/mediatomb-mp4v2-check.patch
|
||||
patch -p1 -i $CWD/mediatomb-0.12.1-libmp4v2_191_p479.patch
|
||||
|
||||
# Fix compiling with gcc 4.7
|
||||
patch -p1 -i $CWD/mediatomb-0.12.1-gcc46.patch
|
||||
patch -p1 -i $CWD/mediatomb-0.12.1-gcc47.patch
|
||||
# Fix support for Samsung TVs
|
||||
patch -p1 -i $CWD/samsung-mkv.patch
|
||||
|
||||
# Check for js185 in addition to the usual js packages
|
||||
patch -p1 -i $CWD/mediatomb-0.12.1-mozjs185.patch
|
||||
|
||||
autoreconf
|
||||
autoreconf -vif
|
||||
|
||||
# We need LDFLAGS="-ldl" for proper sqlite detection
|
||||
CFLAGS="$SLKCFLAGS" \
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
PRGNAM="mediatomb"
|
||||
VERSION="0.12.1"
|
||||
VERSION="b66dc1f"
|
||||
HOMEPAGE="http://mediatomb.cc/"
|
||||
DOWNLOAD="http://downloads.sourceforge.net/mediatomb/mediatomb-0.12.1.tar.gz"
|
||||
MD5SUM="e927dd5dc52d3cfcebd8ca1af6f0d3c2"
|
||||
DOWNLOAD="http://www.liwjatan.at/files/src/mediatomb/mediatomb-b66dc1f.tar.xz"
|
||||
MD5SUM="7f4eb80f9e708564e6b8db45ee63f002"
|
||||
DOWNLOAD_x86_64=""
|
||||
MD5SUM_x86_64=""
|
||||
REQUIRES=""
|
||||
|
|
445
multimedia/mediatomb/samsung-mkv.patch
Normal file
445
multimedia/mediatomb/samsung-mkv.patch
Normal file
|
@ -0,0 +1,445 @@
|
|||
Workaround for Samsung Smart TV 2012 :
|
||||
- URI patch made by swiergot http://sourceforge.net/tracker/index.php?func=detail&aid=3532724&group_id=129766&atid=715782
|
||||
- per device content-type engine : change video/x-matroska with video/x-mkv for Samsung devices only
|
||||
|
||||
--- a/tombupnp/upnp/src/genlib/miniserver/miniserver.c
|
||||
+++ b/tombupnp/upnp/src/genlib/miniserver/miniserver.c
|
||||
@@ -842,6 +842,8 @@
|
||||
return UPNP_E_INTERNAL_ERROR; // miniserver running
|
||||
}
|
||||
|
||||
+ ssdpdevices_init(&GlobalSsdpDevices);
|
||||
+
|
||||
miniSocket =
|
||||
( MiniServerSockArray * ) malloc( sizeof( MiniServerSockArray ) );
|
||||
if( miniSocket == NULL )
|
||||
@@ -963,5 +965,8 @@
|
||||
}
|
||||
shutdown( sock, SD_BOTH );
|
||||
UpnpCloseSocket( sock );
|
||||
+
|
||||
+ ssdpdevices_destroy(&GlobalSsdpDevices);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
--- a/tombupnp/upnp/src/genlib/net/http/webserver.c
|
||||
+++ b/tombupnp/upnp/src/genlib/net/http/webserver.c
|
||||
@@ -1211,6 +1211,7 @@
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t *req ; HTTP Request message
|
||||
+* IN SOCKINFO *info ; Socket info (fd with remote ip & port)
|
||||
* OUT enum resp_type *rtype ; Tpye of response
|
||||
* OUT membuffer *headers ;
|
||||
* OUT membuffer *filename ; Get filename from request document
|
||||
@@ -1230,6 +1231,7 @@
|
||||
************************************************************************/
|
||||
static int
|
||||
process_request( IN http_message_t * req,
|
||||
+ IN SOCKINFO *info,
|
||||
OUT enum resp_type *rtype,
|
||||
OUT membuffer * headers,
|
||||
OUT membuffer * filename,
|
||||
@@ -1473,6 +1475,19 @@
|
||||
goto error_handler;
|
||||
}
|
||||
|
||||
+ // change "x-matroska" by "x-mkv", for samsung devices only
|
||||
+ char *newtype;
|
||||
+ if((strcmp(finfo.content_type, "video/x-matroska")==0)) {
|
||||
+ if(ssdpdevice_servermatch(&GlobalSsdpDevices, info->foreign_ip_addr.s_addr, "samsung")) {
|
||||
+// printf("Req from Samsung device : %s\n", finfo.content_type);
|
||||
+ // change is made in two steps : free the previous string, malloc a new one
|
||||
+ if((newtype= (char *) strdup("video/x-mkv"))) {
|
||||
+ free(finfo.content_type);
|
||||
+ finfo.content_type = newtype;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if( RespInstr->IsRangeActive && RespInstr->IsChunkActive ) {
|
||||
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
|
||||
//Transfer-Encoding: chunked
|
||||
@@ -1800,7 +1815,7 @@
|
||||
//Process request should create the different kind of header depending on the
|
||||
//the type of request.
|
||||
ret =
|
||||
- process_request( req, &rtype, &headers, &filename, &xmldoc,
|
||||
+ process_request( req, info, &rtype, &headers, &filename, &xmldoc,
|
||||
&RespInstr, &Fp);
|
||||
if( ret != UPNP_E_SUCCESS ) {
|
||||
// send error code
|
||||
--- a/tombupnp/upnp/src/genlib/net/uri/uri.c
|
||||
+++ b/tombupnp/upnp/src/genlib/net/uri/uri.c
|
||||
@@ -1042,7 +1042,8 @@
|
||||
out->path_type = REL_PATH;
|
||||
}
|
||||
|
||||
- if( ( ( begin_hostport + 1 ) < max ) && ( in[begin_hostport] == '/' )
|
||||
+ //parse hostport only if scheme was found
|
||||
+ if( ( begin_hostport > 0 ) && ( ( begin_hostport + 1 ) < max ) && ( in[begin_hostport] == '/' )
|
||||
&& ( in[begin_hostport + 1] == '/' ) ) {
|
||||
begin_hostport += 2;
|
||||
|
||||
@@ -1059,6 +1060,12 @@
|
||||
out->hostport.text.size = 0;
|
||||
out->hostport.text.buff = 0;
|
||||
begin_path = begin_hostport;
|
||||
+
|
||||
+ //remove excessive leading slashes (fix for Samsung Smart TV 2012)
|
||||
+ while( ( ( begin_path + 1 ) < max ) && ( in[begin_path] == '/' ) && ( in[begin_path + 1] == '/') ) {
|
||||
+ begin_path++;
|
||||
+ }
|
||||
+
|
||||
}
|
||||
|
||||
begin_fragment =
|
||||
--- a/tombupnp/upnp/src/inc/ssdplib.h
|
||||
+++ b/tombupnp/upnp/src/inc/ssdplib.h
|
||||
@@ -161,9 +161,22 @@
|
||||
struct sockaddr_in dest_addr;
|
||||
} ssdp_thread_data;
|
||||
|
||||
+typedef struct
|
||||
+{
|
||||
+ ithread_mutex_t mutex;
|
||||
+ LinkedList deviceslist;
|
||||
+} ssdpdevices_t;
|
||||
+
|
||||
+typedef struct
|
||||
+{
|
||||
+ uint32_t s_addr;
|
||||
+ char *serverdesc;
|
||||
+} ssdp_device_t;
|
||||
|
||||
/* globals */
|
||||
|
||||
+extern ssdpdevices_t GlobalSsdpDevices;
|
||||
+
|
||||
CLIENTONLY(extern SOCKET gSsdpReqSocket;);
|
||||
|
||||
typedef int (*ParserFun)(char *, Event *);
|
||||
@@ -174,6 +187,64 @@
|
||||
//int AnalyzeCommand(char * szCommand, Event * Evt);
|
||||
|
||||
/************************************************************************
|
||||
+* Function : ssdpdevices_free
|
||||
+*
|
||||
+* Parameters :
|
||||
+* void *d ;
|
||||
+*
|
||||
+* Description : Free memory allocated for each SSDP Device
|
||||
+*
|
||||
+* Return : void ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+void ssdpdevice_free( void *d );
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevice_compare
|
||||
+*
|
||||
+* Parameters :
|
||||
+* void* param1 ;
|
||||
+* void* param2 ;
|
||||
+*
|
||||
+* Description : Compare two SSDP devices by their ip address
|
||||
+*
|
||||
+* Return : int ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+int ssdpdevice_compare( void *param1, void *param2 );
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevices_init
|
||||
+*
|
||||
+* Parameters :
|
||||
+* INOUT ssdpdevices_t* s ; Array of SSDP Devices
|
||||
+*
|
||||
+* Description : Initialize and allocate memory for the array of SSDP devices
|
||||
+*
|
||||
+* Return : void ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+
|
||||
+void ssdpdevices_init(ssdpdevices_t* s);
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevices_destroy
|
||||
+*
|
||||
+* Parameters :
|
||||
+* INOUT ssdpdevices_t* msg ; Array of SSDP Devices
|
||||
+*
|
||||
+* Description : Free memory allocated for the Array of SSDP Devices
|
||||
+*
|
||||
+* Return : void ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+void ssdpdevices_destroy( ssdpdevices_t *s );
|
||||
+
|
||||
+/************************************************************************
|
||||
* Function : Make_Socket_NoBlocking
|
||||
*
|
||||
* Parameters:
|
||||
--- a/tombupnp/upnp/src/ssdp/ssdp_server.c
|
||||
+++ b/tombupnp/upnp/src/ssdp/ssdp_server.c
|
||||
@@ -52,8 +52,231 @@
|
||||
#include "unixutil.h"
|
||||
#endif
|
||||
|
||||
+#include <regex.h>
|
||||
+
|
||||
#define MAX_TIME_TOREAD 45
|
||||
|
||||
+// global containing the array of devices
|
||||
+ssdpdevices_t GlobalSsdpDevices;
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevices_free
|
||||
+*
|
||||
+* Parameters :
|
||||
+* void *msg ;
|
||||
+*
|
||||
+* Description : Free memory allocated for each SSDP Device
|
||||
+*
|
||||
+* Return : void ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+void
|
||||
+ssdpdevice_free( void *d )
|
||||
+{
|
||||
+ ssdp_device_t *sd = ( ssdp_device_t * ) d;
|
||||
+
|
||||
+ free(sd->serverdesc);
|
||||
+
|
||||
+ free( sd );
|
||||
+}
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevice_compare
|
||||
+*
|
||||
+* Parameters :
|
||||
+* void* param1 ;
|
||||
+* void* param2 ;
|
||||
+*
|
||||
+* Description : Compare two SSDP devices by their ip address
|
||||
+*
|
||||
+* Return : int ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+int
|
||||
+ssdpdevice_compare( void *param1,
|
||||
+ void *param2 )
|
||||
+{
|
||||
+ assert( param1 != NULL );
|
||||
+ assert( param2 != NULL );
|
||||
+
|
||||
+ return ( ( ssdp_device_t * ) param1 )->s_addr ==
|
||||
+ ( ( ssdp_device_t * ) param2 )->s_addr;
|
||||
+}
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevices_init
|
||||
+*
|
||||
+* Parameters :
|
||||
+* INOUT ssdpdevices_t* s ; Array of SSDP Devices
|
||||
+*
|
||||
+* Description : Initialize and allocate memory for the array of SSDP devices
|
||||
+*
|
||||
+* Return : void ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+
|
||||
+void ssdpdevices_init(ssdpdevices_t* s) {
|
||||
+ ithread_mutex_init( &s->mutex, NULL );
|
||||
+ ListInit( &s->deviceslist, ssdpdevice_compare, ssdpdevice_free );
|
||||
+}
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevices_destroy
|
||||
+*
|
||||
+* Parameters :
|
||||
+* INOUT ssdpdevices_t* s ; Array of SSDP Devices
|
||||
+*
|
||||
+* Description : Free memory allocated for the Array of SSDP Devices
|
||||
+*
|
||||
+* Return : void ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+void
|
||||
+ssdpdevices_destroy( ssdpdevices_t *s )
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ assert( s != NULL );
|
||||
+
|
||||
+ ithread_mutex_lock( &s->mutex );
|
||||
+ ListDestroy( &s->deviceslist, 1 );
|
||||
+ ithread_mutex_unlock( &s->mutex );
|
||||
+
|
||||
+ ret = ithread_mutex_destroy( &s->mutex );
|
||||
+ assert( ret == 0 );
|
||||
+
|
||||
+}
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : create_device_node
|
||||
+*
|
||||
+* Parameters :
|
||||
+* IN uint32_t *ip4addr; IP Address
|
||||
+* IN membuffer *mbuf; Server descripton
|
||||
+*
|
||||
+* Description : Create a device structure and fill it with ip & description
|
||||
+*
|
||||
+* Return : ssdp_device_t *
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+
|
||||
+ssdp_device_t *create_device(uint32_t ipaddr, membuffer *mbuf) {
|
||||
+ ssdp_device_t *newd;
|
||||
+ if( (newd = (ssdp_device_t *) malloc(sizeof(ssdp_device_t)))) {
|
||||
+ if( ( newd->serverdesc = str_alloc ( mbuf->buf, mbuf->length) ) ) {
|
||||
+ newd->s_addr = ipaddr;
|
||||
+ return(newd);
|
||||
+ }
|
||||
+ free(newd);
|
||||
+ }
|
||||
+ return(NULL);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevices_updatelist
|
||||
+*
|
||||
+* Parameters :
|
||||
+* INOUT ssdpdevices_t* s ; Array of SSDP Devices
|
||||
+* IN uint32_t *ip4addr; IP Address
|
||||
+* IN char *serverstr; Server descripton
|
||||
+*
|
||||
+* Description : Insert or update the list with given device
|
||||
+*
|
||||
+* Return : void ;
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+void
|
||||
+ssdpdevices_updatelist( ssdpdevices_t *s, uint32_t ip4addr, membuffer *serverstr)
|
||||
+{
|
||||
+ assert( s != NULL );
|
||||
+ assert( ip4addr != 0 );
|
||||
+ assert( serverstr != NULL );
|
||||
+
|
||||
+ int found = 0;
|
||||
+
|
||||
+ // Loop through each existing device
|
||||
+ ithread_mutex_lock( &s->mutex );
|
||||
+ LinkedList *l = &s->deviceslist;
|
||||
+ ListNode *temp = NULL;
|
||||
+ ssdp_device_t *d,*newd;
|
||||
+ for (temp = ListHead(l);temp!=NULL;temp = ListNext(l,temp))
|
||||
+ {
|
||||
+ d=(ssdp_device_t *)temp->item;
|
||||
+ if(d->s_addr == ip4addr) {
|
||||
+ found = 1;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // Add the entry if necessary
|
||||
+ if(!found) {
|
||||
+ if( ( newd = create_device(ip4addr, serverstr))) {
|
||||
+ ListAddTail( l, newd);
|
||||
+ }
|
||||
+ }
|
||||
+ ithread_mutex_unlock( &s->mutex );
|
||||
+
|
||||
+}
|
||||
+
|
||||
+/************************************************************************
|
||||
+* Function : ssdpdevice_descmatch
|
||||
+*
|
||||
+* Parameters :
|
||||
+* IN ssdpdevices_t* s ; Array of SSDP Devices
|
||||
+* IN uint32_t ipaddr; Ip addres to check
|
||||
+* IN char *regexp; Regex to match
|
||||
+*
|
||||
+* Description : Check whether the device's description matches the given regex
|
||||
+*
|
||||
+* Return : int (1 = match, else no match)
|
||||
+*
|
||||
+* Note :
|
||||
+************************************************************************/
|
||||
+int
|
||||
+ssdpdevice_servermatch( ssdpdevices_t *s, uint32_t ip4addr, char *regex)
|
||||
+{
|
||||
+ assert( s != NULL );
|
||||
+ assert( ip4addr != 0 );
|
||||
+ assert( regex != NULL );
|
||||
+
|
||||
+ int ret = 0;
|
||||
+ regex_t reg;
|
||||
+
|
||||
+ if( regcomp(®, regex, REG_EXTENDED | REG_NOSUB | REG_ICASE) != 0) {
|
||||
+ printf("Invalid regex : %s\n", regex);
|
||||
+ return(0);
|
||||
+ }
|
||||
+
|
||||
+ // Loop through each existing device
|
||||
+ ithread_mutex_lock( &s->mutex );
|
||||
+ LinkedList *l = &s->deviceslist;
|
||||
+ ListNode *temp = NULL;
|
||||
+ ssdp_device_t *d;
|
||||
+ for (temp = ListHead(l);temp!=NULL;temp = ListNext(l,temp))
|
||||
+ {
|
||||
+ d=(ssdp_device_t *)temp->item;
|
||||
+ if(d->s_addr == ip4addr) {
|
||||
+ // We found the ip addr, let's check if the desc contains the searched string
|
||||
+ if(regexec(®, d->serverdesc, 0, NULL, 0) == 0) {
|
||||
+ ret=1;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ ithread_mutex_unlock( &s->mutex );
|
||||
+ return(ret);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
CLIENTONLY( SOCKET gSsdpReqSocket = 0;
|
||||
)
|
||||
|
||||
@@ -756,6 +979,24 @@
|
||||
if( !valid_ssdp_msg( &parser->msg ) ) {
|
||||
goto error_handler;
|
||||
}
|
||||
+
|
||||
+ // update liste of devices for each NOTIFY received
|
||||
+
|
||||
+ if ( parser->msg.method == HTTPMETHOD_NOTIFY ) {
|
||||
+// printf( "SSDP recvd code NOTIFY = %d from %s\n", parser->msg.method, inet_ntoa(data->dest_addr.sin_addr));
|
||||
+ LinkedList *g=&parser->msg.headers;
|
||||
+ ListNode *temp = NULL;
|
||||
+ http_header_t *h;
|
||||
+ for (temp = ListHead(g);temp!=NULL;temp = ListNext(g,temp))
|
||||
+ {
|
||||
+ h=(http_header_t *)temp->item;
|
||||
+ if(strncasecmp(h->name.buf, "SERVER", h->name.length) == 0) {
|
||||
+ ssdpdevices_updatelist(&GlobalSsdpDevices, data->dest_addr.sin_addr.s_addr, &h->value);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ }
|
||||
+
|
||||
return 0; //////// done; thread will free 'data'
|
||||
|
||||
error_handler:
|
Loading…
Reference in a new issue