From d02696233c08e990023c91ebd8c1f311d1118fdc Mon Sep 17 00:00:00 2001 From: martii Date: Sun, 10 Mar 2013 15:44:30 +0100 Subject: [PATCH] libeplayer3: add callback to abort avformat_open_input --- libeplayer3/container/container_ffmpeg.c | 14 ++++++++++++++ libeplayer3/include/playback.h | 1 + libeplayer3/playback/playback.c | 1 + libspark/playback_libeplayer3.cpp | 5 +++++ libspark/playback_libeplayer3.h | 1 + 5 files changed, 22 insertions(+) diff --git a/libeplayer3/container/container_ffmpeg.c b/libeplayer3/container/container_ffmpeg.c index 5078756..01b4d5c 100644 --- a/libeplayer3/container/container_ffmpeg.c +++ b/libeplayer3/container/container_ffmpeg.c @@ -1508,6 +1508,13 @@ static void ffmpeg_buf_free() /* **************************** */ /* Container part for ffmpeg */ /* **************************** */ +#ifdef MARTII +static int interrupt_cb(void *ctx) +{ + PlaybackHandler_t *p = (PlaybackHandler_t *)ctx; + return p->abortRequested; +} +#endif int container_ffmpeg_init(Context_t *context, char * filename) { @@ -1543,6 +1550,12 @@ int container_ffmpeg_init(Context_t *context, char * filename) #ifdef MARTII //TDT avformat_network_init(); #endif +#ifdef MARTII + context->playback->abortRequested = 0; + avContext = avformat_alloc_context(); + avContext->interrupt_callback.callback = interrupt_cb; + avContext->interrupt_callback.opaque = context->playback; +#endif #if LIBAVCODEC_VERSION_MAJOR < 54 if ((err = av_open_input_file(&avContext, filename, NULL, 0, NULL)) != 0) { @@ -2139,6 +2152,7 @@ static int container_ffmpeg_stop(Context_t *context) { getMutex(FILENAME, __FUNCTION__,__LINE__); #ifdef MARTII + if (avContext) avformat_close_input(&avContext); #else if (avContext != NULL) { diff --git a/libeplayer3/include/playback.h b/libeplayer3/include/playback.h index 95ff98d..cbac4b7 100644 --- a/libeplayer3/include/playback.h +++ b/libeplayer3/include/playback.h @@ -35,6 +35,7 @@ typedef struct PlaybackHandler_s { unsigned char isDvbSubtitle; unsigned char isTeletext; unsigned char mayWriteToFramebuffer; + unsigned char abortRequested; #endif int (* Command) (/*Context_t*/void *, PlaybackCmd_t, void *); diff --git a/libeplayer3/playback/playback.c b/libeplayer3/playback/playback.c index d19e450..c328190 100644 --- a/libeplayer3/playback/playback.c +++ b/libeplayer3/playback/playback.c @@ -1172,6 +1172,7 @@ PlaybackHandler_t PlaybackHandler = { 0, 0, 1, + 0, #endif &Command, "", diff --git a/libspark/playback_libeplayer3.cpp b/libspark/playback_libeplayer3.cpp index 268849d..81e29fc 100644 --- a/libspark/playback_libeplayer3.cpp +++ b/libspark/playback_libeplayer3.cpp @@ -655,6 +655,11 @@ void cPlayback::SuspendSubtitle(bool b) else player->playback->Command(player, PLAYBACK_FRAMEBUFFER_UNLOCK, 0); } + +void cPlayback::RequestAbort() { + if (player->playback) + player->playback->abortRequested = 1; +} #endif #if 0 bool cPlayback::IsPlaying(void) const diff --git a/libspark/playback_libeplayer3.h b/libspark/playback_libeplayer3.h index 4b91f02..ac46b97 100644 --- a/libspark/playback_libeplayer3.h +++ b/libspark/playback_libeplayer3.h @@ -53,6 +53,7 @@ class cPlayback #ifdef MARTII void FindAllSubtitlePids(uint16_t *pids, uint16_t *numpids, std::string *language); void FindAllDvbsubtitlePids(uint16_t *pids, uint16_t *numpids, std::string *language); + void RequestAbort(void); #endif #if 0 // Functions that are not used by movieplayer.cpp: