Skip to content

Commit

Permalink
fix: fix error when opening some formats (ts, wmv)
Browse files Browse the repository at this point in the history
  • Loading branch information
vzhd1701 committed Nov 15, 2021
1 parent 86b780c commit 4c8b19c
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 33 deletions.
68 changes: 41 additions & 27 deletions gridplayer/widgets/video_frame_vlc_base.py
Expand Up @@ -49,6 +49,7 @@ def __init__(self, vlc_instance, **kwargs):

self._is_first_start_finished = False
self._is_waiting_for_buffer = False
self._is_meta_loaded = False

self._media_player = None
self._media = None
Expand Down Expand Up @@ -108,24 +109,7 @@ def cb_parse_changed(self, event):
self._log.error(f"Media parse failed! Status changed to {status_txt}.")
return self.notify_error()

video_track = self._get_video_track()

if video_track is None:
self._log.error("Video track is missing!")
return self.notify_error()

self.length = self._media.get_duration()
self.video_dimensions = (video_track.width, video_track.height)
self.fps = video_track.frame_rate_num / video_track.frame_rate_den

self._log.debug("Video parsed")
self._log.debug("========")
self._log.debug(
f"Dimensions: {self.video_dimensions[0]}x{self.video_dimensions[1]}"
)
self._log.debug(f"Length: {self.length}")
self._log.debug(f"FPS: {self.fps}")
self._log.debug("========")
self._extract_meta_parse()

self.loopback_load_video_player()

Expand Down Expand Up @@ -168,7 +152,6 @@ def load_video(self, file_path):
vlc.EventType.MediaParsedChanged, self.cb_parse_changed
)

# Disable hardware decoding
self._media.add_options(*self._media_options)

self._media.parse_with_options(vlc.MediaParseFlag.local, -1)
Expand All @@ -185,6 +168,9 @@ def load_video_player(self):
def load_video_finish(self):
"""Step 3. Make sure video buffered and properly seekable"""

if not self._is_meta_loaded:
self._extract_meta_play()

self._log.debug("Load finished")

self._media_player.set_pause(1)
Expand Down Expand Up @@ -249,28 +235,56 @@ def audio_set_volume(self, volume):
self._media_player.audio_set_volume(volume)

def _get_video_track(self):
media_tracks = self._media.tracks_get()

if not media_tracks:
return None

video_tracks = (
t.u.video.contents
for t in self._media.tracks_get()
if t.type == vlc.TrackType.video
t.u.video.contents for t in media_tracks if t.type == vlc.TrackType.video
)

video_track = next(video_tracks, None)

vital_params = (
video_track,
video_track.frame_rate_num,
video_track.frame_rate_den,
video_track.width,
video_track.height,
self._media.get_duration(),
)

if not all(vital_params):
return None

return video_track

def _extract_meta_parse(self):
video_track = self._get_video_track()

if video_track is None:
self._log.warning("Video track data is missing, cannot parse metadata.")
return

self._log.debug("Parsing metadata...")

self.length = self._media.get_duration()
self.video_dimensions = (video_track.width, video_track.height)

if video_track.frame_rate_num and video_track.frame_rate_den:
self.fps = video_track.frame_rate_num / video_track.frame_rate_den
else:
self.fps = 25

self._is_meta_loaded = True

def _extract_meta_play(self):
self._log.debug("Extracting metadata...")

self.length = self._media.get_duration()
self.video_dimensions = self._media_player.video_get_size()
self.fps = self._media_player.get_fps() or 25

self._is_meta_loaded = True


class VlcPlayerThreaded(CommandLoopThreaded, VlcPlayerBase):
def start(self):
Expand Down Expand Up @@ -389,8 +403,8 @@ def __init__(self, vlc_log_level, **kwargs):
super().__init__(**kwargs)

self.vlc_instance = None
self.vlc_options = []

self._vlc_options = []
self._vlc_log_level = vlc_log_level

self._logger = None
Expand All @@ -405,7 +419,7 @@ def init_instance(self):
"--quiet",
"--no-disable-screensaver",
"--no-sub-autodetect-file",
*self._vlc_options,
*self.vlc_options,
]

# https://forum.videolan.org/viewtopic.php?t=147229
Expand Down
42 changes: 36 additions & 6 deletions gridplayer/widgets/video_frame_vlc_sw.py
Expand Up @@ -119,7 +119,7 @@ def __init__(self, **kwargs):
for _ in range(self.players_per_instance)
]

self._vlc_options = ["--vout=vdummy"]
self._vlc.vlc_options = ["--vout=vdummy"]

def init_player_shared_data(self, player_id):
available_locks = (ml for ml in self._memory_locks if ml["is_busy"].value == 0)
Expand Down Expand Up @@ -171,6 +171,9 @@ def __init__(self, player_id, release_callback, init_data, **kwargs):

self.shared_memory = init_data["shared_memory"]
self.decoder = None

self._loaded_path = None
# Disable hardware decoding
self._media_options.append("avcodec-hw=none")

self.start()
Expand All @@ -193,16 +196,26 @@ def cleanup(self):
def cleanup_final(self):
self.cmd_loop_terminate()

def load_video_player(self):
width, height = self.video_dimensions
def load_video(self, file_path):
self._loaded_path = file_path

self.decoder.set_frame(width, height)
self.decoder.attach_media_player(self._media_player)
super().load_video(file_path)

self.cmd_send("init_frame", width, height)
def load_video_player(self):
if self._is_meta_loaded:
self._init_video_decoder()

super().load_video_player()

def load_video_finish(self):
if not self._is_meta_loaded:
# Since we need metadata to allocate video buffer, restart is required
self._extract_meta_play()
self._restart_playback()
return

super().load_video_finish()

def play(self):
self.decoder.is_paused = False

Expand All @@ -213,6 +226,23 @@ def set_pause(self, is_paused):

super().set_pause(is_paused)

def _init_video_decoder(self):
width, height = self.video_dimensions

self.decoder.set_frame(width, height)
self.decoder.attach_media_player(self._media_player)

self.cmd_send("init_frame", width, height)

def _restart_playback(self):
self._log.debug("Restarting playback...")

super().cleanup()
super().init_player()

self._is_first_start_finished = False
self.cmd_send("load_video", self._loaded_path)


class VideoDriverVLCSW(VLCVideoDriverThreaded):
set_dummy_frame_sig = pyqtSignal()
Expand Down

0 comments on commit 4c8b19c

Please sign in to comment.