mirror of
https://github.com/tuxbox-fork-migrations/recycled-ni-libstb-hal.git
synced 2025-08-26 23:12:44 +02:00
libeplayer3/libspark: cPlayback: implement retrieval of metadata
Origin commit data
------------------
Branch: master
Commit: 1c676196af
Author: martii <m4rtii@gmx.de>
Date: 2014-01-19 (Sun, 19 Jan 2014)
------------------
No further description and justification available within origin commit message!
------------------
This commit was generated by Migit
This commit is contained in:
@@ -122,6 +122,12 @@ void cPlayback::GetChapters(std::vector<int> &positions, std::vector<std::string
|
|||||||
titles.clear();
|
titles.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cPlayback::GetMetadata(std::vector<std::string> &keys, std::vector<std::string> &values)
|
||||||
|
{
|
||||||
|
keys.clear();
|
||||||
|
values.clear();
|
||||||
|
}
|
||||||
|
|
||||||
cPlayback::cPlayback(int /*num*/)
|
cPlayback::cPlayback(int /*num*/)
|
||||||
{
|
{
|
||||||
printf("%s:%s\n", FILENAME, __func__);
|
printf("%s:%s\n", FILENAME, __func__);
|
||||||
|
@@ -48,6 +48,7 @@ class cPlayback
|
|||||||
void FindAllSubs(int *pids, unsigned int *supported, unsigned int *numpida, std::string *language);
|
void FindAllSubs(int *pids, unsigned int *supported, unsigned int *numpida, std::string *language);
|
||||||
bool SelectSubtitles(int pid);
|
bool SelectSubtitles(int pid);
|
||||||
void GetChapters(std::vector<int> &positions, std::vector<std::string> &titles);
|
void GetChapters(std::vector<int> &positions, std::vector<std::string> &titles);
|
||||||
|
void GetMetadata(std::vector<std::string> &keys, std::vector<std::string> &values);
|
||||||
//
|
//
|
||||||
cPlayback(int num = 0);
|
cPlayback(int num = 0);
|
||||||
~cPlayback();
|
~cPlayback();
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
|
@@ -726,6 +726,25 @@ void cPlayback::GetChapters(std::vector<int> &positions, std::vector<std::string
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cPlayback::GetMetadata(std::vector<std::string> &keys, std::vector<std::string> &values)
|
||||||
|
{
|
||||||
|
keys.clear();
|
||||||
|
values.clear();
|
||||||
|
char **metadata = NULL;
|
||||||
|
if (player && player->playback) {
|
||||||
|
player->playback->Command(player, PLAYBACK_METADATA, &metadata);
|
||||||
|
if (metadata) {
|
||||||
|
for (char **m = metadata; *m;) {
|
||||||
|
keys.push_back(*m);
|
||||||
|
free(*m++);
|
||||||
|
values.push_back(*m);
|
||||||
|
free(*m++);
|
||||||
|
}
|
||||||
|
free(metadata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
cPlayback::cPlayback(int num __attribute__((unused)), void (*fbcb)(uint32_t **, unsigned int *, unsigned int *, unsigned int *, void (**)(void)))
|
cPlayback::cPlayback(int num __attribute__((unused)), void (*fbcb)(uint32_t **, unsigned int *, unsigned int *, unsigned int *, void (**)(void)))
|
||||||
{
|
{
|
||||||
@@ -769,6 +788,7 @@ unsigned long long cPlayback::GetReadCount() {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
bool cPlayback::IsPlaying(void) const
|
bool cPlayback::IsPlaying(void) const
|
||||||
{
|
{
|
||||||
|
@@ -55,6 +55,7 @@ class cPlayback
|
|||||||
bool SelectSubtitles(int pid);
|
bool SelectSubtitles(int pid);
|
||||||
#endif
|
#endif
|
||||||
void GetChapters(std::vector<int> &positions, std::vector<std::string> &titles);
|
void GetChapters(std::vector<int> &positions, std::vector<std::string> &titles);
|
||||||
|
void GetMetadata(std::vector<std::string> &keys, std::vector<std::string> &values);
|
||||||
#if 0
|
#if 0
|
||||||
// Functions that are not used by movieplayer.cpp:
|
// Functions that are not used by movieplayer.cpp:
|
||||||
bool GetOffset(off64_t &offset);
|
bool GetOffset(off64_t &offset);
|
||||||
|
Reference in New Issue
Block a user