libeplayer3/libspark: cPlayback: implement retrieval of metadata

This commit is contained in:
martii
2014-01-19 12:25:35 +01:00
parent 5fb12c8048
commit 8da0fecb53
5 changed files with 83 additions and 2 deletions

View File

@@ -56,7 +56,7 @@
#ifdef ASS_DEBUG #ifdef ASS_DEBUG
static short debug_level = 10; static short debug_level = 0;
#define ass_printf(level, fmt, x...) do { \ #define ass_printf(level, fmt, x...) do { \
if (debug_level >= level) printf("[%s:%s] " fmt, __FILE__, __FUNCTION__, ## x); } while (0) if (debug_level >= level) printf("[%s:%s] " fmt, __FILE__, __FUNCTION__, ## x); } while (0)

View File

@@ -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) static int Command(void *_context, ContainerCmd_t command, void *argument)
{ {
Context_t *context = (Context_t *) _context; 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); ret = container_ffmpeg_get_info(context, (char **) argument);
break; break;
} }
case CONTAINER_METADATA:{
ret = container_ffmpeg_get_metadata(context, (char ***) argument);
break;
}
case CONTAINER_STATUS:{ case CONTAINER_STATUS:{
*((int *) argument) = hasPlayThreadStarted; *((int *) argument) = hasPlayThreadStarted;
break; break;

View File

@@ -18,6 +18,7 @@ typedef enum {
CONTAINER_SWITCH_DVBSUBTITLE, CONTAINER_SWITCH_DVBSUBTITLE,
CONTAINER_SWITCH_TELETEXT, CONTAINER_SWITCH_TELETEXT,
CONTAINER_INFO, CONTAINER_INFO,
CONTAINER_METADATA,
CONTAINER_STATUS, CONTAINER_STATUS,
CONTAINER_LAST_PTS, CONTAINER_LAST_PTS,
CONTAINER_DATA CONTAINER_DATA

View File

@@ -6,7 +6,7 @@ typedef enum { PLAYBACK_OPEN, PLAYBACK_CLOSE, PLAYBACK_PLAY, PLAYBACK_STOP,
PLAYBACK_PAUSE, PLAYBACK_CONTINUE, PLAYBACK_FLUSH, PLAYBACK_TERM, PLAYBACK_PAUSE, PLAYBACK_CONTINUE, PLAYBACK_FLUSH, PLAYBACK_TERM,
PLAYBACK_FASTFORWARD, PLAYBACK_SEEK, PLAYBACK_SEEK_ABS, PLAYBACK_FASTFORWARD, PLAYBACK_SEEK, PLAYBACK_SEEK_ABS,
PLAYBACK_PTS, PLAYBACK_LENGTH, PLAYBACK_SWITCH_AUDIO, PLAYBACK_PTS, PLAYBACK_LENGTH, PLAYBACK_SWITCH_AUDIO,
PLAYBACK_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_SLOWMOTION, PLAYBACK_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_METADATA, PLAYBACK_SLOWMOTION,
PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT, PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT,
PLAYBACK_SWITCH_TELETEXT, PLAYBACK_SWITCH_DVBSUBTITLE, PLAYBACK_SWITCH_TELETEXT, PLAYBACK_SWITCH_DVBSUBTITLE,
PLAYBACK_FRAMEBUFFER_LOCK, PLAYBACK_FRAMEBUFFER_LOCK,

View File

@@ -862,6 +862,17 @@ static int PlaybackInfo(Context_t * context, char **infoString)
return ret; return ret;
} }
static int PlaybackMetadata(Context_t * context, char ***metadata)
{
int ret = cERR_PLAYBACK_NO_ERROR;
if (context->container && context->container->selectedContainer)
context->container->selectedContainer->Command(context,
CONTAINER_METADATA,
metadata);
return ret;
}
static int Command(void *_context, PlaybackCmd_t command, void *argument) static int Command(void *_context, PlaybackCmd_t command, void *argument)
{ {
Context_t *context = (Context_t *) _context; /* to satisfy compiler */ Context_t *context = (Context_t *) _context; /* to satisfy compiler */
@@ -932,6 +943,10 @@ static int Command(void *_context, PlaybackCmd_t command, void *argument)
ret = PlaybackInfo(context, (char **) argument); ret = PlaybackInfo(context, (char **) argument);
break; break;
} }
case PLAYBACK_METADATA:{
ret = PlaybackMetadata(context, (char ***) argument);
break;
}
case PLAYBACK_SLOWMOTION:{ case PLAYBACK_SLOWMOTION:{
ret = PlaybackSlowMotion(context, (int *) argument); ret = PlaybackSlowMotion(context, (int *) argument);
break; break;