mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 23:13:16 +02:00
libeplayer3: tracks update is now lock-free
This commit is contained in:
@@ -364,6 +364,13 @@ static void FFMPEGThread(Context_t *context) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMutex(FILENAME, __FUNCTION__,__LINE__);
|
||||||
|
|
||||||
|
if (!context->playback || !context->playback->isPlaying) {
|
||||||
|
releaseMutex(FILENAME, __FUNCTION__,__LINE__);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (context->playback->BackWard && av_gettime() >= showtime)
|
if (context->playback->BackWard && av_gettime() >= showtime)
|
||||||
{
|
{
|
||||||
context->output->Command(context, OUTPUT_CLEAR, "video");
|
context->output->Command(context, OUTPUT_CLEAR, "video");
|
||||||
@@ -394,8 +401,6 @@ static void FFMPEGThread(Context_t *context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getMutex(FILENAME, __FUNCTION__,__LINE__);
|
|
||||||
|
|
||||||
if (do_seek_target_seconds || do_seek_target_bytes) {
|
if (do_seek_target_seconds || do_seek_target_bytes) {
|
||||||
if (do_seek_target_seconds) {
|
if (do_seek_target_seconds) {
|
||||||
float seek_target_seconds_min = seek_target_seconds - 15 * AV_TIME_BASE;
|
float seek_target_seconds_min = seek_target_seconds - 15 * AV_TIME_BASE;
|
||||||
@@ -912,7 +917,8 @@ int container_ffmpeg_init(Context_t *context, char * filename)
|
|||||||
terminating = 0;
|
terminating = 0;
|
||||||
latestPts = 0;
|
latestPts = 0;
|
||||||
isContainerRunning = 1;
|
isContainerRunning = 1;
|
||||||
return container_ffmpeg_update_tracks(context, filename, 1);
|
int res = container_ffmpeg_update_tracks(context, filename, 1);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initial)
|
int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initial)
|
||||||
@@ -924,10 +930,6 @@ int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initi
|
|||||||
Track_t * subtitleTrack = NULL;
|
Track_t * subtitleTrack = NULL;
|
||||||
Track_t * dvbsubtitleTrack = NULL;
|
Track_t * dvbsubtitleTrack = NULL;
|
||||||
Track_t * teletextTrack = NULL;
|
Track_t * teletextTrack = NULL;
|
||||||
int audioId = -1;
|
|
||||||
int subtitleId = -1;
|
|
||||||
int dvbsubtitleId = -1;
|
|
||||||
int teletextId = -1;
|
|
||||||
|
|
||||||
context->manager->audio->Command(context, MANAGER_GET_TRACK, &audioTrack);
|
context->manager->audio->Command(context, MANAGER_GET_TRACK, &audioTrack);
|
||||||
if (initial)
|
if (initial)
|
||||||
@@ -935,28 +937,18 @@ int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initi
|
|||||||
context->manager->dvbsubtitle->Command(context, MANAGER_GET_TRACK, &dvbsubtitleTrack);
|
context->manager->dvbsubtitle->Command(context, MANAGER_GET_TRACK, &dvbsubtitleTrack);
|
||||||
context->manager->teletext->Command(context, MANAGER_GET_TRACK, &teletextTrack);
|
context->manager->teletext->Command(context, MANAGER_GET_TRACK, &teletextTrack);
|
||||||
|
|
||||||
if (audioTrack)
|
|
||||||
audioId = ((AVStream *) (audioTrack->stream))->id;
|
|
||||||
if (initial && subtitleTrack)
|
|
||||||
subtitleId = ((AVStream *) (subtitleTrack->stream))->id;
|
|
||||||
if (dvbsubtitleTrack)
|
|
||||||
dvbsubtitleId = ((AVStream *) (dvbsubtitleTrack->stream))->id;
|
|
||||||
if (teletextTrack)
|
|
||||||
teletextId = ((AVStream *) (teletextTrack->stream))->id;
|
|
||||||
|
|
||||||
getMutex(FILENAME, __FUNCTION__,__LINE__);
|
|
||||||
if (context->manager->video)
|
if (context->manager->video)
|
||||||
context->manager->video->Command(context, MANAGER_DEL, NULL);
|
context->manager->video->Command(context, MANAGER_INIT_UPDATE, NULL);
|
||||||
if (context->manager->audio)
|
if (context->manager->audio)
|
||||||
context->manager->audio->Command(context, MANAGER_DEL, NULL);
|
context->manager->audio->Command(context, MANAGER_INIT_UPDATE, NULL);
|
||||||
#if 0
|
#if 0
|
||||||
if (context->manager->subtitle)
|
if (context->manager->subtitle)
|
||||||
context->manager->subtitle->Command(context, MANAGER_DEL, NULL);
|
context->manager->subtitle->Command(context, MANAGER_INIT_UPDATE, NULL);
|
||||||
#endif
|
#endif
|
||||||
if (context->manager->dvbsubtitle)
|
if (context->manager->dvbsubtitle)
|
||||||
context->manager->dvbsubtitle->Command(context, MANAGER_DEL, NULL);
|
context->manager->dvbsubtitle->Command(context, MANAGER_INIT_UPDATE, NULL);
|
||||||
if (context->manager->teletext)
|
if (context->manager->teletext)
|
||||||
context->manager->teletext->Command(context, MANAGER_DEL, NULL);
|
context->manager->teletext->Command(context, MANAGER_INIT_UPDATE, NULL);
|
||||||
|
|
||||||
ffmpeg_printf(20, "dump format\n");
|
ffmpeg_printf(20, "dump format\n");
|
||||||
av_dump_format(avContext, 0, filename, 0);
|
av_dump_format(avContext, 0, filename, 0);
|
||||||
@@ -1340,19 +1332,6 @@ int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initi
|
|||||||
|
|
||||||
} /* for */
|
} /* for */
|
||||||
|
|
||||||
if (context->playback) {
|
|
||||||
if (audioId > -1)
|
|
||||||
context->playback->Command(context, PLAYBACK_SWITCH_AUDIO, &audioId);
|
|
||||||
if (subtitleId > -1)
|
|
||||||
context->playback->Command(context, PLAYBACK_SWITCH_SUBTITLE, &subtitleId);
|
|
||||||
if (dvbsubtitleId > -1)
|
|
||||||
context->playback->Command(context, PLAYBACK_SWITCH_DVBSUBTITLE, &dvbsubtitleId);
|
|
||||||
if (teletextId > -1)
|
|
||||||
context->playback->Command(context, PLAYBACK_SWITCH_TELETEXT, &teletextId);
|
|
||||||
}
|
|
||||||
|
|
||||||
releaseMutex(FILENAME, __FUNCTION__,__LINE__);
|
|
||||||
|
|
||||||
return cERR_CONTAINER_FFMPEG_NO_ERROR;
|
return cERR_CONTAINER_FFMPEG_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1494,8 +1473,6 @@ static int container_ffmpeg_seek_rel(Context_t *context, off_t pos, long long in
|
|||||||
if (sec < 0)
|
if (sec < 0)
|
||||||
seek_target_flag |= AVSEEK_FLAG_BACKWARD;
|
seek_target_flag |= AVSEEK_FLAG_BACKWARD;
|
||||||
|
|
||||||
getMutex(FILENAME, __FUNCTION__,__LINE__);
|
|
||||||
|
|
||||||
ffmpeg_printf(10, "iformat->flags %d\n", avContext->iformat->flags);
|
ffmpeg_printf(10, "iformat->flags %d\n", avContext->iformat->flags);
|
||||||
|
|
||||||
if (avContext->iformat->flags & AVFMT_TS_DISCONT)
|
if (avContext->iformat->flags & AVFMT_TS_DISCONT)
|
||||||
@@ -1524,7 +1501,6 @@ static int container_ffmpeg_seek_rel(Context_t *context, off_t pos, long long in
|
|||||||
seek_target_bytes = pos;
|
seek_target_bytes = pos;
|
||||||
do_seek_target_bytes = 1;
|
do_seek_target_bytes = 1;
|
||||||
|
|
||||||
releaseMutex(FILENAME, __FUNCTION__,__LINE__);
|
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1582,6 +1558,11 @@ static int container_ffmpeg_seek(Context_t *context, float sec, int absolute) {
|
|||||||
|
|
||||||
getMutex(FILENAME, __FUNCTION__,__LINE__);
|
getMutex(FILENAME, __FUNCTION__,__LINE__);
|
||||||
|
|
||||||
|
if (!context->playback || !context->playback->isPlaying) {
|
||||||
|
releaseMutex(FILENAME, __FUNCTION__,__LINE__);
|
||||||
|
return cERR_CONTAINER_FFMPEG_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
ffmpeg_printf(10, "iformat->flags %d\n", avContext->iformat->flags);
|
ffmpeg_printf(10, "iformat->flags %d\n", avContext->iformat->flags);
|
||||||
|
|
||||||
if (avContext->iformat->flags & AVFMT_TS_DISCONT)
|
if (avContext->iformat->flags & AVFMT_TS_DISCONT)
|
||||||
|
@@ -13,6 +13,7 @@ typedef enum {
|
|||||||
MANAGER_GETENCODING,
|
MANAGER_GETENCODING,
|
||||||
MANAGER_DEL,
|
MANAGER_DEL,
|
||||||
MANAGER_GET_TRACK,
|
MANAGER_GET_TRACK,
|
||||||
|
MANAGER_INIT_UPDATE
|
||||||
} ManagerCmd_t;
|
} ManagerCmd_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -56,6 +57,8 @@ typedef struct Track_s {
|
|||||||
* AVCodec is than used for softdecoding and stream will be injected as PCM */
|
* AVCodec is than used for softdecoding and stream will be injected as PCM */
|
||||||
int inject_as_pcm;
|
int inject_as_pcm;
|
||||||
int inject_raw_pcm;
|
int inject_raw_pcm;
|
||||||
|
|
||||||
|
int pending;
|
||||||
} Track_t;
|
} Track_t;
|
||||||
|
|
||||||
typedef struct Manager_s {
|
typedef struct Manager_s {
|
||||||
|
@@ -65,7 +65,7 @@ static const char FILENAME[] = __FILE__;
|
|||||||
/* Varaibles */
|
/* Varaibles */
|
||||||
/* ***************************** */
|
/* ***************************** */
|
||||||
|
|
||||||
static Track_t * Tracks;
|
static Track_t * Tracks = NULL;
|
||||||
static int TrackCount = 0;
|
static int TrackCount = 0;
|
||||||
static int CurrentTrack = 0; //TRACK[0] as default.
|
static int CurrentTrack = 0; //TRACK[0] as default.
|
||||||
|
|
||||||
@@ -91,6 +91,14 @@ static int ManagerAdd(Context_t *context, Track_t track) {
|
|||||||
return cERR_AUDIO_MGR_ERROR;
|
return cERR_AUDIO_MGR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TRACKWRAP; i++) {
|
||||||
|
if (Tracks[i].Id == track.Id) {
|
||||||
|
Tracks[i].pending = 0;
|
||||||
|
return cERR_AUDIO_MGR_NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (TrackCount < TRACKWRAP) {
|
if (TrackCount < TRACKWRAP) {
|
||||||
copyTrack(&Tracks[TrackCount], &track);
|
copyTrack(&Tracks[TrackCount], &track);
|
||||||
TrackCount++;
|
TrackCount++;
|
||||||
@@ -124,6 +132,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
||||||
|
if (Tracks[i].pending)
|
||||||
|
continue;
|
||||||
size_t len = strlen(Tracks[i].Name) + 20;
|
size_t len = strlen(Tracks[i].Name) + 20;
|
||||||
char tmp[len];
|
char tmp[len];
|
||||||
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
||||||
@@ -236,6 +246,12 @@ static int Command(void *_context, ManagerCmd_t command, void * argument) {
|
|||||||
ret = ManagerDel(context);
|
ret = ManagerDel(context);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MANAGER_INIT_UPDATE: {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TrackCount; i++)
|
||||||
|
Tracks[i].pending = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
audio_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
|
audio_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
|
||||||
ret = cERR_AUDIO_MGR_ERROR;
|
ret = cERR_AUDIO_MGR_ERROR;
|
||||||
|
@@ -65,7 +65,7 @@ static const char FILENAME[] = __FILE__;
|
|||||||
/* Varaibles */
|
/* Varaibles */
|
||||||
/* ***************************** */
|
/* ***************************** */
|
||||||
|
|
||||||
static Track_t * Tracks;
|
static Track_t * Tracks = NULL;
|
||||||
static int TrackCount = 0;
|
static int TrackCount = 0;
|
||||||
static int CurrentTrack = -1;
|
static int CurrentTrack = -1;
|
||||||
|
|
||||||
@@ -91,6 +91,14 @@ static int ManagerAdd(Context_t *context, Track_t track) {
|
|||||||
return cERR_DVBSUBTITLE_MGR_ERROR;
|
return cERR_DVBSUBTITLE_MGR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TRACKWRAP; i++) {
|
||||||
|
if (Tracks[i].Id == track.Id) {
|
||||||
|
Tracks[i].pending = 0;
|
||||||
|
return cERR_DVBSUBTITLE_MGR_NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (TrackCount < TRACKWRAP) {
|
if (TrackCount < TRACKWRAP) {
|
||||||
copyTrack(&Tracks[TrackCount], &track);
|
copyTrack(&Tracks[TrackCount], &track);
|
||||||
TrackCount++;
|
TrackCount++;
|
||||||
@@ -124,6 +132,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
||||||
|
if (Tracks[i].pending)
|
||||||
|
continue;
|
||||||
size_t len = strlen(Tracks[i].Name) + 20;
|
size_t len = strlen(Tracks[i].Name) + 20;
|
||||||
char tmp[len];
|
char tmp[len];
|
||||||
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
||||||
@@ -236,6 +246,12 @@ static int Command(void *_context, ManagerCmd_t command, void * argument) {
|
|||||||
ret = ManagerDel(context);
|
ret = ManagerDel(context);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MANAGER_INIT_UPDATE: {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TrackCount; i++)
|
||||||
|
Tracks[i].pending = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
dvbsubtitle_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
|
dvbsubtitle_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
|
||||||
ret = cERR_DVBSUBTITLE_MGR_ERROR;
|
ret = cERR_DVBSUBTITLE_MGR_ERROR;
|
||||||
|
@@ -64,7 +64,7 @@ static const char FILENAME[] = __FILE__;
|
|||||||
/* Varaibles */
|
/* Varaibles */
|
||||||
/* ***************************** */
|
/* ***************************** */
|
||||||
|
|
||||||
static Track_t * Tracks;
|
static Track_t * Tracks = NULL;
|
||||||
static int TrackCount = 0;
|
static int TrackCount = 0;
|
||||||
static int CurrentTrack = -1; //no as default.
|
static int CurrentTrack = -1; //no as default.
|
||||||
|
|
||||||
@@ -90,6 +90,14 @@ static int ManagerAdd(Context_t *context, Track_t track) {
|
|||||||
return cERR_SUBTITLE_MGR_ERROR;
|
return cERR_SUBTITLE_MGR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TRACKWRAP; i++) {
|
||||||
|
if (Tracks[i].Id == track.Id) {
|
||||||
|
Tracks[i].pending = 0;
|
||||||
|
return cERR_SUBTITLE_MGR_NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (TrackCount < TRACKWRAP) {
|
if (TrackCount < TRACKWRAP) {
|
||||||
copyTrack(&Tracks[TrackCount], &track);
|
copyTrack(&Tracks[TrackCount], &track);
|
||||||
TrackCount++;
|
TrackCount++;
|
||||||
@@ -123,6 +131,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
||||||
|
if (Tracks[i].pending)
|
||||||
|
continue;
|
||||||
size_t len = strlen(Tracks[i].Name) + 20;
|
size_t len = strlen(Tracks[i].Name) + 20;
|
||||||
char tmp[len];
|
char tmp[len];
|
||||||
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
||||||
@@ -238,6 +248,12 @@ static int Command(void *_context, ManagerCmd_t command, void * argument) {
|
|||||||
ret = ManagerDel(context);
|
ret = ManagerDel(context);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MANAGER_INIT_UPDATE: {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TrackCount; i++)
|
||||||
|
Tracks[i].pending = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
subtitle_mgr_err("%s:%s: ConatinerCmd not supported!", FILENAME, __FUNCTION__);
|
subtitle_mgr_err("%s:%s: ConatinerCmd not supported!", FILENAME, __FUNCTION__);
|
||||||
ret = cERR_SUBTITLE_MGR_ERROR;
|
ret = cERR_SUBTITLE_MGR_ERROR;
|
||||||
|
@@ -65,7 +65,7 @@ static const char FILENAME[] = __FILE__;
|
|||||||
/* Varaibles */
|
/* Varaibles */
|
||||||
/* ***************************** */
|
/* ***************************** */
|
||||||
|
|
||||||
static Track_t * Tracks;
|
static Track_t * Tracks = NULL;
|
||||||
static int TrackCount = 0;
|
static int TrackCount = 0;
|
||||||
static int CurrentTrack = -1;
|
static int CurrentTrack = -1;
|
||||||
|
|
||||||
@@ -91,6 +91,14 @@ static int ManagerAdd(Context_t *context, Track_t track) {
|
|||||||
return cERR_TELETEXT_MGR_ERROR;
|
return cERR_TELETEXT_MGR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TRACKWRAP; i++) {
|
||||||
|
if (Tracks[i].Id == track.Id) {
|
||||||
|
Tracks[i].pending = 0;
|
||||||
|
return cERR_TELETEXT_MGR_NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (TrackCount < TRACKWRAP) {
|
if (TrackCount < TRACKWRAP) {
|
||||||
copyTrack(&Tracks[TrackCount], &track);
|
copyTrack(&Tracks[TrackCount], &track);
|
||||||
TrackCount++;
|
TrackCount++;
|
||||||
@@ -124,6 +132,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
||||||
|
if (Tracks[i].pending)
|
||||||
|
continue;
|
||||||
size_t len = strlen(Tracks[i].Name) + 20;
|
size_t len = strlen(Tracks[i].Name) + 20;
|
||||||
char tmp[len];
|
char tmp[len];
|
||||||
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
||||||
@@ -236,6 +246,12 @@ static int Command(void *_context, ManagerCmd_t command, void * argument) {
|
|||||||
ret = ManagerDel(context);
|
ret = ManagerDel(context);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MANAGER_INIT_UPDATE: {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TrackCount; i++)
|
||||||
|
Tracks[i].pending = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
teletext_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
|
teletext_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
|
||||||
ret = cERR_TELETEXT_MGR_ERROR;
|
ret = cERR_TELETEXT_MGR_ERROR;
|
||||||
|
@@ -64,7 +64,7 @@ static const char FILENAME[] = __FILE__;
|
|||||||
/* Varaibles */
|
/* Varaibles */
|
||||||
/* ***************************** */
|
/* ***************************** */
|
||||||
|
|
||||||
static Track_t * Tracks;
|
static Track_t * Tracks = NULL;
|
||||||
static int TrackCount = 0;
|
static int TrackCount = 0;
|
||||||
static int CurrentTrack = 0; //TRACK[0] as default.
|
static int CurrentTrack = 0; //TRACK[0] as default.
|
||||||
|
|
||||||
@@ -89,6 +89,14 @@ static int ManagerAdd(Context_t *context, Track_t track) {
|
|||||||
return cERR_VIDEO_MGR_ERROR;
|
return cERR_VIDEO_MGR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TRACKWRAP; i++) {
|
||||||
|
if (Tracks[i].Id == track.Id) {
|
||||||
|
Tracks[i].pending = 0;
|
||||||
|
return cERR_VIDEO_MGR_NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (TrackCount < TRACKWRAP) {
|
if (TrackCount < TRACKWRAP) {
|
||||||
copyTrack(&Tracks[TrackCount], &track);
|
copyTrack(&Tracks[TrackCount], &track);
|
||||||
|
|
||||||
@@ -123,6 +131,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
|
||||||
|
if (Tracks[i].pending)
|
||||||
|
continue;
|
||||||
size_t len = strlen(Tracks[i].Name) + 20;
|
size_t len = strlen(Tracks[i].Name) + 20;
|
||||||
char tmp[len];
|
char tmp[len];
|
||||||
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
|
||||||
@@ -230,6 +240,12 @@ static int Command(void *_context, ManagerCmd_t command, void * argument) {
|
|||||||
ret = ManagerDel(context);
|
ret = ManagerDel(context);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MANAGER_INIT_UPDATE: {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < TrackCount; i++)
|
||||||
|
Tracks[i].pending = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
video_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
|
video_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
|
||||||
ret = cERR_VIDEO_MGR_ERROR;
|
ret = cERR_VIDEO_MGR_ERROR;
|
||||||
|
Reference in New Issue
Block a user