mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-27 15:33:00 +02:00
libeplayer3/libspark: cPlayback: implement retrieval of metadata
This commit is contained in:
@@ -56,7 +56,7 @@
|
||||
|
||||
#ifdef ASS_DEBUG
|
||||
|
||||
static short debug_level = 10;
|
||||
static short debug_level = 0;
|
||||
|
||||
#define ass_printf(level, fmt, x...) do { \
|
||||
if (debug_level >= level) printf("[%s:%s] " fmt, __FILE__, __FUNCTION__, ## x); } while (0)
|
||||
|
@@ -1508,6 +1508,67 @@ static int container_ffmpeg_get_info(Context_t * context, char **infoString)
|
||||
|
||||
}
|
||||
|
||||
static int container_ffmpeg_get_metadata(Context_t * context, char ***p)
|
||||
{
|
||||
Track_t *videoTrack = NULL;
|
||||
Track_t *audioTrack = NULL;
|
||||
AVDictionaryEntry *tag = NULL;
|
||||
size_t psize = 1;
|
||||
char **pp;
|
||||
|
||||
if (!context) {
|
||||
fprintf(stderr, "BUG %s:%d\n", __func__, __LINE__);
|
||||
return cERR_CONTAINER_FFMPEG_ERR;
|
||||
}
|
||||
|
||||
if (!p || *p) {
|
||||
fprintf(stderr, "BUG %s:%d\n", __func__, __LINE__);
|
||||
return cERR_CONTAINER_FFMPEG_ERR;
|
||||
}
|
||||
|
||||
context->manager->video->Command(context, MANAGER_GET_TRACK, &videoTrack);
|
||||
context->manager->audio->Command(context, MANAGER_GET_TRACK, &audioTrack);
|
||||
|
||||
if (avContext->metadata)
|
||||
psize += av_dict_count(avContext->metadata);
|
||||
if (videoTrack)
|
||||
psize += av_dict_count(((AVStream *)(videoTrack->stream))->metadata);
|
||||
if (audioTrack)
|
||||
psize += av_dict_count(((AVStream *)(audioTrack->stream))->metadata);
|
||||
|
||||
*p = malloc(sizeof(char *) * psize * 2);
|
||||
if (!*p) {
|
||||
fprintf(stderr, "MALLOC %s:%d\n", __func__, __LINE__);
|
||||
return cERR_CONTAINER_FFMPEG_ERR;
|
||||
}
|
||||
pp = *p;
|
||||
|
||||
if (avContext->metadata)
|
||||
while ((tag = av_dict_get(avContext->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
|
||||
*pp++ = strdup(tag->key);
|
||||
*pp++ = strdup(tag->value);
|
||||
}
|
||||
|
||||
if (videoTrack) {
|
||||
tag = NULL;
|
||||
while ((tag = av_dict_get(((AVStream *)(videoTrack->stream))->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
|
||||
*pp++ = strdup(tag->key);
|
||||
*pp++ = strdup(tag->value);
|
||||
}
|
||||
}
|
||||
if (audioTrack) {
|
||||
tag = NULL;
|
||||
while ((tag = av_dict_get(((AVStream *)(audioTrack->stream))->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
|
||||
*pp++ = strdup(tag->key);
|
||||
*pp++ = strdup(tag->value);
|
||||
}
|
||||
}
|
||||
*pp++ = NULL;
|
||||
*pp = NULL;
|
||||
|
||||
return cERR_CONTAINER_FFMPEG_NO_ERROR;
|
||||
}
|
||||
|
||||
static int Command(void *_context, ContainerCmd_t command, void *argument)
|
||||
{
|
||||
Context_t *context = (Context_t *) _context;
|
||||
@@ -1560,6 +1621,10 @@ static int Command(void *_context, ContainerCmd_t command, void *argument)
|
||||
ret = container_ffmpeg_get_info(context, (char **) argument);
|
||||
break;
|
||||
}
|
||||
case CONTAINER_METADATA:{
|
||||
ret = container_ffmpeg_get_metadata(context, (char ***) argument);
|
||||
break;
|
||||
}
|
||||
case CONTAINER_STATUS:{
|
||||
*((int *) argument) = hasPlayThreadStarted;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user