diff --git a/libeplayer3/container/container_ffmpeg.c b/libeplayer3/container/container_ffmpeg.c index 05cd78c..ce61eec 100644 --- a/libeplayer3/container/container_ffmpeg.c +++ b/libeplayer3/container/container_ffmpeg.c @@ -364,6 +364,13 @@ static void FFMPEGThread(Context_t *context) { continue; } + getMutex(FILENAME, __FUNCTION__,__LINE__); + + if (!context->playback || !context->playback->isPlaying) { + releaseMutex(FILENAME, __FUNCTION__,__LINE__); + continue; + } + if (context->playback->BackWard && av_gettime() >= showtime) { 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) { float seek_target_seconds_min = seek_target_seconds - 15 * AV_TIME_BASE; @@ -914,7 +919,8 @@ int container_ffmpeg_init(Context_t *context, char * filename) terminating = 0; latestPts = 0; 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) @@ -926,10 +932,6 @@ int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initi Track_t * subtitleTrack = NULL; Track_t * dvbsubtitleTrack = 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); if (initial) @@ -937,28 +939,18 @@ int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initi context->manager->dvbsubtitle->Command(context, MANAGER_GET_TRACK, &dvbsubtitleTrack); 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) - context->manager->video->Command(context, MANAGER_DEL, NULL); + context->manager->video->Command(context, MANAGER_INIT_UPDATE, NULL); if (context->manager->audio) - context->manager->audio->Command(context, MANAGER_DEL, NULL); + context->manager->audio->Command(context, MANAGER_INIT_UPDATE, NULL); #if 0 if (context->manager->subtitle) - context->manager->subtitle->Command(context, MANAGER_DEL, NULL); + context->manager->subtitle->Command(context, MANAGER_INIT_UPDATE, NULL); #endif 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) - context->manager->teletext->Command(context, MANAGER_DEL, NULL); + context->manager->teletext->Command(context, MANAGER_INIT_UPDATE, NULL); ffmpeg_printf(20, "dump format\n"); av_dump_format(avContext, 0, filename, 0); @@ -1342,19 +1334,6 @@ int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initi } /* 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; } @@ -1496,8 +1475,6 @@ static int container_ffmpeg_seek_rel(Context_t *context, off_t pos, long long in if (sec < 0) seek_target_flag |= AVSEEK_FLAG_BACKWARD; - getMutex(FILENAME, __FUNCTION__,__LINE__); - ffmpeg_printf(10, "iformat->flags %d\n", avContext->iformat->flags); if (avContext->iformat->flags & AVFMT_TS_DISCONT) @@ -1526,7 +1503,6 @@ static int container_ffmpeg_seek_rel(Context_t *context, off_t pos, long long in seek_target_bytes = pos; do_seek_target_bytes = 1; - releaseMutex(FILENAME, __FUNCTION__,__LINE__); return pos; } else @@ -1584,6 +1560,11 @@ static int container_ffmpeg_seek(Context_t *context, float sec, int absolute) { 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); if (avContext->iformat->flags & AVFMT_TS_DISCONT) diff --git a/libeplayer3/include/manager.h b/libeplayer3/include/manager.h index bbe42c8..f5aa225 100644 --- a/libeplayer3/include/manager.h +++ b/libeplayer3/include/manager.h @@ -13,6 +13,7 @@ typedef enum { MANAGER_GETENCODING, MANAGER_DEL, MANAGER_GET_TRACK, + MANAGER_INIT_UPDATE } ManagerCmd_t; typedef enum { @@ -56,6 +57,8 @@ typedef struct Track_s { * AVCodec is than used for softdecoding and stream will be injected as PCM */ int inject_as_pcm; int inject_raw_pcm; + + int pending; } Track_t; typedef struct Manager_s { diff --git a/libeplayer3/manager/audio.c b/libeplayer3/manager/audio.c index 52de0be..cbc4b4f 100644 --- a/libeplayer3/manager/audio.c +++ b/libeplayer3/manager/audio.c @@ -65,7 +65,7 @@ static const char FILENAME[] = "audio.c"; /* Varaibles */ /* ***************************** */ -static Track_t * Tracks; +static Track_t * Tracks = NULL; static int TrackCount = 0; 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; } + 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) { copyTrack(&Tracks[TrackCount], &track); TrackCount++; @@ -124,6 +132,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) { } for (i = 0, j = 0; i < TrackCount; i++, j+=2) { + if (Tracks[i].pending) + continue; size_t len = strlen(Tracks[i].Name) + 20; char tmp[len]; 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); break; } + case MANAGER_INIT_UPDATE: { + int i; + for (i = 0; i < TrackCount; i++) + Tracks[i].pending = 1; + break; + } default: audio_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command); ret = cERR_AUDIO_MGR_ERROR; diff --git a/libeplayer3/manager/dvbsubtitle.c b/libeplayer3/manager/dvbsubtitle.c index 3d66f12..5bdb88e 100644 --- a/libeplayer3/manager/dvbsubtitle.c +++ b/libeplayer3/manager/dvbsubtitle.c @@ -65,7 +65,7 @@ static const char FILENAME[] = __FILE__; /* Varaibles */ /* ***************************** */ -static Track_t * Tracks; +static Track_t * Tracks = NULL; static int TrackCount = 0; static int CurrentTrack = -1; @@ -91,6 +91,14 @@ static int ManagerAdd(Context_t *context, Track_t track) { 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) { copyTrack(&Tracks[TrackCount], &track); TrackCount++; @@ -124,6 +132,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) { } for (i = 0, j = 0; i < TrackCount; i++, j+=2) { + if (Tracks[i].pending) + continue; size_t len = strlen(Tracks[i].Name) + 20; char tmp[len]; 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); break; } + case MANAGER_INIT_UPDATE: { + int i; + for (i = 0; i < TrackCount; i++) + Tracks[i].pending = 1; + break; + } default: dvbsubtitle_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command); ret = cERR_DVBSUBTITLE_MGR_ERROR; diff --git a/libeplayer3/manager/subtitle.c b/libeplayer3/manager/subtitle.c index 6f8ff01..f9eb18e 100644 --- a/libeplayer3/manager/subtitle.c +++ b/libeplayer3/manager/subtitle.c @@ -64,7 +64,7 @@ static const char FILENAME[] = "subtitle.c"; /* Varaibles */ /* ***************************** */ -static Track_t * Tracks; +static Track_t * Tracks = NULL; static int TrackCount = 0; 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; } + 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) { copyTrack(&Tracks[TrackCount], &track); TrackCount++; @@ -123,6 +131,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) { } for (i = 0, j = 0; i < TrackCount; i++, j+=2) { + if (Tracks[i].pending) + continue; size_t len = strlen(Tracks[i].Name) + 20; char tmp[len]; 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); break; } + case MANAGER_INIT_UPDATE: { + int i; + for (i = 0; i < TrackCount; i++) + Tracks[i].pending = 1; + break; + } default: subtitle_mgr_err("%s:%s: ConatinerCmd not supported!", FILENAME, __FUNCTION__); ret = cERR_SUBTITLE_MGR_ERROR; diff --git a/libeplayer3/manager/teletext.c b/libeplayer3/manager/teletext.c index 9bf94a7..21df28b 100644 --- a/libeplayer3/manager/teletext.c +++ b/libeplayer3/manager/teletext.c @@ -65,7 +65,7 @@ static const char FILENAME[] = __FILE__; /* Varaibles */ /* ***************************** */ -static Track_t * Tracks; +static Track_t * Tracks = NULL; static int TrackCount = 0; static int CurrentTrack = -1; @@ -91,6 +91,14 @@ static int ManagerAdd(Context_t *context, Track_t track) { 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) { copyTrack(&Tracks[TrackCount], &track); TrackCount++; @@ -124,6 +132,8 @@ static char ** ManagerList(Context_t *context __attribute__((unused))) { } for (i = 0, j = 0; i < TrackCount; i++, j+=2) { + if (Tracks[i].pending) + continue; size_t len = strlen(Tracks[i].Name) + 20; char tmp[len]; 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); break; } + case MANAGER_INIT_UPDATE: { + int i; + for (i = 0; i < TrackCount; i++) + Tracks[i].pending = 1; + break; + } default: teletext_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command); ret = cERR_TELETEXT_MGR_ERROR; diff --git a/libeplayer3/manager/video.c b/libeplayer3/manager/video.c index 5bf5a94..930bcd7 100644 --- a/libeplayer3/manager/video.c +++ b/libeplayer3/manager/video.c @@ -64,7 +64,7 @@ static const char FILENAME[] = "video.c"; /* Varaibles */ /* ***************************** */ -static Track_t * Tracks; +static Track_t * Tracks = NULL; static int TrackCount = 0; 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; } + 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) { 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) { + if (Tracks[i].pending) + continue; size_t len = strlen(Tracks[i].Name) + 20; char tmp[len]; 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); break; } + case MANAGER_INIT_UPDATE: { + int i; + for (i = 0; i < TrackCount; i++) + Tracks[i].pending = 1; + break; + } default: video_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command); ret = cERR_VIDEO_MGR_ERROR;