diff --git a/gst_libav/ext/libav/gstavdemux.c b/gst_libav/ext/libav/gstavdemux.c index 4c9a5381fd6d8b3720b78a6c7bb44dea971ad5bc..0d56d9f09c8b6af1f9f4d2b9975874c8f02b6e7b 100644 --- a/gst_libav/ext/libav/gstavdemux.c +++ b/gst_libav/ext/libav/gstavdemux.c @@ -43,6 +43,12 @@ #endif #define MAX_STREAMS 20 +#ifdef OHOS_OPT_COMPAT +/* ohos.opt.compat.0063 */ +#define AV_SEEK_FRAME_TIME_OUT 5 +gint is_exit = 0; +guint64 timeout_start = 0; +#endif typedef struct _GstFFMpegDemux GstFFMpegDemux; typedef struct _GstFFStream GstFFStream; @@ -507,6 +513,10 @@ gst_ffmpegdemux_do_seek (GstFFMpegDemux * demux, GstSegment * segment) ", 0) for time %" GST_TIME_FORMAT, index, fftarget, GST_TIME_ARGS (target)); +#ifdef OHOS_OPT_COMPAT + /* ohos.opt.compat.0063 */ + timeout_start = 0; +#endif if ((seekret = av_seek_frame (demux->context, index, fftarget, AVSEEK_FLAG_BACKWARD)) < 0) @@ -1348,6 +1358,24 @@ gst_ffmpeg_metadata_to_tag_list (AVDictionary * metadata) return list; } +#ifdef OHOS_OPT_COMPAT +/* ohos.opt.compat.0063 + * set av_seek_frame timeout calllback + */ +static gint gst_ffmpegdemux_interrupt_timeout_callback(void *context) +{ + (void)context; + guint64 now = av_gettime_relative(); + if (timeout_start == 0) { + timeout_start = now; + } else if ((now - timeout_start) / G_USEC_PER_SEC >= AV_SEEK_FRAME_TIME_OUT) { + GST_WARNING("timeout 5s, interrupt!"); + return 1; + } + return is_exit; +} +#endif + static gboolean gst_ffmpegdemux_open (GstFFMpegDemux * demux) { @@ -1408,6 +1436,10 @@ gst_ffmpegdemux_open (GstFFMpegDemux * demux) demux->context = avformat_alloc_context (); demux->context->pb = iocontext; +#ifdef OHOS_OPT_COMPAT + /* ohos.opt.compat.0063 */ + demux->context->interrupt_callback.callback = gst_ffmpegdemux_interrupt_timeout_callback; +#endif #ifdef OHOS_EXT_FUNC /* ohos.ext.func.0030 */ @@ -2210,6 +2242,10 @@ gst_ffmpegdemux_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: +#ifdef OHOS_OPT_COMPAT + /* ohos.opt.compat.0063 */ + is_exit = 0; +#endif #if 0 /* test seek in READY here */ gst_element_send_event (element, gst_event_new_seek (1.0, @@ -2226,6 +2262,10 @@ gst_ffmpegdemux_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: +#ifdef OHOS_OPT_COMPAT + /* ohos.opt.compat.0063 */ + is_exit = 1; +#endif gst_ffmpegdemux_close (demux); gst_adapter_clear (demux->ffpipe.adapter); g_list_foreach (demux->cached_events, (GFunc) gst_mini_object_unref,